ZGlmZiAtLWdpdCBhL0RvYy9SRUFETUUgYi9Eb2MvUkVBRE1FCmluZGV4IDQ4NGZjZTYuLmE0MjZiYTIgMTAwNjQ0Ci0tLSBhL0RvYy9SRUFETUUKKysrIGIvRG9jL1JFQURNRQpAQCAtMjI5LDcgKzIyOSw3IEBACiBhcyBsb25nIGFzIHlvdSBkb24ndCBjaGFuZ2Ugb3IgcmVtb3ZlIHRoZSBjb3B5cmlnaHQgbm90aWNlOgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KK0NvcHlyaWdodCAoYykgMjAwMC0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogQ29weXJpZ2h0IChjKSAyMDAwIEJlT3Blbi5jb20uCmRpZmYgLS1naXQgYS9Eb2MvYXBpL25ld3R5cGVzLnRleCBiL0RvYy9hcGkvbmV3dHlwZXMudGV4CmluZGV4IDQzZDJmODguLmU1YzVhYWMgMTAwNjQ0Ci0tLSBhL0RvYy9hcGkvbmV3dHlwZXMudGV4CisrKyBiL0RvYy9hcGkvbmV3dHlwZXMudGV4CkBAIC0xMDMsOCArMTAzLDYgQEAKICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBmb3IgdGhlIFx2YXJ7bWV0aG9kc30gYXJndW1lbnRdezIuM30KIFxlbmR7Y2Z1bmNkZXNjfQogCi1ETF9JTVBPUlQKLQogXGJlZ2lue2N2YXJkZXNjfXtQeU9iamVjdH17X1B5X05vbmVTdHJ1Y3R9CiAgIE9iamVjdCB3aGljaCBpcyB2aXNpYmxlIGluIFB5dGhvbiBhcyBcY29kZXtOb25lfS4gIFRoaXMgc2hvdWxkIG9ubHkKICAgYmUgYWNjZXNzZWQgdXNpbmcgdGhlIFxjb2Rle1B5X05vbmV9IG1hY3JvLCB3aGljaCBldmFsdWF0ZXMgdG8gYQpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2Z1bmN0aW9uYWwucnN0IGIvRG9jL2hvd3RvL2Z1bmN0aW9uYWwucnN0CmluZGV4IDJlNWE2YTkuLjEyNGRkMDEgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9mdW5jdGlvbmFsLnJzdAorKysgYi9Eb2MvaG93dG8vZnVuY3Rpb25hbC5yc3QKQEAgLTEzOTgsMTAgKzEzOTgsMTAgQEAKICcnJycnJycnJycnJycnJycnJycnJycnJycnJwogCiBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYi9tb2R1bGUtaXRlcnRvb2xzLmh0bWw6Ci1Eb2N1bWVudGF0aW9uIGBgZm9yIHRoZSBpdGVydG9vbHNgYCBtb2R1bGUuCitEb2N1bWVudGF0aW9uIGZvciB0aGUgYGBpdGVydG9vbHNgYCBtb2R1bGUuCiAKIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGliL21vZHVsZS1vcGVyYXRvci5odG1sOgotRG9jdW1lbnRhdGlvbiBgYGZvciB0aGUgb3BlcmF0b3JgYCBtb2R1bGUuCitEb2N1bWVudGF0aW9uIGZvciB0aGUgYGBvcGVyYXRvcmBgIG1vZHVsZS4KIAogaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMjg5LzoKIFBFUCAyODk6ICJHZW5lcmF0b3IgRXhwcmVzc2lvbnMiCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmJzZGRiLnRleCBiL0RvYy9saWIvbGliYnNkZGIudGV4CmluZGV4IDg1ZWE4MjQuLmU5ZDdlMjEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliYnNkZGIudGV4CisrKyBiL0RvYy9saWIvbGliYnNkZGIudGV4CkBAIC0xNiw3ICsxNiw3IEBACiBcZnVuY3Rpb257cGlja2xlLmR1bXBzKCl9LgogCiBUaGUgXG1vZHVsZXtic2RkYn0gbW9kdWxlIHJlcXVpcmVzIGEgQmVya2VsZXkgREIgbGlicmFyeSB2ZXJzaW9uIGZyb20KLTMuMyB0aHJ1IDQuNC4KKzMuMyB0aHJ1IDQuNS4KIAogXGJlZ2lue3NlZWFsc299CiAgIFxzZWV1cmx7aHR0cDovL3B5YnNkZGIuc291cmNlZm9yZ2UubmV0L30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYnoyLnRleCBiL0RvYy9saWIvbGliYnoyLnRleAppbmRleCAxMTgwMWZlLi4zNmJjMGQyIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmJ6Mi50ZXgKKysrIGIvRG9jL2xpYi9saWJiejIudGV4CkBAIC04MSwxMCArODEsMTAgQEAKIAogXGJlZ2lue21ldGhvZGRlc2N9W0JaMkZpbGVde3NlZWt9e29mZnNldFxvcHRpb25hbHssIHdoZW5jZX19CiBNb3ZlIHRvIG5ldyBmaWxlIHBvc2l0aW9uLiBBcmd1bWVudCBcdmFye29mZnNldH0gaXMgYSBieXRlIGNvdW50LiBPcHRpb25hbAotYXJndW1lbnQgXHZhcnt3aGVuY2V9IGRlZmF1bHRzIHRvIFxjb2RlezB9IChvZmZzZXQgZnJvbSBzdGFydCBvZiBmaWxlLAotb2Zmc2V0IHNob3VsZCBiZSBcY29kZXs+PSAwfSk7IG90aGVyIHZhbHVlcyBhcmUgXGNvZGV7MX0gKG1vdmUgcmVsYXRpdmUgdG8KLWN1cnJlbnQgcG9zaXRpb24sIHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSwgYW5kIFxjb2RlezJ9IChtb3ZlIHJlbGF0aXZlIHRvIGVuZAotb2YgZmlsZSwgdXN1YWxseSBuZWdhdGl2ZSwgYWx0aG91Z2ggbWFueSBwbGF0Zm9ybXMgYWxsb3cgc2Vla2luZyBiZXlvbmQKK2FyZ3VtZW50IFx2YXJ7d2hlbmNlfSBkZWZhdWx0cyB0byBcY29kZXtvcy5TRUVLX1NFVH0gb3IgXGNvZGV7MH0gKG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZpbGU7CitvZmZzZXQgc2hvdWxkIGJlIFxjb2Rlez49IDB9KTsgb3RoZXIgdmFsdWVzIGFyZSBcY29kZXtvcy5TRUVLX0NVUn0gb3IgXGNvZGV7MX0gKG1vdmUgcmVsYXRpdmUgdG8KK2N1cnJlbnQgcG9zaXRpb247IG9mZnNldCBjYW4gYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUpLCBhbmQgXGNvZGV7b3MuU0VFS19FTkR9IG9yIFxjb2RlezJ9IChtb3ZlIHJlbGF0aXZlIHRvIGVuZAorb2YgZmlsZTsgb2Zmc2V0IGlzIHVzdWFsbHkgbmVnYXRpdmUsIGFsdGhvdWdoIG1hbnkgcGxhdGZvcm1zIGFsbG93IHNlZWtpbmcgYmV5b25kCiB0aGUgZW5kIG9mIGEgZmlsZSkuCiAKIE5vdGUgdGhhdCBzZWVraW5nIG9mIGJ6MiBmaWxlcyBpcyBlbXVsYXRlZCwgYW5kIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjdHlwZXMudGV4IGIvRG9jL2xpYi9saWJjdHlwZXMudGV4CmluZGV4IGMwZTIzMTAuLjJmODgwZjIgMTAwNzU1Ci0tLSBhL0RvYy9saWIvbGliY3R5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYmN0eXBlcy50ZXgKQEAgLTIwODUsMTAgKzIwODUsMTAgQEAKIHRoZSB0eXBlLiAgU29tZSB0eXBlcyBhY2NlcHQgb3RoZXIgb2JqZWN0cyBhcyB3ZWxsLgogXGVuZHttZXRob2RkZXNjfQogCi1cYmVnaW57bWV0aG9kZGVzY317aW5fZGxsfXtuYW1lLCBsaWJyYXJ5fQorXGJlZ2lue21ldGhvZGRlc2N9e2luX2RsbH17bGlicmFyeSwgbmFtZX0KIFRoaXMgbWV0aG9kIHJldHVybnMgYSBjdHlwZXMgdHlwZSBpbnN0YW5jZSBleHBvcnRlZCBieSBhIHNoYXJlZAogbGlicmFyeS4gXHZhcntuYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRoYXQgZXhwb3J0cyB0aGUgZGF0YSwKLVxjb2Rle2xpYnJhcnl9IGlzIHRoZSBsb2FkZWQgc2hhcmVkIGxpYnJhcnkuCitcdmFye2xpYnJhcnl9IGlzIHRoZSBsb2FkZWQgc2hhcmVkIGxpYnJhcnkuCiBcZW5ke21ldGhvZGRlc2N9CiAKIENvbW1vbiBpbnN0YW5jZSB2YXJpYWJsZXMgb2YgY3R5cGVzIGRhdGEgdHlwZXM6CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmZ1bmNzLnRleCBiL0RvYy9saWIvbGliZnVuY3MudGV4CmluZGV4IDdlMGI4OGQuLjAyY2NhODMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliZnVuY3MudGV4CisrKyBiL0RvYy9saWIvbGliZnVuY3MudGV4CkBAIC0yMzcsMTEgKzIzNywxMSBAQAogICBcY29kZXtkZWwgXHZhcnt4fS5cdmFye2Zvb2Jhcn19LgogXGVuZHtmdW5jZGVzY30KIAotXGJlZ2lue2Z1bmNkZXNjfXtkaWN0fXtcb3B0aW9uYWx7bWFwcGluZy1vci1zZXF1ZW5jZX19CitcYmVnaW57ZnVuY2Rlc2N9e2RpY3R9e1xvcHRpb25hbHthcmd9fQogICBSZXR1cm4gYSBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGFuIG9wdGlvbmFsIHBvc2l0aW9uYWwKICAgYXJndW1lbnQgb3IgZnJvbSBhIHNldCBvZiBrZXl3b3JkIGFyZ3VtZW50cy4KICAgSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgcmV0dXJuIGEgbmV3IGVtcHR5IGRpY3Rpb25hcnkuCi0gIElmIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGEgbWFwcGluZyBvYmplY3QsIHJldHVybiBhIGRpY3Rpb25hcnkKKyAgSWYgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgXHZhcnthcmd9IGlzIGEgbWFwcGluZyBvYmplY3QsIHJldHVybiBhIGRpY3Rpb25hcnkKICAgbWFwcGluZyB0aGUgc2FtZSBrZXlzIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyBkb2VzIHRoZSBtYXBwaW5nIG9iamVjdC4KICAgT3RoZXJ3aXNlIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IG11c3QgYmUgYSBzZXF1ZW5jZSwgYSBjb250YWluZXIgdGhhdAogICBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yIG9iamVjdC4gIFRoZSBlbGVtZW50cyBvZiB0aGUgYXJndW1lbnQKQEAgLTQ0OCwxOCArNDQ4LDE4IEBACiAgIFx2ZXJzaW9uYWRkZWR7Mi4yfQogXGVuZHtmdW5jZGVzY30KIAotXGJlZ2lue2Z1bmNkZXNjfXtmaWx0ZXJ9e2Z1bmN0aW9uLCBsaXN0fQotICBDb25zdHJ1Y3QgYSBsaXN0IGZyb20gdGhvc2UgZWxlbWVudHMgb2YgXHZhcntsaXN0fSBmb3Igd2hpY2gKLSAgXHZhcntmdW5jdGlvbn0gcmV0dXJucyB0cnVlLiAgXHZhcntsaXN0fSBtYXkgYmUgZWl0aGVyIGEgc2VxdWVuY2UsIGEKLSAgY29udGFpbmVyIHdoaWNoIHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3IsICBJZiBcdmFye2xpc3R9CitcYmVnaW57ZnVuY2Rlc2N9e2ZpbHRlcn17ZnVuY3Rpb24sIGl0ZXJhYmxlfQorICBDb25zdHJ1Y3QgYSBsaXN0IGZyb20gdGhvc2UgZWxlbWVudHMgb2YgXHZhcntpdGVyYWJsZX0gZm9yIHdoaWNoCisgIFx2YXJ7ZnVuY3Rpb259IHJldHVybnMgdHJ1ZS4gIFx2YXJ7aXRlcmFibGV9IG1heSBiZSBlaXRoZXIgYSBzZXF1ZW5jZSwgYQorICBjb250YWluZXIgd2hpY2ggc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiBpdGVyYXRvciwgIElmIFx2YXJ7aXRlcmFibGV9CiAgIGlzIGEgc3RyaW5nIG9yIGEgdHVwbGUsIHRoZSByZXN1bHQKICAgYWxzbyBoYXMgdGhhdCB0eXBlOyBvdGhlcndpc2UgaXQgaXMgYWx3YXlzIGEgbGlzdC4gIElmIFx2YXJ7ZnVuY3Rpb259IGlzCiAgIFxjb2Rle05vbmV9LCB0aGUgaWRlbnRpdHkgZnVuY3Rpb24gaXMgYXNzdW1lZCwgdGhhdCBpcywgYWxsIGVsZW1lbnRzIG9mCi0gIFx2YXJ7bGlzdH0gdGhhdCBhcmUgZmFsc2UgYXJlIHJlbW92ZWQuCisgIFx2YXJ7aXRlcmFibGV9IHRoYXQgYXJlIGZhbHNlIGFyZSByZW1vdmVkLgogCi0gIE5vdGUgdGhhdCBcY29kZXtmaWx0ZXIoZnVuY3Rpb24sIFx2YXJ7bGlzdH0pfSBpcyBlcXVpdmFsZW50IHRvCi0gIFxjb2Rle1tpdGVtIGZvciBpdGVtIGluIFx2YXJ7bGlzdH0gaWYgZnVuY3Rpb24oaXRlbSldfSBpZiBmdW5jdGlvbiBpcwotICBub3QgXGNvZGV7Tm9uZX0gYW5kIFxjb2Rle1tpdGVtIGZvciBpdGVtIGluIFx2YXJ7bGlzdH0gaWYgaXRlbV19IGlmCisgIE5vdGUgdGhhdCBcY29kZXtmaWx0ZXIoZnVuY3Rpb24sIFx2YXJ7aXRlcmFibGV9KX0gaXMgZXF1aXZhbGVudCB0bworICBcY29kZXtbaXRlbSBmb3IgaXRlbSBpbiBcdmFye2l0ZXJhYmxlfSBpZiBmdW5jdGlvbihpdGVtKV19IGlmIGZ1bmN0aW9uIGlzCisgIG5vdCBcY29kZXtOb25lfSBhbmQgXGNvZGV7W2l0ZW0gZm9yIGl0ZW0gaW4gXHZhcntpdGVyYWJsZX0gaWYgaXRlbV19IGlmCiAgIGZ1bmN0aW9uIGlzIFxjb2Rle05vbmV9LgogXGVuZHtmdW5jZGVzY30KIApAQCAtNjA4LDEyICs2MDgsMTIgQEAKICAgbWF5IGJlIGEgc2VxdWVuY2UgKHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3IgYSBtYXBwaW5nIChkaWN0aW9uYXJ5KS4KIFxlbmR7ZnVuY2Rlc2N9CiAKLVxiZWdpbntmdW5jZGVzY317bGlzdH17XG9wdGlvbmFse3NlcXVlbmNlfX0KK1xiZWdpbntmdW5jZGVzY317bGlzdH17XG9wdGlvbmFse2l0ZXJhYmxlfX0KICAgUmV0dXJuIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzCi0gIFx2YXJ7c2VxdWVuY2V9J3MgaXRlbXMuICBcdmFye3NlcXVlbmNlfSBtYXkgYmUgZWl0aGVyIGEgc2VxdWVuY2UsIGEKKyAgXHZhcntpdGVyYWJsZX0ncyBpdGVtcy4gIFx2YXJ7aXRlcmFibGV9IG1heSBiZSBlaXRoZXIgYSBzZXF1ZW5jZSwgYQogICBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yIG9iamVjdC4gIElmCi0gIFx2YXJ7c2VxdWVuY2V9IGlzIGFscmVhZHkgYSBsaXN0LCBhIGNvcHkgaXMgbWFkZSBhbmQgcmV0dXJuZWQsCi0gIHNpbWlsYXIgdG8gXGNvZGV7XHZhcntzZXF1ZW5jZX1bOl19LiAgRm9yIGluc3RhbmNlLAorICBcdmFye2l0ZXJhYmxlfSBpcyBhbHJlYWR5IGEgbGlzdCwgYSBjb3B5IGlzIG1hZGUgYW5kIHJldHVybmVkLAorICBzaW1pbGFyIHRvIFxjb2Rle1x2YXJ7aXRlcmFibGV9WzpdfS4gIEZvciBpbnN0YW5jZSwKICAgXGNvZGV7bGlzdCgnYWJjJyl9IHJldHVybnMgXGNvZGV7WydhJywgJ2InLCAnYyddfSBhbmQgXGNvZGV7bGlzdCgKICAgKDEsIDIsIDMpICl9IHJldHVybnMgXGNvZGV7WzEsIDIsIDNdfS4gIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLAogICByZXR1cm5zIGEgbmV3IGVtcHR5IGxpc3QsIFxjb2Rle1tdfS4KQEAgLTYzOSwyMiArNjM5LDIyIEBACiAgIGFyZSBnaXZlbiwgcmV0dXJucyBcY29kZXswTH0uCiBcZW5ke2Z1bmNkZXNjfQogCi1cYmVnaW57ZnVuY2Rlc2N9e21hcH17ZnVuY3Rpb24sIGxpc3QsIC4uLn0KLSAgQXBwbHkgXHZhcntmdW5jdGlvbn0gdG8gZXZlcnkgaXRlbSBvZiBcdmFye2xpc3R9IGFuZCByZXR1cm4gYSBsaXN0Ci0gIG9mIHRoZSByZXN1bHRzLiAgSWYgYWRkaXRpb25hbCBcdmFye2xpc3R9IGFyZ3VtZW50cyBhcmUgcGFzc2VkLAorXGJlZ2lue2Z1bmNkZXNjfXttYXB9e2Z1bmN0aW9uLCBpdGVyYWJsZSwgLi4ufQorICBBcHBseSBcdmFye2Z1bmN0aW9ufSB0byBldmVyeSBpdGVtIG9mIFx2YXJ7aXRlcmFibGV9IGFuZCByZXR1cm4gYSBsaXN0CisgIG9mIHRoZSByZXN1bHRzLiAgSWYgYWRkaXRpb25hbCBcdmFye2l0ZXJhYmxlfSBhcmd1bWVudHMgYXJlIHBhc3NlZCwKICAgXHZhcntmdW5jdGlvbn0gbXVzdCB0YWtlIHRoYXQgbWFueSBhcmd1bWVudHMgYW5kIGlzIGFwcGxpZWQgdG8gdGhlCi0gIGl0ZW1zIG9mIGFsbCBsaXN0cyBpbiBwYXJhbGxlbDsgaWYgYSBsaXN0IGlzIHNob3J0ZXIgdGhhbiBhbm90aGVyIGl0CisgIGl0ZW1zIGZyb20gYWxsIGl0ZXJhYmxlcyBpbiBwYXJhbGxlbC4gIElmIG9uZSBpdGVyYWJsZSBpcyBzaG9ydGVyIHRoYW4gYW5vdGhlciBpdAogICBpcyBhc3N1bWVkIHRvIGJlIGV4dGVuZGVkIHdpdGggXGNvZGV7Tm9uZX0gaXRlbXMuICBJZiBcdmFye2Z1bmN0aW9ufQogICBpcyBcY29kZXtOb25lfSwgdGhlIGlkZW50aXR5IGZ1bmN0aW9uIGlzIGFzc3VtZWQ7IGlmIHRoZXJlIGFyZQotICBtdWx0aXBsZSBsaXN0IGFyZ3VtZW50cywgXGZ1bmN0aW9ue21hcCgpfSByZXR1cm5zIGEgbGlzdCBjb25zaXN0aW5nCi0gIG9mIHR1cGxlcyBjb250YWluaW5nIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gYWxsIGxpc3RzIChhIGtpbmQKLSAgb2YgdHJhbnNwb3NlIG9wZXJhdGlvbikuICBUaGUgXHZhcntsaXN0fSBhcmd1bWVudHMgbWF5IGJlIGFueSBraW5kCi0gIG9mIHNlcXVlbmNlOyB0aGUgcmVzdWx0IGlzIGFsd2F5cyBhIGxpc3QuCisgIG11bHRpcGxlIGFyZ3VtZW50cywgXGZ1bmN0aW9ue21hcCgpfSByZXR1cm5zIGEgbGlzdCBjb25zaXN0aW5nCisgIG9mIHR1cGxlcyBjb250YWluaW5nIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gYWxsIGl0ZXJhYmxlcyAoYSBraW5kCisgIG9mIHRyYW5zcG9zZSBvcGVyYXRpb24pLiAgVGhlIFx2YXJ7aXRlcmFibGV9IGFyZ3VtZW50cyBtYXkgYmUgYSBzZXF1ZW5jZSAKKyAgb3IgYW55IGl0ZXJhYmxlIG9iamVjdDsgdGhlIHJlc3VsdCBpcyBhbHdheXMgYSBsaXN0LgogXGVuZHtmdW5jZGVzY30KIAotXGJlZ2lue2Z1bmNkZXNjfXttYXh9e3Ncb3B0aW9uYWx7LCBhcmdzLi4ufVxvcHRpb25hbHtrZXl9fQotICBXaXRoIGEgc2luZ2xlIGFyZ3VtZW50IFx2YXJ7c30sIHJldHVybiB0aGUgbGFyZ2VzdCBpdGVtIG9mIGEKLSAgbm9uLWVtcHR5IHNlcXVlbmNlIChzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KS4gIFdpdGggbW9yZQorXGJlZ2lue2Z1bmNkZXNjfXttYXh9e2l0ZXJhYmxlXG9wdGlvbmFseywgYXJncy4uLn1cb3B0aW9uYWx7a2V5fX0KKyAgV2l0aCBhIHNpbmdsZSBhcmd1bWVudCBcdmFye2l0ZXJhYmxlfSwgcmV0dXJuIHRoZSBsYXJnZXN0IGl0ZW0gb2YgYQorICBub24tZW1wdHkgaXRlcmFibGUgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgV2l0aCBtb3JlCiAgIHRoYW4gb25lIGFyZ3VtZW50LCByZXR1cm4gdGhlIGxhcmdlc3Qgb2YgdGhlIGFyZ3VtZW50cy4KIAogICBUaGUgb3B0aW9uYWwgXHZhcntrZXl9IGFyZ3VtZW50IHNwZWNpZmllcyBhIG9uZS1hcmd1bWVudCBvcmRlcmluZwpAQCAtNjY0LDE2ICs2NjQsMTYgQEAKICAgXHZlcnNpb25jaGFuZ2VkW0FkZGVkIHN1cHBvcnQgZm9yIHRoZSBvcHRpb25hbCBcdmFye2tleX0gYXJndW1lbnRdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKLVxiZWdpbntmdW5jZGVzY317bWlufXtzXG9wdGlvbmFseywgYXJncy4uLn1cb3B0aW9uYWx7a2V5fX0KLSAgV2l0aCBhIHNpbmdsZSBhcmd1bWVudCBcdmFye3N9LCByZXR1cm4gdGhlIHNtYWxsZXN0IGl0ZW0gb2YgYQotICBub24tZW1wdHkgc2VxdWVuY2UgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgV2l0aCBtb3JlCitcYmVnaW57ZnVuY2Rlc2N9e21pbn17aXRlcmFibGVcb3B0aW9uYWx7LCBhcmdzLi4ufVxvcHRpb25hbHtrZXl9fQorICBXaXRoIGEgc2luZ2xlIGFyZ3VtZW50IFx2YXJ7aXRlcmFibGV9LCByZXR1cm4gdGhlIHNtYWxsZXN0IGl0ZW0gb2YgYQorICBub24tZW1wdHkgaXRlcmFibGUgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgV2l0aCBtb3JlCiAgIHRoYW4gb25lIGFyZ3VtZW50LCByZXR1cm4gdGhlIHNtYWxsZXN0IG9mIHRoZSBhcmd1bWVudHMuCiAKICAgVGhlIG9wdGlvbmFsIFx2YXJ7a2V5fSBhcmd1bWVudCBzcGVjaWZpZXMgYSBvbmUtYXJndW1lbnQgb3JkZXJpbmcKICAgZnVuY3Rpb24gbGlrZSB0aGF0IHVzZWQgZm9yIFxtZXRob2R7bGlzdC5zb3J0KCl9LiAgVGhlIFx2YXJ7a2V5fQogICBhcmd1bWVudCwgaWYgc3VwcGxpZWQsIG11c3QgYmUgaW4ga2V5d29yZCBmb3JtIChmb3IgZXhhbXBsZSwKICAgXHNhbXB7bWluKGEsYixjLGtleT1mdW5jKX0pLgotICBcdmVyc2lvbmNoYW5nZWRbQWRkZWQgc3VwcG9ydCBmb3IgdGhlIG9wdGlvbmFsIFx2YXJ7a2V5fSBhcmd1bWVudF17Mi41fSAgICAgICAgICAgCisgIFx2ZXJzaW9uY2hhbmdlZFtBZGRlZCBzdXBwb3J0IGZvciB0aGUgb3B0aW9uYWwgXHZhcntrZXl9IGFyZ3VtZW50XXsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e29iamVjdH17fQpAQCAtMTA3MywxMSArMTA3MywxMSBAQAogICBzdHJpbmcsIFxjb2RleycnfS4KIFxlbmR7ZnVuY2Rlc2N9CiAKLVxiZWdpbntmdW5jZGVzY317c3VtfXtzZXF1ZW5jZVxvcHRpb25hbHssIHN0YXJ0fX0KLSAgU3VtcyBcdmFye3N0YXJ0fSBhbmQgdGhlIGl0ZW1zIG9mIGEgXHZhcntzZXF1ZW5jZX0sIGZyb20gbGVmdCB0bwotICByaWdodCwgYW5kIHJldHVybnMgdGhlIHRvdGFsLiAgXHZhcntzdGFydH0gZGVmYXVsdHMgdG8gXGNvZGV7MH0uCi0gIFRoZSBcdmFye3NlcXVlbmNlfSdzIGl0ZW1zIGFyZSBub3JtYWxseSBudW1iZXJzLCBhbmQgYXJlIG5vdCBhbGxvd2VkCi0gIHRvIGJlIHN0cmluZ3MuICBUaGUgZmFzdCwgY29ycmVjdCB3YXkgdG8gY29uY2F0ZW5hdGUgc2VxdWVuY2Ugb2YKK1xiZWdpbntmdW5jZGVzY317c3VtfXtpdGVyYWJsZVxvcHRpb25hbHssIHN0YXJ0fX0KKyAgU3VtcyBcdmFye3N0YXJ0fSBhbmQgdGhlIGl0ZW1zIG9mIGFuIFx2YXJ7aXRlcmFibGV9IGZyb20gbGVmdCB0bworICByaWdodCBhbmQgcmV0dXJucyB0aGUgdG90YWwuICBcdmFye3N0YXJ0fSBkZWZhdWx0cyB0byBcY29kZXswfS4KKyAgVGhlIFx2YXJ7aXRlcmFibGV9J3MgaXRlbXMgYXJlIG5vcm1hbGx5IG51bWJlcnMsIGFuZCBhcmUgbm90IGFsbG93ZWQKKyAgdG8gYmUgc3RyaW5ncy4gIFRoZSBmYXN0LCBjb3JyZWN0IHdheSB0byBjb25jYXRlbmF0ZSBhIHNlcXVlbmNlIG9mCiAgIHN0cmluZ3MgaXMgYnkgY2FsbGluZyBcY29kZXsnJy5qb2luKFx2YXJ7c2VxdWVuY2V9KX0uCiAgIFx2ZXJzaW9uYWRkZWR7Mi4zfQogXGVuZHtmdW5jZGVzY30KQEAgLTExMDUsMTEgKzExMDUsMTEgQEAKIFx2ZXJzaW9uYWRkZWR7Mi4yfQogXGVuZHtmdW5jZGVzY30KIAotXGJlZ2lue2Z1bmNkZXNjfXt0dXBsZX17XG9wdGlvbmFse3NlcXVlbmNlfX0KK1xiZWdpbntmdW5jZGVzY317dHVwbGV9e1xvcHRpb25hbHtpdGVyYWJsZX19CiAgIFJldHVybiBhIHR1cGxlIHdob3NlIGl0ZW1zIGFyZSB0aGUgc2FtZSBhbmQgaW4gdGhlIHNhbWUgb3JkZXIgYXMKLSAgXHZhcntzZXF1ZW5jZX0ncyBpdGVtcy4gIFx2YXJ7c2VxdWVuY2V9IG1heSBiZSBhIHNlcXVlbmNlLCBhCisgIFx2YXJ7aXRlcmFibGV9J3MgaXRlbXMuICBcdmFye2l0ZXJhYmxlfSBtYXkgYmUgYSBzZXF1ZW5jZSwgYQogICBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yIG9iamVjdC4KLSAgSWYgXHZhcntzZXF1ZW5jZX0gaXMgYWxyZWFkeSBhIHR1cGxlLCBpdAorICBJZiBcdmFye2l0ZXJhYmxlfSBpcyBhbHJlYWR5IGEgdHVwbGUsIGl0CiAgIGlzIHJldHVybmVkIHVuY2hhbmdlZC4gIEZvciBpbnN0YW5jZSwgXGNvZGV7dHVwbGUoJ2FiYycpfSByZXR1cm5zCiAgIFxjb2RleygnYScsICdiJywgJ2MnKX0gYW5kIFxjb2Rle3R1cGxlKFsxLCAyLCAzXSl9IHJldHVybnMKICAgXGNvZGV7KDEsIDIsIDMpfS4gIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm5zIGEgbmV3IGVtcHR5CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmxvZ2dpbmcudGV4IGIvRG9jL2xpYi9saWJsb2dnaW5nLnRleAppbmRleCBlMDFmZTBiLi5iOTc4NTRkIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmxvZ2dpbmcudGV4CisrKyBiL0RvYy9saWIvbGlibG9nZ2luZy50ZXgKQEAgLTUxNiw4ICs1MTYsMTAgQEAKIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e2ZpbmRDYWxsZXJ9e30KLUZpbmRzIHRoZSBjYWxsZXIncyBzb3VyY2UgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyLiBSZXR1cm5zIHRoZSBmaWxlbmFtZQotYW5kIGxpbmUgbnVtYmVyIGFzIGEgMi1lbGVtZW50IHR1cGxlLgorRmluZHMgdGhlIGNhbGxlcidzIHNvdXJjZSBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIuIFJldHVybnMgdGhlIGZpbGVuYW1lLAorbGluZSBudW1iZXIgYW5kIGZ1bmN0aW9uIG5hbWUgYXMgYSAzLWVsZW1lbnQgdHVwbGUuCitcdmVyc2lvbmNoYW5nZWRbVGhlIGZ1bmN0aW9uIG5hbWUgd2FzIGFkZGVkLiBJbiBlYXJsaWVyIHZlcnNpb25zLCB0aGUKK2ZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciB3ZXJlIHJldHVybmVkIGFzIGEgMi1lbGVtZW50IHR1cGxlLl17Mi41fQogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317aGFuZGxlfXtyZWNvcmR9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1tYXAudGV4IGIvRG9jL2xpYi9saWJtbWFwLnRleAppbmRleCAzZGNhNDBmLi4zNzYzZDRmIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYm1tYXAudGV4CisrKyBiL0RvYy9saWIvbGlibW1hcC50ZXgKQEAgLTE0MCw4ICsxNDAsOSBAQAogCiBcYmVnaW57bWV0aG9kZGVzY317c2Vla317cG9zXG9wdGlvbmFseywgd2hlbmNlfX0KICAgU2V0IHRoZSBmaWxlJ3MgY3VycmVudCBwb3NpdGlvbi4gIFx2YXJ7d2hlbmNlfSBhcmd1bWVudCBpcyBvcHRpb25hbAotICBhbmQgZGVmYXVsdHMgdG8gXGNvZGV7MH0gKGFic29sdXRlIGZpbGUgcG9zaXRpb25pbmcpOyBvdGhlciB2YWx1ZXMKLSAgYXJlIFxjb2RlezF9IChzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uKSBhbmQgXGNvZGV7Mn0KKyAgYW5kIGRlZmF1bHRzIHRvIFxjb2Rle29zLlNFRUtfU0VUfSBvciBcY29kZXswfSAoYWJzb2x1dGUgZmlsZQorICBwb3NpdGlvbmluZyk7IG90aGVyIHZhbHVlcyBhcmUgXGNvZGV7b3MuU0VFS19DVVJ9IG9yIFxjb2RlezF9IChzZWVrCisgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uKSBhbmQgXGNvZGV7b3MuU0VFS19FTkR9IG9yIFxjb2RlezJ9CiAgIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBmaWxlJ3MgZW5kKS4KIFxlbmR7bWV0aG9kZGVzY30KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzaW1wbGV4bWxycGMudGV4IGIvRG9jL2xpYi9saWJzaW1wbGV4bWxycGMudGV4CmluZGV4IDdhOTc4NjEuLjZiNDU4NTUgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic2ltcGxleG1scnBjLnRleAorKysgYi9Eb2MvbGliL2xpYnNpbXBsZXhtbHJwYy50ZXgKQEAgLTE1LDcgKzE1LDcgQEAKIAogXGJlZ2lue2NsYXNzZGVzY317U2ltcGxlWE1MUlBDU2VydmVyfXthZGRyXG9wdGlvbmFseywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJcb3B0aW9uYWx7LAotCQkJCQlsb2dSZXF1ZXN0c1xvcHRpb25hbHthbGxvd19ub25lXG9wdGlvbmFseywgZW5jb2Rpbmd9fX19fQorCQkJCQlsb2dSZXF1ZXN0c1xvcHRpb25hbHssIGFsbG93X25vbmVcb3B0aW9uYWx7LCBlbmNvZGluZ319fX19CiAKICAgQ3JlYXRlIGEgbmV3IHNlcnZlciBpbnN0YW5jZS4gIFRoaXMgY2xhc3MKICAgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcmVnaXN0cmF0aW9uIG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgYnkKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic29ja2V0LnRleCBiL0RvYy9saWIvbGlic29ja2V0LnRleAppbmRleCBmNTEwZmQ0Li5mMjBjNTZjIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnNvY2tldC50ZXgKKysrIGIvRG9jL2xpYi9saWJzb2NrZXQudGV4CkBAIC01NjksMTEgKzU2OSwzMiBAQAogUmVjZWl2ZSBkYXRhIGZyb20gdGhlIHNvY2tldC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwYWlyCiBcY29kZXsoXHZhcntzdHJpbmd9LCBcdmFye2FkZHJlc3N9KX0gd2hlcmUgXHZhcntzdHJpbmd9IGlzIGEgc3RyaW5nCiByZXByZXNlbnRpbmcgdGhlIGRhdGEgcmVjZWl2ZWQgYW5kIFx2YXJ7YWRkcmVzc30gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi1zb2NrZXQgc2VuZGluZyB0aGUgZGF0YS4gIFRoZSBvcHRpb25hbCBcdmFye2ZsYWdzfSBhcmd1bWVudCBoYXMgdGhlCi1zYW1lIG1lYW5pbmcgYXMgZm9yIFxtZXRob2R7cmVjdigpfSBhYm92ZS4KK3NvY2tldCBzZW5kaW5nIHRoZSBkYXRhLiAgU2VlIHRoZSBcVU5JWHt9IG1hbnVhbCBwYWdlCitcbWFucGFnZXtyZWN2fXsyfSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIG9wdGlvbmFsIGFyZ3VtZW50CitcdmFye2ZsYWdzfTsgaXQgZGVmYXVsdHMgdG8gemVyby4KIChUaGUgZm9ybWF0IG9mIFx2YXJ7YWRkcmVzc30gZGVwZW5kcyBvbiB0aGUgYWRkcmVzcyBmYW1pbHkgLS0tIHNlZSBhYm92ZS4pCiBcZW5ke21ldGhvZGRlc2N9CiAKK1xiZWdpbnttZXRob2RkZXNjfVtzb2NrZXRde3JlY3Zmcm9tX2ludG99e2J1ZmZlclxvcHRpb25hbHssIG5ieXRlc1xvcHRpb25hbHssIGZsYWdzfX19CitSZWNlaXZlIGRhdGEgZnJvbSB0aGUgc29ja2V0LCB3cml0aW5nIGl0IGludG8gXHZhcntidWZmZXJ9IGluc3RlYWQgb2YgCitjcmVhdGluZyBhIG5ldyBzdHJpbmcuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcGFpcgorXGNvZGV7KFx2YXJ7bmJ5dGVzfSwgXHZhcnthZGRyZXNzfSl9IHdoZXJlIFx2YXJ7bmJ5dGVzfSBpcyB0aGUgbnVtYmVyCitvZiBieXRlcyByZWNlaXZlZCBhbmQgXHZhcnthZGRyZXNzfSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc29ja2V0CitzZW5kaW5nIHRoZSBkYXRhLiAgU2VlIHRoZSBcVU5JWHt9IG1hbnVhbCBwYWdlCitcbWFucGFnZXtyZWN2fXsyfSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIG9wdGlvbmFsIGFyZ3VtZW50CitcdmFye2ZsYWdzfTsgaXQgZGVmYXVsdHMgdG8gemVyby4gIChUaGUgZm9ybWF0IG9mIFx2YXJ7YWRkcmVzc30KK2RlcGVuZHMgb24gdGhlIGFkZHJlc3MgZmFtaWx5IC0tLSBzZWUgYWJvdmUuKQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtyZWN2X2ludG99e2J1ZmZlclxvcHRpb25hbHssIG5ieXRlc1xvcHRpb25hbHssIGZsYWdzfX19CitSZWNlaXZlIHVwIHRvIFx2YXJ7bmJ5dGVzfSBieXRlcyBmcm9tIHRoZSBzb2NrZXQsCitzdG9yaW5nIHRoZSBkYXRhIGludG8gYSBidWZmZXIgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgc3RyaW5nLiAgICAKK0lmIFx2YXJ7bmJ5dGVzfSBpcyBub3Qgc3BlY2lmaWVkIChvciAwKSwgCityZWNlaXZlIHVwIHRvIHRoZSBzaXplIGF2YWlsYWJsZSBpbiB0aGUgZ2l2ZW4gYnVmZmVyLgorU2VlIHRoZSBcVU5JWHt9IG1hbnVhbCBwYWdlIFxtYW5wYWdle3JlY3Z9ezJ9IGZvciB0aGUgbWVhbmluZyBvZiB0aGUKK29wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7ZmxhZ3N9OyBpdCBkZWZhdWx0cyB0byB6ZXJvLgorXGVuZHttZXRob2RkZXNjfQorCiBcYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtzZW5kfXtzdHJpbmdcb3B0aW9uYWx7LCBmbGFnc319CiBTZW5kIGRhdGEgdG8gdGhlIHNvY2tldC4gIFRoZSBzb2NrZXQgbXVzdCBiZSBjb25uZWN0ZWQgdG8gYSByZW1vdGUKIHNvY2tldC4gIFRoZSBvcHRpb25hbCBcdmFye2ZsYWdzfSBhcmd1bWVudCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3FsaXRlMy50ZXggYi9Eb2MvbGliL2xpYnNxbGl0ZTMudGV4CmluZGV4IDgyNDE2ZmEuLmFlYjYwYzEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic3FsaXRlMy50ZXgKKysrIGIvRG9jL2xpYi9saWJzcWxpdGUzLnRleApAQCAtMTg3LDEyICsxODcsMTIgQEAKIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317Y29tcGxldGVfc3RhdGVtZW50fXtzcWx9Ci1SZXR1cm5zIFxjb25zdGFudHtUcnVlfSBpZiB0aGUgc3RyaW5nIFx2YXJ7c3FsfSBvbmUgb3IgbW9yZSBjb21wbGV0ZSBTUUwKLXN0YXRlbWVudHMgdGVybWluYXRlZCBieSBzZW1pY29sb25zLiBJdCBkb2VzIG5vdCB2ZXJpZnkgaWYgdGhlIFNRTCBpcwotc3ludGFjdGljYWxseSBjb3JyZWN0LCBvbmx5IGlmIHRoZXJlIGFyZSBubyB1bmNsb3NlZCBzdHJpbmcgbGl0ZXJhbHMgYW5kIGlmIHRoZQorUmV0dXJucyBcY29uc3RhbnR7VHJ1ZX0gaWYgdGhlIHN0cmluZyBcdmFye3NxbH0gY29udGFpbnMgb25lIG9yIG1vcmUgY29tcGxldGUgU1FMCitzdGF0ZW1lbnRzIHRlcm1pbmF0ZWQgYnkgc2VtaWNvbG9ucy4gSXQgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIFNRTCBpcworc3ludGFjdGljYWxseSBjb3JyZWN0LCBvbmx5IHRoYXQgdGhlcmUgYXJlIG5vIHVuY2xvc2VkIHN0cmluZyBsaXRlcmFscyBhbmQgdGhlCiBzdGF0ZW1lbnQgaXMgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbi4KIAotVGhpcyBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHNoZWxsIGZvciBTUUxpdGUsIGxpa2UgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorVGhpcyBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHNoZWxsIGZvciBTUUxpdGUsIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKIAogICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5fQogXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RkdHlwZXMudGV4IGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKaW5kZXggYjQzM2JjNC4uOGE1MjdmNiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKKysrIGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKQEAgLTE2NjAsOSArMTY2MCwxMiBAQAogCiBcYmVnaW57bWV0aG9kZGVzY31bZmlsZV17c2Vla317b2Zmc2V0XG9wdGlvbmFseywgd2hlbmNlfX0KICAgU2V0IHRoZSBmaWxlJ3MgY3VycmVudCBwb3NpdGlvbiwgbGlrZSBcY29kZXtzdGRpb30ncyBcY2Z1bmN0aW9ue2ZzZWVrKCl9LgotICBUaGUgXHZhcnt3aGVuY2V9IGFyZ3VtZW50IGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcY29kZXswfQotICAoYWJzb2x1dGUgZmlsZSBwb3NpdGlvbmluZyk7IG90aGVyIHZhbHVlcyBhcmUgXGNvZGV7MX0gKHNlZWsKLSAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24pIGFuZCBcY29kZXsyfSAoc2VlayByZWxhdGl2ZSB0byB0aGUKKyAgVGhlIFx2YXJ7d2hlbmNlfSBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gCisgIFxjb2Rle29zLlNFRUtfU0VUfSBvciBcY29kZXswfQorICAoYWJzb2x1dGUgZmlsZSBwb3NpdGlvbmluZyk7IG90aGVyIHZhbHVlcyBhcmUgXGNvZGV7b3MuU0VFS19DVVJ9IG9yIFxjb2RlezF9CisgIChzZWVrCisgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uKSBhbmQgXGNvZGV7b3MuU0VFS19FTkR9IG9yIFxjb2RlezJ9IAorICAoc2VlayByZWxhdGl2ZSB0byB0aGUKICAgZmlsZSdzIGVuZCkuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuICBOb3RlIHRoYXQgaWYgdGhlIGZpbGUgaXMKICAgb3BlbmVkIGZvciBhcHBlbmRpbmcgKG1vZGUgXGNvZGV7J2EnfSBvciBcY29kZXsnYSsnfSksIGFueQogICBcbWV0aG9ke3NlZWsoKX0gb3BlcmF0aW9ucyB3aWxsIGJlIHVuZG9uZSBhdCB0aGUgbmV4dCB3cml0ZS4gIElmIHRoZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0YXJmaWxlLnRleCBiL0RvYy9saWIvbGlidGFyZmlsZS50ZXgKaW5kZXggY2E2ZTY1YS4uNWYyNzdkYSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ0YXJmaWxlLnRleAorKysgYi9Eb2MvbGliL2xpYnRhcmZpbGUudGV4CkBAIC0xMjQsNiArMTI0LDExIEBACiAgICAgb25seSBpZiBcbWVtYmVye1RhckZpbGUuZXJyb3JsZXZlbH1cY29kZXsgPT0gMn0uCiBcZW5ke2V4Y2Rlc2N9CiAKK1xiZWdpbntleGNkZXNjfXtIZWFkZXJFcnJvcn0KKyAgICBJcyByYWlzZWQgYnkgXG1ldGhvZHtmcm9tYnVmKCl9IGlmIHRoZSBidWZmZXIgaXQgZ2V0cyBpcyBpbnZhbGlkLgorICAgIFx2ZXJzaW9uYWRkZWR7Mi42fQorXGVuZHtleGNkZXNjfQorCiBcYmVnaW57c2VlYWxzb30KICAgICBcc2VlbW9kdWxle3ppcGZpbGV9e0RvY3VtZW50YXRpb24gb2YgdGhlIFxyZWZtb2R1bGV7emlwZmlsZX0KICAgICBzdGFuZGFyZCBtb2R1bGUufQpAQCAtMzMyLDYgKzMzNyw4IEBACiAKIFxiZWdpbnttZXRob2RkZXNjfXtmcm9tYnVmfXt9CiAgICAgQ3JlYXRlIGFuZCByZXR1cm4gYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0IGZyb20gYSBzdHJpbmcgYnVmZmVyLgorICAgIFx2ZXJzaW9uYWRkZWRbUmFpc2VzIFxleGNlcHRpb257SGVhZGVyRXJyb3J9IGlmIHRoZSBidWZmZXIgaXMKKyAgICBpbnZhbGlkLl17Mi42fQogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317dG9idWZ9e3Bvc2l4fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0ZXN0LnRleCBiL0RvYy9saWIvbGlidGVzdC50ZXgKaW5kZXggNTRhMjRiMS4uZjg5YzcwNyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ0ZXN0LnRleAorKysgYi9Eb2MvbGliL2xpYnRlc3QudGV4CkBAIC0yNjMsNiArMjYzLDEyIEBACiBUaGlzIGRvZXMgbm90IGVxdWFsIGEgZmFpbHVyZSBzaW5jZSBpdCBjb3VsZCBiZSB0aGUgcGF0aCB0byB0aGUgZmlsZS4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntmdW5jZGVzY317Z3VhcmRfd2FybmluZ3NfZmlsdGVyfXt9CitSZXR1cm5zIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgZ3VhcmRzIHRoZSBcbW9kdWxle3dhcm5pbmdzfSBtb2R1bGUncworZmlsdGVyIHNldHRpbmdzLgorXHZlcnNpb25hZGRlZHsyLjZ9CitcZW5ke2Z1bmNkZXNjfQorCiBcYmVnaW57ZnVuY2Rlc2N9e3J1bl91bml0dGVzdH17KmNsYXNzZXN9CiBFeGVjdXRlIFxjbGFzc3t1bml0dGVzdC5UZXN0Q2FzZX0gc3ViY2xhc3NlcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgogVGhlIGZ1bmN0aW9uIHNjYW5zIHRoZSBjbGFzc2VzIGZvciBtZXRob2RzIHN0YXJ0aW5nIHdpdGggdGhlIHByZWZpeApAQCAtMjc1LDQgKzI4MSwyMiBAQAogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7dGVzdGNsYXNzfSBhY2NlcHRzIG9uZSBvZiB0aGUgdGVzdCBjbGFzc2VzIGluIHRoZQogc3VpdGUgc28gYXMgdG8gcHJpbnQgb3V0IG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hlcmUgdGhlIHRlc3Rpbmcgc3VpdGUKIG9yaWdpbmF0ZWQgZnJvbS4KKworVGhlIFxtb2R1bGV7dGVzdC50ZXN0X3N1cHBvcnR9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKKworXGJlZ2lue2NsYXNzZGVzY317RW52aXJvbm1lbnRWYXJHdWFyZH17fQorQ2xhc3MgdXNlZCB0byB0ZW1wb3JhcmlseSBzZXQgb3IgdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgSW5zdGFuY2VzIGNhbiBiZQordXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlci4KK1x2ZXJzaW9uYWRkZWR7Mi42fQorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtzZXR9e2VudnZhciwgdmFsdWV9CitUZW1wb3JhcmlseSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxjb2Rle2VudnZhcn0gdG8gdGhlIHZhbHVlIG9mCitcY29kZXt2YWx1ZX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXt1bnNldH17ZW52dmFyfQorVGVtcG9yYXJpbHkgdW5zZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxjb2Rle2VudnZhcn0uCitcZW5ke21ldGhvZGRlc2N9CisKIFxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVybHBhcnNlLnRleCBiL0RvYy9saWIvbGlidXJscGFyc2UudGV4CmluZGV4IDg2MDM2MDUuLjA0NzNhZWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidXJscGFyc2UudGV4CisrKyBiL0RvYy9saWIvbGlidXJscGFyc2UudGV4CkBAIC04OSw3ICs4OSw3IEBACiAKIFxiZWdpbntmdW5jZGVzY317dXJsdW5wYXJzZX17cGFydHN9CiBDb25zdHJ1Y3QgYSBVUkwgZnJvbSBhIHR1cGxlIGFzIHJldHVybmVkIGJ5IFxjb2Rle3VybHBhcnNlKCl9LgotVGhlIFx2YXJ7cGFydHN9IGFyZ3VtZW50IGJlIGFueSBzaXgtaXRlbSBpdGVyYWJsZS4KK1RoZSBcdmFye3BhcnRzfSBhcmd1bWVudCBjYW4gYmUgYW55IHNpeC1pdGVtIGl0ZXJhYmxlLgogVGhpcyBtYXkgcmVzdWx0IGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50LCBidXQgZXF1aXZhbGVudCBVUkwsIGlmIHRoZQogVVJMIHRoYXQgd2FzIHBhcnNlZCBvcmlnaW5hbGx5IGhhZCB1bm5lY2Vzc2FyeSBkZWxpbWl0ZXJzIChmb3IgZXhhbXBsZSwKIGEgPyB3aXRoIGFuIGVtcHR5IHF1ZXJ5OyB0aGUgUkZDIHN0YXRlcyB0aGF0IHRoZXNlIGFyZSBlcXVpdmFsZW50KS4KQEAgLTEzMyw3ICsxMzMsNyBAQAogXGJlZ2lue2Z1bmNkZXNjfXt1cmx1bnNwbGl0fXtwYXJ0c30KIENvbWJpbmUgdGhlIGVsZW1lbnRzIG9mIGEgdHVwbGUgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue3VybHNwbGl0KCl9CiBpbnRvIGEgY29tcGxldGUgVVJMIGFzIGEgc3RyaW5nLgotVGhlIFx2YXJ7cGFydHN9IGFyZ3VtZW50IGJlIGFueSBmaXZlLWl0ZW0gaXRlcmFibGUuCitUaGUgXHZhcntwYXJ0c30gYXJndW1lbnQgY2FuIGJlIGFueSBmaXZlLWl0ZW0gaXRlcmFibGUuCiBUaGlzIG1heSByZXN1bHQgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQsIGJ1dCBlcXVpdmFsZW50IFVSTCwgaWYgdGhlCiBVUkwgdGhhdCB3YXMgcGFyc2VkIG9yaWdpbmFsbHkgaGFkIHVubmVjZXNzYXJ5IGRlbGltaXRlcnMgKGZvciBleGFtcGxlLAogYSA/IHdpdGggYW4gZW1wdHkgcXVlcnk7IHRoZSBSRkMgc3RhdGVzIHRoYXQgdGhlc2UgYXJlIGVxdWl2YWxlbnQpLgpkaWZmIC0tZ2l0IGEvRG9jL21hYy90b29sYm94LnRleCBiL0RvYy9tYWMvdG9vbGJveC50ZXgKaW5kZXggOWZiY2I4NC4uZTdjZTI0ZiAxMDA2NDQKLS0tIGEvRG9jL21hYy90b29sYm94LnRleAorKysgYi9Eb2MvbWFjL3Rvb2xib3gudGV4CkBAIC02NSw3ICs2NSw3IEBACiBcbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIHRoZSBDb21wb25lbnQgTWFuYWdlci59CiAKIFxzZWN0aW9ue1xtb2R1bGV7Q2FyYm9uLkNhcmJvbkV2dH0gLS0tIENhcmJvbiBFdmVudCBNYW5hZ2VyfQotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e0NhcmJvbi5DYXJvbkV2dH0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtDYXJib24uQ2FyYm9uRXZ0fQogICBccGxhdGZvcm17TWFjfQogXG1vZHVsZXN5bm9wc2lze0ludGVyZmFjZSB0byB0aGUgQ2FyYm9uIEV2ZW50IE1hbmFnZXIufQogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXgKaW5kZXggZmI2OGFjYy4uZmNlMzkyNyAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleApAQCAtNSw3ICs1LDcgQEAKICUgRml4IFhYWCBjb21tZW50cwogCiBcdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi41fQotXHJlbGVhc2V7MS4wfQorXHJlbGVhc2V7MS4wMX0KIFxhdXRob3J7QS5NLiBLdWNobGluZ30KIFxhdXRob3JhZGRyZXNze1xlbWFpbHthbWtAYW1rLmNhfX0KIApAQCAtNTU2LDEzICs1NTYsMTQgQEAKICAgd2hlcmUgdGhlIGdlbmVyYXRvcidzIGV4ZWN1dGlvbiBpcyBwYXVzZWQuCiAKICAgXGl0ZW0gXG1ldGhvZHtjbG9zZSgpfSByYWlzZXMgYSBuZXcgXGV4Y2VwdGlvbntHZW5lcmF0b3JFeGl0fQotICBleGNlcHRpb24gaW5zaWRlIHRoZSBnZW5lcmF0b3IgdG8gdGVybWluYXRlIHRoZSBpdGVyYXRpb24uICAKLSAgT24gcmVjZWl2aW5nIHRoaXMKLSAgZXhjZXB0aW9uLCB0aGUgZ2VuZXJhdG9yJ3MgY29kZSBtdXN0IGVpdGhlciByYWlzZQotICBcZXhjZXB0aW9ue0dlbmVyYXRvckV4aXR9IG9yIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn07IGNhdGNoaW5nIHRoZSAKLSAgZXhjZXB0aW9uIGFuZCBkb2luZyBhbnl0aGluZyBlbHNlIGlzIGlsbGVnYWwgYW5kIHdpbGwgdHJpZ2dlcgotICBhIFxleGNlcHRpb257UnVudGltZUVycm9yfS4gIFxtZXRob2R7Y2xvc2UoKX0gd2lsbCBhbHNvIGJlIGNhbGxlZCBieSAKLSAgUHl0aG9uJ3MgZ2FyYmFnZSBjb2xsZWN0b3Igd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIGdhcmJhZ2UtY29sbGVjdGVkLgorICBleGNlcHRpb24gaW5zaWRlIHRoZSBnZW5lcmF0b3IgdG8gdGVybWluYXRlIHRoZSBpdGVyYXRpb24uICBPbgorICByZWNlaXZpbmcgdGhpcyBleGNlcHRpb24sIHRoZSBnZW5lcmF0b3IncyBjb2RlIG11c3QgZWl0aGVyIHJhaXNlCisgIFxleGNlcHRpb257R2VuZXJhdG9yRXhpdH0gb3IgXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufS4gIENhdGNoaW5nCisgIHRoZSBcZXhjZXB0aW9ue0dlbmVyYXRvckV4aXR9IGV4Y2VwdGlvbiBhbmQgcmV0dXJuaW5nIGEgdmFsdWUgaXMKKyAgaWxsZWdhbCBhbmQgd2lsbCB0cmlnZ2VyIGEgXGV4Y2VwdGlvbntSdW50aW1lRXJyb3J9OyBpZiB0aGUgZnVuY3Rpb24KKyAgcmFpc2VzIHNvbWUgb3RoZXIgZXhjZXB0aW9uLCB0aGF0IGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZQorICBjYWxsZXIuICBcbWV0aG9ke2Nsb3NlKCl9IHdpbGwgYWxzbyBiZSBjYWxsZWQgYnkgUHl0aG9uJ3MgZ2FyYmFnZQorICBjb2xsZWN0b3Igd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIGdhcmJhZ2UtY29sbGVjdGVkLgogCiAgIElmIHlvdSBuZWVkIHRvIHJ1biBjbGVhbnVwIGNvZGUgd2hlbiBhIFxleGNlcHRpb257R2VuZXJhdG9yRXhpdH0gb2NjdXJzLAogICBJIHN1Z2dlc3QgdXNpbmcgYSBcY29kZXt0cnk6IC4uLiBmaW5hbGx5On0gc3VpdGUgaW5zdGVhZCBvZiAKQEAgLTE2NjMsNiArMTY2NCwxMyBAQAogXGl0ZW0gVGhlIFxtb2R1bGV7cHlleHBhdH0gbW9kdWxlIG5vdyB1c2VzIHZlcnNpb24gMi4wIG9mIHRoZSBFeHBhdCBwYXJzZXIuCiAoQ29udHJpYnV0ZWQgYnkgVHJlbnQgTWljay4pCiAKK1xpdGVtIFRoZSBcY2xhc3N7UXVldWV9IGNsYXNzIHByb3ZpZGVkIGJ5IHRoZSBcbW9kdWxle1F1ZXVlfSBtb2R1bGUKK2dhaW5lZCB0d28gbmV3IG1ldGhvZHMuICBcbWV0aG9ke2pvaW4oKX0gYmxvY2tzIHVudGlsIGFsbCBpdGVtcyBpbgordGhlIHF1ZXVlIGhhdmUgYmVlbiByZXRyaWV2ZWQgYW5kIGFsbCBwcm9jZXNzaW5nIHdvcmsgb24gdGhlIGl0ZW1zIAoraGF2ZSBiZWVuIGNvbXBsZXRlZC4gIFdvcmtlciB0aHJlYWRzIGNhbGwgdGhlIG90aGVyIG5ldyBtZXRob2QsIAorXG1ldGhvZHt0YXNrX2RvbmUoKX0sIHRvIHNpZ25hbCB0aGF0IHByb2Nlc3NpbmcgZm9yIGFuIGl0ZW0gaGFzIGJlZW4KK2NvbXBsZXRlZC4gIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCisKIFxpdGVtIFRoZSBvbGQgXG1vZHVsZXtyZWdleH0gYW5kIFxtb2R1bGV7cmVnc3VifSBtb2R1bGVzLCB3aGljaCBoYXZlIGJlZW4gCiBkZXByZWNhdGVkIGV2ZXIgc2luY2UgUHl0aG9uIDIuMCwgaGF2ZSBmaW5hbGx5IGJlZW4gZGVsZXRlZC4gIAogT3RoZXIgZGVsZXRlZCBtb2R1bGVzOiBcbW9kdWxle3N0YXRjYWNoZX0sIFxtb2R1bGV7dHpwYXJzZX0sCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA1YWZmZWZjLi4wYWU0MTRjIDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTg4LDkgKzg4LDkgQEAKIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcywgZGlzdHJpYnV0ZSwgYW5kIG90aGVyd2lzZSB1c2UgUHl0aG9uCiBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uLCBwcm92aWRlZCwgaG93ZXZlciwgdGhhdCBQU0YncwogTGljZW5zZSBBZ3JlZW1lbnQgYW5kIFBTRidzIG5vdGljZSBvZiBjb3B5cmlnaHQsIGkuZS4sICJDb3B5cmlnaHQgKGMpCi0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzCi1SZXNlcnZlZCIgYXJlIHJldGFpbmVkIGluIFB5dGhvbiBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uIAotcHJlcGFyZWQgYnkgTGljZW5zZWUuCisyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAKK0FsbCBSaWdodHMgUmVzZXJ2ZWQiIGFyZSByZXRhaW5lZCBpbiBQeXRob24gYWxvbmUgb3IgaW4gYW55IGRlcml2YXRpdmUgCit2ZXJzaW9uIHByZXBhcmVkIGJ5IExpY2Vuc2VlLgogCiAzLiBJbiB0aGUgZXZlbnQgTGljZW5zZWUgcHJlcGFyZXMgYSBkZXJpdmF0aXZlIHdvcmsgdGhhdCBpcyBiYXNlZCBvbgogb3IgaW5jb3Jwb3JhdGVzIFB5dGhvbiBvciBhbnkgcGFydCB0aGVyZW9mLCBhbmQgd2FudHMgdG8gbWFrZQpkaWZmIC0tZ2l0IGEvTGliL0NHSUhUVFBTZXJ2ZXIucHkgYi9MaWIvQ0dJSFRUUFNlcnZlci5weQppbmRleCA3YTVjODE5Li5jMTE5YzlhIDEwMDY0NAotLS0gYS9MaWIvQ0dJSFRUUFNlcnZlci5weQorKysgYi9MaWIvQ0dJSFRUUFNlcnZlci5weQpAQCAtMTA1LDE3ICsxMDUsMzYgQEAKIAogICAgIGRlZiBydW5fY2dpKHNlbGYpOgogICAgICAgICAiIiJFeGVjdXRlIGEgQ0dJIHNjcmlwdC4iIiIKKyAgICAgICAgcGF0aCA9IHNlbGYucGF0aAogICAgICAgICBkaXIsIHJlc3QgPSBzZWxmLmNnaV9pbmZvCisgICAgICAgIAorICAgICAgICBpID0gcGF0aC5maW5kKCcvJywgbGVuKGRpcikgKyAxKQorICAgICAgICB3aGlsZSBpID49IDA6CisgICAgICAgICAgICBuZXh0ZGlyID0gcGF0aFs6aV0KKyAgICAgICAgICAgIG5leHRyZXN0ID0gcGF0aFtpKzE6XQorCisgICAgICAgICAgICBzY3JpcHRkaXIgPSBzZWxmLnRyYW5zbGF0ZV9wYXRoKG5leHRkaXIpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNjcmlwdGRpcik6CisgICAgICAgICAgICAgICAgZGlyLCByZXN0ID0gbmV4dGRpciwgbmV4dHJlc3QKKyAgICAgICAgICAgICAgICBpID0gcGF0aC5maW5kKCcvJywgbGVuKGRpcikgKyAxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgZmluZCBhbiBleHBsaWNpdCBxdWVyeSBzdHJpbmcsIGlmIHByZXNlbnQuCiAgICAgICAgIGkgPSByZXN0LnJmaW5kKCc/JykKICAgICAgICAgaWYgaSA+PSAwOgogICAgICAgICAgICAgcmVzdCwgcXVlcnkgPSByZXN0WzppXSwgcmVzdFtpKzE6XQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcXVlcnkgPSAnJworCisgICAgICAgICMgZGlzc2VjdCB0aGUgcGFydCBhZnRlciB0aGUgZGlyZWN0b3J5IG5hbWUgaW50byBhIHNjcmlwdCBuYW1lICYKKyAgICAgICAgIyBhIHBvc3NpYmxlIGFkZGl0aW9uYWwgcGF0aCwgdG8gYmUgc3RvcmVkIGluIFBBVEhfSU5GTy4KICAgICAgICAgaSA9IHJlc3QuZmluZCgnLycpCiAgICAgICAgIGlmIGkgPj0gMDoKICAgICAgICAgICAgIHNjcmlwdCwgcmVzdCA9IHJlc3RbOmldLCByZXN0W2k6XQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2NyaXB0LCByZXN0ID0gcmVzdCwgJycKKwogICAgICAgICBzY3JpcHRuYW1lID0gZGlyICsgJy8nICsgc2NyaXB0CiAgICAgICAgIHNjcmlwdGZpbGUgPSBzZWxmLnRyYW5zbGF0ZV9wYXRoKHNjcmlwdG5hbWUpCiAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzY3JpcHRmaWxlKToKZGlmZiAtLWdpdCBhL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5IGIvTGliL1NpbXBsZUhUVFBTZXJ2ZXIucHkKaW5kZXggZmFlNTUxYS4uODZjNjY5ZSAxMDA2NDQKLS0tIGEvTGliL1NpbXBsZUhUVFBTZXJ2ZXIucHkKKysrIGIvTGliL1NpbXBsZUhUVFBTZXJ2ZXIucHkKQEAgLTY2LDYgKzY2LDEyIEBACiAgICAgICAgIHBhdGggPSBzZWxmLnRyYW5zbGF0ZV9wYXRoKHNlbGYucGF0aCkKICAgICAgICAgZiA9IE5vbmUKICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhdGguZW5kc3dpdGgoJy8nKToKKyAgICAgICAgICAgICAgICAjIHJlZGlyZWN0IGJyb3dzZXIgLSBkb2luZyBiYXNpY2FsbHkgd2hhdCBhcGFjaGUgZG9lcworICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgzMDEpCisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiTG9jYXRpb24iLCBzZWxmLnBhdGggKyAiLyIpCisgICAgICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgIGZvciBpbmRleCBpbiAiaW5kZXguaHRtbCIsICJpbmRleC5odG0iOgogICAgICAgICAgICAgICAgIGluZGV4ID0gb3MucGF0aC5qb2luKHBhdGgsIGluZGV4KQogICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGluZGV4KToKZGlmZiAtLWdpdCBhL0xpYi9TdHJpbmdJTy5weSBiL0xpYi9TdHJpbmdJTy5weQppbmRleCA3ZDU3ZDgwLi45Mzk0MzYwIDEwMDY0NAotLS0gYS9MaWIvU3RyaW5nSU8ucHkKKysrIGIvTGliL1N0cmluZ0lPLnB5CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgICAgcmV0dXJuIHIKIAogICAgIGRlZiByZWFkbGluZShzZWxmLCBsZW5ndGg9Tm9uZSk6Ci0gICAgICAgICIiIlJlYWQgb25lIGVudGlyZSBsaW5lIGZyb20gdGhlIGZpbGUuCisgICAgICAgIHIiIiJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLgogCiAgICAgICAgIEEgdHJhaWxpbmcgbmV3bGluZSBjaGFyYWN0ZXIgaXMga2VwdCBpbiB0aGUgc3RyaW5nIChidXQgbWF5IGJlIGFic2VudAogICAgICAgICB3aGVuIGEgZmlsZSBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lKS4gSWYgdGhlIHNpemUgYXJndW1lbnQgaXMKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi9kYm9iai5weSBiL0xpYi9ic2RkYi9kYm9iai5weQppbmRleCAzNDZjMWFkLi45ODdmNzczIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvZGJvYmoucHkKKysrIGIvTGliL2JzZGRiL2Rib2JqLnB5CkBAIC01NSw4ICs1NSw5IEBACiAgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9sZ19tYXgoKmFyZ3MsICoqa3dhcmdzKQogICAgIGRlZiBzZXRfbGtfZGV0ZWN0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9sa19kZXRlY3QoKmFyZ3MsICoqa3dhcmdzKQotICAgIGRlZiBzZXRfbGtfbWF4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9sa19tYXgoKmFyZ3MsICoqa3dhcmdzKQorICAgIGlmIGRiLnZlcnNpb24oKSA8ICg0LDUpOgorICAgICAgICBkZWYgc2V0X2xrX21heChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xrX21heCgqYXJncywgKiprd2FyZ3MpCiAgICAgZGVmIHNldF9sa19tYXhfbG9ja3Moc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xrX21heF9sb2NrcygqYXJncywgKiprd2FyZ3MpCiAgICAgZGVmIHNldF9sa19tYXhfbG9ja2VycyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF8xNDEzMTkyLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF8xNDEzMTkyLnB5CmluZGV4IDNjMTM1MzYuLjQzNmY0MDcgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfMTQxMzE5Mi5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0XzE0MTMxOTIucHkKQEAgLTE0LDcgKzE0LDcgQEAKIGVudl9uYW1lID0gJy4nCiAKIGVudiA9IGRiLkRCRW52KCkKLWVudi5vcGVuKGVudl9uYW1lLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX1RYTikKK2Vudi5vcGVuKGVudl9uYW1lLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX1RYTiB8IGRiLkRCX0lOSVRfTVBPT0wpCiB0aGVfdHhuID0gZW52LnR4bl9iZWdpbigpCiAKIG1hcCA9IGRiLkRCKGVudikKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYXNzb2NpYXRlLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9hc3NvY2lhdGUucHkKaW5kZXggMzNhNzgzNy4uN2FlN2M1MyAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9hc3NvY2lhdGUucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9hc3NvY2lhdGUucHkKQEAgLTkxLDcgKzkxLDcgQEAKIGNsYXNzIEFzc29jaWF0ZUVycm9yVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5maWxlbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJy5kYicKLSAgICAgICAgaG9tZURpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCAnZGJfaG9tZScpCisgICAgICAgIGhvbWVEaXIgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCAnZGJfaG9tZScpCiAgICAgICAgIHNlbGYuaG9tZURpciA9IGhvbWVEaXIKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgb3MubWtkaXIoaG9tZURpcikKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkKaW5kZXggZTA0NTJkZi4uNDhlY2RiOSAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkKQEAgLTU0LDcgKzU0LDcgQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgaWYgc2VsZi51c2VFbnY6Ci0gICAgICAgICAgICBob21lRGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICdkYl9ob21lJykKKyAgICAgICAgICAgIGhvbWVEaXIgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCAnZGJfaG9tZScpCiAgICAgICAgICAgICBzZWxmLmhvbWVEaXIgPSBob21lRGlyCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShob21lRGlyKQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJvYmoucHkKaW5kZXggYmJhNmE1Yi4uYjE1ZGUyZiAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5CkBAIC0yLDYgKzIsNyBAQAogaW1wb3J0IHN5cywgb3MsIHN0cmluZwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgZ2xvYgoraW1wb3J0IHRlbXBmaWxlCiAKIHRyeToKICAgICAjIEZvciBQeXRob25zIHcvZGlzdHV0aWxzIHB5YnNkZGIKQEAgLTE5LDcgKzIwLDcgQEAKICAgICBkYl9uYW1lID0gJ3Rlc3QtZGJvYmouZGInCiAKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIGhvbWVEaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwgJ2RiX2hvbWUnKQorICAgICAgICBob21lRGlyID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgJ2RiX2hvbWUnKQogICAgICAgICBzZWxmLmhvbWVEaXIgPSBob21lRGlyCiAgICAgICAgIHRyeTogb3MubWtkaXIoaG9tZURpcikKICAgICAgICAgZXhjZXB0IG9zLmVycm9yOiBwYXNzCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weQppbmRleCAzNzRjY2Q4Li4xZGE2NTQ2IDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJzaGVsdmUucHkKQEAgLTI0Miw3ICsyNDIsNyBAQAogY2xhc3MgQmFzaWNFbnZTaGVsdmVUZXN0Q2FzZShEQlNoZWx2ZVRlc3RDYXNlKToKICAgICBkZWYgZG9fb3BlbihzZWxmKToKICAgICAgICAgc2VsZi5ob21lRGlyID0gaG9tZURpciA9IG9zLnBhdGguam9pbigKLSAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICdkYl9ob21lJykKKyAgICAgICAgICAgIHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgJ2RiX2hvbWUnKQogICAgICAgICB0cnk6IG9zLm1rZGlyKGhvbWVEaXIpCiAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjogcGFzcwogICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJ0YWJsZXMucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5CmluZGV4IDJmZjkzYTMuLmEzMWZjZWMgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJ0YWJsZXMucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weQpAQCAtMjYsNiArMjYsNyBAQAogICAgIHBpY2tsZSA9IGNQaWNrbGUKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBpbXBvcnQgcGlja2xlCitpbXBvcnQgdGVtcGZpbGUKIAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIC50ZXN0X2FsbCBpbXBvcnQgdmVyYm9zZQpAQCAtNDYsNyArNDcsNyBAQAogICAgIGRiX25hbWUgPSAndGVzdC10YWJsZS5kYicKIAogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgaG9tZURpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCAnZGJfaG9tZScpCisgICAgICAgIGhvbWVEaXIgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCAnZGJfaG9tZScpCiAgICAgICAgIHNlbGYuaG9tZURpciA9IGhvbWVEaXIKICAgICAgICAgdHJ5OiBvcy5ta2Rpcihob21lRGlyKQogICAgICAgICBleGNlcHQgb3MuZXJyb3I6IHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZW52X2Nsb3NlLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9lbnZfY2xvc2UucHkKaW5kZXggNDNkY2FiZS4uMTJlMTAzNyAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9lbnZfY2xvc2UucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9lbnZfY2xvc2UucHkKQEAgLTMzLDcgKzMzLDcgQEAKIAogY2xhc3MgREJFbnZDbG9zZWRFYXJseUNyYXNoKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuaG9tZURpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCAnZGJfaG9tZScpCisgICAgICAgIHNlbGYuaG9tZURpciA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICdkYl9ob21lJykKICAgICAgICAgdHJ5OiBvcy5ta2RpcihzZWxmLmhvbWVEaXIpCiAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjogcGFzcwogICAgICAgICB0ZW1wZmlsZS50ZW1wZGlyID0gc2VsZi5ob21lRGlyCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHkKaW5kZXggNmU5OGIwYi4uNWUzMDdhZSAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9qb2luLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3Rfam9pbi5weQpAQCAtNDksNyArNDksNyBAQAogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmZpbGVuYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAnLmRiJwotICAgICAgICBob21lRGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICdkYl9ob21lJykKKyAgICAgICAgaG9tZURpciA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICdkYl9ob21lJykKICAgICAgICAgc2VsZi5ob21lRGlyID0gaG9tZURpcgogICAgICAgICB0cnk6IG9zLm1rZGlyKGhvbWVEaXIpCiAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjogcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5CmluZGV4IDUzZjExYTguLjYxYmRhZTggMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfbG9jay5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHkKQEAgLTMwLDcgKzMwLDcgQEAKIGNsYXNzIExvY2tpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIGhvbWVEaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwgJ2RiX2hvbWUnKQorICAgICAgICBob21lRGlyID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgJ2RiX2hvbWUnKQogICAgICAgICBzZWxmLmhvbWVEaXIgPSBob21lRGlyCiAgICAgICAgIHRyeTogb3MubWtkaXIoaG9tZURpcikKICAgICAgICAgZXhjZXB0IG9zLmVycm9yOiBwYXNzCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X21pc2MucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X21pc2MucHkKaW5kZXggODhmNzAwYi4uNmIyZGYwNyAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9taXNjLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weQpAQCAtNCw2ICs0LDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGVtcGZpbGUKIAogdHJ5OgogICAgICMgRm9yIFB5dGhvbnMgdy9kaXN0dXRpbHMgcHlic2RkYgpAQCAtMTcsNyArMTgsNyBAQAogY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICcuZGInCi0gICAgICAgIGhvbWVEaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwgJ2RiX2hvbWUnKQorICAgICAgICBob21lRGlyID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgJ2RiX2hvbWUnKQogICAgICAgICBzZWxmLmhvbWVEaXIgPSBob21lRGlyCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG9zLm1rZGlyKGhvbWVEaXIpCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3JlY25vLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weQppbmRleCBlMzI1YWFjLi4zNTM5OWI1IDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3JlY25vLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHkKQEAgLTIwMywxMCArMjAzLDEwIEBACiAgICAgICAgIGp1c3QgYSBsaW5lIGluIHRoZSBmaWxlLCBidXQgeW91IGNhbiBzZXQgYSBkaWZmZXJlbnQgcmVjb3JkIGRlbGltaXRlcgogICAgICAgICBpZiBuZWVkZWQuCiAgICAgICAgICIiIgotICAgICAgICBzb3VyY2UgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYl9ob21lL3Rlc3RfcmVjbm8udHh0JykKLSAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoJ2RiX2hvbWUnKToKLSAgICAgICAgICAgIG9zLm1rZGlyKCdkYl9ob21lJykKKyAgICAgICAgaG9tZURpciA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICdkYl9ob21lJykKKyAgICAgICAgc291cmNlID0gb3MucGF0aC5qb2luKGhvbWVEaXIsICd0ZXN0X3JlY25vLnR4dCcpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGhvbWVEaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoaG9tZURpcikKICAgICAgICAgZiA9IG9wZW4oc291cmNlLCAndycpICMgY3JlYXRlIHRoZSBmaWxlCiAgICAgICAgIGYuY2xvc2UoKQogCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CmluZGV4IDY5NDJhYTIuLmJmMTlkMjEgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBkYnV0aWxzLl9kZWFkbG9ja19WZXJib3NlRmlsZSA9IHN5cy5zdGRvdXQKIAotICAgICAgICBob21lRGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICdkYl9ob21lJykKKyAgICAgICAgaG9tZURpciA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICdkYl9ob21lJykKICAgICAgICAgc2VsZi5ob21lRGlyID0gaG9tZURpcgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBvcy5ta2Rpcihob21lRGlyKQpkaWZmIC0tZ2l0IGEvTGliL2Nvb2tpZWxpYi5weSBiL0xpYi9jb29raWVsaWIucHkKaW5kZXggZThmZWUwZS4uY2UwMzdiMCAxMDA2NDQKLS0tIGEvTGliL2Nvb2tpZWxpYi5weQorKysgYi9MaWIvY29va2llbGliLnB5CkBAIC0xMzE2LDI2ICsxMzE2LDI4IEBACiAgICAgICAgICIiIgogICAgICAgICBfZGVidWcoImFkZF9jb29raWVfaGVhZGVyIikKICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CiAKLSAgICAgICAgc2VsZi5fcG9saWN5Ll9ub3cgPSBzZWxmLl9ub3cgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgICAgIHNlbGYuX3BvbGljeS5fbm93ID0gc2VsZi5fbm93ID0gaW50KHRpbWUudGltZSgpKQogCi0gICAgICAgIGNvb2tpZXMgPSBzZWxmLl9jb29raWVzX2Zvcl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgIGNvb2tpZXMgPSBzZWxmLl9jb29raWVzX2Zvcl9yZXF1ZXN0KHJlcXVlc3QpCiAKLSAgICAgICAgYXR0cnMgPSBzZWxmLl9jb29raWVfYXR0cnMoY29va2llcykKLSAgICAgICAgaWYgYXR0cnM6Ci0gICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCJDb29raWUiKToKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAotICAgICAgICAgICAgICAgICAgICAiQ29va2llIiwgIjsgIi5qb2luKGF0dHJzKSkKKyAgICAgICAgICAgYXR0cnMgPSBzZWxmLl9jb29raWVfYXR0cnMoY29va2llcykKKyAgICAgICAgICAgaWYgYXR0cnM6CisgICAgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCJDb29raWUiKToKKyAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAiQ29va2llIiwgIjsgIi5qb2luKGF0dHJzKSkKIAotICAgICAgICAjIGlmIG5lY2Vzc2FyeSwgYWR2ZXJ0aXNlIHRoYXQgd2Uga25vdyBSRkMgMjk2NQotICAgICAgICBpZiAoc2VsZi5fcG9saWN5LnJmYzI5NjUgYW5kIG5vdCBzZWxmLl9wb2xpY3kuaGlkZV9jb29raWUyIGFuZAotICAgICAgICAgICAgbm90IHJlcXVlc3QuaGFzX2hlYWRlcigiQ29va2llMiIpKToKLSAgICAgICAgICAgIGZvciBjb29raWUgaW4gY29va2llczoKLSAgICAgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiAhPSAxOgotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJDb29raWUyIiwgJyRWZXJzaW9uPSIxIicpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAjIGlmIG5lY2Vzc2FyeSwgYWR2ZXJ0aXNlIHRoYXQgd2Uga25vdyBSRkMgMjk2NQorICAgICAgICAgICBpZiAoc2VsZi5fcG9saWN5LnJmYzI5NjUgYW5kIG5vdCBzZWxmLl9wb2xpY3kuaGlkZV9jb29raWUyIGFuZAorICAgICAgICAgICAgICAgbm90IHJlcXVlc3QuaGFzX2hlYWRlcigiQ29va2llMiIpKToKKyAgICAgICAgICAgICAgIGZvciBjb29raWUgaW4gY29va2llczoKKyAgICAgICAgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiAhPSAxOgorICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJDb29raWUyIiwgJyRWZXJzaW9uPSIxIicpCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQogCiAgICAgICAgIHNlbGYuY2xlYXJfZXhwaXJlZF9jb29raWVzKCkKIApAQCAtMTYwMiwxMiArMTYwNCwxNSBAQAogICAgIGRlZiBzZXRfY29va2llX2lmX29rKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CiAgICAgICAgICIiIlNldCBhIGNvb2tpZSBpZiBwb2xpY3kgc2F5cyBpdCdzIE9LIHRvIGRvIHNvLiIiIgogICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCi0gICAgICAgIHNlbGYuX3BvbGljeS5fbm93ID0gc2VsZi5fbm93ID0gaW50KHRpbWUudGltZSgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9wb2xpY3kuX25vdyA9IHNlbGYuX25vdyA9IGludCh0aW1lLnRpbWUoKSkKIAotICAgICAgICBpZiBzZWxmLl9wb2xpY3kuc2V0X29rKGNvb2tpZSwgcmVxdWVzdCk6Ci0gICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29va2llKQorICAgICAgICAgICAgaWYgc2VsZi5fcG9saWN5LnNldF9vayhjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjb29raWUpCisgICAgICAgICAKIAotICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCiAKICAgICBkZWYgc2V0X2Nvb2tpZShzZWxmLCBjb29raWUpOgogICAgICAgICAiIiJTZXQgYSBjb29raWUsIHdpdGhvdXQgY2hlY2tpbmcgd2hldGhlciBvciBub3QgaXQgc2hvdWxkIGJlIHNldC4iIiIKQEAgLTE2MjYsMTMgKzE2MzEsMTUgQEAKICAgICAgICAgIiIiRXh0cmFjdCBjb29raWVzIGZyb20gcmVzcG9uc2UsIHdoZXJlIGFsbG93YWJsZSBnaXZlbiB0aGUgcmVxdWVzdC4iIiIKICAgICAgICAgX2RlYnVnKCJleHRyYWN0X2Nvb2tpZXM6ICVzIiwgcmVzcG9uc2UuaW5mbygpKQogICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCi0gICAgICAgIHNlbGYuX3BvbGljeS5fbm93ID0gc2VsZi5fbm93ID0gaW50KHRpbWUudGltZSgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgIHNlbGYuX3BvbGljeS5fbm93ID0gc2VsZi5fbm93ID0gaW50KHRpbWUudGltZSgpKQogCi0gICAgICAgIGZvciBjb29raWUgaW4gc2VsZi5tYWtlX2Nvb2tpZXMocmVzcG9uc2UsIHJlcXVlc3QpOgotICAgICAgICAgICAgaWYgc2VsZi5fcG9saWN5LnNldF9vayhjb29raWUsIHJlcXVlc3QpOgotICAgICAgICAgICAgICAgIF9kZWJ1ZygiIHNldHRpbmcgY29va2llOiAlcyIsIGNvb2tpZSkKLSAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29va2llKQotICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgIGZvciBjb29raWUgaW4gc2VsZi5tYWtlX2Nvb2tpZXMocmVzcG9uc2UsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgaWYgc2VsZi5fcG9saWN5LnNldF9vayhjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiIHNldHRpbmcgY29va2llOiAlcyIsIGNvb2tpZSkKKyAgICAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29va2llKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCiAKICAgICBkZWYgY2xlYXIoc2VsZiwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSwgbmFtZT1Ob25lKToKICAgICAgICAgIiIiQ2xlYXIgc29tZSBjb29raWVzLgpAQCAtMTY2OSwxMCArMTY3NiwxMiBAQAogCiAgICAgICAgICIiIgogICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCi0gICAgICAgIGZvciBjb29raWUgaW4gc2VsZjoKLSAgICAgICAgICAgIGlmIGNvb2tpZS5kaXNjYXJkOgotICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5uYW1lKQotICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOgorICAgICAgICAgICAgICAgaWYgY29va2llLmRpc2NhcmQ6CisgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhcihjb29raWUuZG9tYWluLCBjb29raWUucGF0aCwgY29va2llLm5hbWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKIAogICAgIGRlZiBjbGVhcl9leHBpcmVkX2Nvb2tpZXMoc2VsZik6CiAgICAgICAgICIiIkRpc2NhcmQgYWxsIGV4cGlyZWQgY29va2llcy4KQEAgLTE2ODUsMTEgKzE2OTQsMTMgQEAKIAogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQotICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQotICAgICAgICBmb3IgY29va2llIGluIHNlbGY6Ci0gICAgICAgICAgICBpZiBjb29raWUuaXNfZXhwaXJlZChub3cpOgotICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5uYW1lKQotICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOgorICAgICAgICAgICAgICAgaWYgY29va2llLmlzX2V4cGlyZWQobm93KToKKyAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUubmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQogCiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gZGVlcHZhbHVlcyhzZWxmLl9jb29raWVzKQpAQCAtMTc2MSwxNiArMTc3MiwxOCBAQAogICAgICAgICAgICAgZWxzZTogcmFpc2UgVmFsdWVFcnJvcihNSVNTSU5HX0ZJTEVOQU1FX1RFWFQpCiAKICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQotCi0gICAgICAgIG9sZF9zdGF0ZSA9IGNvcHkuZGVlcGNvcHkoc2VsZi5fY29va2llcykKLSAgICAgICAgc2VsZi5fY29va2llcyA9IHt9CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYubG9hZChmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQsIGlnbm9yZV9leHBpcmVzKQotICAgICAgICBleGNlcHQgKExvYWRFcnJvciwgSU9FcnJvcik6Ci0gICAgICAgICAgICBzZWxmLl9jb29raWVzID0gb2xkX3N0YXRlCi0gICAgICAgICAgICByYWlzZQogCi0gICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgb2xkX3N0YXRlID0gY29weS5kZWVwY29weShzZWxmLl9jb29raWVzKQorICAgICAgICAgICBzZWxmLl9jb29raWVzID0ge30KKyAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgc2VsZi5sb2FkKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpCisgICAgICAgICAgIGV4Y2VwdCAoTG9hZEVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXMgPSBvbGRfc3RhdGUKKyAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQogCiBmcm9tIF9MV1BDb29raWVKYXIgaW1wb3J0IExXUENvb2tpZUphciwgbHdwX2Nvb2tpZV9zdHIKIGZyb20gX01vemlsbGFDb29raWVKYXIgaW1wb3J0IE1vemlsbGFDb29raWVKYXIKZGlmZiAtLWdpdCBhL0xpYi9kaWZmbGliLnB5IGIvTGliL2RpZmZsaWIucHkKaW5kZXggNDA4MDc5Yi4uODMxODQwZCAxMDA2NDQKLS0tIGEvTGliL2RpZmZsaWIucHkKKysrIGIvTGliL2RpZmZsaWIucHkKQEAgLTEzMTAsNyArMTMxMCw3IEBACiAKIGRlZiBfbWRpZmYoZnJvbWxpbmVzLCB0b2xpbmVzLCBjb250ZXh0PU5vbmUsIGxpbmVqdW5rPU5vbmUsCiAgICAgICAgICAgIGNoYXJqdW5rPUlTX0NIQVJBQ1RFUl9KVU5LKToKLSAgICAiIiJSZXR1cm5zIGdlbmVyYXRvciB5aWVsZGluZyBtYXJrZWQgdXAgZnJvbS90byBzaWRlIGJ5IHNpZGUgZGlmZmVyZW5jZXMuCisgICAgciIiIlJldHVybnMgZ2VuZXJhdG9yIHlpZWxkaW5nIG1hcmtlZCB1cCBmcm9tL3RvIHNpZGUgYnkgc2lkZSBkaWZmZXJlbmNlcy4KIAogICAgIEFyZ3VtZW50czoKICAgICBmcm9tbGluZXMgLS0gbGlzdCBvZiB0ZXh0IGxpbmVzIHRvIGNvbXBhcmVkIHRvIHRvbGluZXMKZGlmZiAtLWdpdCBhL0xpYi9kdW1iZGJtLnB5IGIvTGliL2R1bWJkYm0ucHkKaW5kZXggZTAwZDllOC4uZWUyZjM5ZSAxMDA2NDQKLS0tIGEvTGliL2R1bWJkYm0ucHkKKysrIGIvTGliL2R1bWJkYm0ucHkKQEAgLTY4LDcgKzY4LDggQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RhdGZpbGUsICdyJykKICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBmID0gX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3cnLCBzZWxmLl9tb2RlKQorICAgICAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RhdGZpbGUsICd3JykKKyAgICAgICAgICAgIHNlbGYuX2NobW9kKHNlbGYuX2RhdGZpbGUpCiAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBzZWxmLl91cGRhdGUoKQogCkBAIC0xMDYsNyArMTA3LDggQEAKICAgICAgICAgZXhjZXB0IHNlbGYuX29zLmVycm9yOgogICAgICAgICAgICAgcGFzcwogCi0gICAgICAgIGYgPSBzZWxmLl9vcGVuKHNlbGYuX2RpcmZpbGUsICd3Jywgc2VsZi5fbW9kZSkKKyAgICAgICAgZiA9IHNlbGYuX29wZW4oc2VsZi5fZGlyZmlsZSwgJ3cnKQorICAgICAgICBzZWxmLl9jaG1vZChzZWxmLl9kaXJmaWxlKQogICAgICAgICBmb3Iga2V5LCBwb3NfYW5kX3Npel9wYWlyIGluIHNlbGYuX2luZGV4Lml0ZXJpdGVtcygpOgogICAgICAgICAgICAgZi53cml0ZSgiJXIsICVyXG4iICUgKGtleSwgcG9zX2FuZF9zaXpfcGFpcikpCiAgICAgICAgIGYuY2xvc2UoKQpAQCAtMTUyLDcgKzE1NCw4IEBACiAgICAgIyB0aGUgaW4tbWVtb3J5IGluZGV4IGRpY3QsIGFuZCBhcHBlbmQgb25lIHRvIHRoZSBkaXJlY3RvcnkgZmlsZS4KICAgICBkZWYgX2FkZGtleShzZWxmLCBrZXksIHBvc19hbmRfc2l6X3BhaXIpOgogICAgICAgICBzZWxmLl9pbmRleFtrZXldID0gcG9zX2FuZF9zaXpfcGFpcgotICAgICAgICBmID0gX29wZW4oc2VsZi5fZGlyZmlsZSwgJ2EnLCBzZWxmLl9tb2RlKQorICAgICAgICBmID0gX29wZW4oc2VsZi5fZGlyZmlsZSwgJ2EnKQorICAgICAgICBzZWxmLl9jaG1vZChzZWxmLl9kaXJmaWxlKQogICAgICAgICBmLndyaXRlKCIlciwgJXJcbiIgJSAoa2V5LCBwb3NfYW5kX3Npel9wYWlyKSkKICAgICAgICAgZi5jbG9zZSgpCiAKQEAgLTIxMSw2ICsyMTQsOSBAQAogCiAgICAgX19kZWxfXyA9IGNsb3NlCiAKKyAgICBkZWYgX2NobW9kIChzZWxmLCBmaWxlKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9vcywgJ2NobW9kJyk6CisgICAgICAgICAgICBzZWxmLl9vcy5jaG1vZChmaWxlLCBzZWxmLl9tb2RlKQogCiAKIGRlZiBvcGVuKGZpbGUsIGZsYWc9Tm9uZSwgbW9kZT0wNjY2KToKQEAgLTIyNyw0ICsyMzMsMTUgQEAKIAogICAgICIiIgogICAgICMgZmxhZyBhcmd1bWVudCBpcyBjdXJyZW50bHkgaWdub3JlZAorCisgICAgIyBNb2RpZnkgbW9kZSBkZXBlbmRpbmcgb24gdGhlIHVtYXNrCisgICAgdHJ5OgorICAgICAgICB1bSA9IF9vcy51bWFzaygwKQorICAgICAgICBfb3MudW1hc2sodW0pCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyBUdXJuIG9mZiBhbnkgYml0cyB0aGF0IGFyZSBzZXQgaW4gdGhlIHVtYXNrCisgICAgICAgIG1vZGUgPSBtb2RlICYgKH51bSkKKyAgICAgICAgCiAgICAgcmV0dXJuIF9EYXRhYmFzZShmaWxlLCBtb2RlKQpkaWZmIC0tZ2l0IGEvTGliL2hlYXBxLnB5IGIvTGliL2hlYXBxLnB5CmluZGV4IDA0NzI1Y2QuLjc1M2MzYjcgMTAwNjQ0Ci0tLSBhL0xpYi9oZWFwcS5weQorKysgYi9MaWIvaGVhcHEucHkKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgICAgICAgICAnbnNtYWxsZXN0J10KIAogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZSwgcmVwZWF0LCBjb3VudCwgaW1hcCwgaXppcCwgdGVlCi1mcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCitmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyLCBuZWcKIGltcG9ydCBiaXNlY3QKIAogZGVmIGhlYXBwdXNoKGhlYXAsIGl0ZW0pOgpAQCAtMzE1LDggKzMxNSw2IEBACiAKICAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl0KICAgICAiIiIKLSAgICBpZiBrZXkgaXMgTm9uZToKLSAgICAgICAgcmV0dXJuIF9uc21hbGxlc3QobiwgaXRlcmFibGUpCiAgICAgaW4xLCBpbjIgPSB0ZWUoaXRlcmFibGUpCiAgICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBjb3VudCgpLCBpbjIpICAgICAgICAgICAgICAgICAjIGRlY29yYXRlCiAgICAgcmVzdWx0ID0gX25zbWFsbGVzdChuLCBpdCkKQEAgLTMyOCwxMCArMzI2LDggQEAKIAogICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dCiAgICAgIiIiCi0gICAgaWYga2V5IGlzIE5vbmU6Ci0gICAgICAgIHJldHVybiBfbmxhcmdlc3QobiwgaXRlcmFibGUpCiAgICAgaW4xLCBpbjIgPSB0ZWUoaXRlcmFibGUpCi0gICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBjb3VudCgpLCBpbjIpICAgICAgICAgICAgICAgICAjIGRlY29yYXRlCisgICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBpbWFwKG5lZywgY291bnQoKSksIGluMikgICAgICAjIGRlY29yYXRlCiAgICAgcmVzdWx0ID0gX25sYXJnZXN0KG4sIGl0KQogICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCiAKZGlmZiAtLWdpdCBhL0xpYi9obWFjLnB5IGIvTGliL2htYWMucHkKaW5kZXggNDFkNmM2Yy4uODhjM2ZkNSAxMDA2NDQKLS0tIGEvTGliL2htYWMucHkKKysrIGIvTGliL2htYWMucHkKQEAgLTMsMTMgKzMsMTEgQEAKIEltcGxlbWVudHMgdGhlIEhNQUMgYWxnb3JpdGhtIGFzIGRlc2NyaWJlZCBieSBSRkMgMjEwNC4KICIiIgogCi1kZWYgX3N0cnhvcihzMSwgczIpOgotICAgICIiIlV0aWxpdHkgbWV0aG9kLiBYT1IgdGhlIHR3byBzdHJpbmdzIHMxIGFuZCBzMiAobXVzdCBoYXZlIHNhbWUgbGVuZ3RoKS4KLSAgICAiIiIKLSAgICByZXR1cm4gIiIuam9pbihtYXAobGFtYmRhIHgsIHk6IGNocihvcmQoeCkgXiBvcmQoeSkpLCBzMSwgczIpKQordHJhbnNfNUMgPSAiIi5qb2luIChbY2hyICh4IF4gMHg1QykgZm9yIHggaW4geHJhbmdlKDI1NildKQordHJhbnNfMzYgPSAiIi5qb2luIChbY2hyICh4IF4gMHgzNikgZm9yIHggaW4geHJhbmdlKDI1NildKQogCiAjIFRoZSBzaXplIG9mIHRoZSBkaWdlc3RzIHJldHVybmVkIGJ5IEhNQUMgZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZwotIyBoYXNoaW5nIG1vZHVsZSB1c2VkLgorIyBoYXNoaW5nIG1vZHVsZSB1c2VkLiAgVXNlIGRpZ2VzdF9zaXplIGZyb20gdGhlIGluc3RhbmNlIG9mIEhNQUMgaW5zdGVhZC4KIGRpZ2VzdF9zaXplID0gTm9uZQogCiAjIEEgdW5pcXVlIG9iamVjdCBwYXNzZWQgYnkgSE1BQy5jb3B5KCkgdG8gdGhlIEhNQUMgY29uc3RydWN0b3IsIGluIG9yZGVyCkBAIC0yMiw2ICsyMCw3IEBACiAKICAgICBUaGlzIHN1cHBvcnRzIHRoZSBBUEkgZm9yIENyeXB0b2dyYXBoaWMgSGFzaCBGdW5jdGlvbnMgKFBFUCAyNDcpLgogICAgICIiIgorICAgIGJsb2Nrc2l6ZSA9IDY0ICAjIDUxMi1iaXQgSE1BQzsgY2FuIGJlIGNoYW5nZWQgaW4gc3ViY2xhc3Nlcy4KIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIG1zZyA9IE5vbmUsIGRpZ2VzdG1vZCA9IE5vbmUpOgogICAgICAgICAiIiJDcmVhdGUgYSBuZXcgSE1BQyBvYmplY3QuCkBAIC00OSwxNiArNDgsMTMgQEAKICAgICAgICAgc2VsZi5pbm5lciA9IHNlbGYuZGlnZXN0X2NvbnMoKQogICAgICAgICBzZWxmLmRpZ2VzdF9zaXplID0gc2VsZi5pbm5lci5kaWdlc3Rfc2l6ZQogCi0gICAgICAgIGJsb2Nrc2l6ZSA9IDY0Ci0gICAgICAgIGlwYWQgPSAiXHgzNiIgKiBibG9ja3NpemUKLSAgICAgICAgb3BhZCA9ICJceDVDIiAqIGJsb2Nrc2l6ZQotCisgICAgICAgIGJsb2Nrc2l6ZSA9IHNlbGYuYmxvY2tzaXplCiAgICAgICAgIGlmIGxlbihrZXkpID4gYmxvY2tzaXplOgogICAgICAgICAgICAga2V5ID0gc2VsZi5kaWdlc3RfY29ucyhrZXkpLmRpZ2VzdCgpCiAKICAgICAgICAga2V5ID0ga2V5ICsgY2hyKDApICogKGJsb2Nrc2l6ZSAtIGxlbihrZXkpKQotICAgICAgICBzZWxmLm91dGVyLnVwZGF0ZShfc3RyeG9yKGtleSwgb3BhZCkpCi0gICAgICAgIHNlbGYuaW5uZXIudXBkYXRlKF9zdHJ4b3Ioa2V5LCBpcGFkKSkKKyAgICAgICAgc2VsZi5vdXRlci51cGRhdGUoa2V5LnRyYW5zbGF0ZSh0cmFuc181QykpCisgICAgICAgIHNlbGYuaW5uZXIudXBkYXRlKGtleS50cmFuc2xhdGUodHJhbnNfMzYpKQogICAgICAgICBpZiBtc2cgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzZWxmLnVwZGF0ZShtc2cpCiAKQEAgLTc1LDEzICs3MSwyMiBAQAogCiAgICAgICAgIEFuIHVwZGF0ZSB0byB0aGlzIGNvcHkgd29uJ3QgYWZmZWN0IHRoZSBvcmlnaW5hbCBvYmplY3QuCiAgICAgICAgICIiIgotICAgICAgICBvdGhlciA9IEhNQUMoX3NlY3JldF9iYWNrZG9vcl9rZXkpCisgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18oX3NlY3JldF9iYWNrZG9vcl9rZXkpCiAgICAgICAgIG90aGVyLmRpZ2VzdF9jb25zID0gc2VsZi5kaWdlc3RfY29ucwogICAgICAgICBvdGhlci5kaWdlc3Rfc2l6ZSA9IHNlbGYuZGlnZXN0X3NpemUKICAgICAgICAgb3RoZXIuaW5uZXIgPSBzZWxmLmlubmVyLmNvcHkoKQogICAgICAgICBvdGhlci5vdXRlciA9IHNlbGYub3V0ZXIuY29weSgpCiAgICAgICAgIHJldHVybiBvdGhlcgogCisgICAgZGVmIF9jdXJyZW50KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBoYXNoIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuCisKKyAgICAgICAgVG8gYmUgdXNlZCBvbmx5IGludGVybmFsbHkgd2l0aCBkaWdlc3QoKSBhbmQgaGV4ZGlnZXN0KCkuCisgICAgICAgICIiIgorICAgICAgICBoID0gc2VsZi5vdXRlci5jb3B5KCkKKyAgICAgICAgaC51cGRhdGUoc2VsZi5pbm5lci5kaWdlc3QoKSkKKyAgICAgICAgcmV0dXJuIGgKKwogICAgIGRlZiBkaWdlc3Qoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgaGFzaCB2YWx1ZSBvZiB0aGlzIGhhc2hpbmcgb2JqZWN0LgogCkBAIC04OSwxNSArOTQsMTQgQEAKICAgICAgICAgbm90IGFsdGVyZWQgaW4gYW55IHdheSBieSB0aGlzIGZ1bmN0aW9uOyB5b3UgY2FuIGNvbnRpbnVlCiAgICAgICAgIHVwZGF0aW5nIHRoZSBvYmplY3QgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAiIiIKLSAgICAgICAgaCA9IHNlbGYub3V0ZXIuY29weSgpCi0gICAgICAgIGgudXBkYXRlKHNlbGYuaW5uZXIuZGlnZXN0KCkpCisgICAgICAgIGggPSBzZWxmLl9jdXJyZW50KCkKICAgICAgICAgcmV0dXJuIGguZGlnZXN0KCkKIAogICAgIGRlZiBoZXhkaWdlc3Qoc2VsZik6CiAgICAgICAgICIiIkxpa2UgZGlnZXN0KCksIGJ1dCByZXR1cm5zIGEgc3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cyBpbnN0ZWFkLgogICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuICIiLmpvaW4oW2hleChvcmQoeCkpWzI6XS56ZmlsbCgyKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gdHVwbGUoc2VsZi5kaWdlc3QoKSldKQorICAgICAgICBoID0gc2VsZi5fY3VycmVudCgpCisgICAgICAgIHJldHVybiBoLmhleGRpZ2VzdCgpCiAKIGRlZiBuZXcoa2V5LCBtc2cgPSBOb25lLCBkaWdlc3Rtb2QgPSBOb25lKToKICAgICAiIiJDcmVhdGUgYSBuZXcgaGFzaGluZyBvYmplY3QgYW5kIHJldHVybiBpdC4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weSBiL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weQppbmRleCA4YmVkMDM0Li43ZjhhZGFmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlV2luZG93LnB5CkBAIC0xMTgsOCArMTE4LDExIEBACiAgICAgICAgICAgICBpID0gMAogICAgICAgICAgICAgd2hpbGUgaSA8IGxlbihsdHMpIGFuZCBpIDwgbGVuKHNlbHN0YXJ0KSBhbmQgbHRzW2ldID09IHNlbHN0YXJ0W2ldOgogICAgICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICAgICAgd2hpbGUgY3Vyc2VsID4gMCBhbmQgc2Vsc3RhcnRbOmldIDw9IHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsLTFdOgorICAgICAgICAgICAgcHJldmlvdXNfY29tcGxldGlvbiA9IHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsIC0gMV0KKyAgICAgICAgICAgIHdoaWxlIGN1cnNlbCA+IDAgYW5kIHNlbHN0YXJ0WzppXSA8PSBwcmV2aW91c19jb21wbGV0aW9uOgogICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgIGlmIHNlbHN0YXJ0ID09IHByZXZpb3VzX2NvbXBsZXRpb246CisgICAgICAgICAgICAgICAgICAgIGJyZWFrICAjIG1heWJlIHdlIGhhdmUgYSBkdXBsaWNhdGU/CiAgICAgICAgICAgICBuZXdzdGFydCA9IHNlbHN0YXJ0WzppXQogICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQobmV3c3RhcnQpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL05FV1MudHh0IGIvTGliL2lkbGVsaWIvTkVXUy50eHQKaW5kZXggNDNlNWI0NS4uNWY3M2E2OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvTkVXUy50eHQKKysrIGIvTGliL2lkbGVsaWIvTkVXUy50eHQKQEAgLTMsOSArMywxNCBAQAogCiAqUmVsZWFzZSBkYXRlOiBYWC1YWFgtMjAwWCoKIAorLSBBdm9pZCBoYW5nIHdoZW4gZW5jb3VudGVyaW5nIGEgZHVwbGljYXRlIGluIGEgY29tcGxldGlvbiBsaXN0LiBCdWcgMTU3MTExMi4KKwogLSBQYXRjaCAjMTM2Mjk3NTogUmV3b3JrIENvZGVDb250ZXh0IGluZGVudGF0aW9uIGFsZ29yaXRobSB0bwogICBhdm9pZCBoYXJkLWNvZGluZyBwaXhlbCB3aWR0aHMuCiAKKy0gQnVnICM4MTMzNDI6IFN0YXJ0IHRoZSBJRExFIHN1YnByb2Nlc3Mgd2l0aCAtUW5ldyBpZiB0aGUgcGFyZW50CisgIGlzIHN0YXJ0ZWQgd2l0aCB0aGF0IG9wdGlvbi4KKwogLSBTb21lIHN5bnRheCBlcnJvcnMgd2VyZSBiZWluZyBjYXVnaHQgYnkgdG9rZW5pemUgZHVyaW5nIHRoZSB0YWJuYW5ueQogICBjaGVjaywgcmVzdWx0aW5nIGluIG9ic2N1cmUgZXJyb3IgbWVzc2FnZXMuICBEbyB0aGUgc3ludGF4IGNoZWNrCiAgIGZpcnN0LiAgQnVnIDE1NjI3MTYsIDE1NjI3MTkKQEAgLTE0LDYgKzE5LDEyIEBACiAgIHRoZSBQeXRob24gcmVsZWFzZSBvZiB3aGljaCBpdCdzIGEgcGFydC4KIAogCitXaGF0J3MgTmV3IGluIElETEUgMS4yPworPT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTktU0VQLTIwMDYqCisKKwogV2hhdCdzIE5ldyBpbiBJRExFIDEuMmMxPwogPT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC00NCw2ICs1NSwxMyBAQAogCiAqUmVsZWFzZSBkYXRlOiAwMy1BVUctMjAwNioKIAorLSBCdWcgIzE1MjU4MTc6IERvbid0IHRydW5jYXRlIHNob3J0IGxpbmVzIGluIElETEUncyB0b29sIHRpcHMuCisKKy0gQnVnICMxNTE3OTkwOiBJRExFIGtleWJpbmRpbmdzIG9uIE1hY09TIFggbm93IHdvcmsgY29ycmVjdGx5CisKKy0gQnVnICMxNTE3OTk2OiBJRExFIG5vdyBsb25nZXIgc2hvd3MgdGhlIGRlZmF1bHQgVGsgbWVudSB3aGVuIGEKKyAgcGF0aCBicm93c2VyLCBjbGFzcyBicm93c2VyIG9yIGRlYnVnZ2VyIGlzIHRoZSBmcm9udG1vc3Qgd2luZG93IG9uIE1hY09TIFgKKwogLSBFZGl0b3JXaW5kb3cudGVzdCgpIHdhcyBmYWlsaW5nLiAgQnVnIDE0MTc1OTgKIAogLSBFZGl0b3JXaW5kb3cgZmFpbGVkIHdoZW4gdXNlZCBzdGFuZC1hbG9uZSBpZiBzeXMucHMxIG5vdCBzZXQuCkBAIC04MCw2ICs5OCw4IEBACiAKICpSZWxlYXNlIGRhdGU6IDA1LUFQUi0yMDA2KgogCistIFBhdGNoICMxMTYyODI1OiBTdXBwb3J0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIElETEUgd2luZG93IHRpdGxlcy4KKwogLSBTb3VyY2UgZmlsZSBmLmZsdXNoKCkgYWZ0ZXIgd3JpdGluZzsgdHJ5aW5nIHRvIGF2b2lkIGxvc3NhZ2UgaWYgdXNlcgogICBraWxscyBHVUkuCiAKZGlmZiAtLWdpdCBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5IGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKaW5kZXggYjU3YTlhZi4uNjE1ZGNjNyAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKKysrIGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKQEAgLTQxLDggKzQxLDggQEAKIAogX19hdXRob3JfXyAgPSAiVmluYXkgU2FqaXAgPHZpbmF5X3NhamlwQHJlZC1kb3ZlLmNvbT4iCiBfX3N0YXR1c19fICA9ICJwcm9kdWN0aW9uIgotX192ZXJzaW9uX18gPSAiMC40LjkuOSIKLV9fZGF0ZV9fICAgID0gIjA2IEZlYnJ1YXJ5IDIwMDYiCitfX3ZlcnNpb25fXyA9ICIwLjUuMC4wIgorX19kYXRlX18gICAgPSAiMDggSmFudWFyeSAyMDA3IgogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjICAgTWlzY2VsbGFuZW91cyBtb2R1bGUgZGF0YQpAQCAtMjQzLDcgKzI0Myw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGhuYW1lKQogICAgICAgICAgICAgc2VsZi5tb2R1bGUgPSBvcy5wYXRoLnNwbGl0ZXh0KHNlbGYuZmlsZW5hbWUpWzBdCi0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBwYXRobmFtZQogICAgICAgICAgICAgc2VsZi5tb2R1bGUgPSAiVW5rbm93biBtb2R1bGUiCiAgICAgICAgIHNlbGYuZXhjX2luZm8gPSBleGNfaW5mbwpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQppbmRleCAxN2VjYThhLi44Mjg5NmFkIDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQorKysgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc2VsZi5tYWtlU29ja2V0KCkKICAgICAgICAgICAgICAgICBzZWxmLnJldHJ5VGltZSA9IE5vbmUgIyBuZXh0IHRpbWUsIG5vIGRlbGF5IGJlZm9yZSB0cnlpbmcKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CiAgICAgICAgICAgICAgICAgI0NyZWF0aW9uIGZhaWxlZCwgc28gc2V0IHRoZSByZXRyeSB0aW1lIGFuZCByZXR1cm4uCiAgICAgICAgICAgICAgICAgaWYgc2VsZi5yZXRyeVRpbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXRyeVBlcmlvZCA9IHNlbGYucmV0cnlTdGFydApAQCAtNzM4LDcgKzczOCw3IEBACiAgICAgICAgICAgICBpbXBvcnQgc210cGxpYgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZyb20gZW1haWwuVXRpbHMgaW1wb3J0IGZvcm1hdGRhdGUKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgICBmb3JtYXRkYXRlID0gc2VsZi5kYXRlX3RpbWUKICAgICAgICAgICAgIHBvcnQgPSBzZWxmLm1haWxwb3J0CiAgICAgICAgICAgICBpZiBub3QgcG9ydDoKZGlmZiAtLWdpdCBhL0xpYi9tYWlsYm94LnB5IGIvTGliL21haWxib3gucHkKaW5kZXggMDg0MzQzMC4uOGQxZGY0YiAxMDA3NTUKLS0tIGEvTGliL21haWxib3gucHkKKysrIGIvTGliL21haWxib3gucHkKQEAgLTUxMCw2ICs1MTAsNyBAQAogICAgICAgICBzZWxmLl9uZXh0X2tleSA9IDAKICAgICAgICAgc2VsZi5fcGVuZGluZyA9IEZhbHNlICAgIyBObyBjaGFuZ2VzIHJlcXVpcmUgcmV3cml0aW5nIHRoZSBmaWxlLgogICAgICAgICBzZWxmLl9sb2NrZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9maWxlX2xlbmd0aCA9IE5vbmUgICAgICAgICMgVXNlZCB0byByZWNvcmQgbWFpbGJveCBzaXplCiAKICAgICBkZWYgYWRkKHNlbGYsIG1lc3NhZ2UpOgogICAgICAgICAiIiJBZGQgbWVzc2FnZSBhbmQgcmV0dXJuIGFzc2lnbmVkIGtleS4iIiIKQEAgLTU2Myw3ICs1NjQsMjEgQEAKICAgICAgICAgIiIiV3JpdGUgYW55IHBlbmRpbmcgY2hhbmdlcyB0byBkaXNrLiIiIgogICAgICAgICBpZiBub3Qgc2VsZi5fcGVuZGluZzoKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLl9sb29rdXAoKQorCisgICAgICAgICMgSW4gb3JkZXIgdG8gYmUgd3JpdGluZyBhbnl0aGluZyBvdXQgYXQgYWxsLCBzZWxmLl90b2MgbXVzdAorICAgICAgICAjIGFscmVhZHkgaGF2ZSBiZWVuIGdlbmVyYXRlZCAoYW5kIHByZXN1bWFibHkgaGFzIGJlZW4gbW9kaWZpZWQKKyAgICAgICAgIyBieSBhZGRpbmcgb3IgZGVsZXRpbmcgYW4gaXRlbSkuCisgICAgICAgIGFzc2VydCBzZWxmLl90b2MgaXMgbm90IE5vbmUKKyAgICAgICAgCisgICAgICAgICMgQ2hlY2sgbGVuZ3RoIG9mIHNlbGYuX2ZpbGU7IGlmIGl0J3MgY2hhbmdlZCwgc29tZSBvdGhlciBwcm9jZXNzCisgICAgICAgICMgaGFzIG1vZGlmaWVkIHRoZSBtYWlsYm94IHNpbmNlIHdlIHNjYW5uZWQgaXQuCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwLCAyKQorICAgICAgICBjdXJfbGVuID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgaWYgY3VyX2xlbiAhPSBzZWxmLl9maWxlX2xlbmd0aDoKKyAgICAgICAgICAgIHJhaXNlIEV4dGVybmFsQ2xhc2hFcnJvcignU2l6ZSBvZiBtYWlsYm94IGZpbGUgY2hhbmdlZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhleHBlY3RlZCAlaSwgZm91bmQgJWkpJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX2ZpbGVfbGVuZ3RoLCBjdXJfbGVuKSkKKyAgICAgICAgCiAgICAgICAgIG5ld19maWxlID0gX2NyZWF0ZV90ZW1wb3Jhcnkoc2VsZi5fcGF0aCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbmV3X3RvYyA9IHt9CkBAIC02MzksNiArNjU0LDcgQEAKICAgICAgICAgb2Zmc2V0cyA9IHNlbGYuX2luc3RhbGxfbWVzc2FnZShtZXNzYWdlKQogICAgICAgICBzZWxmLl9wb3N0X21lc3NhZ2VfaG9vayhzZWxmLl9maWxlKQogICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKKyAgICAgICAgc2VsZi5fZmlsZV9sZW5ndGggPSBzZWxmLl9maWxlLnRlbGwoKSAgIyBSZWNvcmQgY3VycmVudCBsZW5ndGggb2YgbWFpbGJveAogICAgICAgICByZXR1cm4gb2Zmc2V0cwogCiAKQEAgLTczMCw2ICs3NDYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIHNlbGYuX3RvYyA9IGRpY3QoZW51bWVyYXRlKHppcChzdGFydHMsIHN0b3BzKSkpCiAgICAgICAgIHNlbGYuX25leHRfa2V5ID0gbGVuKHNlbGYuX3RvYykKKyAgICAgICAgc2VsZi5fZmlsZV9sZW5ndGggPSBzZWxmLl9maWxlLnRlbGwoKQogCiAKIGNsYXNzIE1NREYoX21ib3hNTURGKToKQEAgLTc3Myw2ICs3OTAsOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIHNlbGYuX3RvYyA9IGRpY3QoZW51bWVyYXRlKHppcChzdGFydHMsIHN0b3BzKSkpCiAgICAgICAgIHNlbGYuX25leHRfa2V5ID0gbGVuKHNlbGYuX3RvYykKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKDAsIDIpCisgICAgICAgIHNlbGYuX2ZpbGVfbGVuZ3RoID0gc2VsZi5fZmlsZS50ZWxsKCkKIAogCiBjbGFzcyBNSChNYWlsYm94KToKQEAgLTExOTgsNyArMTIxNyw5IEBACiAgICAgICAgIHNlbGYuX3RvYyA9IGRpY3QoZW51bWVyYXRlKHppcChzdGFydHMsIHN0b3BzKSkpCiAgICAgICAgIHNlbGYuX2xhYmVscyA9IGRpY3QoZW51bWVyYXRlKGxhYmVsX2xpc3RzKSkKICAgICAgICAgc2VsZi5fbmV4dF9rZXkgPSBsZW4oc2VsZi5fdG9jKQotCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwLCAyKQorICAgICAgICBzZWxmLl9maWxlX2xlbmd0aCA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIAogICAgIGRlZiBfcHJlX21haWxib3hfaG9vayhzZWxmLCBmKToKICAgICAgICAgIiIiQ2FsbGVkIGJlZm9yZSB3cml0aW5nIHRoZSBtYWlsYm94IHRvIGZpbGUgZi4iIiIKICAgICAgICAgZi53cml0ZSgnQkFCWUwgT1BUSU9OUzolc1ZlcnNpb246IDUlc0xhYmVsczolcyVzXDAzNycgJQpAQCAtMTg4NCw3ICsxOTA1LDggQEAKIGRlZiBfc3luY19mbHVzaChmKToKICAgICAiIiJFbnN1cmUgY2hhbmdlcyB0byBmaWxlIGYgYXJlIHBoeXNpY2FsbHkgb24gZGlzay4iIiIKICAgICBmLmZsdXNoKCkKLSAgICBvcy5mc3luYyhmLmZpbGVubygpKQorICAgIGlmIGhhc2F0dHIob3MsICdmc3luYycpOgorICAgICAgICBvcy5mc3luYyhmLmZpbGVubygpKQogCiBkZWYgX3N5bmNfY2xvc2UoZik6CiAgICAgIiIiQ2xvc2UgZmlsZSBmLCBlbnN1cmluZyBhbGwgY2hhbmdlcyBhcmUgcGh5c2ljYWxseSBvbiBkaXNrLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3B0eS5weSBiL0xpYi9wdHkucHkKaW5kZXggODg5MTEzYy4uZDNlYjY0ZiAxMDA2NDQKLS0tIGEvTGliL3B0eS5weQorKysgYi9MaWIvcHR5LnB5CkBAIC0xMjEsNyArMTIxLDkgQEAKICAgICAgICAgIyBFeHBsaWNpdGx5IG9wZW4gdGhlIHR0eSB0byBtYWtlIGl0IGJlY29tZSBhIGNvbnRyb2xsaW5nIHR0eS4KICAgICAgICAgdG1wX2ZkID0gb3Mub3Blbihvcy50dHluYW1lKFNURE9VVF9GSUxFTk8pLCBvcy5PX1JEV1IpCiAgICAgICAgIG9zLmNsb3NlKHRtcF9mZCkKLQorICAgIGVsc2U6CisgICAgICAgIG9zLmNsb3NlKHNsYXZlX2ZkKQorICAgICAgICAKICAgICAjIFBhcmVudCBhbmQgY2hpbGQgcHJvY2Vzcy4KICAgICByZXR1cm4gcGlkLCBtYXN0ZXJfZmQKIApkaWZmIC0tZ2l0IGEvTGliL3B5ZG9jLnB5IGIvTGliL3B5ZG9jLnB5CmluZGV4IDM0NTlmYmUuLmQxYWIwMWMgMTAwNzU1Ci0tLSBhL0xpYi9weWRvYy5weQorKysgYi9MaWIvcHlkb2MucHkKQEAgLTE3NDEsNiArMTc0MSw5IEBACiBTb3JyeSwgdG9waWMgYW5kIGtleXdvcmQgZG9jdW1lbnRhdGlvbiBpcyBub3QgYXZhaWxhYmxlIGJlY2F1c2UgdGhlIFB5dGhvbgogSFRNTCBkb2N1bWVudGF0aW9uIGZpbGVzIGNvdWxkIG5vdCBiZSBmb3VuZC4gIElmIHlvdSBoYXZlIGluc3RhbGxlZCB0aGVtLAogcGxlYXNlIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUFlUSE9ORE9DUyB0byBpbmRpY2F0ZSB0aGVpciBsb2NhdGlvbi4KKworT24gdGhlIE1pY3Jvc29mdCBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW0sIHRoZSBmaWxlcyBjYW4gYmUgYnVpbHQgYnkKK3J1bm5pbmcgImhoIC1kZWNvbXBpbGUgLiBQeXRob25OTi5jaG0iIGluIHRoZSBDOlxQeXRob25OTlxEb2M+IGRpcmVjdG9yeS4KICcnJykKICAgICAgICAgICAgIHJldHVybgogICAgICAgICB0YXJnZXQgPSBzZWxmLnRvcGljcy5nZXQodG9waWMsIHNlbGYua2V5d29yZHMuZ2V0KHRvcGljKSkKZGlmZiAtLWdpdCBhL0xpYi9yYW5kb20ucHkgYi9MaWIvcmFuZG9tLnB5CmluZGV4IGFlMmQ0MzQuLmI4MGYxYTEgMTAwNjQ0Ci0tLSBhL0xpYi9yYW5kb20ucHkKKysrIGIvTGliL3JhbmRvbS5weQpAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpIgogCiAgICAgICAgIGlmIG4gPj0gbWF4d2lkdGg6Ci0gICAgICAgICAgICByZXR1cm4gaXN0YXJ0ICsgc2VsZi5fcmFuZGJlbG93KG4pCisgICAgICAgICAgICByZXR1cm4gaXN0YXJ0ICsgaXN0ZXAqc2VsZi5fcmFuZGJlbG93KG4pCiAgICAgICAgIHJldHVybiBpc3RhcnQgKyBpc3RlcCppbnQoc2VsZi5yYW5kb20oKSAqIG4pCiAKICAgICBkZWYgcmFuZGludChzZWxmLCBhLCBiKToKZGlmZiAtLWdpdCBhL0xpYi9zcmVfcGFyc2UucHkgYi9MaWIvc3JlX3BhcnNlLnB5CmluZGV4IDMxOWJmNDMuLmU2M2YyYWMgMTAwNjQ0Ci0tLSBhL0xpYi9zcmVfcGFyc2UucHkKKysrIGIvTGliL3NyZV9wYXJzZS5weQpAQCAtMTM0LDYgKzEzNCw4IEBACiAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KToKICAgICAgICAgZGVsIHNlbGYuZGF0YVtpbmRleF0KICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4LCBzbGljZSk6CisgICAgICAgICAgICByZXR1cm4gU3ViUGF0dGVybihzZWxmLnBhdHRlcm4sIHNlbGYuZGF0YVtpbmRleF0pCiAgICAgICAgIHJldHVybiBzZWxmLmRhdGFbaW5kZXhdCiAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBjb2RlKToKICAgICAgICAgc2VsZi5kYXRhW2luZGV4XSA9IGNvZGUKZGlmZiAtLWdpdCBhL0xpYi9zdWJwcm9jZXNzLnB5IGIvTGliL3N1YnByb2Nlc3MucHkKaW5kZXggNjhhYjA1ZS4uNjJiNzBiYSAxMDA2NDQKLS0tIGEvTGliL3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3N1YnByb2Nlc3MucHkKQEAgLTE2Niw3ICsxNjYsNyBAQAogY29tbXVuaWNhdGUoaW5wdXQ9Tm9uZSkKICAgICBJbnRlcmFjdCB3aXRoIHByb2Nlc3M6IFNlbmQgZGF0YSB0byBzdGRpbi4gIFJlYWQgZGF0YSBmcm9tIHN0ZG91dAogICAgIGFuZCBzdGRlcnIsIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuICBXYWl0IGZvciBwcm9jZXNzIHRvCi0gICAgdGVybWluYXRlLiAgVGhlIG9wdGlvbmFsIHN0ZGluIGFyZ3VtZW50IHNob3VsZCBiZSBhIHN0cmluZyB0byBiZQorICAgIHRlcm1pbmF0ZS4gIFRoZSBvcHRpb25hbCBpbnB1dCBhcmd1bWVudCBzaG91bGQgYmUgYSBzdHJpbmcgdG8gYmUKICAgICBzZW50IHRvIHRoZSBjaGlsZCBwcm9jZXNzLCBvciBOb25lLCBpZiBubyBkYXRhIHNob3VsZCBiZSBzZW50IHRvCiAgICAgdGhlIGNoaWxkLgogCkBAIC0xMDA1LDggKzEwMDUsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAjIENsb3NlIHBpcGUgZmRzLiAgTWFrZSBzdXJlIHdlIGRvbid0IGNsb3NlIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgICAgICMgZmQgbW9yZSB0aGFuIG9uY2UsIG9yIHN0YW5kYXJkIGZkcy4KLSAgICAgICAgICAgICAgICAgICAgZm9yIGZkIGluIHNldCgocDJjcmVhZCwgYzJwd3JpdGUsIGVycndyaXRlKSktc2V0KCgwLDEsMikpOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmQ6IG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgICAgICAgICBpZiBwMmNyZWFkIGFuZCBwMmNyZWFkIG5vdCBpbiAoMCwpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UocDJjcmVhZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgYzJwd3JpdGUgYW5kIGMycHdyaXRlIG5vdCBpbiAocDJjcmVhZCwgMSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShjMnB3cml0ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyd3JpdGUgYW5kIGVycndyaXRlIG5vdCBpbiAocDJjcmVhZCwgYzJwd3JpdGUsIDIpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJyd3JpdGUpCiAKICAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBhbGwgb3RoZXIgZmRzLCBpZiBhc2tlZCBmb3IKICAgICAgICAgICAgICAgICAgICAgaWYgY2xvc2VfZmRzOgpAQCAtMTEwOCw2ICsxMTEyLDcgQEAKICAgICAgICAgICAgICAgICByZWFkX3NldC5hcHBlbmQoc2VsZi5zdGRlcnIpCiAgICAgICAgICAgICAgICAgc3RkZXJyID0gW10KIAorICAgICAgICAgICAgaW5wdXRfb2Zmc2V0ID0gMAogICAgICAgICAgICAgd2hpbGUgcmVhZF9zZXQgb3Igd3JpdGVfc2V0OgogICAgICAgICAgICAgICAgIHJsaXN0LCB3bGlzdCwgeGxpc3QgPSBzZWxlY3Quc2VsZWN0KHJlYWRfc2V0LCB3cml0ZV9zZXQsIFtdKQogCkBAIC0xMTE1LDkgKzExMjAsOSBAQAogICAgICAgICAgICAgICAgICAgICAjIFdoZW4gc2VsZWN0IGhhcyBpbmRpY2F0ZWQgdGhhdCB0aGUgZmlsZSBpcyB3cml0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgIyB3ZSBjYW4gd3JpdGUgdXAgdG8gUElQRV9CVUYgYnl0ZXMgd2l0aG91dCByaXNrCiAgICAgICAgICAgICAgICAgICAgICMgYmxvY2tpbmcuICBQT1NJWCBkZWZpbmVzIFBJUEVfQlVGID49IDUxMgotICAgICAgICAgICAgICAgICAgICBieXRlc193cml0dGVuID0gb3Mud3JpdGUoc2VsZi5zdGRpbi5maWxlbm8oKSwgaW5wdXRbOjUxMl0pCi0gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXRbYnl0ZXNfd3JpdHRlbjpdCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9IG9zLndyaXRlKHNlbGYuc3RkaW4uZmlsZW5vKCksIGJ1ZmZlcihpbnB1dCwgaW5wdXRfb2Zmc2V0LCA1MTIpKQorICAgICAgICAgICAgICAgICAgICBpbnB1dF9vZmZzZXQgKz0gYnl0ZXNfd3JpdHRlbiAKKyAgICAgICAgICAgICAgICAgICAgaWYgaW5wdXRfb2Zmc2V0ID49IGxlbihpbnB1dCk6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3NldC5yZW1vdmUoc2VsZi5zdGRpbikKIApkaWZmIC0tZ2l0IGEvTGliL3RhcmZpbGUucHkgYi9MaWIvdGFyZmlsZS5weQppbmRleCAxNDU1M2E3Li4zZmZkZmYzIDEwMDY0NAotLS0gYS9MaWIvdGFyZmlsZS5weQorKysgYi9MaWIvdGFyZmlsZS5weQpAQCAtMTQ3LDcgKzE0NywxMCBAQAogICAgICMgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBlbmNvZGluZ3MgZm9yIGEgbnVtYmVyIGZpZWxkLCBzZWUKICAgICAjIGl0bigpIGJlbG93LgogICAgIGlmIHNbMF0gIT0gY2hyKDAyMDApOgotICAgICAgICBuID0gaW50KHMucnN0cmlwKE5VTCArICIgIikgb3IgIjAiLCA4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuID0gaW50KHMucnN0cmlwKE5VTCArICIgIikgb3IgIjAiLCA4KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEhlYWRlckVycm9yKCJpbnZhbGlkIGhlYWRlciIpCiAgICAgZWxzZToKICAgICAgICAgbiA9IDBMCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4ocykgLSAxKToKQEAgLTI4Miw2ICsyODUsOSBAQAogY2xhc3MgU3RyZWFtRXJyb3IoVGFyRXJyb3IpOgogICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5zdXBwb3J0ZWQgb3BlcmF0aW9ucyBvbiBzdHJlYW0tbGlrZSBUYXJGaWxlcy4iIiIKICAgICBwYXNzCitjbGFzcyBIZWFkZXJFcnJvcihUYXJFcnJvcik6CisgICAgIiIiRXhjZXB0aW9uIGZvciBpbnZhbGlkIGhlYWRlcnMuIiIiCisgICAgcGFzcwogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGludGVybmFsIHN0cmVhbSBpbnRlcmZhY2UKQEAgLTYyNCw2NCArNjMwLDE1OCBAQAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBFeHRyYWN0aW9uIGZpbGUgb2JqZWN0CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbGFzcyBFeEZpbGVPYmplY3Qob2JqZWN0KToKLSAgICAiIiJGaWxlLWxpa2Ugb2JqZWN0IGZvciByZWFkaW5nIGFuIGFyY2hpdmUgbWVtYmVyLgotICAgICAgIElzIHJldHVybmVkIGJ5IFRhckZpbGUuZXh0cmFjdGZpbGUoKS4gU3VwcG9ydCBmb3IKLSAgICAgICBzcGFyc2UgZmlsZXMgaW5jbHVkZWQuCitjbGFzcyBfRmlsZUluRmlsZShvYmplY3QpOgorICAgICIiIkEgdGhpbiB3cmFwcGVyIGFyb3VuZCBhbiBleGlzdGluZyBmaWxlIG9iamVjdCB0aGF0CisgICAgICAgcHJvdmlkZXMgYSBwYXJ0IG9mIGl0cyBkYXRhIGFzIGFuIGluZGl2aWR1YWwgZmlsZQorICAgICAgIG9iamVjdC4KICAgICAiIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJmaWxlLCB0YXJpbmZvKToKLSAgICAgICAgc2VsZi5maWxlb2JqID0gdGFyZmlsZS5maWxlb2JqCi0gICAgICAgIHNlbGYubmFtZSAgICA9IHRhcmluZm8ubmFtZQotICAgICAgICBzZWxmLm1vZGUgICAgPSAiciIKLSAgICAgICAgc2VsZi5jbG9zZWQgID0gRmFsc2UKLSAgICAgICAgc2VsZi5vZmZzZXQgID0gdGFyaW5mby5vZmZzZXRfZGF0YQotICAgICAgICBzZWxmLnNpemUgICAgPSB0YXJpbmZvLnNpemUKLSAgICAgICAgc2VsZi5wb3MgICAgID0gMEwKLSAgICAgICAgc2VsZi5saW5lYnVmZmVyID0gIiIKLSAgICAgICAgaWYgdGFyaW5mby5pc3NwYXJzZSgpOgotICAgICAgICAgICAgc2VsZi5zcGFyc2UgPSB0YXJpbmZvLnNwYXJzZQotICAgICAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5fcmVhZHNwYXJzZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5fcmVhZG5vcm1hbAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCBvZmZzZXQsIHNpemUsIHNwYXJzZT1Ob25lKToKKyAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagorICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorICAgICAgICBzZWxmLnNpemUgPSBzaXplCisgICAgICAgIHNlbGYuc3BhcnNlID0gc3BhcnNlCisgICAgICAgIHNlbGYucG9zaXRpb24gPSAwCiAKLSAgICBkZWYgX19yZWFkKHNlbGYsIHNpemUpOgotICAgICAgICAiIiJPdmVybG9hZGFibGUgcmVhZCBtZXRob2QuCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucG9zaXRpb24KKworICAgIGRlZiBzZWVrKHNlbGYsIHBvc2l0aW9uKToKKyAgICAgICAgIiIiU2VlayB0byBhIHBvc2l0aW9uIGluIHRoZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5wb3NpdGlvbiA9IHBvc2l0aW9uCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICAiIiJSZWFkIGRhdGEgZnJvbSB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLnNpemUgLSBzZWxmLnBvc2l0aW9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaXplID0gbWluKHNpemUsIHNlbGYuc2l6ZSAtIHNlbGYucG9zaXRpb24pCisKKyAgICAgICAgaWYgc2VsZi5zcGFyc2UgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJlYWRub3JtYWwoc2l6ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJlYWRzcGFyc2Uoc2l6ZSkKKworICAgIGRlZiByZWFkbm9ybWFsKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZWFkIG9wZXJhdGlvbiBmb3IgcmVndWxhciBmaWxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0ICsgc2VsZi5wb3NpdGlvbikKKyAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBzaXplCiAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmoucmVhZChzaXplKQogCi0gICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9LTEpOgotICAgICAgICAiIiJSZWFkIGEgbGluZSB3aXRoIGFwcHJveC4gc2l6ZS4gSWYgc2l6ZSBpcyBuZWdhdGl2ZSwKLSAgICAgICAgICAgcmVhZCBhIHdob2xlIGxpbmUuIHJlYWRsaW5lKCkgYW5kIHJlYWQoKSBtdXN0IG5vdAotICAgICAgICAgICBiZSBtaXhlZCB1cCAoISkuCisgICAgZGVmIHJlYWRzcGFyc2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgICIiIlJlYWQgb3BlcmF0aW9uIGZvciBzcGFyc2UgZmlsZXMuCiAgICAgICAgICIiIgotICAgICAgICBpZiBzaXplIDwgMDoKLSAgICAgICAgICAgIHNpemUgPSBzeXMubWF4aW50CisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICB3aGlsZSBzaXplID4gMDoKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYucmVhZHNwYXJzZXNlY3Rpb24oc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNpemUgLT0gbGVuKGJ1ZikKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKGJ1ZikKKyAgICAgICAgcmV0dXJuICIiLmpvaW4oZGF0YSkKIAotICAgICAgICBubCA9IHNlbGYubGluZWJ1ZmZlci5maW5kKCJcbiIpCi0gICAgICAgIGlmIG5sID49IDA6Ci0gICAgICAgICAgICBubCA9IG1pbihubCwgc2l6ZSkKKyAgICBkZWYgcmVhZHNwYXJzZXNlY3Rpb24oc2VsZiwgc2l6ZSk6CisgICAgICAgICIiIlJlYWQgYSBzaW5nbGUgc2VjdGlvbiBvZiBhIHNwYXJzZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VjdGlvbiA9IHNlbGYuc3BhcnNlLmZpbmQoc2VsZi5wb3NpdGlvbikKKworICAgICAgICBpZiBzZWN0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgICAgICBzaXplID0gbWluKHNpemUsIHNlY3Rpb24ub2Zmc2V0ICsgc2VjdGlvbi5zaXplIC0gc2VsZi5wb3NpdGlvbikKKworICAgICAgICBpZiBpc2luc3RhbmNlKHNlY3Rpb24sIF9kYXRhKToKKyAgICAgICAgICAgIHJlYWxwb3MgPSBzZWN0aW9uLnJlYWxwb3MgKyBzZWxmLnBvc2l0aW9uIC0gc2VjdGlvbi5vZmZzZXQKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0ICsgcmVhbHBvcykKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb24gKz0gc2l6ZQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5yZWFkKHNpemUpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzaXplIC09IGxlbihzZWxmLmxpbmVidWZmZXIpCi0gICAgICAgICAgICB3aGlsZSAobmwgPCAwIGFuZCBzaXplID4gMCk6Ci0gICAgICAgICAgICAgICAgYnVmID0gc2VsZi5yZWFkKG1pbihzaXplLCAxMDApKQotICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICBzZWxmLnBvc2l0aW9uICs9IHNpemUKKyAgICAgICAgICAgIHJldHVybiBOVUwgKiBzaXplCisjY2xhc3MgX0ZpbGVJbkZpbGUKKworCitjbGFzcyBFeEZpbGVPYmplY3Qob2JqZWN0KToKKyAgICAiIiJGaWxlLWxpa2Ugb2JqZWN0IGZvciByZWFkaW5nIGFuIGFyY2hpdmUgbWVtYmVyLgorICAgICAgIElzIHJldHVybmVkIGJ5IFRhckZpbGUuZXh0cmFjdGZpbGUoKS4KKyAgICAiIiIKKyAgICBibG9ja3NpemUgPSAxMDI0CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSwgdGFyaW5mbyk6CisgICAgICAgIHNlbGYuZmlsZW9iaiA9IF9GaWxlSW5GaWxlKHRhcmZpbGUuZmlsZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHRhcmluZm8sICJzcGFyc2UiLCBOb25lKSkKKyAgICAgICAgc2VsZi5uYW1lID0gdGFyaW5mby5uYW1lCisgICAgICAgIHNlbGYubW9kZSA9ICJyIgorICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuc2l6ZSA9IHRhcmluZm8uc2l6ZQorCisgICAgICAgIHNlbGYucG9zaXRpb24gPSAwCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGZpbGUuIElmIHNpemUgaXMgbm90CisgICAgICAgICAgIHByZXNlbnQgb3IgTm9uZSwgcmVhZCBhbGwgZGF0YSB1bnRpbCBFT0YgaXMgcmVhY2hlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCisKKyAgICAgICAgYnVmID0gIiIKKyAgICAgICAgaWYgc2VsZi5idWZmZXI6CisgICAgICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnVmID0gc2VsZi5idWZmZXIKKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuYnVmZmVyWzpzaXplXQorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbc2l6ZTpdCisKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgYnVmICs9IHNlbGYuZmlsZW9iai5yZWFkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1ZiArPSBzZWxmLmZpbGVvYmoucmVhZChzaXplIC0gbGVuKGJ1ZikpCisKKyAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBsZW4oYnVmKQorICAgICAgICByZXR1cm4gYnVmCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgICIiIlJlYWQgb25lIGVudGlyZSBsaW5lIGZyb20gdGhlIGZpbGUuIElmIHNpemUgaXMgcHJlc2VudAorICAgICAgICAgICBhbmQgbm9uLW5lZ2F0aXZlLCByZXR1cm4gYSBzdHJpbmcgd2l0aCBhdCBtb3N0IHRoYXQKKyAgICAgICAgICAgc2l6ZSwgd2hpY2ggbWF5IGJlIGFuIGluY29tcGxldGUgbGluZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCisKKyAgICAgICAgaWYgIlxuIiBpbiBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgIHBvcyA9IHNlbGYuYnVmZmVyLmZpbmQoIlxuIikgKyAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWZmZXJzID0gW3NlbGYuYnVmZmVyXQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChzZWxmLmJsb2Nrc2l6ZSkKKyAgICAgICAgICAgICAgICBidWZmZXJzLmFwcGVuZChidWYpCisgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZiBvciAiXG4iIGluIGJ1ZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSAiIi5qb2luKGJ1ZmZlcnMpCisgICAgICAgICAgICAgICAgICAgIHBvcyA9IHNlbGYuYnVmZmVyLmZpbmQoIlxuIikgKyAxCisgICAgICAgICAgICAgICAgICAgIGlmIHBvcyA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBuZXdsaW5lIGZvdW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gbGVuKHNlbGYuYnVmZmVyKQogICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIHNlbGYubGluZWJ1ZmZlciArPSBidWYKLSAgICAgICAgICAgICAgICBzaXplIC09IGxlbihidWYpCi0gICAgICAgICAgICAgICAgbmwgPSBzZWxmLmxpbmVidWZmZXIuZmluZCgiXG4iKQotICAgICAgICAgICAgaWYgbmwgPT0gLTE6Ci0gICAgICAgICAgICAgICAgcyA9IHNlbGYubGluZWJ1ZmZlcgotICAgICAgICAgICAgICAgIHNlbGYubGluZWJ1ZmZlciA9ICIiCi0gICAgICAgICAgICAgICAgcmV0dXJuIHMKLSAgICAgICAgYnVmID0gc2VsZi5saW5lYnVmZmVyWzpubF0KLSAgICAgICAgc2VsZi5saW5lYnVmZmVyID0gc2VsZi5saW5lYnVmZmVyW25sICsgMTpdCi0gICAgICAgIHdoaWxlIGJ1ZlstMTpdID09ICJcciI6Ci0gICAgICAgICAgICBidWYgPSBidWZbOi0xXQotICAgICAgICByZXR1cm4gYnVmICsgIlxuIgorCisgICAgICAgIGlmIHNpemUgIT0gLTE6CisgICAgICAgICAgICBwb3MgPSBtaW4oc2l6ZSwgcG9zKQorCisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmZmVyWzpwb3NdCisgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbcG9zOl0KKyAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBsZW4oYnVmKQorICAgICAgICByZXR1cm4gYnVmCiAKICAgICBkZWYgcmVhZGxpbmVzKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IHdpdGggYWxsIChmb2xsb3dpbmcpIGxpbmVzLgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IHdpdGggYWxsIHJlbWFpbmluZyBsaW5lcy4KICAgICAgICAgIiIiCiAgICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgIHdoaWxlIFRydWU6CkBAIC02OTAsNzQgKzc5MCwzNCBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKQogICAgICAgICByZXR1cm4gcmVzdWx0CiAKLSAgICBkZWYgX3JlYWRub3JtYWwoc2VsZiwgc2l6ZT1Ob25lKToKLSAgICAgICAgIiIiUmVhZCBvcGVyYXRpb24gZm9yIHJlZ3VsYXIgZmlsZXMuCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLmNsb3NlZDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgY2xvc2VkIikKLSAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQgKyBzZWxmLnBvcykKLSAgICAgICAgYnl0ZXNsZWZ0ID0gc2VsZi5zaXplIC0gc2VsZi5wb3MKLSAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgotICAgICAgICAgICAgYnl0ZXN0b3JlYWQgPSBieXRlc2xlZnQKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGJ5dGVzdG9yZWFkID0gbWluKHNpemUsIGJ5dGVzbGVmdCkKLSAgICAgICAgc2VsZi5wb3MgKz0gYnl0ZXN0b3JlYWQKLSAgICAgICAgcmV0dXJuIHNlbGYuX19yZWFkKGJ5dGVzdG9yZWFkKQotCi0gICAgZGVmIF9yZWFkc3BhcnNlKHNlbGYsIHNpemU9Tm9uZSk6Ci0gICAgICAgICIiIlJlYWQgb3BlcmF0aW9uIGZvciBzcGFyc2UgZmlsZXMuCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLmNsb3NlZDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgY2xvc2VkIikKLQotICAgICAgICBpZiBzaXplIGlzIE5vbmU6Ci0gICAgICAgICAgICBzaXplID0gc2VsZi5zaXplIC0gc2VsZi5wb3MKLQotICAgICAgICBkYXRhID0gW10KLSAgICAgICAgd2hpbGUgc2l6ZSA+IDA6Ci0gICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkc3BhcnNlc2VjdGlvbihzaXplKQotICAgICAgICAgICAgaWYgbm90IGJ1ZjoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgc2l6ZSAtPSBsZW4oYnVmKQotICAgICAgICAgICAgZGF0YS5hcHBlbmQoYnVmKQotICAgICAgICByZXR1cm4gIiIuam9pbihkYXRhKQotCi0gICAgZGVmIF9yZWFkc3BhcnNlc2VjdGlvbihzZWxmLCBzaXplKToKLSAgICAgICAgIiIiUmVhZCBhIHNpbmdsZSBzZWN0aW9uIG9mIGEgc3BhcnNlIGZpbGUuCi0gICAgICAgICIiIgotICAgICAgICBzZWN0aW9uID0gc2VsZi5zcGFyc2UuZmluZChzZWxmLnBvcykKLQotICAgICAgICBpZiBzZWN0aW9uIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gIiIKLQotICAgICAgICB0b3JlYWQgPSBtaW4oc2l6ZSwgc2VjdGlvbi5vZmZzZXQgKyBzZWN0aW9uLnNpemUgLSBzZWxmLnBvcykKLSAgICAgICAgaWYgaXNpbnN0YW5jZShzZWN0aW9uLCBfZGF0YSk6Ci0gICAgICAgICAgICByZWFscG9zID0gc2VjdGlvbi5yZWFscG9zICsgc2VsZi5wb3MgLSBzZWN0aW9uLm9mZnNldAotICAgICAgICAgICAgc2VsZi5wb3MgKz0gdG9yZWFkCi0gICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCArIHJlYWxwb3MpCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fX3JlYWQodG9yZWFkKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5wb3MgKz0gdG9yZWFkCi0gICAgICAgICAgICByZXR1cm4gTlVMICogdG9yZWFkCi0KICAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCiAgICAgICAgICIiIgotICAgICAgICByZXR1cm4gc2VsZi5wb3MKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKIAotICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgorICAgICAgICByZXR1cm4gc2VsZi5wb3NpdGlvbgorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9b3MuU0VFS19TRVQpOgogICAgICAgICAiIiJTZWVrIHRvIGEgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLmxpbmVidWZmZXIgPSAiIgotICAgICAgICBpZiB3aGVuY2UgPT0gMDoKLSAgICAgICAgICAgIHNlbGYucG9zID0gbWluKG1heChwb3MsIDApLCBzZWxmLnNpemUpCi0gICAgICAgIGlmIHdoZW5jZSA9PSAxOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQorCisgICAgICAgIGlmIHdoZW5jZSA9PSBvcy5TRUVLX1NFVDoKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtaW4obWF4KHBvcywgMCksIHNlbGYuc2l6ZSkKKyAgICAgICAgZWxpZiB3aGVuY2UgPT0gb3MuU0VFS19DVVI6CiAgICAgICAgICAgICBpZiBwb3MgPCAwOgotICAgICAgICAgICAgICAgIHNlbGYucG9zID0gbWF4KHNlbGYucG9zICsgcG9zLCAwKQorICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtYXgoc2VsZi5wb3NpdGlvbiArIHBvcywgMCkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5wb3MgPSBtaW4oc2VsZi5wb3MgKyBwb3MsIHNlbGYuc2l6ZSkKLSAgICAgICAgaWYgd2hlbmNlID09IDI6Ci0gICAgICAgICAgICBzZWxmLnBvcyA9IG1heChtaW4oc2VsZi5zaXplICsgcG9zLCBzZWxmLnNpemUpLCAwKQorICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtaW4oc2VsZi5wb3NpdGlvbiArIHBvcywgc2VsZi5zaXplKQorICAgICAgICBlbGlmIHdoZW5jZSA9PSBvcy5TRUVLX0VORDoKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtYXgobWluKHNlbGYuc2l6ZSArIHBvcywgc2VsZi5zaXplKSwgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgYXJndW1lbnQiKQorCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5wb3NpdGlvbikKIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgIiIiQ2xvc2UgdGhlIGZpbGUgb2JqZWN0LgpAQCAtNzY1LDIwICs4MjUsMTMgQEAKICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCiAKICAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgICIiIkdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBmaWxlIG9iamVjdC4KKyAgICAgICAgIiIiR2V0IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGZpbGUncyBsaW5lcy4KICAgICAgICAgIiIiCi0gICAgICAgIGlmIHNlbGYuY2xvc2VkOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCi0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgbmV4dChzZWxmKToKLSAgICAgICAgIiIiR2V0IHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgZmlsZSBpdGVyYXRvci4KLSAgICAgICAgIiIiCi0gICAgICAgIHJlc3VsdCA9IHNlbGYucmVhZGxpbmUoKQotICAgICAgICBpZiBub3QgcmVzdWx0OgotICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB5aWVsZCBsaW5lCiAjY2xhc3MgRXhGaWxlT2JqZWN0CiAKICMtLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTgyMSw5ICs4NzQsMTMgQEAKICAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySW5mbyBvYmplY3QgZnJvbSBhIDUxMiBieXRlIHN0cmluZyBidWZmZXIuCiAgICAgICAgICIiIgogICAgICAgICBpZiBsZW4oYnVmKSAhPSBCTE9DS1NJWkU6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0cnVuY2F0ZWQgaGVhZGVyIikKKyAgICAgICAgICAgIHJhaXNlIEhlYWRlckVycm9yKCJ0cnVuY2F0ZWQgaGVhZGVyIikKICAgICAgICAgaWYgYnVmLmNvdW50KE5VTCkgPT0gQkxPQ0tTSVpFOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZW1wdHkgaGVhZGVyIikKKyAgICAgICAgICAgIHJhaXNlIEhlYWRlckVycm9yKCJlbXB0eSBoZWFkZXIiKQorCisgICAgICAgIGNoa3N1bSA9IG50aShidWZbMTQ4OjE1Nl0pCisgICAgICAgIGlmIGNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6CisgICAgICAgICAgICByYWlzZSBIZWFkZXJFcnJvcigiYmFkIGNoZWNrc3VtIikKIAogICAgICAgICB0YXJpbmZvID0gY2xzKCkKICAgICAgICAgdGFyaW5mby5idWYgPSBidWYKQEAgLTgzMyw3ICs4OTAsNyBAQAogICAgICAgICB0YXJpbmZvLmdpZCA9IG50aShidWZbMTE2OjEyNF0pCiAgICAgICAgIHRhcmluZm8uc2l6ZSA9IG50aShidWZbMTI0OjEzNl0pCiAgICAgICAgIHRhcmluZm8ubXRpbWUgPSBudGkoYnVmWzEzNjoxNDhdKQotICAgICAgICB0YXJpbmZvLmNoa3N1bSA9IG50aShidWZbMTQ4OjE1Nl0pCisgICAgICAgIHRhcmluZm8uY2hrc3VtID0gY2hrc3VtCiAgICAgICAgIHRhcmluZm8udHlwZSA9IGJ1ZlsxNTY6MTU3XQogICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gYnVmWzE1NzoyNTddLnJzdHJpcChOVUwpCiAgICAgICAgIHRhcmluZm8udW5hbWUgPSBidWZbMjY1OjI5N10ucnN0cmlwKE5VTCkKQEAgLTg0NSw4ICs5MDIsNiBAQAogICAgICAgICBpZiBwcmVmaXggYW5kIG5vdCB0YXJpbmZvLmlzc3BhcnNlKCk6CiAgICAgICAgICAgICB0YXJpbmZvLm5hbWUgPSBwcmVmaXggKyAiLyIgKyB0YXJpbmZvLm5hbWUKIAotICAgICAgICBpZiB0YXJpbmZvLmNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGhlYWRlciIpCiAgICAgICAgIHJldHVybiB0YXJpbmZvCiAKICAgICBkZWYgdG9idWYoc2VsZiwgcG9zaXg9RmFsc2UpOgpAQCAtOTk5LDcgKzEwNTQsNyBAQAogICAgICAgICAgICBjYW4gYmUgZGV0ZXJtaW5lZCwgYG1vZGUnIGlzIG92ZXJyaWRkZW4gYnkgYGZpbGVvYmoncyBtb2RlLgogICAgICAgICAgICBgZmlsZW9iaicgaXMgbm90IGNsb3NlZCwgd2hlbiBUYXJGaWxlIGlzIGNsb3NlZC4KICAgICAgICAgIiIiCi0gICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5hYnNwYXRoKG5hbWUpCiAKICAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQpAQCAtMTAxMSw3ICsxMDY2LDcgQEAKICAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgaWYgc2VsZi5uYW1lIGlzIE5vbmUgYW5kIGhhc2F0dHIoZmlsZW9iaiwgIm5hbWUiKToKLSAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBmaWxlb2JqLm5hbWUKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLmFic3BhdGgoZmlsZW9iai5uYW1lKQogICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAibW9kZSIpOgogICAgICAgICAgICAgICAgIHNlbGYubW9kZSA9IGZpbGVvYmoubW9kZQogICAgICAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IFRydWUKQEAgLTEwODgsOSArMTE0MywxMyBAQAogICAgICAgICAgICAgIyBGaW5kIG91dCB3aGljaCAqb3BlbigpIGlzIGFwcHJvcHJpYXRlIGZvciBvcGVuaW5nIHRoZSBmaWxlLgogICAgICAgICAgICAgZm9yIGNvbXB0eXBlIGluIGNscy5PUEVOX01FVEg6CiAgICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoY2xzLCBjbHMuT1BFTl9NRVRIW2NvbXB0eXBlXSkKKyAgICAgICAgICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzYXZlZF9wb3MgPSBmaWxlb2JqLnRlbGwoKQogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgInIiLCBmaWxlb2JqKQogICAgICAgICAgICAgICAgIGV4Y2VwdCAoUmVhZEVycm9yLCBDb21wcmVzc2lvbkVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlayhzYXZlZF9wb3MpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBzdWNjZXNzZnVsbHkiKQogCkBAIC0xMTQ3LDI0ICsxMjA2LDEyIEBACiAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImd6aXAgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQogCi0gICAgICAgIHByZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBwcmUgPSBvcy5wYXRoLmJhc2VuYW1lKHByZSkKLSAgICAgICAgaWYgZXh0ID09ICIudGd6IjoKLSAgICAgICAgICAgIGV4dCA9ICIudGFyIgotICAgICAgICBpZiBleHQgPT0gIi5neiI6Ci0gICAgICAgICAgICBleHQgPSAiIgotICAgICAgICB0YXJuYW1lID0gcHJlICsgZXh0Ci0KICAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgogICAgICAgICAgICAgZmlsZW9iaiA9IF9vcGVuKG5hbWUsIG1vZGUgKyAiYiIpCiAKLSAgICAgICAgaWYgbW9kZSAhPSAiciI6Ci0gICAgICAgICAgICBuYW1lID0gdGFybmFtZQotCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHQgPSBjbHMudGFyb3Blbih0YXJuYW1lLCBtb2RlLAotICAgICAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaikKLSAgICAgICAgICAgICkKKyAgICAgICAgICAgIHQgPSBjbHMudGFyb3BlbihuYW1lLCBtb2RlLAorICAgICAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaikpCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKQEAgLTExODMsMjEgKzEyMzAsMTMgQEAKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKIAotICAgICAgICBwcmUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKLSAgICAgICAgcHJlID0gb3MucGF0aC5iYXNlbmFtZShwcmUpCi0gICAgICAgIGlmIGV4dCA9PSAiLnRiejIiOgotICAgICAgICAgICAgZXh0ID0gIi50YXIiCi0gICAgICAgIGlmIGV4dCA9PSAiLmJ6MiI6Ci0gICAgICAgICAgICBleHQgPSAiIgotICAgICAgICB0YXJuYW1lID0gcHJlICsgZXh0Ci0KICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGZpbGVvYmogPSBfQloyUHJveHkoZmlsZW9iaiwgbW9kZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGZpbGVvYmogPSBiejIuQloyRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsPWNvbXByZXNzbGV2ZWwpCiAKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKHRhcm5hbWUsIG1vZGUsIGZpbGVvYmopCisgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaikKICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGJ6aXAyIGZpbGUiKQogICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKQEAgLTE0MDIsOCArMTQ0MSw3IEBACiAgICAgICAgICAgICBhcmNuYW1lID0gbmFtZQogCiAgICAgICAgICMgU2tpcCBpZiBzb21lYm9keSB0cmllcyB0byBhcmNoaXZlIHRoZSBhcmNoaXZlLi4uCi0gICAgICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZSBcCi0gICAgICAgICAgICBhbmQgb3MucGF0aC5hYnNwYXRoKG5hbWUpID09IG9zLnBhdGguYWJzcGF0aChzZWxmLm5hbWUpOgorICAgICAgICBpZiBzZWxmLm5hbWUgaXMgbm90IE5vbmUgYW5kIG9zLnBhdGguYWJzcGF0aChuYW1lKSA9PSBzZWxmLm5hbWU6CiAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IFNraXBwZWQgJXIiICUgbmFtZSkKICAgICAgICAgICAgIHJldHVybgogCkBAIC0xNzk1LDE2ICsxODMzLDE0IEBACiAKICAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5wcm9jX21lbWJlcih0YXJpbmZvKQogCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvciwgZToKICAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiBlbXB0eSBvciBpbnZhbGlkIGJsb2NrOiAlcyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYub2Zmc2V0LCBlKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiAlcyIgJSAoc2VsZi5vZmZzZXQsIGUpKQogICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJlbXB0eSwgdW5yZWFkYWJsZSBvciBjb21wcmVzc2VkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZTogJXMiICUgZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgICBicmVhawogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKaW5kZXggNzNlZjJkNC4uYjUxN2RhYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQpAQCAtMSw1ICsxLDQgQEAKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQppbmRleCA0YzVkMWVlLi41NjAzMWE3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKQEAgLTM5Niw2ICszOTYsMTIgQEAKICAgICAgICAgZC5wb3AoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGl0Lm5leHQpCiAKKyAgICBkZWYgdGVzdF9ydW50aW1lX2Vycm9yX29uX2VtcHR5X2RlcXVlKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoKQorICAgICAgICBpdCA9IGl0ZXIoZCkKKyAgICAgICAgZC5hcHBlbmQoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgaXQubmV4dCkKKwogY2xhc3MgRGVxdWUoZGVxdWUpOgogICAgIHBhc3MKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kdW1iZGJtLnB5IGIvTGliL3Rlc3QvdGVzdF9kdW1iZGJtLnB5CmluZGV4IDYzYjE0YjAuLmU1ZGZlMWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZHVtYmRibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2R1bWJkYm0ucHkKQEAgLTM4LDYgKzM4LDI0IEBACiAgICAgICAgIHNlbGYucmVhZF9oZWxwZXIoZikKICAgICAgICAgZi5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdF9kdW1iZGJtX2NyZWF0aW9uX21vZGUoc2VsZik6CisgICAgICAgICMgT24gcGxhdGZvcm1zIHdpdGhvdXQgY2htb2QsIGRvbid0IGRvIGFueXRoaW5nLgorICAgICAgICBpZiBub3QgKGhhc2F0dHIob3MsICdjaG1vZCcpIGFuZCBoYXNhdHRyKG9zLCAndW1hc2snKSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvbGRfdW1hc2sgPSBvcy51bWFzaygwMDAyKQorICAgICAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUsICdjJywgMDYzNykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW1hc2sob2xkX3VtYXNrKQorICAgICAgICAgICAgCisgICAgICAgIGltcG9ydCBzdGF0CisgICAgICAgIHN0ID0gb3Muc3RhdChfZm5hbWUgKyAnLmRhdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpLCAwNjM1KQorICAgICAgICBzdCA9IG9zLnN0YXQoX2ZuYW1lICsgJy5kaXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQuU19JTU9ERShzdC5zdF9tb2RlKSwgMDYzNSkKKyAgICAgICAgCiAgICAgZGVmIHRlc3RfY2xvc2VfdHdpY2Uoc2VsZik6CiAgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lKQogICAgICAgICBmWydhJ10gPSAnYicKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weSBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQppbmRleCBhYmNlNDFlLi43NjE5YWFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CkBAIC0zLDcgKzMsNiBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwogaW1wb3J0IHBpY2tsZQogdHJ5OgogICAgIGltcG9ydCBjUGlja2xlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5IGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQppbmRleCAxOTE2NDQ5Li5iNjUyZDQxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKQEAgLTEwNCwyMCArMTA0LDIwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYXBfc29ydGVkLCBzb3J0ZWQoZGF0YSkpCiAKICAgICBkZWYgdGVzdF9uc21hbGxlc3Qoc2VsZik6Ci0gICAgICAgIGRhdGEgPSBbcmFuZG9tLnJhbmRyYW5nZSgyMDAwKSBmb3IgaSBpbiByYW5nZSgxMDAwKV0KLSAgICAgICAgZiA9IGxhbWJkYSB4OiAgeCAqIDU0NyAlIDIwMDAKLSAgICAgICAgZm9yIG4gaW4gKDAsIDEsIDIsIDEwLCAxMDAsIDQwMCwgOTk5LCAxMDAwLCAxMTAwKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnNtYWxsZXN0KG4sIGRhdGEpLCBzb3J0ZWQoZGF0YSlbOm5dKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuc21hbGxlc3QobiwgZGF0YSwga2V5PWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQoZGF0YSwga2V5PWYpWzpuXSkKKyAgICAgICAgZGF0YSA9IFsocmFuZG9tLnJhbmRyYW5nZSgyMDAwKSwgaSkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldCisgICAgICAgIGZvciBmIGluIChOb25lLCBsYW1iZGEgeDogIHhbMF0gKiA1NDcgJSAyMDAwKToKKyAgICAgICAgICAgIGZvciBuIGluICgwLCAxLCAyLCAxMCwgMTAwLCA0MDAsIDk5OSwgMTAwMCwgMTEwMCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuc21hbGxlc3QobiwgZGF0YSksIHNvcnRlZChkYXRhKVs6bl0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuc21hbGxlc3QobiwgZGF0YSwga2V5PWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKGRhdGEsIGtleT1mKVs6bl0pCiAKICAgICBkZWYgdGVzdF9ubGFyZ2VzdChzZWxmKToKLSAgICAgICAgZGF0YSA9IFtyYW5kb20ucmFuZHJhbmdlKDIwMDApIGZvciBpIGluIHJhbmdlKDEwMDApXQotICAgICAgICBmID0gbGFtYmRhIHg6ICB4ICogNTQ3ICUgMjAwMAotICAgICAgICBmb3IgbiBpbiAoMCwgMSwgMiwgMTAsIDEwMCwgNDAwLCA5OTksIDEwMDAsIDExMDApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChubGFyZ2VzdChuLCBkYXRhKSwgc29ydGVkKGRhdGEsIHJldmVyc2U9VHJ1ZSlbOm5dKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChubGFyZ2VzdChuLCBkYXRhLCBrZXk9ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZChkYXRhLCBrZXk9ZiwgcmV2ZXJzZT1UcnVlKVs6bl0pCisgICAgICAgIGRhdGEgPSBbKHJhbmRvbS5yYW5kcmFuZ2UoMjAwMCksIGkpIGZvciBpIGluIHJhbmdlKDEwMDApXQorICAgICAgICBmb3IgZiBpbiAoTm9uZSwgbGFtYmRhIHg6ICB4WzBdICogNTQ3ICUgMjAwMCk6CisgICAgICAgICAgICBmb3IgbiBpbiAoMCwgMSwgMiwgMTAsIDEwMCwgNDAwLCA5OTksIDEwMDAsIDExMDApOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmxhcmdlc3QobiwgZGF0YSksIHNvcnRlZChkYXRhLCByZXZlcnNlPVRydWUpWzpuXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5sYXJnZXN0KG4sIGRhdGEsIGtleT1mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZChkYXRhLCBrZXk9ZiwgcmV2ZXJzZT1UcnVlKVs6bl0pCiAKIAogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQppbmRleCBlMzczNzhmLi41OGRlOTQ0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQpAQCAtMSwxMCArMSwxMSBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCBndWFyZF93YXJuaW5nc19maWx0ZXIKIAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKIGltcG9ydCByYW5kb20KIGltcG9ydCBzeXMKIGltcG9ydCBweV9jb21waWxlCitpbXBvcnQgd2FybmluZ3MKIAogCiBkZWYgcmVtb3ZlX2ZpbGVzKG5hbWUpOgpAQCAtMjA0LDE1ICsyMDUsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgdGVzdC50ZXN0X3N1cHBvcnQsIHkuX19uYW1lX18pCiAKICAgICBkZWYgdGVzdF9pbXBvcnRfaW5pdGxlc3NfZGlyZWN0b3J5X3dhcm5pbmcoc2VsZik6Ci0gICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICBvbGRmaWx0ZXJzID0gd2FybmluZ3MuZmlsdGVyc1s6XQotICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Vycm9yJywgSW1wb3J0V2FybmluZyk7Ci0gICAgICAgIHRyeToKKyAgICAgICAgd2l0aCBndWFyZF93YXJuaW5nc19maWx0ZXIoKToKICAgICAgICAgICAgICMgSnVzdCBhIHJhbmRvbSBub24tcGFja2FnZSBkaXJlY3Rvcnkgd2UgYWx3YXlzIGV4cGVjdCB0byBiZQogICAgICAgICAgICAgIyBzb21ld2hlcmUgaW4gc3lzLnBhdGguLi4KKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignZXJyb3InLCBJbXBvcnRXYXJuaW5nKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0V2FybmluZywgX19pbXBvcnRfXywgInNpdGUtcGFja2FnZXMiKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVycyA9IG9sZGZpbHRlcnMKIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgogICAgIHJ1bl91bml0dGVzdChJbXBvcnRUZXN0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wdHkucHkgYi9MaWIvdGVzdC90ZXN0X3B0eS5weQppbmRleCA1OWU1MTYyLi44YTgzZTM5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B0eS5weQpAQCAtMTE1LDYgKzExNSwxMiBAQAogICAgIG9zLl9leGl0KDQpCiBlbHNlOgogICAgIGRlYnVnKCJXYWl0aW5nIGZvciBjaGlsZCAoJWQpIHRvIGZpbmlzaC4iJXBpZCkKKyAgICAjI2xpbmUgPSBvcy5yZWFkKG1hc3Rlcl9mZCwgODApCisgICAgIyNsaW5lcyA9IGxpbmUucmVwbGFjZSgnXHJcbicsICdcbicpLnNwbGl0KCdcbicpCisgICAgIyNpZiBGYWxzZSBhbmQgbGluZXMgIT0gWydJbiBjaGlsZCwgY2FsbGluZyBvcy5zZXRzaWQoKScsCisgICAgIyMgICAgICAgICAgICAgJ0dvb2Q6IE9TRXJyb3Igd2FzIHJhaXNlZC4nLCAnJ106CisgICAgIyMgICAgcmFpc2UgVGVzdEZhaWxlZCgiVW5leHBlY3RlZCBvdXRwdXQgZnJvbSBjaGlsZDogJXIiICUgbGluZSkKKyAgICAgICAgICAgIAogICAgIChwaWQsIHN0YXR1cykgPSBvcy53YWl0cGlkKHBpZCwgMCkKICAgICByZXMgPSBzdGF0dXMgPj4gOAogICAgIGRlYnVnKCJDaGlsZCAoJWQpIGV4aXRlZCB3aXRoIHN0YXR1cyAlZCAoJWQpLiIlKHBpZCwgcmVzLCBzdGF0dXMpKQpAQCAtMTI3LDYgKzEzMywxNSBAQAogICAgIGVsaWYgcmVzICE9IDQ6CiAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICJwdHkuZm9yaygpIGZhaWxlZCBmb3IgdW5rbm93biByZWFzb25zLiIKIAorICAgICMjZGVidWcoIlJlYWRpbmcgZnJvbSBtYXN0ZXJfZmQgbm93IHRoYXQgdGhlIGNoaWxkIGhhcyBleGl0ZWQiKQorICAgICMjdHJ5OgorICAgICMjICAgIHMxID0gb3MucmVhZChtYXN0ZXJfZmQsIDEwMjQpCisgICAgIyNleGNlcHQgb3MuZXJyb3I6CisgICAgIyMgICAgcGFzcworICAgICMjZWxzZToKKyAgICAjIyAgICByYWlzZSBUZXN0RmFpbGVkKCJSZWFkIGZyb20gbWFzdGVyX2ZkIGRpZCBub3QgcmFpc2UgZXhjZXB0aW9uIikKKyAgICAKKyAgICAKIG9zLmNsb3NlKG1hc3Rlcl9mZCkKIAogIyBwdHkuZm9yaygpIHBhc3NlZC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmFuZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKaW5kZXggYWZjZjExMy4uN2VjMTMwZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKQEAgLTE4MCwxMCArMTgwLDkgQEAKIAogICAgIGRlZiB0ZXN0X2JpZ3JhbmQoc2VsZik6CiAgICAgICAgICMgVmVyaWZ5IHdhcm5pbmdzIGFyZSByYWlzZWQgd2hlbiByYW5kcmFuZ2UgaXMgdG9vIGxhcmdlIGZvciByYW5kb20oKQotICAgICAgICBvbGRmaWx0ZXJzID0gd2FybmluZ3MuZmlsdGVyc1s6XQotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCAiVW5kZXJseWluZyByYW5kb20iKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVc2VyV2FybmluZywgc2VsZi5nZW4ucmFuZHJhbmdlLCAyKio2MCkKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IG9sZGZpbHRlcnMKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuZ3VhcmRfd2FybmluZ3NfZmlsdGVyKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCAiVW5kZXJseWluZyByYW5kb20iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVXNlcldhcm5pbmcsIHNlbGYuZ2VuLnJhbmRyYW5nZSwgMioqNjApCiAKIGNsYXNzIFN5c3RlbVJhbmRvbV9UZXN0QmFzaWNPcHMoVGVzdEJhc2ljT3BzKToKICAgICBnZW4gPSByYW5kb20uU3lzdGVtUmFuZG9tKCkKQEAgLTQ0MSw2ICs0NDAsMTQgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbnVtYml0cykgICAgICAgICMgbm90ZSB0aGUgc3Ryb25nZXIgYXNzZXJ0aW9uCiAgICAgICAgICAgICBzZWxmLmFzc2VydF8oMioqayA+IG4gPiAyKiooay0xKSkgICAjIG5vdGUgdGhlIHN0cm9uZ2VyIGFzc2VydGlvbgogCisgICAgZGVmIHRlc3RfcmFuZHJhbmdlX2J1Z18xNTkwODkxKHNlbGYpOgorICAgICAgICBzdGFydCA9IDEwMDAwMDAwMDAwMDAKKyAgICAgICAgc3RvcCA9IC0xMDAwMDAwMDAwMDAwMDAwMDAwMDAKKyAgICAgICAgc3RlcCA9IC0yMDAKKyAgICAgICAgeCA9IHNlbGYuZ2VuLnJhbmRyYW5nZShzdGFydCwgc3RvcCwgc3RlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHN0b3AgPCB4IDw9IHN0YXJ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4K3N0b3ApJXN0ZXAsIDApCisKIF9nYW1tYWNvZWZmID0gKDAuOTk5OTk5OTk5OTk5NTE4MywgNjc2LjUyMDM2ODEyMTg4MzUsIC0xMjU5LjEzOTIxNjcyMjI4OSwKICAgICAgICAgICAgICAgNzcxLjMyMzQyODc3NTc2NzQsICAtMTc2LjYxNTAyOTE0OTgzODYsIDEyLjUwNzM0MzI0MDA5MDU2LAogICAgICAgICAgICAgICAtMC4xMzg1NzEwMzMxMjk2NTI2LCAwLjk5MzQ5MzcxMTM5MzA3NDhlLTA1LCAwLjE2NTk0NzAxODc0MDg0NjJlLTA2KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZXByLnB5IGIvTGliL3Rlc3QvdGVzdF9yZXByLnB5CmluZGV4IDFkZmEyODIuLjgyMzI5OGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmVwci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlcHIucHkKQEAgLTEzNiw3ICsxMzYsNiBAQAogICAgICAgICAgICAgJzxidWlsdC1pbiBtZXRob2Qgc3BsaXQgb2Ygc3RyIG9iamVjdCBhdCAweCcpKQogCiAgICAgZGVmIHRlc3RfeHJhbmdlKHNlbGYpOgotICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscwogICAgICAgICBlcShyZXByKHhyYW5nZSgxKSksICd4cmFuZ2UoMSknKQogICAgICAgICBlcShyZXByKHhyYW5nZSgxLCAyKSksICd4cmFuZ2UoMSwgMiknKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NldC5weQppbmRleCBhNDgzMGQ0Li42NjQxZmY4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldC5weQpAQCAtMjEsNiArMjEsMTEgQEAKICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCiAKK2NsYXNzIFJlcHJXcmFwcGVyOgorICAgICdVc2VkIHRvIHRlc3Qgc2VsZi1yZWZlcmVudGlhbCByZXByKCkgY2FsbHMnCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gcmVwcihzZWxmLnZhbHVlKQorCiBjbGFzcyBUZXN0Sm9pbnRPcHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICMgVGVzdHMgY29tbW9uIHRvIGJvdGggc2V0IGFuZCBmcm96ZW5zZXQKIApAQCAtMjQ0LDYgKzI0OSwzMCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzLmRpc2NhcmQsIEJhZENtcCgpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzLnJlbW92ZSwgQmFkQ21wKCkpCiAKKyAgICBkZWYgdGVzdF9jeWNsaWNhbF9yZXByKHNlbGYpOgorICAgICAgICB3ID0gUmVwcldyYXBwZXIoKQorICAgICAgICBzID0gc2VsZi50aGV0eXBlKFt3XSkKKyAgICAgICAgdy52YWx1ZSA9IHMKKyAgICAgICAgaWYgc2VsZi50aGV0eXBlID09IHNldDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzKSwgJ3tzZXQoLi4uKX0nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9IHJlcHIocykucGFydGl0aW9uKCcoJylbMF0gICAgIyBzdHJpcCBjbGFzcyBuYW1lCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocyksICclcyhbJXMoLi4uKV0pJyAlIChuYW1lLCBuYW1lKSkKKworICAgIGRlZiB0ZXN0X2N5Y2xpY2FsX3ByaW50KHNlbGYpOgorICAgICAgICB3ID0gUmVwcldyYXBwZXIoKQorICAgICAgICBzID0gc2VsZi50aGV0eXBlKFt3XSkKKyAgICAgICAgdy52YWx1ZSA9IHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgICAgICBwcmludCA+PiBmbywgcywKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkKCksIHJlcHIocykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKwogY2xhc3MgVGVzdFNldChUZXN0Sm9pbnRPcHMpOgogICAgIHRoZXR5cGUgPSBzZXQKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQppbmRleCAzMDI2OThiLi5kNDc0NGRkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQpAQCAtNTAsMjIgKzUwLDE3IEBACiAKIGRlZiB3aXRoX3dhcm5pbmdfcmVzdG9yZShmdW5jKToKICAgICBkZWYgX3dpdGhfd2FybmluZ19yZXN0b3JlKCphcmdzLCAqKmt3KToKLSAgICAgICAgIyBUaGUgYHdhcm5pbmdzYCBtb2R1bGUgZG9lc24ndCBoYXZlIGFuIGFkdmVydGlzZWQgd2F5IHRvIHJlc3RvcmUKLSAgICAgICAgIyBpdHMgZmlsdGVyIGxpc3QuICBDaGVhdC4KLSAgICAgICAgc2F2ZV93YXJuaW5nc19maWx0ZXJzID0gd2FybmluZ3MuZmlsdGVyc1s6XQotICAgICAgICAjIEdycnIsIHdlIG5lZWQgdGhpcyBmdW5jdGlvbiB0byB3YXJuIGV2ZXJ5IHRpbWUuICBXaXRob3V0IHJlbW92aW5nCi0gICAgICAgICMgdGhlIHdhcm5pbmdyZWdpc3RyeSwgcnVubmluZyB0ZXN0X3RhcmZpbGUgdGhlbiB0ZXN0X3N0cnVjdCB3b3VsZCBmYWlsCi0gICAgICAgICMgb24gNjQtYml0IHBsYXRmb3Jtcy4KLSAgICAgICAgZ2xvYmFscyA9IGZ1bmMuZnVuY19nbG9iYWxzCi0gICAgICAgIGlmICdfX3dhcm5pbmdyZWdpc3RyeV9fJyBpbiBnbG9iYWxzOgotICAgICAgICAgICAgZGVsIGdsb2JhbHNbJ19fd2FybmluZ3JlZ2lzdHJ5X18nXQotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCByIiIiXnN0cnVjdC4qIiIiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIHIiIiIuKmZvcm1hdCByZXF1aXJlcy4qIiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHRyeToKKyAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC5ndWFyZF93YXJuaW5nc19maWx0ZXIoKToKKyAgICAgICAgICAgICMgR3Jyciwgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uIHRvIHdhcm4gZXZlcnkgdGltZS4gIFdpdGhvdXQgcmVtb3ZpbmcKKyAgICAgICAgICAgICMgdGhlIHdhcm5pbmdyZWdpc3RyeSwgcnVubmluZyB0ZXN0X3RhcmZpbGUgdGhlbiB0ZXN0X3N0cnVjdCB3b3VsZCBmYWlsCisgICAgICAgICAgICAjIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCisgICAgICAgICAgICBnbG9iYWxzID0gZnVuYy5mdW5jX2dsb2JhbHMKKyAgICAgICAgICAgIGlmICdfX3dhcm5pbmdyZWdpc3RyeV9fJyBpbiBnbG9iYWxzOgorICAgICAgICAgICAgICAgIGRlbCBnbG9iYWxzWydfX3dhcm5pbmdyZWdpc3RyeV9fJ10KKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIHIiIiJec3RydWN0LioiIiIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIHIiIiIuKmZvcm1hdCByZXF1aXJlcy4qIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3cpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gc2F2ZV93YXJuaW5nc19maWx0ZXJzWzpdCiAgICAgcmV0dXJuIF93aXRoX3dhcm5pbmdfcmVzdG9yZQogCiBkZWYgZGVwcmVjYXRlZF9lcnIoZnVuYywgKmFyZ3MpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CmluZGV4IDI4MjljNTUuLjJjMTk2OTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTMsNyArMyw5IEBACiBpZiBfX25hbWVfXyAhPSAndGVzdC50ZXN0X3N1cHBvcnQnOgogICAgIHJhaXNlIEltcG9ydEVycm9yLCAndGVzdF9zdXBwb3J0IG11c3QgYmUgaW1wb3J0ZWQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlJwogCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCiBpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKIAogY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKICAgICAiIiJCYXNlIGNsYXNzIGZvciByZWdyZXNzaW9uIHRlc3QgZXhjZXB0aW9ucy4iIiIKQEAgLTI2Nyw2ICsyNjksNDggQEAKICAgICBwcmludCA+PiBnZXRfb3JpZ2luYWxfc3Rkb3V0KCksICdcdGZldGNoaW5nICVzIC4uLicgJSB1cmwKICAgICBmbiwgXyA9IHVybGxpYi51cmxyZXRyaWV2ZSh1cmwsIGZpbGVuYW1lKQogICAgIHJldHVybiBvcGVuKGZuKQorICAgIAorQGNvbnRleHRtYW5hZ2VyCitkZWYgZ3VhcmRfd2FybmluZ3NfZmlsdGVyKCk6CisgICAgIiIiR3VhcmQgdGhlIHdhcm5pbmdzIGZpbHRlciBmcm9tIGJlaW5nIHBlcm1hbmVudGx5IGNoYW5nZWQuIiIiCisgICAgb3JpZ2luYWxfZmlsdGVycyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICB0cnk6CisgICAgICAgIHlpZWxkCisgICAgZmluYWxseToKKyAgICAgICAgd2FybmluZ3MuZmlsdGVycyA9IG9yaWdpbmFsX2ZpbHRlcnMKKworY2xhc3MgRW52aXJvbm1lbnRWYXJHdWFyZChvYmplY3QpOgorCisgICAgIiIiQ2xhc3MgdG8gaGVscCBwcm90ZWN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBwcm9wZXJseS4gIENhbiBiZSB1c2VkIGFzCisgICAgYSBjb250ZXh0IG1hbmFnZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGZyb20gb3MgaW1wb3J0IGVudmlyb24KKyAgICAgICAgc2VsZi5fZW52aXJvbiA9IGVudmlyb24KKyAgICAgICAgc2VsZi5fdW5zZXQgPSBzZXQoKQorICAgICAgICBzZWxmLl9yZXNldCA9IGRpY3QoKQorCisgICAgZGVmIHNldChzZWxmLCBlbnZ2YXIsIHZhbHVlKToKKyAgICAgICAgaWYgZW52dmFyIG5vdCBpbiBzZWxmLl9lbnZpcm9uOgorICAgICAgICAgICAgc2VsZi5fdW5zZXQuYWRkKGVudnZhcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3Jlc2V0W2VudnZhcl0gPSBzZWxmLl9lbnZpcm9uW2VudnZhcl0KKyAgICAgICAgc2VsZi5fZW52aXJvbltlbnZ2YXJdID0gdmFsdWUKKworICAgIGRlZiB1bnNldChzZWxmLCBlbnZ2YXIpOgorICAgICAgICBpZiBlbnZ2YXIgaW4gc2VsZi5fZW52aXJvbjoKKyAgICAgICAgICAgIHNlbGYuX3Jlc2V0W2VudnZhcl0gPSBzZWxmLl9lbnZpcm9uW2VudnZhcl0KKyAgICAgICAgICAgIGRlbCBzZWxmLl9lbnZpcm9uW2VudnZhcl0KKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmlnbm9yZV9leGMpOgorICAgICAgICBmb3IgZW52dmFyLCB2YWx1ZSBpbiBzZWxmLl9yZXNldC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuX2Vudmlyb25bZW52dmFyXSA9IHZhbHVlCisgICAgICAgIGZvciB1bnNldCBpbiBzZWxmLl91bnNldDoKKyAgICAgICAgICAgIGRlbCBzZWxmLl9lbnZpcm9uW3Vuc2V0XQorCiAKICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBEZWNvcmF0b3IgZm9yIHJ1bm5pbmcgYSBmdW5jdGlvbiBpbiBhIGRpZmZlcmVudCBsb2NhbGUsIGNvcnJlY3RseSByZXNldHRpbmcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCAwY2ViYjI5Li4yYjM5NzE1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICAgICAgIiIiVGVzdCBzZWVrKCkgbWV0aG9kIG9mIF9GaWxlT2JqZWN0LCBpbmNsLiByYW5kb20gcmVhZGluZy4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuc2VwICE9ICJ8IjoKLSAgICAgICAgICAgIGZpbGVuYW1lID0gIjAtUkVHVFlQRSIKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIjAtUkVHVFlQRS1URVhUIgogICAgICAgICAgICAgc2VsZi50YXIuZXh0cmFjdChmaWxlbmFtZSwgZGlybmFtZSgpKQogICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUoKSwgZmlsZW5hbWUpLCAicmIiKQogICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCkBAIC0xNDksNiArMTQ5LDE2IEBACiAgICAgICAgICAgICBzMiA9IGZvYmoucmVhZGxpbmVzKCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzMSA9PSBzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzKCkgYWZ0ZXIgc2VlayBmYWlsZWQiKQorICAgICAgICAgICAgZm9iai5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKGZvYmoucmVhZGxpbmUoKSkgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlbGwoKSBhZnRlciByZWFkbGluZSgpIGZhaWxlZCIpCisgICAgICAgICAgICBmb2JqLnNlZWsoNTEyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihmb2JqLnJlYWRsaW5lKCkpICsgNTEyID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWxsKCkgYWZ0ZXIgc2VlaygpIGFuZCByZWFkbGluZSgpIGZhaWxlZCIpCisgICAgICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIGxpbmUgPSBmb2JqLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqLnJlYWQoKSA9PSBkYXRhW2xlbihsaW5lKTpdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQogICAgICAgICAgICAgZm9iai5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9vbGRfZGlydHlwZShzZWxmKToKQEAgLTI4MCw2ICsyOTAsMjAgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5kc3QuYWRkZmlsZSh0YXJpbmZvLCBmKQogCisgICAgZGVmIHRlc3RfYWRkX3NlbGYoc2VsZik6CisgICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5kc3RuYW1lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kc3QubmFtZSwgZHN0bmFtZSwgImFyY2hpdmUgbmFtZSBtdXN0IGJlIGFic29sdXRlIikKKworICAgICAgICBzZWxmLmRzdC5hZGQoZHN0bmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRzdC5nZXRuYW1lcygpLCBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCisKKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIoZGlybmFtZSgpKQorICAgICAgICBzZWxmLmRzdC5hZGQoZHN0bmFtZSkKKyAgICAgICAgb3MuY2hkaXIoY3dkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZHN0LmdldG5hbWVzKCksIFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKKwogCiBjbGFzcyBXcml0ZTEwMFRlc3QoQmFzZVRlc3QpOgogICAgICMgVGhlIG5hbWUgZmllbGQgaW4gYSB0YXIgaGVhZGVyIHN0b3JlcyBzdHJpbmdzIG9mIGF0IG1vc3QgMTAwIGNoYXJzLgpAQCAtNjAxLDYgKzYyNSwzOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmZpbGUuZmlsZW1vZGUoMDc1NSksICctcnd4ci14ci14JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJmaWxlLmZpbGVtb2RlKDA3MTExKSwgJy0tLXMtLXMtLXQnKQogCitjbGFzcyBIZWFkZXJFcnJvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHJ1bmNhdGVkX2hlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsICIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLkhlYWRlckVycm9yLCB0YXJmaWxlLlRhckluZm8uZnJvbWJ1ZiwgImZpbGVuYW1lXDAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLkhlYWRlckVycm9yLCB0YXJmaWxlLlRhckluZm8uZnJvbWJ1ZiwgIlwwIiAqIDUxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsICJcMCIgKiA1MTMpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuSGVhZGVyRXJyb3IsIHRhcmZpbGUuVGFySW5mby5mcm9tYnVmLCAiXDAiICogNTEyKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9oZWFkZXIoc2VsZik6CisgICAgICAgIGJ1ZiA9IHRhcmZpbGUuVGFySW5mbygiZmlsZW5hbWUiKS50b2J1ZigpCisgICAgICAgIGJ1ZiA9IGJ1Zls6MTQ4XSArICJmb29cMFwwXDBcMFwwIiArIGJ1ZlsxNTY6XSAjIGludmFsaWQgbnVtYmVyIGZpZWxkLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLkhlYWRlckVycm9yLCB0YXJmaWxlLlRhckluZm8uZnJvbWJ1ZiwgYnVmKQorCisgICAgZGVmIHRlc3RfYmFkX2NoZWNrc3VtKHNlbGYpOgorICAgICAgICBidWYgPSB0YXJmaWxlLlRhckluZm8oImZpbGVuYW1lIikudG9idWYoKQorICAgICAgICBiID0gYnVmWzoxNDhdICsgIiAgICAgICAgIiArIGJ1ZlsxNTY6XSAjIGNsZWFyIHRoZSBjaGVja3N1bSBmaWVsZC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsIGIpCisgICAgICAgIGIgPSAiYSIgKyBidWZbMTpdICMgbWFuaXB1bGF0ZSB0aGUgYnVmZmVyLCBzbyBjaGVja3N1bSB3b24ndCBtYXRjaC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsIGIpCisKK2NsYXNzIE9wZW5GaWxlb2JqVGVzdChCYXNlVGVzdCk6CisgICAgIyBUZXN0IGZvciBTRiBidWcgIzE0OTY1MDEuCisKKyAgICBkZWYgdGVzdF9vcGVuZXIoc2VsZik6CisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygiZm9vXG4iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJmaWxlLm9wZW4oIiIsICJyIiwgZmlsZW9iaj1mb2JqKQorICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvYmoudGVsbCgpLCAwLCAiZmlsZW9iaidzIHBvc2l0aW9uIGhhcyBtb3ZlZCIpCiAKIGlmIGJ6MjoKICAgICAjIEJ6aXAyIFRlc3RDYXNlcwpAQCAtNjQ2LDYgKzcwMiw4IEBACiAKICAgICB0ZXN0cyA9IFsKICAgICAgICAgRmlsZU1vZGVUZXN0LAorICAgICAgICBIZWFkZXJFcnJvclRlc3QsCisgICAgICAgIE9wZW5GaWxlb2JqVGVzdCwKICAgICAgICAgUmVhZFRlc3QsCiAgICAgICAgIFJlYWRTdHJlYW1UZXN0LAogICAgICAgICBSZWFkRGV0ZWN0VGVzdCwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXUucHkgYi9MaWIvdGVzdC90ZXN0X3V1LnB5CmluZGV4IDc3ODYzMTYuLjE2YTU1ZTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91dS5weQpAQCAtMTE0LDExICsxMTQsMTEgQEAKIAogICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZmluID0gb3BlbihzZWxmLnRtcGluLCAnd2InKQorICAgICAgICAgICAgZmluID0gb3BlbihzZWxmLnRtcGluLCAndycpCiAgICAgICAgICAgICBmaW4ud3JpdGUocGxhaW50ZXh0KQogICAgICAgICAgICAgZmluLmNsb3NlKCkKIAotICAgICAgICAgICAgZmluID0gb3BlbihzZWxmLnRtcGluLCAncmInKQorICAgICAgICAgICAgZmluID0gb3BlbihzZWxmLnRtcGluLCAncicpCiAgICAgICAgICAgICBmb3V0ID0gb3BlbihzZWxmLnRtcG91dCwgJ3cnKQogICAgICAgICAgICAgdXUuZW5jb2RlKGZpbiwgZm91dCwgc2VsZi50bXBpbiwgbW9kZT0wNjQ0KQogICAgICAgICAgICAgZmluLmNsb3NlKCkKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY0NCwgc2VsZi50bXBpbikpCiAKICAgICAgICAgICAgICMgaW5fZmlsZSBhbmQgb3V0X2ZpbGUgYXMgZmlsZW5hbWVzCi0gICAgICAgICAgICB1dS5lbmNvZGUoc2VsZi50bXBpbiwgc2VsZi50bXBvdXQsIG1vZGU9MDY0NCkKKyAgICAgICAgICAgIHV1LmVuY29kZShzZWxmLnRtcGluLCBzZWxmLnRtcG91dCwgc2VsZi50bXBpbiwgbW9kZT0wNjQ0KQogICAgICAgICAgICAgZm91dCA9IG9wZW4oc2VsZi50bXBvdXQsICdyJykKICAgICAgICAgICAgIHMgPSBmb3V0LnJlYWQoKQogICAgICAgICAgICAgZm91dC5jbG9zZSgpCkBAIC0xNDIsMTEgKzE0MiwxMSBAQAogCiAgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcGluLCAnd2InKQorICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi50bXBpbiwgJ3cnKQogICAgICAgICAgICAgZi53cml0ZShlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY0NCwgc2VsZi50bXBvdXQpKQogICAgICAgICAgICAgZi5jbG9zZSgpCiAKLSAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYudG1waW4sICdyYicpCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcGluLCAncicpCiAgICAgICAgICAgICB1dS5kZWNvZGUoZikKICAgICAgICAgICAgIGYuY2xvc2UoKQogCkBAIC0xNjMsMTEgKzE2MywxMSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmID0gY1N0cmluZ0lPLlN0cmluZ0lPKGVuY29kZWR0ZXh0d3JhcHBlZCAlICgwNjQ0LCBzZWxmLnRtcG91dCkpCiAKLSAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYudG1waW4sICdyYicpCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcGluLCAncicpCiAgICAgICAgICAgICB1dS5kZWNvZGUoZikKICAgICAgICAgICAgIGYuY2xvc2UoKQogCi0gICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcGluLCAncmInKQorICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi50bXBpbiwgJ3InKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXUuRXJyb3IsIHV1LmRlY29kZSwgZikKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5IGIvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CmluZGV4IDExNjU5ODAuLjA2ZjQ1MzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKQEAgLTE4OSw3ICsxODksNyBAQAogICAgICMgTm9uZSBhcyB0aGUgdmFsdWUgZm9yIHRoZSBjYWxsYmFjaywgd2hlcmUgZWl0aGVyIG1lYW5zICJubwogICAgICMgY2FsbGJhY2siLiAgVGhlICJubyBjYWxsYmFjayIgcmVmIGFuZCBwcm94eSBvYmplY3RzIGFyZSBzdXBwb3NlZAogICAgICMgdG8gYmUgc2hhcmVkIHNvIGxvbmcgYXMgdGhleSBleGlzdCBieSBhbGwgY2FsbGVycyBzbyBsb25nIGFzCi0gICAgIyB0aGV5IGFyZSBhY3RpdmUuICBJbiBQeXRob24gMi4zLjMgYW5kIGVhcmxpZXIsIHRoaXMgZ3VhcmFudHRlZQorICAgICMgdGhleSBhcmUgYWN0aXZlLiAgSW4gUHl0aG9uIDIuMy4zIGFuZCBlYXJsaWVyLCB0aGlzIGd1YXJhbnRlZQogICAgICMgd2FzIG5vdCBob25vcmVkLCBhbmQgd2FzIGJyb2tlbiBpbiBkaWZmZXJlbnQgd2F5cyBmb3IKICAgICAjIFB5V2Vha3JlZl9OZXdSZWYoKSBhbmQgUHlXZWFrcmVmX05ld1Byb3h5KCkuICAoVHdvIHRlc3RzLikKIApkaWZmIC0tZ2l0IGEvTGliL3RocmVhZGluZy5weSBiL0xpYi90aHJlYWRpbmcucHkKaW5kZXggNTY1NWRkZS4uZmVjZDNjYyAxMDA2NDQKLS0tIGEvTGliL3RocmVhZGluZy5weQorKysgYi9MaWIvdGhyZWFkaW5nLnB5CkBAIC02MzYsMTMgKzYzNiwxMSBAQAogICAgICAgICBfYWN0aXZlX2xpbWJvX2xvY2suYWNxdWlyZSgpCiAgICAgICAgIF9hY3RpdmVbX2dldF9pZGVudCgpXSA9IHNlbGYKICAgICAgICAgX2FjdGl2ZV9saW1ib19sb2NrLnJlbGVhc2UoKQotICAgICAgICBpbXBvcnQgYXRleGl0Ci0gICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLl9fZXhpdGZ1bmMpCiAKICAgICBkZWYgX3NldF9kYWVtb24oc2VsZik6CiAgICAgICAgIHJldHVybiBGYWxzZQogCi0gICAgZGVmIF9fZXhpdGZ1bmMoc2VsZik6CisgICAgZGVmIF9leGl0ZnVuYyhzZWxmKToKICAgICAgICAgc2VsZi5fVGhyZWFkX19zdG9wKCkKICAgICAgICAgdCA9IF9waWNrU29tZU5vbkRhZW1vblRocmVhZCgpCiAgICAgICAgIGlmIHQ6CkBAIC03MTUsOSArNzEzLDExIEBACiAKIGZyb20gdGhyZWFkIGltcG9ydCBzdGFja19zaXplCiAKLSMgQ3JlYXRlIHRoZSBtYWluIHRocmVhZCBvYmplY3QKKyMgQ3JlYXRlIHRoZSBtYWluIHRocmVhZCBvYmplY3QsCisjIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIGludGVycHJldGVyCisjIChQeV9NYWluKSBhcyB0aHJlYWRpbmcuX3NodXRkb3duLgogCi1fTWFpblRocmVhZCgpCitfc2h1dGRvd24gPSBfTWFpblRocmVhZCgpLl9leGl0ZnVuYwogCiAjIGdldCB0aHJlYWQtbG9jYWwgaW1wbGVtZW50YXRpb24sIGVpdGhlciBmcm9tIHRoZSB0aHJlYWQKICMgbW9kdWxlLCBvciBmcm9tIHRoZSBweXRob24gZmFsbGJhY2sKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIucHkgYi9MaWIvdXJsbGliLnB5CmluZGV4IDkwZjdhYTAuLjI3ZWMyYzkgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIucHkKKysrIGIvTGliL3VybGxpYi5weQpAQCAtNDA1LDggKzQwNSw4IEBACiAgICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgJyVkJyAlIGxlbihkYXRhKSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KCdHRVQnLCBzZWxlY3RvcikKLSAgICAgICAgICAgIGlmIHByb3h5X2F1dGg6IGgucHV0aGVhZGVyKCdQcm94eS1BdXRob3JpemF0aW9uOiBCYXNpYyAlcycgJSBwcm94eV9hdXRoKQotICAgICAgICAgICAgaWYgYXV0aDogaC5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb246IEJhc2ljICVzJyAlIGF1dGgpCisgICAgICAgICAgICBpZiBwcm94eV9hdXRoOiBoLnB1dGhlYWRlcignUHJveHktQXV0aG9yaXphdGlvbicsICdCYXNpYyAlcycgJSBwcm94eV9hdXRoKQorICAgICAgICAgICAgaWYgYXV0aDogaC5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJXMnICUgYXV0aCkKICAgICAgICAgICAgIGlmIHJlYWxob3N0OiBoLnB1dGhlYWRlcignSG9zdCcsIHJlYWxob3N0KQogICAgICAgICAgICAgZm9yIGFyZ3MgaW4gc2VsZi5hZGRoZWFkZXJzOiBoLnB1dGhlYWRlcigqYXJncykKICAgICAgICAgICAgIGguZW5kaGVhZGVycygpCmRpZmYgLS1naXQgYS9NaXNjL0FDS1MgYi9NaXNjL0FDS1MKaW5kZXggZDVkNzY3NS4uYjE5ODExNCAxMDA2NDQKLS0tIGEvTWlzYy9BQ0tTCisrKyBiL01pc2MvQUNLUwpAQCAtMjg1LDYgKzI4NSw3IEBACiBBbGJlcnQgSG9ma2FtcAogSm9uYXRoYW4gSG9nZwogR2Vycml0IEhvbGwKK1NoYW5lIEhvbGxvd2F5CiBSdW5lIEhvbG0KIFBoaWxpcCBIb21idXJnCiBOYW9mdW1pIEhvbmRhCmRpZmYgLS1naXQgYS9NaXNjL2RldmVsb3BlcnMudHh0IGIvTWlzYy9kZXZlbG9wZXJzLnR4dAppbmRleCBjMDg1OTA4Li4yYmRhYjdjIDEwMDY0NAotLS0gYS9NaXNjL2RldmVsb3BlcnMudHh0CisrKyBiL01pc2MvZGV2ZWxvcGVycy50eHQKQEAgLTE3LDYgKzE3LDE1IEBACiBQZXJtaXNzaW9ucyBIaXN0b3J5CiAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKKy0gSm9zaWFoIENhcmxzb24gKFNGIG5hbWUgImpvc2lhaGNhcmxzb24iKSBhZGRlZCB0byB0aGUgU291cmNlRm9yZ2UgUHl0aG9uCisgIHByb2plY3QgMDYgSmFuIDIwMDcsIGJ5IE5DTiwgYXMgYSB0cmFja2VyIHRlY2guICBIZSB3aWxsIG1haW50YWluIGFzeW5jb3JlLgorCistIENvbGxpbiBXaW50ZXIgd2FzIGdpdmVuIFNWTiBhY2Nlc3Mgb24gMDUgSmFuIDIwMDcgYnkgTkNOLCBmb3IgUEVQCisgIHVwZGF0ZSBhY2Nlc3MuCisKKy0gTGFycyBHdXN0YWViZWwgd2FzIGdpdmVuIFNWTiBhY2Nlc3Mgb24gMjAgRGVjIDIwMDYgYnkgTkNOLCBmb3IgdGFyZmlsZS5weQorICByZWxhdGVkIHdvcmsuCisKIC0gMjAwNiBTdW1tZXIgb2YgQ29kZSBlbnRyaWVzOiBTb0MgZGV2ZWxvcGVycyBhcmUgZXhwZWN0ZWQgdG8gd29yawogICBwcmltYXJpbHkgaW4gbm9uZGlzdC9zYW5kYm94IG9yIG9uIGEgYnJhbmNoIG9mIHRoZWlyIG93biwgYW5kIHdpbGwKICAgaGF2ZSB0aGVpciB3b3JrIHJldmlld2VkIGJlZm9yZSBjaGFuZ2VzIGFyZSBhY2NlcHRlZCBpbnRvIHRoZSB0cnVuay4KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JzZGRiLmMgYi9Nb2R1bGVzL19ic2RkYi5jCmluZGV4IDY4NDg5ZTkuLmMzZDM0MTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2JzZGRiLmMKKysrIGIvTW9kdWxlcy9fYnNkZGIuYwpAQCAtOTgsNyArOTgsNyBAQAogI2Vycm9yICJlZWshIERCVkVSIGNhbid0IGhhbmRsZSBtaW5vciB2ZXJzaW9ucyA+IDkiCiAjZW5kaWYKIAotI2RlZmluZSBQWV9CU0REQl9WRVJTSU9OICI0LjQuNiIKKyNkZWZpbmUgUFlfQlNEREJfVkVSU0lPTiAiNC41LjAiCiBzdGF0aWMgY2hhciAqcmNzX2lkID0gIiRJZCQiOwogCiAKQEAgLTQxMjcsNiArNDEyNyw3IEBACiB9CiAKIAorI2lmIChEQlZFUiA8IDQ1KQogc3RhdGljIFB5T2JqZWN0KgogREJFbnZfc2V0X2xrX21heChEQkVudk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7CkBAIC00MTQyLDYgKzQxNDMsNyBAQAogICAgIFJFVFVSTl9JRl9FUlIoKTsKICAgICBSRVRVUk5fTk9ORSgpOwogfQorI2VuZGlmCiAKIAogI2lmIChEQlZFUiA+PSAzMikKQEAgLTUyMzEsNyArNTIzMyw5IEBACiAgICAgeyJzZXRfbGdfcmVnaW9ubWF4IiwoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2xnX3JlZ2lvbm1heCwgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgogICAgIHsic2V0X2xrX2RldGVjdCIsICAgKFB5Q0Z1bmN0aW9uKURCRW52X3NldF9sa19kZXRlY3QsICAgIE1FVEhfVkFSQVJHU30sCisjaWYgKERCVkVSIDwgNDUpCiAgICAgeyJzZXRfbGtfbWF4IiwgICAgICAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2xrX21heCwgICAgICAgTUVUSF9WQVJBUkdTfSwKKyNlbmRpZgogI2lmIChEQlZFUiA+PSAzMikKICAgICB7InNldF9sa19tYXhfbG9ja3MiLCAoUHlDRnVuY3Rpb24pREJFbnZfc2V0X2xrX21heF9sb2NrcywgTUVUSF9WQVJBUkdTfSwKICAgICB7InNldF9sa19tYXhfbG9ja2VycyIsIChQeUNGdW5jdGlvbilEQkVudl9zZXRfbGtfbWF4X2xvY2tlcnMsIE1FVEhfVkFSQVJHU30sCkBAIC01ODMzLDcgKzU4MzcsOSBAQAogICAgIEFERF9JTlQoZCwgREJfQUZURVIpOwogICAgIEFERF9JTlQoZCwgREJfQVBQRU5EKTsKICAgICBBRERfSU5UKGQsIERCX0JFRk9SRSk7CisjaWYgKERCVkVSIDwgNDUpCiAgICAgQUREX0lOVChkLCBEQl9DQUNIRURfQ09VTlRTKTsKKyNlbmRpZgogI2lmIChEQlZFUiA+PSA0MSkKICAgICBfYWRkSW50VG9EaWN0KGQsICJEQl9DSEVDS1BPSU5UIiwgMCk7CiAjZWxzZQpAQCAtNTg2OCw3ICs1ODc0LDkgQEAKICAgICBBRERfSU5UKGQsIERCX1BPU0lUSU9OKTsKICAgICBBRERfSU5UKGQsIERCX1BSRVYpOwogICAgIEFERF9JTlQoZCwgREJfUFJFVl9OT0RVUCk7CisjaWYgKERCVkVSIDwgNDUpCiAgICAgQUREX0lOVChkLCBEQl9SRUNPUkRDT1VOVCk7CisjZW5kaWYKICAgICBBRERfSU5UKGQsIERCX1NFVCk7CiAgICAgQUREX0lOVChkLCBEQl9TRVRfUkFOR0UpOwogICAgIEFERF9JTlQoZCwgREJfU0VUX1JFQ05PKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvYnoybW9kdWxlLmMgYi9Nb2R1bGVzL2J6Mm1vZHVsZS5jCmluZGV4IDVhNGU1ZDkuLjNjNmRhYTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYnoybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9iejJtb2R1bGUuYwpAQCAtOTg5LDcgKzk4OSw3IEBACiAJY2hhciBzbWFsbF9idWZmZXJbU01BTExDSFVOS107CiAJY2hhciAqYnVmZmVyID0gc21hbGxfYnVmZmVyOwogCXNpemVfdCBidWZmZXJzaXplID0gU01BTExDSFVOSzsKLQlpbnQgYnl0ZXNyZWFkID0gMDsKKwlQeV9vZmZfdCBieXRlc3JlYWQgPSAwOwogCXNpemVfdCByZWFkc2l6ZTsKIAlpbnQgY2h1bmtzaXplOwogCWludCBiemVycm9yOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jCmluZGV4IGNiMTJiM2EuLmNhNGIzMjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTkxMSwxNSArOTExLDE0IEBACiB7CiAJUHlPYmplY3QgKml0ZW07CiAKLQlpZiAoaXQtPmNvdW50ZXIgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KIAlpZiAoaXQtPmRlcXVlLT5zdGF0ZSAhPSBpdC0+c3RhdGUpIHsKIAkJaXQtPmNvdW50ZXIgPSAwOwogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogCQkJCSJkZXF1ZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCWlmIChpdC0+Y291bnRlciA9PSAwKQorCQlyZXR1cm4gTlVMTDsgICAgICAgIAogCWFzc2VydCAoIShpdC0+YiA9PSBpdC0+ZGVxdWUtPnJpZ2h0YmxvY2sgJiYKIAkJICBpdC0+aW5kZXggPiBpdC0+ZGVxdWUtPnJpZ2h0aW5kZXgpKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tYWluLmMgYi9Nb2R1bGVzL21haW4uYwppbmRleCBhYzZiMzhkLi5kNjA0ODc5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL21haW4uYworKysgYi9Nb2R1bGVzL21haW4uYwpAQCAtMTc1LDYgKzE3NSwzMyBAQAogCXJldHVybiAwOwogfQogCisvKiBXYWl0IHVudGlsIHRocmVhZGluZy5fc2h1dGRvd24gY29tcGxldGVzLCBwcm92aWRlZAorICAgdGhlIHRocmVhZGluZyBtb2R1bGUgd2FzIGltcG9ydGVkIGluIHRoZSBmaXJzdCBwbGFjZS4KKyAgIFRoZSBzaHV0ZG93biByb3V0aW5lIHdpbGwgd2FpdCB1bnRpbCBhbGwgbm9uLWRhZW1vbgorICAgInRocmVhZGluZyIgdGhyZWFkcyBoYXZlIGNvbXBsZXRlZC4gKi8KKyNpbmNsdWRlICJhYnN0cmFjdC5oIgorc3RhdGljIHZvaWQKK1dhaXRGb3JUaHJlYWRTaHV0ZG93bih2b2lkKQoreworI2lmZGVmIFdJVEhfVEhSRUFECisJUHlPYmplY3QgKnJlc3VsdDsKKwlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworCVB5T2JqZWN0ICp0aHJlYWRpbmcgPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyh0c3RhdGUtPmludGVycC0+bW9kdWxlcywKKwkJCQkJCSAgICAgICJ0aHJlYWRpbmciKTsKKwlpZiAodGhyZWFkaW5nID09IE5VTEwpIHsKKwkJLyogdGhyZWFkaW5nIG5vdCBpbXBvcnRlZCAqLworCQlQeUVycl9DbGVhcigpOworCQlyZXR1cm47CisJfQorCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGhyZWFkaW5nLCAiX3NodXRkb3duIiwgIiIpOworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHRocmVhZGluZyk7CisJZWxzZQorCQlQeV9ERUNSRUYocmVzdWx0KTsKKwlQeV9ERUNSRUYodGhyZWFkaW5nKTsKKyNlbmRpZgorfQorCiAvKiBNYWluIHByb2dyYW0gKi8KIAogaW50CkBAIC00ODMsNiArNTEwLDggQEAKIAkJLyogWFhYICovCiAJCXN0cyA9IFB5UnVuX0FueUZpbGVGbGFncyhzdGRpbiwgIjxzdGRpbj4iLCAmY2YpICE9IDA7CiAKKwlXYWl0Rm9yVGhyZWFkU2h1dGRvd24oKTsKKwogCVB5X0ZpbmFsaXplKCk7CiAjaWZkZWYgUklTQ09TCiAJaWYgKFB5X1JJU0NPU1dpbXBGbGFnKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKaW5kZXggYzlmMDM4OC4uOGVjMGVkNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCkBAIC0yMjEwLDcgKzIyMTAsNyBAQAogCiAvKgogICogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgcmVjdigpIGFuZCByZWN2X2ludG8oKSBtZXRob2RzLCB3aGljaCByZWFkcyBpbnRvIGEKLSAqIGNoYXIgYnVmZmVyLiAgSWYgeW91IGhhdmUgYW55IGluYy9kZWYgcmVmIHRvIGRvIHRvIHRoZSBvYmplY3RzIHRoYXQgY29udGFpbgorICogY2hhciBidWZmZXIuICBJZiB5b3UgaGF2ZSBhbnkgaW5jL2RlYyByZWYgdG8gZG8gdG8gdGhlIG9iamVjdHMgdGhhdCBjb250YWluCiAgKiB0aGUgYnVmZmVyLCBkbyBpdCBpbiB0aGUgY2FsbGVyLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKICAqIHN1Y2Nlc2Z1bGx5IHJlYWQuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIGl0IHJldHVybnMgLTEuICBOb3RlIHRoYXQgaXQgaXMKICAqIGFsc28gcG9zc2libGUgdGhhdCB3ZSByZXR1cm4gYSBudW1iZXIgb2YgYnl0ZXMgc21hbGxlciB0aGFuIHRoZSByZXF1ZXN0CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCmluZGV4IDQ0NGI3MzkuLjlhYjI3MjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCkBAIC02NTksNyArNjU5LDcgQEAKIAl0aW1lX3R6c2V0LiBJbiB0aGUgZnV0dXJlLCBzb21lIHBhcnRzIG9mIGl0IGNhbiBiZSBtb3ZlZCBiYWNrCiAJKGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBIQVZFX1dPUktJTkdfVFpTRVQsIHdoZW4gd2Uga25vdyB3aGF0IHRoZXkKIAlhcmUpLCBhbmQgdGhlIGV4dHJhbmlvdXMgY2FsbHMgdG8gdHpzZXQoMykgc2hvdWxkIGJlIHJlbW92ZWQuCi0JSSBoYXZuJ3QgZG9uZSB0aGlzIHlldCwgYXMgSSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGlzIGNvZGUgYXMKKwlJIGhhdmVuJ3QgZG9uZSB0aGlzIHlldCwgYXMgSSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGlzIGNvZGUgYXMKIAlsaXR0bGUgYXMgcG9zc2libGUgd2hlbiBpbnRyb2R1Y2luZyB0aGUgdGltZS50enNldCBhbmQgdGltZS50enNldHdhbGwKIAltZXRob2RzLiBUaGlzIHNob3VsZCBzaW1wbHkgYmUgYSBtZXRob2Qgb2YgZG9pbmcgdGhlIGZvbGxvd2luZyBvbmNlLAogCWF0IHRoZSB0b3Agb2YgdGhpcyBmdW5jdGlvbiBhbmQgcmVtb3ZpbmcgdGhlIGNhbGwgdG8gdHpzZXQoKSBmcm9tCmRpZmYgLS1naXQgYS9PYmplY3RzL2RpY3Rub3Rlcy50eHQgYi9PYmplY3RzL2RpY3Rub3Rlcy50eHQKaW5kZXggYjBlNTlhNy4uM2I2MzE5NyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kaWN0bm90ZXMudHh0CisrKyBiL09iamVjdHMvZGljdG5vdGVzLnR4dApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAgICAgZC5zZXRkZWZhdWx0KHdvcmQsIFtdKS5hcHBlbmQocGFnZW51bWJlcikKIAogICAgIE5vdGUsIHRoZSBzZWNvbmQgZXhhbXBsZSBpcyBhIHVzZSBjYXNlIGNoYXJhY3Rlcml6ZWQgYnkgYSBnZXQgYW5kIHNldAotICAgIHRvIHRoZSBzYW1lIGtleS4gIFRoZXJlIGFyZSBzaW1pbGFyIHVzZWQgY2FzZXMgd2l0aCBhIF9fY29udGFpbnNfXworICAgIHRvIHRoZSBzYW1lIGtleS4gIFRoZXJlIGFyZSBzaW1pbGFyIHVzZSBjYXNlcyB3aXRoIGEgX19jb250YWluc19fCiAgICAgZm9sbG93ZWQgYnkgYSBnZXQsIHNldCwgb3IgZGVsIHRvIHRoZSBzYW1lIGtleS4gIFBhcnQgb2YgdGhlCiAgICAganVzdGlmaWNhdGlvbiBmb3IgZC5zZXRkZWZhdWx0IGlzIGNvbWJpbmluZyB0aGUgdHdvIGxvb2t1cHMgaW50byBvbmUuCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvc2V0b2JqZWN0LmMgYi9PYmplY3RzL3NldG9iamVjdC5jCmluZGV4IDBhZjFmMTUuLmJlODI5YTggMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2V0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zZXRvYmplY3QuYwpAQCAtNTczLDggKzU3MywxNyBAQAogCWNoYXIgKmVtaXQgPSAiIjsJLyogTm8gc2VwYXJhdG9yIGVtaXR0ZWQgb24gZmlyc3QgcGFzcyAqLwogCWNoYXIgKnNlcGFyYXRvciA9ICIsICI7CiAJaW50IGxpdGVyYWxmb3JtID0gMDsKKwlpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJZnByaW50ZihmcCwgIiVzKC4uLikiLCBzby0+b2JfdHlwZS0+dHBfbmFtZSk7CisJCXJldHVybiAwOworCX0gICAgICAgIAogCiAJaWYgKCFzby0+dXNlZCkgeworCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0Kilzbyk7CiAJCWZwcmludGYoZnAsICIlcygpIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC01ODcsMzIgKzU5Niw0NCBAQAogCXdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewogCQlmcHV0cyhlbWl0LCBmcCk7CiAJCWVtaXQgPSBzZXBhcmF0b3I7Ci0JCWlmIChQeU9iamVjdF9QcmludChlbnRyeS0+a2V5LCBmcCwgMCkgIT0gMCkKKwkJaWYgKFB5T2JqZWN0X1ByaW50KGVudHJ5LT5rZXksIGZwLCAwKSAhPSAwKSB7CisJCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0Kilzbyk7CiAJCQlyZXR1cm4gLTE7CisJCX0KIAl9CiAJaWYgKGxpdGVyYWxmb3JtKQogCQlmcHV0cygifSIsIGZwKTsKIAllbHNlCiAJCWZwdXRzKCJdKSIsIGZwKTsKKwlQeV9SZXByTGVhdmUoKFB5T2JqZWN0Kilzbyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcmVwcihQeVNldE9iamVjdCAqc28pCiB7Ci0JUHlPYmplY3QgKmtleXMsICpyZXN1bHQsICpsaXN0cmVwcjsKKwlQeU9iamVjdCAqa2V5cywgKnJlc3VsdD1OVUxMLCAqbGlzdHJlcHI7CisJaW50IHN0YXR1cyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKXNvKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoLi4uKSIsIHNvLT5vYl90eXBlLT50cF9uYW1lKTsKKwl9CiAKIAkvKiBzaG9ydGN1dCBmb3IgdGhlIGVtcHR5IHNldCAqLwotCWlmICghc28tPnVzZWQpCisJaWYgKCFzby0+dXNlZCkgeworCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0Kilzbyk7CiAJCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcygpIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOworCX0KIAogCWtleXMgPSBQeVNlcXVlbmNlX0xpc3QoKFB5T2JqZWN0ICopc28pOwogCWlmIChrZXlzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworCQlnb3RvIGRvbmU7CiAJbGlzdHJlcHIgPSBQeU9iamVjdF9SZXByKGtleXMpOwogCVB5X0RFQ1JFRihrZXlzKTsKIAlpZiAobGlzdHJlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZG9uZTsKIAogCWlmIChzby0+b2JfdHlwZSA9PSAmUHlTZXRfVHlwZSkgewogCQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKGxpc3RyZXByKTsKQEAgLTYyNCw2ICs2NDUsOCBAQAogCQkJIAlQeVN0cmluZ19BU19TVFJJTkcobGlzdHJlcHIpKTsKIAl9CiAJUHlfREVDUkVGKGxpc3RyZXByKTsKK2RvbmU6CisJUHlfUmVwckxlYXZlKChQeU9iamVjdCopc28pOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL1BDL3B5dGhvbl9udC5yYyBiL1BDL3B5dGhvbl9udC5yYwppbmRleCBhNGU5N2ZkLi42ZmI3M2I2IDEwMDY0NAotLS0gYS9QQy9weXRob25fbnQucmMKKysrIGIvUEMvcHl0aG9uX250LnJjCkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIlB5dGhvbiBDb3JlXDAiCiAgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCBQWVRIT05fVkVSU0lPTgogICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJQeXRob24gRExMXDAiCi0gICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBDb3B5cmlnaHQgqSAyMDAwIEJlT3Blbi5jb20uIENvcHlyaWdodCCpIDE5OTUtMjAwMSBDTlJJLiBDb3B5cmlnaHQgqSAxOTkxLTE5OTUgU01DLlwwIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCCpIDIwMDEtMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4gQ29weXJpZ2h0IKkgMjAwMCBCZU9wZW4uY29tLiBDb3B5cmlnaHQgqSAxOTk1LTIwMDEgQ05SSS4gQ29weXJpZ2h0IKkgMTk5MS0xOTk1IFNNQy5cMCIKICAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgUFlUSE9OX0RMTF9OQU1FICJcMCIKICAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJQeXRob25cMCIKICAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIFBZVEhPTl9WRVJTSU9OCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3B5dGhvbjIwLndzZSBiL1BDYnVpbGQvcHl0aG9uMjAud3NlCmluZGV4IGE2MjI2NWEuLmZhMTFhZjQgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9uMjAud3NlCisrKyBiL1BDYnVpbGQvcHl0aG9uMjAud3NlCkBAIC0yNCw4ICsyNCw4IEBACiAgIERpYWxvZ3MgVmVyc2lvbj04CiAgIFZlcnNpb24gRmlsZT0yLjRhMQogICBWZXJzaW9uIERlc2NyaXB0aW9uPVB5dGhvbiBQcm9ncmFtbWluZyBMYW5ndWFnZQotICBWZXJzaW9uIENvcHlyaWdodD2pMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIFZlcnNpb24gQ29tcGFueT1QeXRob25MYWJzIGF0IFpvcGUgQ29ycG9yYXRpb24KKyAgVmVyc2lvbiBDb3B5cmlnaHQ9qTIwMDEtMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorICBWZXJzaW9uIENvbXBhbnk9UHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICAgQ3J5c3RhbCBGb3JtYXQ9MTAxMTExMDAxMDExMDAwMDAwMTAwMDEwMDEwMDEwMDEKICAgU3RlcCBWaWV3PSZBbGwKICAgVmFyaWFibGUgTmFtZTE9X1dJU0VfCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9weXRob24yMC53c2UgYi9QQ2J1aWxkOC9weXRob24yMC53c2UKaW5kZXggMzNhMzQ5MS4uYThkOTc4NSAxMDA2NDQKLS0tIGEvUENidWlsZDgvcHl0aG9uMjAud3NlCisrKyBiL1BDYnVpbGQ4L3B5dGhvbjIwLndzZQpAQCAtMjQsOCArMjQsOCBAQAogICBEaWFsb2dzIFZlcnNpb249OA0KICAgVmVyc2lvbiBGaWxlPTIuNGExDQogICBWZXJzaW9uIERlc2NyaXB0aW9uPVB5dGhvbiBQcm9ncmFtbWluZyBMYW5ndWFnZQ0KLSAgVmVyc2lvbiBDb3B5cmlnaHQ9qTIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbg0KLSAgVmVyc2lvbiBDb21wYW55PVB5dGhvbkxhYnMgYXQgWm9wZSBDb3Jwb3JhdGlvbg0KKyAgVmVyc2lvbiBDb3B5cmlnaHQ9qTIwMDEtMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbg0KKyAgVmVyc2lvbiBDb21wYW55PVB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uDQogICBDcnlzdGFsIEZvcm1hdD0xMDExMTEwMDEwMTEwMDAwMDAxMDAwMTAwMTAwMTAwMQ0KICAgU3RlcCBWaWV3PSZBbGwNCiAgIFZhcmlhYmxlIE5hbWUxPV9XSVNFXw0KZGlmZiAtLWdpdCBhL1B5dGhvbi9jZXZhbC5jIGIvUHl0aG9uL2NldmFsLmMKaW5kZXggZjVlYmI4ZS4uOTc4ZmY2MSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NldmFsLmMKKysrIGIvUHl0aG9uL2NldmFsLmMKQEAgLTczOCw3ICs3MzgsMTYgQEAKIAkgICB0aGlzIHdhc24ndCBhbHdheXMgdHJ1ZSBiZWZvcmUgMi4zISAgUHlGcmFtZV9OZXcgbm93IHNldHMKIAkgICBmLT5mX2xhc3RpIHRvIC0xIChpLmUuIHRoZSBpbmRleCAqYmVmb3JlKiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24pCiAJICAgYW5kIFlJRUxEX1ZBTFVFIGRvZXNuJ3QgZmlkZGxlIHdpdGggZl9sYXN0aSBhbnkgbW9yZS4gIFNvIHRoaXMKLQkgICBkb2VzIHdvcmsuICBQcm9taXNlLiAqLworCSAgIGRvZXMgd29yay4gIFByb21pc2UuIAorCisJICAgV2hlbiB0aGUgUFJFRElDVCgpIG1hY3JvcyBhcmUgZW5hYmxlZCwgc29tZSBvcGNvZGUgcGFpcnMgZm9sbG93IGluCisgICAgICAgICAgIGRpcmVjdCBzdWNjZXNzaW9uIHdpdGhvdXQgdXBkYXRpbmcgZi0+Zl9sYXN0aS4gIEEgc3VjY2Vzc2Z1bCAKKyAgICAgICAgICAgcHJlZGljdGlvbiBlZmZlY3RpdmVseSBsaW5rcyB0aGUgdHdvIGNvZGVzIHRvZ2V0aGVyIGFzIGlmIHRoZXkKKyAgICAgICAgICAgd2VyZSBhIHNpbmdsZSBuZXcgb3Bjb2RlOyBhY2NvcmRpbmdseSxmLT5mX2xhc3RpIHdpbGwgcG9pbnQgdG8KKyAgICAgICAgICAgdGhlIGZpcnN0IGNvZGUgaW4gdGhlIHBhaXIgKGZvciBpbnN0YW5jZSwgR0VUX0lURVIgZm9sbG93ZWQgYnkKKyAgICAgICAgICAgRk9SX0lURVIgaXMgZWZmZWN0aXZlbHkgYSBzaW5nbGUgb3Bjb2RlIGFuZCBmLT5mX2xhc3RpIHdpbGwgcG9pbnQKKyAgICAgICAgICAgYXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tYmluZWQgcGFpci4pCisJKi8KIAluZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyBmLT5mX2xhc3RpICsgMTsKIAlzdGFja19wb2ludGVyID0gZi0+Zl9zdGFja3RvcDsKIAlhc3NlcnQoc3RhY2tfcG9pbnRlciAhPSBOVUxMKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9lcnJvcnMuYyBiL1B5dGhvbi9lcnJvcnMuYwppbmRleCAyOGMxZWE1Li4wZTU2NWMxIDEwMDY0NAotLS0gYS9QeXRob24vZXJyb3JzLmMKKysrIGIvUHl0aG9uL2Vycm9ycy5jCkBAIC02NDksNyArNjQ5LDggQEAKIAogCWlmICh3YXJuaW5nc19tb2R1bGUgIT0gTlVMTCkgewogCQlkaWN0ID0gUHlNb2R1bGVfR2V0RGljdCh3YXJuaW5nc19tb2R1bGUpOwotCQlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIndhcm4iKTsKKwkJaWYgKGRpY3QgIT0gTlVMTCkKKwkJCWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAid2FybiIpOwogCX0KIAlpZiAoZnVuYyA9PSBOVUxMKSB7CiAJCVB5U3lzX1dyaXRlU3RkZXJyKCJ3YXJuaW5nOiAlc1xuIiwgbWVzc2FnZSk7CmRpZmYgLS1naXQgYS9QeXRob24vZ2V0Y29weXJpZ2h0LmMgYi9QeXRob24vZ2V0Y29weXJpZ2h0LmMKaW5kZXggMzI1YWVlNS4uYzEwYWVhNCAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldGNvcHlyaWdodC5jCisrKyBiL1B5dGhvbi9nZXRjb3B5cmlnaHQuYwpAQCAtNCw3ICs0LDcgQEAKIAogc3RhdGljIGNoYXIgY3BydFtdID0gCiAiXAotQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uXG5cCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi5cblwKIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCiBcblwKIENvcHlyaWdodCAoYykgMjAwMCBCZU9wZW4uY29tLlxuXApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IGVkNmIxMzkuLjZlZWIwNTEgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTEsNyArMSw4IEBACiBUaGlzIGlzIFB5dGhvbiAzMDAwIC0tIHVudmVyc2lvbmVkIChicmFuY2hlZCBvZmYgMi41IGluIHZhcmlvdXMgYmV0YSBzdGFnZXMpCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1Db3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCitDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgCitQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKIENvcHlyaWdodCAoYykgMjAwMCBCZU9wZW4uY29tLgpkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQppbmRleCAzOTAwMTA3Li4xZjUyOWUzIDEwMDY0NAotLS0gYS9zZXR1cC5weQorKysgYi9zZXR1cC5weQpAQCAtNjA2LDcgKzYwNiw3IEBACiAgICAgICAgICMgYSByZWxlYXNlLiAgTW9zdCBvcGVuIHNvdXJjZSBPU2VzIGNvbWUgd2l0aCBvbmUgb3IgbW9yZQogICAgICAgICAjIHZlcnNpb25zIG9mIEJlcmtlbGV5REIgYWxyZWFkeSBpbnN0YWxsZWQuCiAKLSAgICAgICAgbWF4X2RiX3ZlciA9ICg0LCA0KQorICAgICAgICBtYXhfZGJfdmVyID0gKDQsIDUpCiAgICAgICAgIG1pbl9kYl92ZXIgPSAoMywgMykKICAgICAgICAgZGJfc2V0dXBfZGVidWcgPSBGYWxzZSAgICMgdmVyYm9zZSBkZWJ1ZyBwcmludHMgZnJvbSB0aGlzIHNjcmlwdD8KIApAQCAtNjIzLDcgKzYyMyw3IEBACiAgICAgICAgICAgICAnL3N3L2luY2x1ZGUvZGIzJywKICAgICAgICAgXQogICAgICAgICAjIDQueCBtaW5vciBudW1iZXIgc3BlY2lmaWMgcGF0aHMKLSAgICAgICAgZm9yIHggaW4gKDAsMSwyLDMsNCk6CisgICAgICAgIGZvciB4IGluICgwLDEsMiwzLDQsNSk6CiAgICAgICAgICAgICBkYl9pbmNfcGF0aHMuYXBwZW5kKCcvdXNyL2luY2x1ZGUvZGI0JWQnICUgeCkKICAgICAgICAgICAgIGRiX2luY19wYXRocy5hcHBlbmQoJy91c3IvaW5jbHVkZS9kYjQuJWQnICUgeCkKICAgICAgICAgICAgIGRiX2luY19wYXRocy5hcHBlbmQoJy91c3IvbG9jYWwvQmVya2VsZXlEQi40LiVkL2luY2x1ZGUnICUgeCkKQEAgLTYzMSw3ICs2MzEsNyBAQAogICAgICAgICAgICAgZGJfaW5jX3BhdGhzLmFwcGVuZCgnL3BrZy9kYi00LiVkL2luY2x1ZGUnICUgeCkKICAgICAgICAgICAgIGRiX2luY19wYXRocy5hcHBlbmQoJy9vcHQvZGItNC4lZC9pbmNsdWRlJyAlIHgpCiAgICAgICAgICMgMy54IG1pbm9yIG51bWJlciBzcGVjaWZpYyBwYXRocwotICAgICAgICBmb3IgeCBpbiAoMiwzKToKKyAgICAgICAgZm9yIHggaW4gKDMsKToKICAgICAgICAgICAgIGRiX2luY19wYXRocy5hcHBlbmQoJy91c3IvaW5jbHVkZS9kYjMlZCcgJSB4KQogICAgICAgICAgICAgZGJfaW5jX3BhdGhzLmFwcGVuZCgnL3Vzci9sb2NhbC9CZXJrZWxleURCLjMuJWQvaW5jbHVkZScgJSB4KQogICAgICAgICAgICAgZGJfaW5jX3BhdGhzLmFwcGVuZCgnL3Vzci9sb2NhbC9pbmNsdWRlL2RiMyVkJyAlIHgpCg==