ZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2Jhc2VodHRwLnB5IGIvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKaW5kZXggNGM5NjQ1ZC4uMTBhNzA2ZSAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKKysrIGIvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKQEAgLTY4LDcgKzY4LDYgQEAKIGltcG9ydCB0aW1lCiBpbXBvcnQgc29ja2V0ICMgRm9yIGdldGhvc3RieWFkZHIoKQogaW1wb3J0IHN0cmluZwotaW1wb3J0IHJmYzgyMgogaW1wb3J0IG1pbWV0b29scwogaW1wb3J0IFNvY2tldFNlcnZlcgogCkBAIC05NCwxMiArOTMsMTYgQEAKICAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuc29ja2V0LmdldHNvY2tuYW1lKCkKICAgICAgICAgaWYgbm90IGhvc3Qgb3IgaG9zdCA9PSAnMC4wLjAuMCc6CiAgICAgICAgICAgICBob3N0ID0gc29ja2V0LmdldGhvc3RuYW1lKCkKLSAgICAgICAgaG9zdG5hbWUsIGhvc3RuYW1lcywgaG9zdGFkZHJzID0gc29ja2V0LmdldGhvc3RieWFkZHIoaG9zdCkKLSAgICAgICAgaWYgJy4nIG5vdCBpbiBob3N0bmFtZToKLSAgICAgICAgICAgIGZvciBob3N0IGluIGhvc3RuYW1lczoKLSAgICAgICAgICAgICAgICBpZiAnLicgaW4gaG9zdDoKLSAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhvc3RuYW1lLCBob3N0bmFtZXMsIGhvc3RhZGRycyA9IHNvY2tldC5nZXRob3N0YnlhZGRyKGhvc3QpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBob3N0bmFtZSA9IGhvc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmICcuJyBub3QgaW4gaG9zdG5hbWU6CisgICAgICAgICAgICAgICAgZm9yIGhvc3QgaW4gaG9zdG5hbWVzOgorICAgICAgICAgICAgICAgICAgICBpZiAnLicgaW4gaG9zdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgc2VsZi5zZXJ2ZXJfbmFtZSA9IGhvc3RuYW1lCiAgICAgICAgIHNlbGYuc2VydmVyX3BvcnQgPSBwb3J0CiAKQEAgLTE2OSw3ICsxNzIsNyBAQAogCiAgICAgVGhpcyBzZXJ2ZXIgcGFyc2VzIHRoZSByZXF1ZXN0IGFuZCB0aGUgaGVhZGVycywgYW5kIHRoZW4gY2FsbHMgYQogICAgIGZ1bmN0aW9uIHNwZWNpZmljIHRvIHRoZSByZXF1ZXN0IHR5cGUgKDxjb21tYW5kPikuICBTcGVjaWZpY2FsbHksCi0gICAgYSByZXF1ZXN0IFNQQU0gd2lsbCBiZSBoYW5kbGVkIGJ5IGEgbWV0aG9kIGhhbmRsZV9TUEFNKCkuICBJZiBubworICAgIGEgcmVxdWVzdCBTUEFNIHdpbGwgYmUgaGFuZGxlZCBieSBhIG1ldGhvZCBkb19TUEFNKCkuICBJZiBubwogICAgIHN1Y2ggbWV0aG9kIGV4aXN0cyB0aGUgc2VydmVyIHNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZQogICAgIGNsaWVudC4gIElmIGl0IGV4aXN0cywgaXQgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzOgogCkBAIC0yMTYsMTYgKzIxOSwxNyBAQAogICAgICMgd2hlcmUgZWFjaCBzdHJpbmcgaXMgb2YgdGhlIGZvcm0gbmFtZVsvdmVyc2lvbl0uCiAgICAgc2VydmVyX3ZlcnNpb24gPSAiQmFzZUhUVFAvIiArIF9fdmVyc2lvbl9fCiAKLSAgICBkZWYgaGFuZGxlKHNlbGYpOgotICAgICAgICAiIiJIYW5kbGUgYSBzaW5nbGUgSFRUUCByZXF1ZXN0LgorICAgIGRlZiBwYXJzZV9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHJlcXVlc3QgKGludGVybmFsKS4KIAotICAgICAgICBZb3Ugbm9ybWFsbHkgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZDsgc2VlIHRoZSBjbGFzcwotICAgICAgICBfX2RvY19fIHN0cmluZyBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGhhbmRsZSBzcGVjaWZpYyBIVFRQCi0gICAgICAgIGNvbW1hbmRzIHN1Y2ggYXMgR0VUIGFuZCBQT1NULgorICAgICAgICBUaGUgcmVxdWVzdCBzaG91bGQgYmUgc3RvcmVkIGluIHNlbGYucmF3X3JlcXVlc3Q7IHRoZSByZXN1bHRzCisgICAgICAgIGFyZSBpbiBzZWxmLmNvbW1hbmQsIHNlbGYucGF0aCwgc2VsZi5yZXF1ZXN0X3ZlcnNpb24gYW5kCisgICAgICAgIHNlbGYuaGVhZGVycy4KKworICAgICAgICBSZXR1cm4gdmFsdWUgaXMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZTsgb24gZmFpbHVyZSwgYW4KKyAgICAgICAgZXJyb3IgaXMgc2VudCBiYWNrLgogCiAgICAgICAgICIiIgotCi0gICAgICAgIHNlbGYucmF3X3JlcXVlc3RsaW5lID0gc2VsZi5yZmlsZS5yZWFkbGluZSgpCiAgICAgICAgIHNlbGYucmVxdWVzdF92ZXJzaW9uID0gdmVyc2lvbiA9ICJIVFRQLzAuOSIgIyBEZWZhdWx0CiAgICAgICAgIHJlcXVlc3RsaW5lID0gc2VsZi5yYXdfcmVxdWVzdGxpbmUKICAgICAgICAgaWYgcmVxdWVzdGxpbmVbLTI6XSA9PSAnXHJcbic6CkBAIC0yMzgsMjEgKzI0MiwzNSBAQAogICAgICAgICAgICAgW2NvbW1hbmQsIHBhdGgsIHZlcnNpb25dID0gd29yZHMKICAgICAgICAgICAgIGlmIHZlcnNpb25bOjVdICE9ICdIVFRQLyc6CiAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMCwgIkJhZCByZXF1ZXN0IHZlcnNpb24gKCVzKSIgJSBgdmVyc2lvbmApCi0gICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZWxpZiBsZW4od29yZHMpID09IDI6CiAgICAgICAgICAgICBbY29tbWFuZCwgcGF0aF0gPSB3b3JkcwogICAgICAgICAgICAgaWYgY29tbWFuZCAhPSAnR0VUJzoKICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIEhUVFAvMC45IHJlcXVlc3QgdHlwZSAoJXMpIiAlIGBjb21tYW5kYCkKLSAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMCwgIkJhZCByZXF1ZXN0IHN5bnRheCAoJXMpIiAlIGByZXF1ZXN0bGluZWApCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIHNlbGYuY29tbWFuZCwgc2VsZi5wYXRoLCBzZWxmLnJlcXVlc3RfdmVyc2lvbiA9IGNvbW1hbmQsIHBhdGgsIHZlcnNpb24KICAgICAgICAgc2VsZi5oZWFkZXJzID0gc2VsZi5NZXNzYWdlQ2xhc3Moc2VsZi5yZmlsZSwgMCkKLSAgICAgICAgbW5hbWUgPSAnZG9fJyArIGNvbW1hbmQKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICIiIkhhbmRsZSBhIHNpbmdsZSBIVFRQIHJlcXVlc3QuCisKKyAgICAgICAgWW91IG5vcm1hbGx5IGRvbid0IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IHNlZSB0aGUgY2xhc3MKKyAgICAgICAgX19kb2NfXyBzdHJpbmcgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBoYW5kbGUgc3BlY2lmaWMgSFRUUAorICAgICAgICBjb21tYW5kcyBzdWNoIGFzIEdFVCBhbmQgUE9TVC4KKworICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnJhd19yZXF1ZXN0bGluZSA9IHNlbGYucmZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZV9yZXF1ZXN0KCk6ICMgQW4gZXJyb3IgY29kZSBoYXMgYmVlbiBzZW50LCBqdXN0IGV4aXQKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtbmFtZSA9ICdkb18nICsgc2VsZi5jb21tYW5kCiAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsIG1uYW1lKToKLSAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig1MDEsICJVbnN1cHBvcnRlZCBtZXRob2QgKCVzKSIgJSBgY29tbWFuZGApCisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNTAxLCAiVW5zdXBwb3J0ZWQgbWV0aG9kICglcykiICUgYHNlbGYuY29tbWFuZGApCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCBtbmFtZSkKICAgICAgICAgbWV0aG9kKCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2NnaWh0dHBzLnB5IGIvTGliL2Rvcy04eDMvY2dpaHR0cHMucHkKaW5kZXggODA2ZWY1Ny4uZmEzMGNiZCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvY2dpaHR0cHMucHkKKysrIGIvTGliL2Rvcy04eDMvY2dpaHR0cHMucHkKQEAgLTMsNiArMyw5IEBACiBUaGlzIG1vZHVsZSBidWlsZHMgb24gU2ltcGxlSFRUUFNlcnZlciBieSBpbXBsZW1lbnRpbmcgR0VUIGFuZCBQT1NUCiByZXF1ZXN0cyB0byBjZ2ktYmluIHNjcmlwdHMuCiAKK0lmIHRoZSBvcy5mb3JrKCkgZnVuY3Rpb24gaXMgbm90IHByZXNlbnQsIHRoaXMgbW9kdWxlIHdpbGwgbm90IHdvcms7CitTeXN0ZW1FcnJvciB3aWxsIGJlIHJhaXNlZCBpbnN0ZWFkLgorCiAiIiIKIAogCkBAIC0xMCwxNSArMTMsMTggQEAKIAogCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKLWltcG9ydCB0aW1lCi1pbXBvcnQgc29ja2V0CiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgdXJsbGliCiBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKIGltcG9ydCBTaW1wbGVIVFRQU2VydmVyCiAKIAordHJ5OgorICAgIG9zLmZvcmsKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSBTeXN0ZW1FcnJvciwgX19uYW1lX18gKyAiIHJlcXVpcmVzIG9zLmZvcmsoKSIKKworCiBjbGFzcyBDR0lIVFRQUmVxdWVzdEhhbmRsZXIoU2ltcGxlSFRUUFNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIpOgogCiAgICAgIiIiQ29tcGxldGUgSFRUUCBzZXJ2ZXIgd2l0aCBHRVQsIEhFQUQgYW5kIFBPU1QgY29tbWFuZHMuCkBAIC0xNTAsNiArMTU2LDkgQEAKICAgICAgICAgICAgIHVhID0gc2VsZi5oZWFkZXJzLmdldGhlYWRlcigndXNlci1hZ2VudCcpCiAgICAgICAgICAgICBpZiB1YToKICAgICAgICAgICAgICAgICBlbnZbJ0hUVFBfVVNFUl9BR0VOVCddID0gdWEKKyAgICAgICAgICAgIGNvID0gZmlsdGVyKE5vbmUsIHNlbGYuaGVhZGVycy5nZXRoZWFkZXJzKCdjb29raWUnKSkKKyAgICAgICAgICAgIGlmIGNvOgorICAgICAgICAgICAgICAgIGVudlsnSFRUUF9DT09LSUUnXSA9IHN0cmluZy5qb2luKGNvLCAnLCAnKQogICAgICAgICAgICAgIyBYWFggT3RoZXIgSFRUUF8qIGhlYWRlcnMKICAgICAgICAgICAgIGRlY29kZWRfcXVlcnkgPSBzdHJpbmcucmVwbGFjZShxdWVyeSwgJysnLCAnICcpCiAgICAgICAgICAgICB0cnk6CkBAIC0xNzcsNyArMTg2LDcgQEAKICAgICBpbXBvcnQgcHdkCiAgICAgdHJ5OgogICAgICAgICBub2JvZHkgPSBwd2QuZ2V0cHduYW0oJ25vYm9keScpWzJdCi0gICAgZXhjZXB0IHB3ZC5lcnJvcjoKKyAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgIG5vYm9keSA9IDEgKyBtYXgobWFwKGxhbWJkYSB4OiB4WzJdLCBwd2QuZ2V0cHdhbGwoKSkpCiAgICAgcmV0dXJuIG5vYm9keQogCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9jb25maWdwYS5weSBiL0xpYi9kb3MtOHgzL2NvbmZpZ3BhLnB5CmluZGV4IGRkOGI2ZDguLmUxY2U5ZGQgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL2NvbmZpZ3BhLnB5CisrKyBiL0xpYi9kb3MtOHgzL2NvbmZpZ3BhLnB5CkBAIC0zMywxMSArMzMsMjQgQEAKICAgICBzZWN0aW9ucygpCiAgICAgICAgIHJldHVybiBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBuYW1lcywgc2FucyBERUZBVUxUCiAKKyAgICBoYXNfc2VjdGlvbihzZWN0aW9uKQorICAgICAgICByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc2VjdGlvbiBleGlzdHMKKwogICAgIG9wdGlvbnMoc2VjdGlvbikKICAgICAgICAgcmV0dXJuIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbmFtZWQgc2VjdGlvbgogCisgICAgaGFzX29wdGlvbihzZWN0aW9uLCBvcHRpb24pCisgICAgICAgIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBzZWN0aW9uIGhhcyB0aGUgZ2l2ZW4gb3B0aW9uCisKICAgICByZWFkKGZpbGVuYW1lcykKLSAgICAgICAgcmVhZCBhbmQgcGFyc2UgdGhlIGxpc3Qgb2YgbmFtZWQgY29uZmlndXJhdGlvbiBmaWxlcworICAgICAgICByZWFkIGFuZCBwYXJzZSB0aGUgbGlzdCBvZiBuYW1lZCBjb25maWd1cmF0aW9uIGZpbGVzLCBnaXZlbiBieQorICAgICAgICBuYW1lLiAgQSBzaW5nbGUgZmlsZW5hbWUgaXMgYWxzbyBhbGxvd2VkLiAgTm9uLWV4aXN0aW5nIGZpbGVzCisgICAgICAgIGFyZSBpZ25vcmVkLgorCisgICAgcmVhZGZwKGZwLCBmaWxlbmFtZT1Ob25lKQorICAgICAgICByZWFkIGFuZCBwYXJzZSBvbmUgY29uZmlndXJhdGlvbiBmaWxlLCBnaXZlbiBhcyBhIGZpbGUgb2JqZWN0LgorICAgICAgICBUaGUgZmlsZW5hbWUgZGVmYXVsdHMgdG8gZnAubmFtZTsgaXQgaXMgb25seSB1c2VkIGluIGVycm9yCisgICAgICAgIG1lc3NhZ2VzIChpZiBmcCBoYXMgbm8gYG5hbWUnIGF0dHJpYnV0ZSwgdGhlIHN0cmluZyBgPD8/Pz4nIGlzIHVzZWQpLgogCiAgICAgZ2V0KHNlY3Rpb24sIG9wdGlvbiwgcmF3PTAsIHZhcnM9Tm9uZSkKICAgICAgICAgcmV0dXJuIGEgc3RyaW5nIHZhbHVlIGZvciB0aGUgbmFtZWQgb3B0aW9uLiAgQWxsICUgaW50ZXJwb2xhdGlvbnMgYXJlCkBAIC0xNTgsNiArMTcxLDcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuX19zZWN0aW9ucy5oYXNfa2V5KHNlY3Rpb24pCiAKICAgICBkZWYgb3B0aW9ucyhzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBvcHRpb24gbmFtZXMgZm9yIHRoZSBnaXZlbiBzZWN0aW9uIG5hbWUuIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG9wdHMgPSBzZWxmLl9fc2VjdGlvbnNbc2VjdGlvbl0uY29weSgpCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKQEAgLTE2NSwxNiArMTc5LDQ5IEBACiAgICAgICAgIG9wdHMudXBkYXRlKHNlbGYuX19kZWZhdWx0cykKICAgICAgICAgcmV0dXJuIG9wdHMua2V5cygpCiAKKyAgICBkZWYgaGFzX29wdGlvbihzZWxmLCBzZWN0aW9uLCBvcHRpb24pOgorICAgICAgICAiIiJSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc2VjdGlvbiBoYXMgdGhlIGdpdmVuIG9wdGlvbi4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3B0cyA9IHNlbGYuX19zZWN0aW9uc1tzZWN0aW9uXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICByZXR1cm4gb3B0cy5oYXNfa2V5KG9wdGlvbikKKwogICAgIGRlZiByZWFkKHNlbGYsIGZpbGVuYW1lcyk6Ci0gICAgICAgICIiIlJlYWQgYW5kIHBhcnNlIGEgbGlzdCBvZiBmaWxlbmFtZXMuIiIiCisgICAgICAgICIiIlJlYWQgYW5kIHBhcnNlIGEgZmlsZW5hbWUgb3IgYSBsaXN0IG9mIGZpbGVuYW1lcy4KKyAgICAgICAgCisgICAgICAgIEZpbGVzIHRoYXQgY2Fubm90IGJlIG9wZW5lZCBhcmUgc2lsZW50bHkgaWdub3JlZDsgdGhpcyBpcworICAgICAgICBkZXNpZ25lZCBzbyB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhIGxpc3Qgb2YgcG90ZW50aWFsCisgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBsb2NhdGlvbnMgKGUuZy4gY3VycmVudCBkaXJlY3RvcnksIHVzZXIncworICAgICAgICBob21lIGRpcmVjdG9yeSwgc3lzdGVtd2lkZSBkaXJlY3RvcnkpLCBhbmQgYWxsIGV4aXN0aW5nCisgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIGxpc3Qgd2lsbCBiZSByZWFkLiAgQSBzaW5nbGUKKyAgICAgICAgZmlsZW5hbWUgbWF5IGFsc28gYmUgZ2l2ZW4uCisgICAgICAgICIiIgogICAgICAgICBpZiB0eXBlKGZpbGVuYW1lcykgaXMgdHlwZSgnJyk6CiAgICAgICAgICAgICBmaWxlbmFtZXMgPSBbZmlsZW5hbWVzXQotICAgICAgICBmb3IgZmlsZSBpbiBmaWxlbmFtZXM6CisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZnAgPSBvcGVuKGZpbGUsICdyJykKLSAgICAgICAgICAgICAgICBzZWxmLl9fcmVhZChmcCkKKyAgICAgICAgICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUpCiAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuX19yZWFkKGZwLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiByZWFkZnAoc2VsZiwgZnAsIGZpbGVuYW1lPU5vbmUpOgorICAgICAgICAiIiJMaWtlIHJlYWQoKSBidXQgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBmaWxlLWxpa2Ugb2JqZWN0LgorCisgICAgICAgIFRoZSBgZnAnIGFyZ3VtZW50IG11c3QgaGF2ZSBhIGByZWFkbGluZScgbWV0aG9kLiAgT3B0aW9uYWwKKyAgICAgICAgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBgZmlsZW5hbWUnLCB3aGljaCBpZiBub3QgZ2l2ZW4sIGlzCisgICAgICAgIHRha2VuIGZyb20gZnAubmFtZS4gIElmIGZwIGhhcyBubyBgbmFtZScgYXR0cmlidXRlLCBgPD8/Pz4nIGlzCisgICAgICAgIHVzZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmcC5uYW1lCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAnPD8/Pz4nCisgICAgICAgIHNlbGYuX19yZWFkKGZwLCBmaWxlbmFtZSkKIAogICAgIGRlZiBnZXQoc2VsZiwgc2VjdGlvbiwgb3B0aW9uLCByYXc9MCwgdmFycz1Ob25lKToKICAgICAgICAgIiIiR2V0IGFuIG9wdGlvbiB2YWx1ZSBmb3IgYSBnaXZlbiBzZWN0aW9uLgpAQCAtMTk5LDcgKzI0Niw3IEBACiAgICAgICAgICMgVXBkYXRlIHdpdGggdGhlIGVudHJ5IHNwZWNpZmljIHZhcmlhYmxlcwogICAgICAgICBpZiB2YXJzOgogICAgICAgICAgICAgZC51cGRhdGUodmFycykKLSAgICAgICAgb3B0aW9uID0gc3RyaW5nLmxvd2VyKG9wdGlvbikKKyAgICAgICAgb3B0aW9uID0gc2VsZi5vcHRpb254Zm9ybShvcHRpb24pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJhd3ZhbCA9IGRbb3B0aW9uXQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CkBAIC0yMTIsNyArMjU5LDcgQEAKICAgICAgICAgZGVwdGggPSAwICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgd2hpbGUgZGVwdGggPCAxMDogICAgICAgICAgICAgICAjIExvb3AgdGhyb3VnaCB0aGlzIHVudGlsIGl0J3MgZG9uZQogICAgICAgICAgICAgZGVwdGggPSBkZXB0aCArIDEKLSAgICAgICAgICAgIGlmIG5vdCBzdHJpbmcuZmluZCh2YWx1ZSwgIiUoIik6CisgICAgICAgICAgICBpZiBzdHJpbmcuZmluZCh2YWx1ZSwgIiUoIikgPj0gMDoKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgJSBkCiAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yLCBrZXk6CkBAIC0yMzYsMjUgKzI4MywyOCBAQAogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ05vdCBhIGJvb2xlYW46ICVzJyAlIHYKICAgICAgICAgcmV0dXJuIHZhbAogCisgICAgZGVmIG9wdGlvbnhmb3JtKHNlbGYsIG9wdGlvbnN0cik6CisgICAgICAgIHJldHVybiBzdHJpbmcubG93ZXIob3B0aW9uc3RyKQorCiAgICAgIwogICAgICMgUmVndWxhciBleHByZXNzaW9ucyBmb3IgcGFyc2luZyBzZWN0aW9uIGhlYWRlcnMgYW5kIG9wdGlvbnMuICBOb3RlIGEKICAgICAjIHNsaWdodCBzZW1hbnRpYyBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbiwgYmVjYXVzZSBvZiB0aGUgdXNlCiAgICAgIyBvZiBcdywgXyBpcyBhbGxvd2VkIGluIHNlY3Rpb24gaGVhZGVyIG5hbWVzLgotICAgIF9fU0VDVENSRSA9IHJlLmNvbXBpbGUoCisgICAgU0VDVENSRSA9IHJlLmNvbXBpbGUoCiAgICAgICAgIHInXFsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbCi0gICAgICAgIHInKD9QPGhlYWRlcj5bLVx3XSspJyAgICAgICAgICAgICAgICAgIyBgLScsIGBfJyBvciBhbnkgYWxwaGFudW0KKyAgICAgICAgcicoP1A8aGVhZGVyPlstXHdfLiosKCl7fV0rKScgICAgICAgICAjIGEgbG90IG9mIHN0dWZmIGZvdW5kIGJ5IEl2TAogICAgICAgICByJ1xdJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgXQogICAgICAgICApCi0gICAgX19PUFRDUkUgPSByZS5jb21waWxlKAotICAgICAgICByJyg/UDxvcHRpb24+Wy0uXHddKyknICAgICAgICAgICAgICAgICMgLSAuIF8gYWxwaGFudW0KLSAgICAgICAgcidbIFx0XSpbOj1dWyBcdF0qJyAgICAgICAgICAgICAgICAgICAjIGFueSBudW1iZXIgb2Ygc3BhY2UvdGFiLAorICAgIE9QVENSRSA9IHJlLmNvbXBpbGUoCisgICAgICAgIHInKD9QPG9wdGlvbj5bLVx3Xy4qLCgpe31dKyknICAgICAgICAgIyBhIGxvdCBvZiBzdHVmZiBmb3VuZCBieSBJdkwKKyAgICAgICAgcidbIFx0XSooP1A8dmk+Wzo9XSlbIFx0XSonICAgICAgICAgICAjIGFueSBudW1iZXIgb2Ygc3BhY2UvdGFiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9sbG93ZWQgYnkgc2VwYXJhdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoZWl0aGVyIDogb3IgPSksIGZvbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBieSBhbnkgIyBzcGFjZS90YWIKICAgICAgICAgcicoP1A8dmFsdWU+LiopJCcgICAgICAgICAgICAgICAgICAgICAjIGV2ZXJ5dGhpbmcgdXAgdG8gZW9sCiAgICAgICAgICkKIAotICAgIGRlZiBfX3JlYWQoc2VsZiwgZnApOgorICAgIGRlZiBfX3JlYWQoc2VsZiwgZnAsIGZwbmFtZSk6CiAgICAgICAgICIiIlBhcnNlIGEgc2VjdGlvbmVkIHNldHVwIGZpbGUuCiAKICAgICAgICAgVGhlIHNlY3Rpb25zIGluIHNldHVwIGZpbGUgY29udGFpbnMgYSB0aXRsZSBsaW5lIGF0IHRoZSB0b3AsCkBAIC0yNzcsNyArMzI3LDcgQEAKICAgICAgICAgICAgIGlmIHN0cmluZy5zdHJpcChsaW5lKSA9PSAnJyBvciBsaW5lWzBdIGluICcjOyc6CiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGlmIHN0cmluZy5sb3dlcihzdHJpbmcuc3BsaXQobGluZSlbMF0pID09ICdyZW0nIFwKLSAgICAgICAgICAgICAgIGFuZCBsaW5lWzBdID09ICJyIjogICAgICAjIG5vIGxlYWRpbmcgd2hpdGVzcGFjZQorICAgICAgICAgICAgICAgYW5kIGxpbmVbMF0gaW4gInJSIjogICAgICAjIG5vIGxlYWRpbmcgd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAjIGNvbnRpbnVhdGlvbiBsaW5lPwogICAgICAgICAgICAgaWYgbGluZVswXSBpbiAnIFx0JyBhbmQgY3Vyc2VjdCBpcyBub3QgTm9uZSBhbmQgb3B0bmFtZToKQEAgLTI4Nyw3ICszMzcsNyBAQAogICAgICAgICAgICAgIyBhIHNlY3Rpb24gaGVhZGVyIG9yIG9wdGlvbiBoZWFkZXI/CiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICMgaXMgaXQgYSBzZWN0aW9uIGhlYWRlcj8KLSAgICAgICAgICAgICAgICBtbyA9IHNlbGYuX19TRUNUQ1JFLm1hdGNoKGxpbmUpCisgICAgICAgICAgICAgICAgbW8gPSBzZWxmLlNFQ1RDUkUubWF0Y2gobGluZSkKICAgICAgICAgICAgICAgICBpZiBtbzoKICAgICAgICAgICAgICAgICAgICAgc2VjdG5hbWUgPSBtby5ncm91cCgnaGVhZGVyJykKICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fX3NlY3Rpb25zLmhhc19rZXkoc2VjdG5hbWUpOgpAQCAtMzAxLDEzICszNTEsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgb3B0bmFtZSA9IE5vbmUKICAgICAgICAgICAgICAgICAjIG5vIHNlY3Rpb24gaGVhZGVyIGluIHRoZSBmaWxlPwogICAgICAgICAgICAgICAgIGVsaWYgY3Vyc2VjdCBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBNaXNzaW5nU2VjdGlvbkhlYWRlckVycm9yKGZwLm5hbWUsIGxpbmVubywgYGxpbmVgKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBNaXNzaW5nU2VjdGlvbkhlYWRlckVycm9yKGZwbmFtZSwgbGluZW5vLCBgbGluZWApCiAgICAgICAgICAgICAgICAgIyBhbiBvcHRpb24gbGluZT8KICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBtbyA9IHNlbGYuX19PUFRDUkUubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgbW8gPSBzZWxmLk9QVENSRS5tYXRjaChsaW5lKQogICAgICAgICAgICAgICAgICAgICBpZiBtbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdG5hbWUsIG9wdHZhbCA9IG1vLmdyb3VwKCdvcHRpb24nLCAndmFsdWUnKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0bmFtZSwgdmksIG9wdHZhbCA9IG1vLmdyb3VwKCdvcHRpb24nLCAndmknLCAndmFsdWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgb3B0bmFtZSA9IHN0cmluZy5sb3dlcihvcHRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmkgaW4gKCc9JywgJzonKSBhbmQgJzsnIGluIG9wdHZhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICc7JyBpcyBhIGNvbW1lbnQgZGVsaW1pdGVyIG9ubHkgaWYgaXQgZm9sbG93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBzcGFjaW5nIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHN0cmluZy5maW5kKG9wdHZhbCwgJzsnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcyBhbmQgb3B0dmFsW3Bvcy0xXSBpbiBzdHJpbmcud2hpdGVzcGFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0dmFsID0gb3B0dmFsWzpwb3NdCiAgICAgICAgICAgICAgICAgICAgICAgICBvcHR2YWwgPSBzdHJpbmcuc3RyaXAob3B0dmFsKQogICAgICAgICAgICAgICAgICAgICAgICAgIyBhbGxvdyBlbXB0eSB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wdHZhbCA9PSAnIiInOgpAQCAtMzE5LDcgKzM3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAjIHJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCB3aWxsIGNvbnRhaW4gYQogICAgICAgICAgICAgICAgICAgICAgICAgIyBsaXN0IG9mIGFsbCBib2d1cyBsaW5lcwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFBhcnNpbmdFcnJvcihmcC5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBQYXJzaW5nRXJyb3IoZnBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgZS5hcHBlbmQobGluZW5vLCBgbGluZWApCiAgICAgICAgICMgaWYgYW55IHBhcnNpbmcgZXJyb3JzIG9jY3VycmVkLCByYWlzZSBhbiBleGNlcHRpb24KICAgICAgICAgaWYgZToKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2V4Y2VwdGlvLnB5IGIvTGliL2Rvcy04eDMvZXhjZXB0aW8ucHkKaW5kZXggZTk0M2Y3Yi4uNDNkMWMyZCAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvZXhjZXB0aW8ucHkKKysrIGIvTGliL2Rvcy04eDMvZXhjZXB0aW8ucHkKQEAgLTMzLDYgKzMzLDggQEAKICAgICAgIHwgICAgfAogICAgICAgfCAgICArLS0gSU9FcnJvcgogICAgICAgfCAgICArLS0gT1NFcnJvcigqKQorICAgICAgfCAgICAgICAgIHwKKyAgICAgIHwgICAgICAgICArLS0gV2luZG93c0Vycm9yKCopCiAgICAgICB8CiAgICAgICArLS0gRU9GRXJyb3IKICAgICAgICstLSBSdW50aW1lRXJyb3IKQEAgLTQwLDYgKzQyLDkgQEAKICAgICAgIHwgICAgKy0tIE5vdEltcGxlbWVudGVkRXJyb3IoKikKICAgICAgIHwKICAgICAgICstLSBOYW1lRXJyb3IKKyAgICAgIHwgICAgfAorICAgICAgfCAgICArLS0gVW5ib3VuZExvY2FsRXJyb3IoKikKKyAgICAgIHwKICAgICAgICstLSBBdHRyaWJ1dGVFcnJvcgogICAgICAgKy0tIFN5bnRheEVycm9yCiAgICAgICArLS0gVHlwZUVycm9yCkBAIC01Niw2ICs2MSw5IEBACiAgICAgICB8ICAgICstLSBGbG9hdGluZ1BvaW50RXJyb3IKICAgICAgIHwKICAgICAgICstLSBWYWx1ZUVycm9yCisgICAgICB8ICAgIHwKKyAgICAgIHwgICAgKy0tIFVuaWNvZGVFcnJvcigqKQorICAgICAgfAogICAgICAgKy0tIFN5c3RlbUVycm9yCiAgICAgICArLS0gTWVtb3J5RXJyb3IKICIiIgpAQCAtMTM2LDYgKzE0NCwxMCBAQAogICAgICIiIk9TIHN5c3RlbSBjYWxsIGZhaWxlZC4iIiIKICAgICBwYXNzCiAKK2NsYXNzIFdpbmRvd3NFcnJvcihPU0Vycm9yKToKKyAgICAiIiJNUy1XaW5kb3dzIE9TIHN5c3RlbSBjYWxsIGZhaWxlZC4iIiIKKyAgICBwYXNzCisKIGNsYXNzIFJ1bnRpbWVFcnJvcihTdGFuZGFyZEVycm9yKToKICAgICAiIiJVbnNwZWNpZmllZCBydW4tdGltZSBlcnJvci4iIiIKICAgICBwYXNzCkBAIC0yMDgsNyArMjIwLDE1IEBACiAgICAgcGFzcwogCiBjbGFzcyBOYW1lRXJyb3IoU3RhbmRhcmRFcnJvcik6Ci0gICAgIiIiTmFtZSBub3QgZm91bmQgbG9jYWxseSBvciBnbG9iYWxseS4iIiIKKyAgICAiIiJOYW1lIG5vdCBmb3VuZCBnbG9iYWxseS4iIiIKKyAgICBwYXNzCisKK2NsYXNzIFVuYm91bmRMb2NhbEVycm9yKE5hbWVFcnJvcik6CisgICAgIiIiTG9jYWwgbmFtZSByZWZlcmVuY2VkIGJ1dCBub3QgYm91bmQgdG8gYSB2YWx1ZS4iIiIKKyAgICBwYXNzCisKK2NsYXNzIFVuaWNvZGVFcnJvcihWYWx1ZUVycm9yKToKKyAgICAiIiJVbmljb2RlIHJlbGF0ZWQgZXJyb3IuIiIiCiAgICAgcGFzcwogCiBjbGFzcyBNZW1vcnlFcnJvcihTdGFuZGFyZEVycm9yKToKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2ZpbGVpbnB1LnB5IGIvTGliL2Rvcy04eDMvZmlsZWlucHUucHkKaW5kZXggMmUyNmI1Yi4uZDFiNzYxNyAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvZmlsZWlucHUucHkKKysrIGIvTGliL2Rvcy04eDMvZmlsZWlucHUucHkKQEAgLTczLDExICs3MywxMSBAQAogCiAiIiIKIAotaW1wb3J0IHN5cywgb3MKK2ltcG9ydCBzeXMsIG9zLCBzdGF0CiAKIF9zdGF0ZSA9IE5vbmUKIAotZGVmIGlucHV0KGZpbGVzPSgpLCBpbnBsYWNlPTAsIGJhY2t1cD0iIik6CitkZWYgaW5wdXQoZmlsZXM9Tm9uZSwgaW5wbGFjZT0wLCBiYWNrdXA9IiIpOgogICAgIGdsb2JhbCBfc3RhdGUKICAgICBpZiBfc3RhdGUgYW5kIF9zdGF0ZS5fZmlsZToKICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiaW5wdXQoKSBhbHJlYWR5IGFjdGl2ZSIKQEAgLTEyMywxNSArMTIzLDE2IEBACiAKIGNsYXNzIEZpbGVJbnB1dDoKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlcz0oKSwgaW5wbGFjZT0wLCBiYWNrdXA9IiIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlcz1Ob25lLCBpbnBsYWNlPTAsIGJhY2t1cD0iIik6CiAgICAgICAgIGlmIHR5cGUoZmlsZXMpID09IHR5cGUoJycpOgogICAgICAgICAgICAgZmlsZXMgPSAoZmlsZXMsKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgZmlsZXMgPSB0dXBsZShmaWxlcykKKyAgICAgICAgICAgIGlmIGZpbGVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZmlsZXMgPSBzeXMuYXJndlsxOl0KICAgICAgICAgICAgIGlmIG5vdCBmaWxlczoKLSAgICAgICAgICAgICAgICBmaWxlcyA9IHR1cGxlKHN5cy5hcmd2WzE6XSkKLSAgICAgICAgICAgICAgICBpZiBub3QgZmlsZXM6Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gKCctJywpCisgICAgICAgICAgICAgICAgZmlsZXMgPSAoJy0nLCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmlsZXMgPSB0dXBsZShmaWxlcykKICAgICAgICAgc2VsZi5fZmlsZXMgPSBmaWxlcwogICAgICAgICBzZWxmLl9pbnBsYWNlID0gaW5wbGFjZQogICAgICAgICBzZWxmLl9iYWNrdXAgPSBiYWNrdXAKQEAgLTIwMywxMCArMjA0LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlbmFtZSArIChzZWxmLl9iYWNrdXAgb3IgIi5iYWsiKSkKICAgICAgICAgICAgICAgICAgICAgdHJ5OiBvcy51bmxpbmsoc2VsZi5fYmFja3VwZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjogcGFzcwotICAgICAgICAgICAgICAgICAgICAjIFRoZSBuZXh0IHRocmVlIGxpbmVzIG1heSByYWlzZSBJT0Vycm9yCisgICAgICAgICAgICAgICAgICAgICMgVGhlIG5leHQgZmV3IGxpbmVzIG1heSByYWlzZSBJT0Vycm9yCiAgICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLl9maWxlbmFtZSwgc2VsZi5fYmFja3VwZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBvcGVuKHNlbGYuX2JhY2t1cGZpbGVuYW1lLCAiciIpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9IG9wZW4oc2VsZi5fZmlsZW5hbWUsICJ3IikKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcGVybSA9IG9zLmZzdGF0KHNlbGYuX2ZpbGUuZmlsZW5vKCkpW3N0YXQuU1RfTU9ERV0KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3V0cHV0ID0gb3BlbihzZWxmLl9maWxlbmFtZSwgInciKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmQgPSBvcy5vcGVuKHNlbGYuX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fQ1JFQVQgfCBvcy5PX1dST05MWSB8IG9zLk9fVFJVTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9IG9zLmZkb3BlbihmZCwgInciKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKHNlbGYuX2ZpbGVuYW1lLCBwZXJtKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2F2ZXN0ZG91dCA9IHN5cy5zdGRvdXQKICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuX291dHB1dAogICAgICAgICAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9mb3JtYXR0ZS5weSBiL0xpYi9kb3MtOHgzL2Zvcm1hdHRlLnB5CmluZGV4IDRiMzQwZDUuLjRkNmExMjkgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL2Zvcm1hdHRlLnB5CisrKyBiL0xpYi9kb3MtOHgzL2Zvcm1hdHRlLnB5CkBAIC0xLDMgKzEsMjMgQEAKKyIiIkdlbmVyaWMgb3V0cHV0IGZvcm1hdHRpbmcuCisKK0Zvcm1hdHRlciBvYmplY3RzIHRyYW5zZm9ybSBhbiBhYnN0cmFjdCBmbG93IG9mIGZvcm1hdHRpbmcgZXZlbnRzIGludG8KK3NwZWNpZmljIG91dHB1dCBldmVudHMgb24gd3JpdGVyIG9iamVjdHMuIEZvcm1hdHRlcnMgbWFuYWdlIHNldmVyYWwgc3RhY2sKK3N0cnVjdHVyZXMgdG8gYWxsb3cgdmFyaW91cyBwcm9wZXJ0aWVzIG9mIGEgd3JpdGVyIG9iamVjdCB0byBiZSBjaGFuZ2VkIGFuZAorcmVzdG9yZWQ7IHdyaXRlcnMgbmVlZCBub3QgYmUgYWJsZSB0byBoYW5kbGUgcmVsYXRpdmUgY2hhbmdlcyBub3IgYW55IHNvcnQKK29mIGBgY2hhbmdlIGJhY2snJyBvcGVyYXRpb24uIFNwZWNpZmljIHdyaXRlciBwcm9wZXJ0aWVzIHdoaWNoIG1heSBiZQorY29udHJvbGxlZCB2aWEgZm9ybWF0dGVyIG9iamVjdHMgYXJlIGhvcml6b250YWwgYWxpZ25tZW50LCBmb250LCBhbmQgbGVmdAorbWFyZ2luIGluZGVudGF0aW9ucy4gQSBtZWNoYW5pc20gaXMgcHJvdmlkZWQgd2hpY2ggc3VwcG9ydHMgcHJvdmlkaW5nCithcmJpdHJhcnksIG5vbi1leGNsdXNpdmUgc3R5bGUgc2V0dGluZ3MgdG8gYSB3cml0ZXIgYXMgd2VsbC4gQWRkaXRpb25hbAoraW50ZXJmYWNlcyBmYWNpbGl0YXRlIGZvcm1hdHRpbmcgZXZlbnRzIHdoaWNoIGFyZSBub3QgcmV2ZXJzaWJsZSwgc3VjaCBhcworcGFyYWdyYXBoIHNlcGFyYXRpb24uIAorCitXcml0ZXIgb2JqZWN0cyBlbmNhcHN1bGF0ZSBkZXZpY2UgaW50ZXJmYWNlcy4gQWJzdHJhY3QgZGV2aWNlcywgc3VjaCBhcworZmlsZSBmb3JtYXRzLCBhcmUgc3VwcG9ydGVkIGFzIHdlbGwgYXMgcGh5c2ljYWwgZGV2aWNlcy4gVGhlIHByb3ZpZGVkCitpbXBsZW1lbnRhdGlvbnMgYWxsIHdvcmsgd2l0aCBhYnN0cmFjdCBkZXZpY2VzLiBUaGUgaW50ZXJmYWNlIG1ha2VzCithdmFpbGFibGUgbWVjaGFuaXNtcyBmb3Igc2V0dGluZyB0aGUgcHJvcGVydGllcyB3aGljaCBmb3JtYXR0ZXIgb2JqZWN0cworbWFuYWdlIGFuZCBpbnNlcnRpbmcgZGF0YSBpbnRvIHRoZSBvdXRwdXQuIAorIiIiCisKIGltcG9ydCBzdHJpbmcKIGltcG9ydCBzeXMKIGZyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGUKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2dvcGhlcmxpLnB5IGIvTGliL2Rvcy04eDMvZ29waGVybGkucHkKaW5kZXggMDMzZTU3OS4uNjk2NWZiZCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvZ29waGVybGkucHkKKysrIGIvTGliL2Rvcy04eDMvZ29waGVybGkucHkKQEAgLTEsNCArMSw0IEBACi0jIEdvcGhlciBwcm90b2NvbCBjbGllbnQgaW50ZXJmYWNlCisiIiJHb3BoZXIgcHJvdG9jb2wgY2xpZW50IGludGVyZmFjZS4iIiIKIAogaW1wb3J0IHN0cmluZwogCkBAIC0yOSwxODAgKzI5LDE4MCBAQAogQV9XSE9JUyAgICAgID0gJ3cnCiBBX1FVRVJZICAgICAgPSAncScKIEFfR0lGICAgICAgICA9ICdnJwotQV9IVE1MICAgICAgID0gJ2gnCQkJIyBIVE1MIGZpbGUKLUFfV1dXICAgICAgICA9ICd3JwkJCSMgV1dXIGFkZHJlc3MKK0FfSFRNTCAgICAgICA9ICdoJyAgICAgICAgICAjIEhUTUwgZmlsZQorQV9XV1cgICAgICAgID0gJ3cnICAgICAgICAgICMgV1dXIGFkZHJlc3MKIEFfUExVU19JTUFHRSA9ICc6JwogQV9QTFVTX01PVklFID0gJzsnCiBBX1BMVVNfU09VTkQgPSAnPCcKIAogCi0jIEZ1bmN0aW9uIG1hcHBpbmcgYWxsIGZpbGUgdHlwZXMgdG8gc3RyaW5nczsgdW5rbm93biB0eXBlcyBiZWNvbWUgVFlQRT0neCcKIF9uYW1lcyA9IGRpcigpCiBfdHlwZV90b19uYW1lX21hcCA9IHt9CiBkZWYgdHlwZV90b19uYW1lKGd0eXBlKToKLQlnbG9iYWwgX3R5cGVfdG9fbmFtZV9tYXAKLQlpZiBfdHlwZV90b19uYW1lX21hcD09e306Ci0JCWZvciBuYW1lIGluIF9uYW1lczoKLQkJCWlmIG5hbWVbOjJdID09ICdBXyc6Ci0JCQkJX3R5cGVfdG9fbmFtZV9tYXBbZXZhbChuYW1lKV0gPSBuYW1lWzI6XQotCWlmIF90eXBlX3RvX25hbWVfbWFwLmhhc19rZXkoZ3R5cGUpOgotCQlyZXR1cm4gX3R5cGVfdG9fbmFtZV9tYXBbZ3R5cGVdCi0JcmV0dXJuICdUWVBFPScgKyBgZ3R5cGVgCisgICAgIiIiTWFwIGFsbCBmaWxlIHR5cGVzIHRvIHN0cmluZ3M7IHVua25vd24gdHlwZXMgYmVjb21lIFRZUEU9J3gnLiIiIgorICAgIGdsb2JhbCBfdHlwZV90b19uYW1lX21hcAorICAgIGlmIF90eXBlX3RvX25hbWVfbWFwPT17fToKKyAgICAgICAgZm9yIG5hbWUgaW4gX25hbWVzOgorICAgICAgICAgICAgaWYgbmFtZVs6Ml0gPT0gJ0FfJzoKKyAgICAgICAgICAgICAgICBfdHlwZV90b19uYW1lX21hcFtldmFsKG5hbWUpXSA9IG5hbWVbMjpdCisgICAgaWYgX3R5cGVfdG9fbmFtZV9tYXAuaGFzX2tleShndHlwZSk6CisgICAgICAgIHJldHVybiBfdHlwZV90b19uYW1lX21hcFtndHlwZV0KKyAgICByZXR1cm4gJ1RZUEU9JyArIGBndHlwZWAKIAogIyBOYW1lcyBmb3IgY2hhcmFjdGVycyBhbmQgc3RyaW5ncwogQ1JMRiA9ICdcclxuJwogVEFCID0gJ1x0JwogCi0jIFNlbmQgYSBzZWxlY3RvciB0byBhIGdpdmVuIGhvc3QgYW5kIHBvcnQsIHJldHVybiBhIGZpbGUgd2l0aCB0aGUgcmVwbHkKIGRlZiBzZW5kX3NlbGVjdG9yKHNlbGVjdG9yLCBob3N0LCBwb3J0ID0gMCk6Ci0JaW1wb3J0IHNvY2tldAotCWltcG9ydCBzdHJpbmcKLQlpZiBub3QgcG9ydDoKLQkJaSA9IHN0cmluZy5maW5kKGhvc3QsICc6JykKLQkJaWYgaSA+PSAwOgotCQkJaG9zdCwgcG9ydCA9IGhvc3RbOmldLCBzdHJpbmcuYXRvaShob3N0W2krMTpdKQotCWlmIG5vdCBwb3J0OgotCQlwb3J0ID0gREVGX1BPUlQKLQllbGlmIHR5cGUocG9ydCkgPT0gdHlwZSgnJyk6Ci0JCXBvcnQgPSBzdHJpbmcuYXRvaShwb3J0KQotCXMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0Jcy5jb25uZWN0KGhvc3QsIHBvcnQpCi0Jcy5zZW5kKHNlbGVjdG9yICsgQ1JMRikKLQlzLnNodXRkb3duKDEpCi0JcmV0dXJuIHMubWFrZWZpbGUoJ3JiJykKKyAgICAiIiJTZW5kIGEgc2VsZWN0b3IgdG8gYSBnaXZlbiBob3N0IGFuZCBwb3J0LCByZXR1cm4gYSBmaWxlIHdpdGggdGhlIHJlcGx5LiIiIgorICAgIGltcG9ydCBzb2NrZXQKKyAgICBpbXBvcnQgc3RyaW5nCisgICAgaWYgbm90IHBvcnQ6CisgICAgICAgIGkgPSBzdHJpbmcuZmluZChob3N0LCAnOicpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBob3N0WzppXSwgc3RyaW5nLmF0b2koaG9zdFtpKzE6XSkKKyAgICBpZiBub3QgcG9ydDoKKyAgICAgICAgcG9ydCA9IERFRl9QT1JUCisgICAgZWxpZiB0eXBlKHBvcnQpID09IHR5cGUoJycpOgorICAgICAgICBwb3J0ID0gc3RyaW5nLmF0b2kocG9ydCkKKyAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgIHMuY29ubmVjdCgoaG9zdCwgcG9ydCkpCisgICAgcy5zZW5kKHNlbGVjdG9yICsgQ1JMRikKKyAgICBzLnNodXRkb3duKDEpCisgICAgcmV0dXJuIHMubWFrZWZpbGUoJ3JiJykKIAotIyBTZW5kIGEgc2VsZWN0b3IgYW5kIGEgcXVlcnkgc3RyaW5nCiBkZWYgc2VuZF9xdWVyeShzZWxlY3RvciwgcXVlcnksIGhvc3QsIHBvcnQgPSAwKToKLQlyZXR1cm4gc2VuZF9zZWxlY3RvcihzZWxlY3RvciArICdcdCcgKyBxdWVyeSwgaG9zdCwgcG9ydCkKKyAgICAiIiJTZW5kIGEgc2VsZWN0b3IgYW5kIGEgcXVlcnkgc3RyaW5nLiIiIgorICAgIHJldHVybiBzZW5kX3NlbGVjdG9yKHNlbGVjdG9yICsgJ1x0JyArIHF1ZXJ5LCBob3N0LCBwb3J0KQogCi0jIFRha2VzIGEgcGF0aCBhcyByZXR1cm5lZCBieSB1cmxwYXJzZSBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgc2VsZWN0b3IKIGRlZiBwYXRoX3RvX3NlbGVjdG9yKHBhdGgpOgotCWlmIHBhdGg9PSIvIjoKLQkJcmV0dXJuICIvIgotCWVsc2U6Ci0JCXJldHVybiBwYXRoWzI6XSAjIEN1dHMgaW5pdGlhbCBzbGFzaCBhbmQgZGF0YSB0eXBlIGlkZW50aWZpZXIKKyAgICAiIiJUYWtlcyBhIHBhdGggYXMgcmV0dXJuZWQgYnkgdXJscGFyc2UgYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHNlbGVjdG9yLiIiIgorICAgIGlmIHBhdGg9PSIvIjoKKyAgICAgICAgcmV0dXJuICIvIgorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBwYXRoWzI6XSAjIEN1dHMgaW5pdGlhbCBzbGFzaCBhbmQgZGF0YSB0eXBlIGlkZW50aWZpZXIKIAotIyBUYWtlcyBhIHBhdGggYXMgcmV0dXJuZWQgYnkgdXJscGFyc2UgYW5kIG1hcHMgaXQgdG8gYSBzdHJpbmcKLSMgU2VlIHNlY3Rpb24gMy40IG9mIFJGQyAxNzM4IGZvciBkZXRhaWxzCiBkZWYgcGF0aF90b19kYXRhdHlwZV9uYW1lKHBhdGgpOgotCWlmIHBhdGg9PSIvIjoKLQkJIyBObyB3YXkgdG8gdGVsbCwgYWx0aG91Z2ggIklOREVYIiBpcyBsaWtlbHkKLQkJcmV0dXJuICJUWVBFPSd1bmtub3duJyIKLQllbHNlOgotCQlyZXR1cm4gdHlwZV90b19uYW1lKHBhdGhbMV0pCisgICAgIiIiVGFrZXMgYSBwYXRoIGFzIHJldHVybmVkIGJ5IHVybHBhcnNlIGFuZCBtYXBzIGl0IHRvIGEgc3RyaW5nLgorICAgIFNlZSBzZWN0aW9uIDMuNCBvZiBSRkMgMTczOCBmb3IgZGV0YWlscy4iIiIKKyAgICBpZiBwYXRoPT0iLyI6CisgICAgICAgICMgTm8gd2F5IHRvIHRlbGwsIGFsdGhvdWdoICJJTkRFWCIgaXMgbGlrZWx5CisgICAgICAgIHJldHVybiAiVFlQRT0ndW5rbm93biciCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHR5cGVfdG9fbmFtZShwYXRoWzFdKQogCiAjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGludGVycHJldCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZ29waGVyCiAjIHNlcnZlciBhY2NvcmRpbmcgdG8gdGhlIGV4cGVjdGVkIHR5cGUsIGUuZy4gdGV4dGZpbGUgb3IgZGlyZWN0b3J5CiAKLSMgR2V0IGEgZGlyZWN0b3J5IGluIHRoZSBmb3JtIG9mIGEgbGlzdCBvZiBlbnRyaWVzCiBkZWYgZ2V0X2RpcmVjdG9yeShmKToKLQlpbXBvcnQgc3RyaW5nCi0JbGlzdCA9IFtdCi0Jd2hpbGUgMToKLQkJbGluZSA9IGYucmVhZGxpbmUoKQotCQlpZiBub3QgbGluZToKLQkJCXByaW50ICcoVW5leHBlY3RlZCBFT0YgZnJvbSBzZXJ2ZXIpJwotCQkJYnJlYWsKLQkJaWYgbGluZVstMjpdID09IENSTEY6Ci0JCQlsaW5lID0gbGluZVs6LTJdCi0JCWVsaWYgbGluZVstMTpdIGluIENSTEY6Ci0JCQlsaW5lID0gbGluZVs6LTFdCi0JCWlmIGxpbmUgPT0gJy4nOgotCQkJYnJlYWsKLQkJaWYgbm90IGxpbmU6Ci0JCQlwcmludCAnKEVtcHR5IGxpbmUgZnJvbSBzZXJ2ZXIpJwotCQkJY29udGludWUKLQkJZ3R5cGUgPSBsaW5lWzBdCi0JCXBhcnRzID0gc3RyaW5nLnNwbGl0ZmllbGRzKGxpbmVbMTpdLCBUQUIpCi0JCWlmIGxlbihwYXJ0cykgPCA0OgotCQkJcHJpbnQgJyhCYWQgbGluZSBmcm9tIHNlcnZlcjonLCBgbGluZWAsICcpJwotCQkJY29udGludWUKLQkJaWYgbGVuKHBhcnRzKSA+IDQ6Ci0JCQlpZiBwYXJ0c1s0Ol0gIT0gWycrJ106Ci0JCQkJcHJpbnQgJyhFeHRyYSBpbmZvIGZyb20gc2VydmVyOicsCi0JCQkJcHJpbnQgcGFydHNbNDpdLCAnKScKLQkJZWxzZToKLQkJCXBhcnRzLmFwcGVuZCgnJykKLQkJcGFydHMuaW5zZXJ0KDAsIGd0eXBlKQotCQlsaXN0LmFwcGVuZChwYXJ0cykKLQlyZXR1cm4gbGlzdAorICAgICIiIkdldCBhIGRpcmVjdG9yeSBpbiB0aGUgZm9ybSBvZiBhIGxpc3Qgb2YgZW50cmllcy4iIiIKKyAgICBpbXBvcnQgc3RyaW5nCisgICAgbGlzdCA9IFtdCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHByaW50ICcoVW5leHBlY3RlZCBFT0YgZnJvbSBzZXJ2ZXIpJworICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbGluZVstMjpdID09IENSTEY6CisgICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdCisgICAgICAgIGVsaWYgbGluZVstMTpdIGluIENSTEY6CisgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisgICAgICAgIGlmIGxpbmUgPT0gJy4nOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBwcmludCAnKEVtcHR5IGxpbmUgZnJvbSBzZXJ2ZXIpJworICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZ3R5cGUgPSBsaW5lWzBdCisgICAgICAgIHBhcnRzID0gc3RyaW5nLnNwbGl0ZmllbGRzKGxpbmVbMTpdLCBUQUIpCisgICAgICAgIGlmIGxlbihwYXJ0cykgPCA0OgorICAgICAgICAgICAgcHJpbnQgJyhCYWQgbGluZSBmcm9tIHNlcnZlcjonLCBgbGluZWAsICcpJworICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbGVuKHBhcnRzKSA+IDQ6CisgICAgICAgICAgICBpZiBwYXJ0c1s0Ol0gIT0gWycrJ106CisgICAgICAgICAgICAgICAgcHJpbnQgJyhFeHRyYSBpbmZvIGZyb20gc2VydmVyOicsCisgICAgICAgICAgICAgICAgcHJpbnQgcGFydHNbNDpdLCAnKScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnJykKKyAgICAgICAgcGFydHMuaW5zZXJ0KDAsIGd0eXBlKQorICAgICAgICBsaXN0LmFwcGVuZChwYXJ0cykKKyAgICByZXR1cm4gbGlzdAogCi0jIEdldCBhIHRleHQgZmlsZSBhcyBhIGxpc3Qgb2YgbGluZXMsIHdpdGggdHJhaWxpbmcgQ1JMRiBzdHJpcHBlZAogZGVmIGdldF90ZXh0ZmlsZShmKToKLQlsaXN0ID0gW10KLQlnZXRfYWx0X3RleHRmaWxlKGYsIGxpc3QuYXBwZW5kKQotCXJldHVybiBsaXN0CisgICAgIiIiR2V0IGEgdGV4dCBmaWxlIGFzIGEgbGlzdCBvZiBsaW5lcywgd2l0aCB0cmFpbGluZyBDUkxGIHN0cmlwcGVkLiIiIgorICAgIGxpc3QgPSBbXQorICAgIGdldF9hbHRfdGV4dGZpbGUoZiwgbGlzdC5hcHBlbmQpCisgICAgcmV0dXJuIGxpc3QKIAotIyBHZXQgYSB0ZXh0IGZpbGUgYW5kIHBhc3MgZWFjaCBsaW5lIHRvIGEgZnVuY3Rpb24sIHdpdGggdHJhaWxpbmcgQ1JMRiBzdHJpcHBlZAogZGVmIGdldF9hbHRfdGV4dGZpbGUoZiwgZnVuYyk6Ci0Jd2hpbGUgMToKLQkJbGluZSA9IGYucmVhZGxpbmUoKQotCQlpZiBub3QgbGluZToKLQkJCXByaW50ICcoVW5leHBlY3RlZCBFT0YgZnJvbSBzZXJ2ZXIpJwotCQkJYnJlYWsKLQkJaWYgbGluZVstMjpdID09IENSTEY6Ci0JCQlsaW5lID0gbGluZVs6LTJdCi0JCWVsaWYgbGluZVstMTpdIGluIENSTEY6Ci0JCQlsaW5lID0gbGluZVs6LTFdCi0JCWlmIGxpbmUgPT0gJy4nOgotCQkJYnJlYWsKLQkJaWYgbGluZVs6Ml0gPT0gJy4uJzoKLQkJCWxpbmUgPSBsaW5lWzE6XQotCQlmdW5jKGxpbmUpCisgICAgIiIiR2V0IGEgdGV4dCBmaWxlIGFuZCBwYXNzIGVhY2ggbGluZSB0byBhIGZ1bmN0aW9uLCB3aXRoIHRyYWlsaW5nIENSTEYgc3RyaXBwZWQuIiIiCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHByaW50ICcoVW5leHBlY3RlZCBFT0YgZnJvbSBzZXJ2ZXIpJworICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbGluZVstMjpdID09IENSTEY6CisgICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdCisgICAgICAgIGVsaWYgbGluZVstMTpdIGluIENSTEY6CisgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisgICAgICAgIGlmIGxpbmUgPT0gJy4nOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbGluZVs6Ml0gPT0gJy4uJzoKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lWzE6XQorICAgICAgICBmdW5jKGxpbmUpCiAKLSMgR2V0IGEgYmluYXJ5IGZpbGUgYXMgb25lIHNvbGlkIGRhdGEgYmxvY2sKIGRlZiBnZXRfYmluYXJ5KGYpOgotCWRhdGEgPSBmLnJlYWQoKQotCXJldHVybiBkYXRhCisgICAgIiIiR2V0IGEgYmluYXJ5IGZpbGUgYXMgb25lIHNvbGlkIGRhdGEgYmxvY2suIiIiCisgICAgZGF0YSA9IGYucmVhZCgpCisgICAgcmV0dXJuIGRhdGEKIAotIyBHZXQgYSBiaW5hcnkgZmlsZSBhbmQgcGFzcyBlYWNoIGJsb2NrIHRvIGEgZnVuY3Rpb24KIGRlZiBnZXRfYWx0X2JpbmFyeShmLCBmdW5jLCBibG9ja3NpemUpOgotCXdoaWxlIDE6Ci0JCWRhdGEgPSBmLnJlYWQoYmxvY2tzaXplKQotCQlpZiBub3QgZGF0YToKLQkJCWJyZWFrCi0JCWZ1bmMoZGF0YSkKKyAgICAiIiJHZXQgYSBiaW5hcnkgZmlsZSBhbmQgcGFzcyBlYWNoIGJsb2NrIHRvIGEgZnVuY3Rpb24uIiIiCisgICAgd2hpbGUgMToKKyAgICAgICAgZGF0YSA9IGYucmVhZChibG9ja3NpemUpCisgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZnVuYyhkYXRhKQogCi0jIFRyaXZpYWwgdGVzdCBwcm9ncmFtCiBkZWYgdGVzdCgpOgotCWltcG9ydCBzeXMKLQlpbXBvcnQgZ2V0b3B0Ci0Jb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnJykKLQlzZWxlY3RvciA9IERFRl9TRUxFQ1RPUgotCXR5cGUgPSBzZWxlY3RvclswXQotCWhvc3QgPSBERUZfSE9TVAotCXBvcnQgPSBERUZfUE9SVAotCWlmIGFyZ3M6Ci0JCWhvc3QgPSBhcmdzWzBdCi0JCWFyZ3MgPSBhcmdzWzE6XQotCWlmIGFyZ3M6Ci0JCXR5cGUgPSBhcmdzWzBdCi0JCWFyZ3MgPSBhcmdzWzE6XQotCQlpZiBsZW4odHlwZSkgPiAxOgotCQkJdHlwZSwgc2VsZWN0b3IgPSB0eXBlWzBdLCB0eXBlCi0JCWVsc2U6Ci0JCQlzZWxlY3RvciA9ICcnCi0JCQlpZiBhcmdzOgotCQkJCXNlbGVjdG9yID0gYXJnc1swXQotCQkJCWFyZ3MgPSBhcmdzWzE6XQotCQlxdWVyeSA9ICcnCi0JCWlmIGFyZ3M6Ci0JCQlxdWVyeSA9IGFyZ3NbMF0KLQkJCWFyZ3MgPSBhcmdzWzE6XQotCWlmIHR5cGUgPT0gQV9JTkRFWDoKLQkJZiA9IHNlbmRfcXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBob3N0KQotCWVsc2U6Ci0JCWYgPSBzZW5kX3NlbGVjdG9yKHNlbGVjdG9yLCBob3N0KQotCWlmIHR5cGUgPT0gQV9URVhUOgotCQlsaXN0ID0gZ2V0X3RleHRmaWxlKGYpCi0JCWZvciBpdGVtIGluIGxpc3Q6IHByaW50IGl0ZW0KLQllbGlmIHR5cGUgaW4gKEFfTUVOVSwgQV9JTkRFWCk6Ci0JCWxpc3QgPSBnZXRfZGlyZWN0b3J5KGYpCi0JCWZvciBpdGVtIGluIGxpc3Q6IHByaW50IGl0ZW0KLQllbHNlOgotCQlkYXRhID0gZ2V0X2JpbmFyeShmKQotCQlwcmludCAnYmluYXJ5IGRhdGE6JywgbGVuKGRhdGEpLCAnYnl0ZXM6JywgYGRhdGFbOjEwMF1gWzo0MF0KKyAgICAiIiJUcml2aWFsIHRlc3QgcHJvZ3JhbS4iIiIKKyAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IGdldG9wdAorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJycpCisgICAgc2VsZWN0b3IgPSBERUZfU0VMRUNUT1IKKyAgICB0eXBlID0gc2VsZWN0b3JbMF0KKyAgICBob3N0ID0gREVGX0hPU1QKKyAgICBwb3J0ID0gREVGX1BPUlQKKyAgICBpZiBhcmdzOgorICAgICAgICBob3N0ID0gYXJnc1swXQorICAgICAgICBhcmdzID0gYXJnc1sxOl0KKyAgICBpZiBhcmdzOgorICAgICAgICB0eXBlID0gYXJnc1swXQorICAgICAgICBhcmdzID0gYXJnc1sxOl0KKyAgICAgICAgaWYgbGVuKHR5cGUpID4gMToKKyAgICAgICAgICAgIHR5cGUsIHNlbGVjdG9yID0gdHlwZVswXSwgdHlwZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZWN0b3IgPSAnJworICAgICAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgICAgICBzZWxlY3RvciA9IGFyZ3NbMF0KKyAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1sxOl0KKyAgICAgICAgcXVlcnkgPSAnJworICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgcXVlcnkgPSBhcmdzWzBdCisgICAgICAgICAgICBhcmdzID0gYXJnc1sxOl0KKyAgICBpZiB0eXBlID09IEFfSU5ERVg6CisgICAgICAgIGYgPSBzZW5kX3F1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgaG9zdCkKKyAgICBlbHNlOgorICAgICAgICBmID0gc2VuZF9zZWxlY3RvcihzZWxlY3RvciwgaG9zdCkKKyAgICBpZiB0eXBlID09IEFfVEVYVDoKKyAgICAgICAgbGlzdCA9IGdldF90ZXh0ZmlsZShmKQorICAgICAgICBmb3IgaXRlbSBpbiBsaXN0OiBwcmludCBpdGVtCisgICAgZWxpZiB0eXBlIGluIChBX01FTlUsIEFfSU5ERVgpOgorICAgICAgICBsaXN0ID0gZ2V0X2RpcmVjdG9yeShmKQorICAgICAgICBmb3IgaXRlbSBpbiBsaXN0OiBwcmludCBpdGVtCisgICAgZWxzZToKKyAgICAgICAgZGF0YSA9IGdldF9iaW5hcnkoZikKKyAgICAgICAgcHJpbnQgJ2JpbmFyeSBkYXRhOicsIGxlbihkYXRhKSwgJ2J5dGVzOicsIGBkYXRhWzoxMDBdYFs6NDBdCiAKICMgUnVuIHRoZSB0ZXN0IHdoZW4gcnVuIGFzIHNjcmlwdAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQl0ZXN0KCkKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2h0bWxlbnRpLnB5IGIvTGliL2Rvcy04eDMvaHRtbGVudGkucHkKaW5kZXggNTVhZWZhYS4uNjY4MmJmMiAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvaHRtbGVudGkucHkKKysrIGIvTGliL2Rvcy04eDMvaHRtbGVudGkucHkKQEAgLTEsMTA1ICsxLDI1NyBAQAotIyBQcm9wb3NlZCBlbnRpdHkgZGVmaW5pdGlvbnMgZm9yIEhUTUwsIHRha2VuIGZyb20KLSMgaHR0cDovL3d3dy53My5vcmcvaHlwZXJ0ZXh0L1dXVy9NYXJrVXAvaHRtbC1zcGVjL2h0bWwtc3BlY18xNC5odG1sCisiIiJIVE1MIGNoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlcy4iIiIKIAogZW50aXR5ZGVmcyA9IHsKLSAgICAnbHQnOiAgICAgICAnPCcsCi0gICAgJ2d0JzogICAgICAgJz4nLAotICAgICdhbXAnOiAgICAgICcmJywKLSAgICAncXVvdCc6CSciJywKLSAgICAnbmJzcCc6CWNocigxNjApLAkjIG5vLWJyZWFrIHNwYWNlCi0gICAgJ2lleGNsJzoJY2hyKDE2MSksCSMgaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyawotICAgICdjZW50JzoJY2hyKDE2MiksCSMgY2VudCBzaWduCi0gICAgJ3BvdW5kJzoJY2hyKDE2MyksCSMgcG91bmQgc3Rlcmxpbmcgc2lnbgotICAgICdjdXJyZW4nOgljaHIoMTY0KSwJIyBnZW5lcmFsIGN1cnJlbmN5IHNpZ24KLSAgICAneWVuJzoJY2hyKDE2NSksCSMgeWVuIHNpZ24KLSAgICAnYnJ2YmFyJzoJY2hyKDE2NiksCSMgYnJva2VuICh2ZXJ0aWNhbCkgYmFyCi0gICAgJ3NlY3QnOgljaHIoMTY3KSwJIyBzZWN0aW9uIHNpZ24KLSAgICAndW1sJzoJY2hyKDE2OCksCSMgdW1sYXV0IChkaWVyZXNpcykKLSAgICAnY29weSc6CWNocigxNjkpLAkjIGNvcHlyaWdodCBzaWduCi0gICAgJ29yZGYnOgljaHIoMTcwKSwJIyBvcmRpbmFsIGluZGljYXRvciwgZmVtaW5pbmUKLSAgICAnbGFxdW8nOgljaHIoMTcxKSwJIyBhbmdsZSBxdW90YXRpb24gbWFyaywgbGVmdAotICAgICdub3QnOgljaHIoMTcyKSwJIyBub3Qgc2lnbgotICAgICdzaHknOgljaHIoMTczKSwJIyBzb2Z0IGh5cGhlbgotICAgICdyZWcnOgljaHIoMTc0KSwJIyByZWdpc3RlcmVkIHNpZ24KLSAgICAnbWFjcic6CWNocigxNzUpLAkjIG1hY3JvbgotICAgICdkZWcnOgljaHIoMTc2KSwJIyBkZWdyZWUgc2lnbgotICAgICdwbHVzbW4nOgljaHIoMTc3KSwJIyBwbHVzLW9yLW1pbnVzIHNpZ24KLSAgICAnc3VwMic6CWNocigxNzgpLAkjIHN1cGVyc2NyaXB0IHR3bwotICAgICdzdXAzJzoJY2hyKDE3OSksCSMgc3VwZXJzY3JpcHQgdGhyZWUKLSAgICAnYWN1dGUnOgljaHIoMTgwKSwJIyBhY3V0ZSBhY2NlbnQKLSAgICAnbWljcm8nOgljaHIoMTgxKSwJIyBtaWNybyBzaWduCi0gICAgJ3BhcmEnOgljaHIoMTgyKSwJIyBwaWxjcm93IChwYXJhZ3JhcGggc2lnbikKLSAgICAnbWlkZG90JzoJY2hyKDE4MyksCSMgbWlkZGxlIGRvdAotICAgICdjZWRpbCc6CWNocigxODQpLAkjIGNlZGlsbGEKLSAgICAnc3VwMSc6CWNocigxODUpLAkjIHN1cGVyc2NyaXB0IG9uZQotICAgICdvcmRtJzoJY2hyKDE4NiksCSMgb3JkaW5hbCBpbmRpY2F0b3IsIG1hc2N1bGluZQotICAgICdyYXF1byc6CWNocigxODcpLAkjIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLCByaWdodAotICAgICdmcmFjMTQnOgljaHIoMTg4KSwJIyBmcmFjdGlvbiBvbmUtcXVhcnRlcgotICAgICdmcmFjMTInOgljaHIoMTg5KSwJIyBmcmFjdGlvbiBvbmUtaGFsZgotICAgICdmcmFjMzQnOgljaHIoMTkwKSwJIyBmcmFjdGlvbiB0aHJlZS1xdWFydGVycwotICAgICdpcXVlc3QnOgljaHIoMTkxKSwJIyBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrCi0gICAgJ0FncmF2ZSc6CWNocigxOTIpLAkjIGNhcGl0YWwgQSwgZ3JhdmUgYWNjZW50Ci0gICAgJ0FhY3V0ZSc6CWNocigxOTMpLAkjIGNhcGl0YWwgQSwgYWN1dGUgYWNjZW50Ci0gICAgJ0FjaXJjJzoJY2hyKDE5NCksCSMgY2FwaXRhbCBBLCBjaXJjdW1mbGV4IGFjY2VudAotICAgICdBdGlsZGUnOgljaHIoMTk1KSwJIyBjYXBpdGFsIEEsIHRpbGRlCi0gICAgJ0F1bWwnOgljaHIoMTk2KSwJIyBjYXBpdGFsIEEsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrCi0gICAgJ0FyaW5nJzoJY2hyKDE5NyksCSMgY2FwaXRhbCBBLCByaW5nCi0gICAgJ0FFbGlnJzoJY2hyKDE5OCksCSMgY2FwaXRhbCBBRSBkaXBodGhvbmcgKGxpZ2F0dXJlKQotICAgICdDY2VkaWwnOgljaHIoMTk5KSwJIyBjYXBpdGFsIEMsIGNlZGlsbGEKLSAgICAnRWdyYXZlJzoJY2hyKDIwMCksCSMgY2FwaXRhbCBFLCBncmF2ZSBhY2NlbnQKLSAgICAnRWFjdXRlJzoJY2hyKDIwMSksCSMgY2FwaXRhbCBFLCBhY3V0ZSBhY2NlbnQKLSAgICAnRWNpcmMnOgljaHIoMjAyKSwJIyBjYXBpdGFsIEUsIGNpcmN1bWZsZXggYWNjZW50Ci0gICAgJ0V1bWwnOgljaHIoMjAzKSwJIyBjYXBpdGFsIEUsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrCi0gICAgJ0lncmF2ZSc6CWNocigyMDQpLAkjIGNhcGl0YWwgSSwgZ3JhdmUgYWNjZW50Ci0gICAgJ0lhY3V0ZSc6CWNocigyMDUpLAkjIGNhcGl0YWwgSSwgYWN1dGUgYWNjZW50Ci0gICAgJ0ljaXJjJzoJY2hyKDIwNiksCSMgY2FwaXRhbCBJLCBjaXJjdW1mbGV4IGFjY2VudAotICAgICdJdW1sJzoJY2hyKDIwNyksCSMgY2FwaXRhbCBJLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyawotICAgICdFVEgnOgljaHIoMjA4KSwJIyBjYXBpdGFsIEV0aCwgSWNlbGFuZGljCi0gICAgJ050aWxkZSc6CWNocigyMDkpLAkjIGNhcGl0YWwgTiwgdGlsZGUKLSAgICAnT2dyYXZlJzoJY2hyKDIxMCksCSMgY2FwaXRhbCBPLCBncmF2ZSBhY2NlbnQKLSAgICAnT2FjdXRlJzoJY2hyKDIxMSksCSMgY2FwaXRhbCBPLCBhY3V0ZSBhY2NlbnQKLSAgICAnT2NpcmMnOgljaHIoMjEyKSwJIyBjYXBpdGFsIE8sIGNpcmN1bWZsZXggYWNjZW50Ci0gICAgJ090aWxkZSc6CWNocigyMTMpLAkjIGNhcGl0YWwgTywgdGlsZGUKLSAgICAnT3VtbCc6CWNocigyMTQpLAkjIGNhcGl0YWwgTywgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsKLSAgICAndGltZXMnOgljaHIoMjE1KSwJIyBtdWx0aXBseSBzaWduCi0gICAgJ09zbGFzaCc6CWNocigyMTYpLAkjIGNhcGl0YWwgTywgc2xhc2gKLSAgICAnVWdyYXZlJzoJY2hyKDIxNyksCSMgY2FwaXRhbCBVLCBncmF2ZSBhY2NlbnQKLSAgICAnVWFjdXRlJzoJY2hyKDIxOCksCSMgY2FwaXRhbCBVLCBhY3V0ZSBhY2NlbnQKLSAgICAnVWNpcmMnOgljaHIoMjE5KSwJIyBjYXBpdGFsIFUsIGNpcmN1bWZsZXggYWNjZW50Ci0gICAgJ1V1bWwnOgljaHIoMjIwKSwJIyBjYXBpdGFsIFUsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrCi0gICAgJ1lhY3V0ZSc6CWNocigyMjEpLAkjIGNhcGl0YWwgWSwgYWN1dGUgYWNjZW50Ci0gICAgJ1RIT1JOJzoJY2hyKDIyMiksCSMgY2FwaXRhbCBUSE9STiwgSWNlbGFuZGljCi0gICAgJ3N6bGlnJzoJY2hyKDIyMyksCSMgc21hbGwgc2hhcnAgcywgR2VybWFuIChzeiBsaWdhdHVyZSkKLSAgICAnYWdyYXZlJzoJY2hyKDIyNCksCSMgc21hbGwgYSwgZ3JhdmUgYWNjZW50Ci0gICAgJ2FhY3V0ZSc6CWNocigyMjUpLAkjIHNtYWxsIGEsIGFjdXRlIGFjY2VudAotICAgICdhY2lyYyc6CWNocigyMjYpLAkjIHNtYWxsIGEsIGNpcmN1bWZsZXggYWNjZW50Ci0gICAgJ2F0aWxkZSc6CWNocigyMjcpLAkjIHNtYWxsIGEsIHRpbGRlCi0gICAgJ2F1bWwnOgljaHIoMjI4KSwJIyBzbWFsbCBhLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyawotICAgICdhcmluZyc6CWNocigyMjkpLAkjIHNtYWxsIGEsIHJpbmcKLSAgICAnYWVsaWcnOgljaHIoMjMwKSwJIyBzbWFsbCBhZSBkaXBodGhvbmcgKGxpZ2F0dXJlKQotICAgICdjY2VkaWwnOgljaHIoMjMxKSwJIyBzbWFsbCBjLCBjZWRpbGxhCi0gICAgJ2VncmF2ZSc6CWNocigyMzIpLAkjIHNtYWxsIGUsIGdyYXZlIGFjY2VudAotICAgICdlYWN1dGUnOgljaHIoMjMzKSwJIyBzbWFsbCBlLCBhY3V0ZSBhY2NlbnQKLSAgICAnZWNpcmMnOgljaHIoMjM0KSwJIyBzbWFsbCBlLCBjaXJjdW1mbGV4IGFjY2VudAotICAgICdldW1sJzoJY2hyKDIzNSksCSMgc21hbGwgZSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsKLSAgICAnaWdyYXZlJzoJY2hyKDIzNiksCSMgc21hbGwgaSwgZ3JhdmUgYWNjZW50Ci0gICAgJ2lhY3V0ZSc6CWNocigyMzcpLAkjIHNtYWxsIGksIGFjdXRlIGFjY2VudAotICAgICdpY2lyYyc6CWNocigyMzgpLAkjIHNtYWxsIGksIGNpcmN1bWZsZXggYWNjZW50Ci0gICAgJ2l1bWwnOgljaHIoMjM5KSwJIyBzbWFsbCBpLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyawotICAgICdldGgnOgljaHIoMjQwKSwJIyBzbWFsbCBldGgsIEljZWxhbmRpYwotICAgICdudGlsZGUnOgljaHIoMjQxKSwJIyBzbWFsbCBuLCB0aWxkZQotICAgICdvZ3JhdmUnOgljaHIoMjQyKSwJIyBzbWFsbCBvLCBncmF2ZSBhY2NlbnQKLSAgICAnb2FjdXRlJzoJY2hyKDI0MyksCSMgc21hbGwgbywgYWN1dGUgYWNjZW50Ci0gICAgJ29jaXJjJzoJY2hyKDI0NCksCSMgc21hbGwgbywgY2lyY3VtZmxleCBhY2NlbnQKLSAgICAnb3RpbGRlJzoJY2hyKDI0NSksCSMgc21hbGwgbywgdGlsZGUKLSAgICAnb3VtbCc6CWNocigyNDYpLAkjIHNtYWxsIG8sIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrCi0gICAgJ2RpdmlkZSc6CWNocigyNDcpLAkjIGRpdmlkZSBzaWduCi0gICAgJ29zbGFzaCc6CWNocigyNDgpLAkjIHNtYWxsIG8sIHNsYXNoCi0gICAgJ3VncmF2ZSc6CWNocigyNDkpLAkjIHNtYWxsIHUsIGdyYXZlIGFjY2VudAotICAgICd1YWN1dGUnOgljaHIoMjUwKSwJIyBzbWFsbCB1LCBhY3V0ZSBhY2NlbnQKLSAgICAndWNpcmMnOgljaHIoMjUxKSwJIyBzbWFsbCB1LCBjaXJjdW1mbGV4IGFjY2VudAotICAgICd1dW1sJzoJY2hyKDI1MiksCSMgc21hbGwgdSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsKLSAgICAneWFjdXRlJzoJY2hyKDI1MyksCSMgc21hbGwgeSwgYWN1dGUgYWNjZW50Ci0gICAgJ3Rob3JuJzoJY2hyKDI1NCksCSMgc21hbGwgdGhvcm4sIEljZWxhbmRpYwotICAgICd5dW1sJzoJY2hyKDI1NSksCSMgc21hbGwgeSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsKKyAgICAnQUVsaWcnOgknXDMwNicsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBBRSA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsIFUrMDBDNiBJU09sYXQxCisgICAgJ0FhY3V0ZSc6CSdcMzAxJywgIAkjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBhY3V0ZSwgVSswMEMxIElTT2xhdDEKKyAgICAnQWNpcmMnOgknXDMwMicsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggY2lyY3VtZmxleCwgVSswMEMyIElTT2xhdDEKKyAgICAnQWdyYXZlJzoJJ1wzMDAnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGdyYXZlID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSBncmF2ZSwgVSswMEMwIElTT2xhdDEKKyAgICAnQWxwaGEnOgknJiM5MTM7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEKKyAgICAnQXJpbmcnOgknXDMwNScsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggcmluZyBhYm92ZSA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgcmluZywgVSswMEM1IElTT2xhdDEKKyAgICAnQXRpbGRlJzoJJ1wzMDMnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHRpbGRlLCBVKzAwQzMgSVNPbGF0MQorICAgICdBdW1sJzoJJ1wzMDQnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGRpYWVyZXNpcywgVSswMEM0IElTT2xhdDEKKyAgICAnQmV0YSc6CScmIzkxNDsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYmV0YSwgVSswMzkyCisgICAgJ0NjZWRpbCc6CSdcMzA3JywgIAkjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEMgd2l0aCBjZWRpbGxhLCBVKzAwQzcgSVNPbGF0MQorICAgICdDaGknOgknJiM5MzU7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3CisgICAgJ0RhZ2dlcic6CScmIzgyMjU7JywgIAkjIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIKKyAgICAnRGVsdGEnOgknJiM5MTY7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLCBVKzAzOTQgSVNPZ3JrMworICAgICdFVEgnOgknXDMyMCcsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBFVEgsIFUrMDBEMCBJU09sYXQxCisgICAgJ0VhY3V0ZSc6CSdcMzExJywgIAkjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBhY3V0ZSwgVSswMEM5IElTT2xhdDEKKyAgICAnRWNpcmMnOgknXDMxMicsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggY2lyY3VtZmxleCwgVSswMENBIElTT2xhdDEKKyAgICAnRWdyYXZlJzoJJ1wzMTAnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGdyYXZlLCBVKzAwQzggSVNPbGF0MQorICAgICdFcHNpbG9uJzoJJyYjOTE3OycsICAJIyBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUKKyAgICAnRXRhJzoJJyYjOTE5OycsICAJIyBncmVlayBjYXBpdGFsIGxldHRlciBldGEsIFUrMDM5NworICAgICdFdW1sJzoJJ1wzMTMnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYWVyZXNpcywgVSswMENCIElTT2xhdDEKKyAgICAnR2FtbWEnOgknJiM5MTU7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLCBVKzAzOTMgSVNPZ3JrMworICAgICdJYWN1dGUnOgknXDMxNScsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggYWN1dGUsIFUrMDBDRCBJU09sYXQxCisgICAgJ0ljaXJjJzoJJ1wzMTYnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDRSBJU09sYXQxCisgICAgJ0lncmF2ZSc6CSdcMzE0JywgIAkjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBncmF2ZSwgVSswMENDIElTT2xhdDEKKyAgICAnSW90YSc6CScmIzkyMTsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5CisgICAgJ0l1bWwnOgknXDMxNycsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZGlhZXJlc2lzLCBVKzAwQ0YgSVNPbGF0MQorICAgICdLYXBwYSc6CScmIzkyMjsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QQorICAgICdMYW1iZGEnOgknJiM5MjM7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwgVSswMzlCIElTT2dyazMKKyAgICAnTXUnOgknJiM5MjQ7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG11LCBVKzAzOUMKKyAgICAnTnRpbGRlJzoJJ1wzMjEnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTiB3aXRoIHRpbGRlLCBVKzAwRDEgSVNPbGF0MQorICAgICdOdSc6CScmIzkyNTsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RAorICAgICdPRWxpZyc6CScmIzMzODsnLCAgCSMgbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSwgVSswMTUyIElTT2xhdDIKKyAgICAnT2FjdXRlJzoJJ1wzMjMnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGFjdXRlLCBVKzAwRDMgSVNPbGF0MQorICAgICdPY2lyYyc6CSdcMzI0JywgIAkjIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBjaXJjdW1mbGV4LCBVKzAwRDQgSVNPbGF0MQorICAgICdPZ3JhdmUnOgknXDMyMicsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZ3JhdmUsIFUrMDBEMiBJU09sYXQxCisgICAgJ09tZWdhJzoJJyYjOTM3OycsICAJIyBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwgVSswM0E5IElTT2dyazMKKyAgICAnT21pY3Jvbic6CScmIzkyNzsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGCisgICAgJ09zbGFzaCc6CSdcMzMwJywgIAkjIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBzdHJva2UgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHNsYXNoLCBVKzAwRDggSVNPbGF0MQorICAgICdPdGlsZGUnOgknXDMyNScsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggdGlsZGUsIFUrMDBENSBJU09sYXQxCisgICAgJ091bWwnOgknXDMyNicsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZGlhZXJlc2lzLCBVKzAwRDYgSVNPbGF0MQorICAgICdQaGknOgknJiM5MzQ7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBoaSwgVSswM0E2IElTT2dyazMKKyAgICAnUGknOgknJiM5Mjg7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMworICAgICdQcmltZSc6CScmIzgyNDM7JywgIAkjIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsIFUrMjAzMyBJU090ZWNoCisgICAgJ1BzaSc6CScmIzkzNjsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLCBVKzAzQTggSVNPZ3JrMworICAgICdSaG8nOgknJiM5Mjk7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHJobywgVSswM0ExCisgICAgJ1NjYXJvbic6CScmIzM1MjsnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgUyB3aXRoIGNhcm9uLCBVKzAxNjAgSVNPbGF0MgorICAgICdTaWdtYSc6CScmIzkzMTsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEsIFUrMDNBMyBJU09ncmszCisgICAgJ1RIT1JOJzoJJ1wzMzYnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVEhPUk4sIFUrMDBERSBJU09sYXQxCisgICAgJ1RhdSc6CScmIzkzMjsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQKKyAgICAnVGhldGEnOgknJiM5MjA7JywgIAkjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLCBVKzAzOTggSVNPZ3JrMworICAgICdVYWN1dGUnOgknXDMzMicsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggYWN1dGUsIFUrMDBEQSBJU09sYXQxCisgICAgJ1VjaXJjJzoJJ1wzMzMnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBEQiBJU09sYXQxCisgICAgJ1VncmF2ZSc6CSdcMzMxJywgIAkjIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBncmF2ZSwgVSswMEQ5IElTT2xhdDEKKyAgICAnVXBzaWxvbic6CScmIzkzMzsnLCAgCSMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwgVSswM0E1IElTT2dyazMKKyAgICAnVXVtbCc6CSdcMzM0JywgIAkjIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBkaWFlcmVzaXMsIFUrMDBEQyBJU09sYXQxCisgICAgJ1hpJzoJJyYjOTI2OycsICAJIyBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMKKyAgICAnWWFjdXRlJzoJJ1wzMzUnLCAgCSMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGFjdXRlLCBVKzAwREQgSVNPbGF0MQorICAgICdZdW1sJzoJJyYjMzc2OycsICAJIyBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggZGlhZXJlc2lzLCBVKzAxNzggSVNPbGF0MgorICAgICdaZXRhJzoJJyYjOTE4OycsICAJIyBncmVlayBjYXBpdGFsIGxldHRlciB6ZXRhLCBVKzAzOTYKKyAgICAnYWFjdXRlJzoJJ1wzNDEnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBhY3V0ZSwgVSswMEUxIElTT2xhdDEKKyAgICAnYWNpcmMnOgknXDM0MicsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBFMiBJU09sYXQxCisgICAgJ2FjdXRlJzoJJ1wyNjQnLCAgCSMgYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwgVSswMEI0IElTT2RpYQorICAgICdhZWxpZyc6CSdcMzQ2JywgIAkjIGxhdGluIHNtYWxsIGxldHRlciBhZSA9IGxhdGluIHNtYWxsIGxpZ2F0dXJlIGFlLCBVKzAwRTYgSVNPbGF0MQorICAgICdhZ3JhdmUnOgknXDM0MCcsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGdyYXZlID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgZ3JhdmUsIFUrMDBFMCBJU09sYXQxCisgICAgJ2FsZWZzeW0nOgknJiM4NTAxOycsICAJIyBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLCBVKzIxMzUgTkVXCisgICAgJ2FscGhhJzoJJyYjOTQ1OycsICAJIyBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsIFUrMDNCMSBJU09ncmszCisgICAgJ2FtcCc6CSdcNDYnLCAgCSMgYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtCisgICAgJ2FuZCc6CScmIzg3NDM7JywgIAkjIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoCisgICAgJ2FuZyc6CScmIzg3MzY7JywgIAkjIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbworICAgICdhcmluZyc6CSdcMzQ1JywgIAkjIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggcmluZyBhYm92ZSA9IGxhdGluIHNtYWxsIGxldHRlciBhIHJpbmcsIFUrMDBFNSBJU09sYXQxCisgICAgJ2FzeW1wJzoJJyYjODc3NjsnLCAgCSMgYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywgVSsyMjQ4IElTT2Ftc3IKKyAgICAnYXRpbGRlJzoJJ1wzNDMnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSwgVSswMEUzIElTT2xhdDEKKyAgICAnYXVtbCc6CSdcMzQ0JywgIAkjIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZGlhZXJlc2lzLCBVKzAwRTQgSVNPbGF0MQorICAgICdiZHF1byc6CScmIzgyMjI7JywgIAkjIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVworICAgICdiZXRhJzoJJyYjOTQ2OycsICAJIyBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMKKyAgICAnYnJ2YmFyJzoJJ1wyNDYnLCAgCSMgYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIsIFUrMDBBNiBJU09udW0KKyAgICAnYnVsbCc6CScmIzgyMjY7JywgIAkjIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSwgVSsyMDIyIElTT3B1YgorICAgICdjYXAnOgknJiM4NzQ1OycsICAJIyBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoCisgICAgJ2NjZWRpbCc6CSdcMzQ3JywgIAkjIGxhdGluIHNtYWxsIGxldHRlciBjIHdpdGggY2VkaWxsYSwgVSswMEU3IElTT2xhdDEKKyAgICAnY2VkaWwnOgknXDI3MCcsICAJIyBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhCisgICAgJ2NlbnQnOgknXDI0MicsICAJIyBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0KKyAgICAnY2hpJzoJJyYjOTY3OycsICAJIyBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMworICAgICdjaXJjJzoJJyYjNzEwOycsICAJIyBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsIFUrMDJDNiBJU09wdWIKKyAgICAnY2x1YnMnOgknJiM5ODI3OycsICAJIyBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywgVSsyNjYzIElTT3B1YgorICAgICdjb25nJzoJJyYjODc3MzsnLCAgCSMgYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2gKKyAgICAnY29weSc6CSdcMjUxJywgIAkjIGNvcHlyaWdodCBzaWduLCBVKzAwQTkgSVNPbnVtCisgICAgJ2NyYXJyJzoJJyYjODYyOTsnLCAgCSMgZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcyA9IGNhcnJpYWdlIHJldHVybiwgVSsyMUI1IE5FVworICAgICdjdXAnOgknJiM4NzQ2OycsICAJIyB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2gKKyAgICAnY3VycmVuJzoJJ1wyNDQnLCAgCSMgY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bQorICAgICdkQXJyJzoJJyYjODY1OTsnLCAgCSMgZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EKKyAgICAnZGFnZ2VyJzoJJyYjODIyNDsnLCAgCSMgZGFnZ2VyLCBVKzIwMjAgSVNPcHViCisgICAgJ2RhcnInOgknJiM4NTk1OycsICAJIyBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0KKyAgICAnZGVnJzoJJ1wyNjAnLCAgCSMgZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0KKyAgICAnZGVsdGEnOgknJiM5NDg7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBkZWx0YSwgVSswM0I0IElTT2dyazMKKyAgICAnZGlhbXMnOgknJiM5ODMwOycsICAJIyBibGFjayBkaWFtb25kIHN1aXQsIFUrMjY2NiBJU09wdWIKKyAgICAnZGl2aWRlJzoJJ1wzNjcnLCAgCSMgZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bQorICAgICdlYWN1dGUnOgknXDM1MScsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGFjdXRlLCBVKzAwRTkgSVNPbGF0MQorICAgICdlY2lyYyc6CSdcMzUyJywgIAkjIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggY2lyY3VtZmxleCwgVSswMEVBIElTT2xhdDEKKyAgICAnZWdyYXZlJzoJJ1wzNTAnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBncmF2ZSwgVSswMEU4IElTT2xhdDEKKyAgICAnZW1wdHknOgknJiM4NzA5OycsICAJIyBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLCBVKzIyMDUgSVNPYW1zbworICAgICdlbXNwJzoJJyYjODE5NTsnLCAgCSMgZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIKKyAgICAnZW5zcCc6CScmIzgxOTQ7JywgIAkjIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViCisgICAgJ2Vwc2lsb24nOgknJiM5NDk7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLCBVKzAzQjUgSVNPZ3JrMworICAgICdlcXVpdic6CScmIzg4MDE7JywgIAkjIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2gKKyAgICAnZXRhJzoJJyYjOTUxOycsICAJIyBncmVlayBzbWFsbCBsZXR0ZXIgZXRhLCBVKzAzQjcgSVNPZ3JrMworICAgICdldGgnOgknXDM2MCcsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgZXRoLCBVKzAwRjAgSVNPbGF0MQorICAgICdldW1sJzoJJ1wzNTMnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMsIFUrMDBFQiBJU09sYXQxCisgICAgJ2V1cm8nOgknJiM4MzY0OycsICAJIyBldXJvIHNpZ24sIFUrMjBBQyBORVcKKyAgICAnZXhpc3QnOgknJiM4NzA3OycsICAJIyB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoCisgICAgJ2Zub2YnOgknJiM0MDI7JywgIAkjIGxhdGluIHNtYWxsIGYgd2l0aCBob29rID0gZnVuY3Rpb24gPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoCisgICAgJ2ZvcmFsbCc6CScmIzg3MDQ7JywgIAkjIGZvciBhbGwsIFUrMjIwMCBJU090ZWNoCisgICAgJ2ZyYWMxMic6CSdcMjc1JywgIAkjIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZiA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtCisgICAgJ2ZyYWMxNCc6CSdcMjc0JywgIAkjIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlciA9IGZyYWN0aW9uIG9uZSBxdWFydGVyLCBVKzAwQkMgSVNPbnVtCisgICAgJ2ZyYWMzNCc6CSdcMjc2JywgIAkjIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycyA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtCisgICAgJ2ZyYXNsJzoJJyYjODI2MDsnLCAgCSMgZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcKKyAgICAnZ2FtbWEnOgknJiM5NDc7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwgVSswM0IzIElTT2dyazMKKyAgICAnZ2UnOgknJiM4ODA1OycsICAJIyBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NSBJU090ZWNoCisgICAgJ2d0JzoJJ1w3NicsICAJIyBncmVhdGVyLXRoYW4gc2lnbiwgVSswMDNFIElTT251bQorICAgICdoQXJyJzoJJyYjODY2MDsnLCAgCSMgbGVmdCByaWdodCBkb3VibGUgYXJyb3csIFUrMjFENCBJU09hbXNhCisgICAgJ2hhcnInOgknJiM4NTk2OycsICAJIyBsZWZ0IHJpZ2h0IGFycm93LCBVKzIxOTQgSVNPYW1zYQorICAgICdoZWFydHMnOgknJiM5ODI5OycsICAJIyBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLCBVKzI2NjUgSVNPcHViCisgICAgJ2hlbGxpcCc6CScmIzgyMzA7JywgIAkjIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLCBVKzIwMjYgSVNPcHViCisgICAgJ2lhY3V0ZSc6CSdcMzU1JywgIAkjIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggYWN1dGUsIFUrMDBFRCBJU09sYXQxCisgICAgJ2ljaXJjJzoJJ1wzNTYnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRUUgSVNPbGF0MQorICAgICdpZXhjbCc6CSdcMjQxJywgIAkjIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmssIFUrMDBBMSBJU09udW0KKyAgICAnaWdyYXZlJzoJJ1wzNTQnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBncmF2ZSwgVSswMEVDIElTT2xhdDEKKyAgICAnaW1hZ2UnOgknJiM4NDY1OycsICAJIyBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwgVSsyMTExIElTT2Ftc28KKyAgICAnaW5maW4nOgknJiM4NzM0OycsICAJIyBpbmZpbml0eSwgVSsyMjFFIElTT3RlY2gKKyAgICAnaW50JzoJJyYjODc0NzsnLCAgCSMgaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoCisgICAgJ2lvdGEnOgknJiM5NTM7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMworICAgICdpcXVlc3QnOgknXDI3NycsICAJIyBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0KKyAgICAnaXNpbic6CScmIzg3MTI7JywgIAkjIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoCisgICAgJ2l1bWwnOgknXDM1NycsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGRpYWVyZXNpcywgVSswMEVGIElTT2xhdDEKKyAgICAna2FwcGEnOgknJiM5NTQ7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwgVSswM0JBIElTT2dyazMKKyAgICAnbEFycic6CScmIzg2NTY7JywgIAkjIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoCisgICAgJ2xhbWJkYSc6CScmIzk1NTsnLCAgCSMgZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwgVSswM0JCIElTT2dyazMKKyAgICAnbGFuZyc6CScmIzkwMDE7JywgIAkjIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwgVSsyMzI5IElTT3RlY2gKKyAgICAnbGFxdW8nOgknXDI1MycsICAJIyBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyayA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtCisgICAgJ2xhcnInOgknJiM4NTkyOycsICAJIyBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0KKyAgICAnbGNlaWwnOgknJiM4OTY4OycsICAJIyBsZWZ0IGNlaWxpbmcgPSBhcGwgdXBzdGlsZSwgVSsyMzA4IElTT2Ftc2MKKyAgICAnbGRxdW8nOgknJiM4MjIwOycsICAJIyBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyaywgVSsyMDFDIElTT251bQorICAgICdsZSc6CScmIzg4MDQ7JywgIAkjIGxlc3MtdGhhbiBvciBlcXVhbCB0bywgVSsyMjY0IElTT3RlY2gKKyAgICAnbGZsb29yJzoJJyYjODk3MDsnLCAgCSMgbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsIFUrMjMwQSBJU09hbXNjCisgICAgJ2xvd2FzdCc6CScmIzg3Mjc7JywgIAkjIGFzdGVyaXNrIG9wZXJhdG9yLCBVKzIyMTcgSVNPdGVjaAorICAgICdsb3onOgknJiM5Njc0OycsICAJIyBsb3plbmdlLCBVKzI1Q0EgSVNPcHViCisgICAgJ2xybSc6CScmIzgyMDY7JywgIAkjIGxlZnQtdG8tcmlnaHQgbWFyaywgVSsyMDBFIE5FVyBSRkMgMjA3MAorICAgICdsc2FxdW8nOgknJiM4MjQ5OycsICAJIyBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDM5IElTTyBwcm9wb3NlZAorICAgICdsc3F1byc6CScmIzgyMTY7JywgIAkjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMTggSVNPbnVtCisgICAgJ2x0JzoJJ1w3NCcsICAJIyBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bQorICAgICdtYWNyJzoJJ1wyNTcnLCAgCSMgbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZSA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhCisgICAgJ21kYXNoJzoJJyYjODIxMjsnLCAgCSMgZW0gZGFzaCwgVSsyMDE0IElTT3B1YgorICAgICdtaWNybyc6CSdcMjY1JywgIAkjIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0KKyAgICAnbWlkZG90JzoJJ1wyNjcnLCAgCSMgbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bQorICAgICdtaW51cyc6CScmIzg3MjI7JywgIAkjIG1pbnVzIHNpZ24sIFUrMjIxMiBJU090ZWNoCisgICAgJ211JzoJJyYjOTU2OycsICAJIyBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszCisgICAgJ25hYmxhJzoJJyYjODcxMTsnLCAgCSMgbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLCBVKzIyMDcgSVNPdGVjaAorICAgICduYnNwJzoJJ1wyNDAnLCAgCSMgbm8tYnJlYWsgc3BhY2UgPSBub24tYnJlYWtpbmcgc3BhY2UsIFUrMDBBMCBJU09udW0KKyAgICAnbmRhc2gnOgknJiM4MjExOycsICAJIyBlbiBkYXNoLCBVKzIwMTMgSVNPcHViCisgICAgJ25lJzoJJyYjODgwMDsnLCAgCSMgbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaAorICAgICduaSc6CScmIzg3MTU7JywgIAkjIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2gKKyAgICAnbm90JzoJJ1wyNTQnLCAgCSMgbm90IHNpZ24sIFUrMDBBQyBJU09udW0KKyAgICAnbm90aW4nOgknJiM4NzEzOycsICAJIyBub3QgYW4gZWxlbWVudCBvZiwgVSsyMjA5IElTT3RlY2gKKyAgICAnbnN1Yic6CScmIzg4MzY7JywgIAkjIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24KKyAgICAnbnRpbGRlJzoJJ1wzNjEnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSwgVSswMEYxIElTT2xhdDEKKyAgICAnbnUnOgknJiM5NTc7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMKKyAgICAnb2FjdXRlJzoJJ1wzNjMnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSwgVSswMEYzIElTT2xhdDEKKyAgICAnb2NpcmMnOgknXDM2NCcsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGNpcmN1bWZsZXgsIFUrMDBGNCBJU09sYXQxCisgICAgJ29lbGlnJzoJJyYjMzM5OycsICAJIyBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIKKyAgICAnb2dyYXZlJzoJJ1wzNjInLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBncmF2ZSwgVSswMEYyIElTT2xhdDEKKyAgICAnb2xpbmUnOgknJiM4MjU0OycsICAJIyBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLCBVKzIwM0UgTkVXCisgICAgJ29tZWdhJzoJJyYjOTY5OycsICAJIyBncmVlayBzbWFsbCBsZXR0ZXIgb21lZ2EsIFUrMDNDOSBJU09ncmszCisgICAgJ29taWNyb24nOgknJiM5NTk7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXCisgICAgJ29wbHVzJzoJJyYjODg1MzsnLCAgCSMgY2lyY2xlZCBwbHVzID0gZGlyZWN0IHN1bSwgVSsyMjk1IElTT2Ftc2IKKyAgICAnb3InOgknJiM4NzQ0OycsICAJIyBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaAorICAgICdvcmRmJzoJJ1wyNTInLCAgCSMgZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0KKyAgICAnb3JkbSc6CSdcMjcyJywgIAkjIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEJBIElTT251bQorICAgICdvc2xhc2gnOgknXDM3MCcsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSwgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyBzbGFzaCwgVSswMEY4IElTT2xhdDEKKyAgICAnb3RpbGRlJzoJJ1wzNjUnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSwgVSswMEY1IElTT2xhdDEKKyAgICAnb3RpbWVzJzoJJyYjODg1NTsnLCAgCSMgY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LCBVKzIyOTcgSVNPYW1zYgorICAgICdvdW1sJzoJJ1wzNjYnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBkaWFlcmVzaXMsIFUrMDBGNiBJU09sYXQxCisgICAgJ3BhcmEnOgknXDI2NicsICAJIyBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwgVSswMEI2IElTT251bQorICAgICdwYXJ0JzoJJyYjODcwNjsnLCAgCSMgcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoCisgICAgJ3Blcm1pbCc6CScmIzgyNDA7JywgIAkjIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaAorICAgICdwZXJwJzoJJyYjODg2OTsnLCAgCSMgdXAgdGFjayA9IG9ydGhvZ29uYWwgdG8gPSBwZXJwZW5kaWN1bGFyLCBVKzIyQTUgSVNPdGVjaAorICAgICdwaGknOgknJiM5NjY7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszCisgICAgJ3BpJzoJJyYjOTYwOycsICAJIyBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszCisgICAgJ3Bpdic6CScmIzk4MjsnLCAgCSMgZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMworICAgICdwbHVzbW4nOgknXDI2MScsICAJIyBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sIFUrMDBCMSBJU09udW0KKyAgICAncG91bmQnOgknXDI0MycsICAJIyBwb3VuZCBzaWduLCBVKzAwQTMgSVNPbnVtCisgICAgJ3ByaW1lJzoJJyYjODI0MjsnLCAgCSMgcHJpbWUgPSBtaW51dGVzID0gZmVldCwgVSsyMDMyIElTT3RlY2gKKyAgICAncHJvZCc6CScmIzg3MTk7JywgIAkjIG4tYXJ5IHByb2R1Y3QgPSBwcm9kdWN0IHNpZ24sIFUrMjIwRiBJU09hbXNiCisgICAgJ3Byb3AnOgknJiM4NzMzOycsICAJIyBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoCisgICAgJ3BzaSc6CScmIzk2ODsnLCAgCSMgZ3JlZWsgc21hbGwgbGV0dGVyIHBzaSwgVSswM0M4IElTT2dyazMKKyAgICAncXVvdCc6CSdcNDInLCAgCSMgcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsIFUrMDAyMiBJU09udW0KKyAgICAnckFycic6CScmIzg2NTg7JywgIAkjIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDIgSVNPdGVjaAorICAgICdyYWRpYyc6CScmIzg3MzA7JywgIAkjIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLCBVKzIyMUEgSVNPdGVjaAorICAgICdyYW5nJzoJJyYjOTAwMjsnLCAgCSMgcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwgVSsyMzJBIElTT3RlY2gKKyAgICAncmFxdW8nOgknXDI3MycsICAJIyByaWdodC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0KKyAgICAncmFycic6CScmIzg1OTQ7JywgIAkjIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0KKyAgICAncmNlaWwnOgknJiM4OTY5OycsICAJIyByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYworICAgICdyZHF1byc6CScmIzgyMjE7JywgIAkjIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyaywgVSsyMDFEIElTT251bQorICAgICdyZWFsJzoJJyYjODQ3NjsnLCAgCSMgYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwgVSsyMTFDIElTT2Ftc28KKyAgICAncmVnJzoJJ1wyNTYnLCAgCSMgcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sIFUrMDBBRSBJU09udW0KKyAgICAncmZsb29yJzoJJyYjODk3MTsnLCAgCSMgcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjCisgICAgJ3Jobyc6CScmIzk2MTsnLCAgCSMgZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMKKyAgICAncmxtJzoJJyYjODIwNzsnLCAgCSMgcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwCisgICAgJ3JzYXF1byc6CScmIzgyNTA7JywgIAkjIHNpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDNBIElTTyBwcm9wb3NlZAorICAgICdyc3F1byc6CScmIzgyMTc7JywgIAkjIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDE5IElTT251bQorICAgICdzYnF1byc6CScmIzgyMTg7JywgIAkjIHNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVworICAgICdzY2Fyb24nOgknJiMzNTM7JywgIAkjIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sIFUrMDE2MSBJU09sYXQyCisgICAgJ3Nkb3QnOgknJiM4OTAxOycsICAJIyBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiCisgICAgJ3NlY3QnOgknXDI0NycsICAJIyBzZWN0aW9uIHNpZ24sIFUrMDBBNyBJU09udW0KKyAgICAnc2h5JzoJJ1wyNTUnLCAgCSMgc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwgVSswMEFEIElTT251bQorICAgICdzaWdtYSc6CScmIzk2MzsnLCAgCSMgZ3JlZWsgc21hbGwgbGV0dGVyIHNpZ21hLCBVKzAzQzMgSVNPZ3JrMworICAgICdzaWdtYWYnOgknJiM5NjI7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciBmaW5hbCBzaWdtYSwgVSswM0MyIElTT2dyazMKKyAgICAnc2ltJzoJJyYjODc2NDsnLCAgCSMgdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sIFUrMjIzQyBJU090ZWNoCisgICAgJ3NwYWRlcyc6CScmIzk4MjQ7JywgIAkjIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIKKyAgICAnc3ViJzoJJyYjODgzNDsnLCAgCSMgc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaAorICAgICdzdWJlJzoJJyYjODgzODsnLCAgCSMgc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaAorICAgICdzdW0nOgknJiM4NzIxOycsICAJIyBuLWFyeSBzdW1hdGlvbiwgVSsyMjExIElTT2Ftc2IKKyAgICAnc3VwJzoJJyYjODgzNTsnLCAgCSMgc3VwZXJzZXQgb2YsIFUrMjI4MyBJU090ZWNoCisgICAgJ3N1cDEnOgknXDI3MScsICAJIyBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsIFUrMDBCOSBJU09udW0KKyAgICAnc3VwMic6CSdcMjYyJywgIAkjIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3byA9IHNxdWFyZWQsIFUrMDBCMiBJU09udW0KKyAgICAnc3VwMyc6CSdcMjYzJywgIAkjIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUgPSBjdWJlZCwgVSswMEIzIElTT251bQorICAgICdzdXBlJzoJJyYjODgzOTsnLCAgCSMgc3VwZXJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NyBJU090ZWNoCisgICAgJ3N6bGlnJzoJJ1wzMzcnLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIHNoYXJwIHMgPSBlc3MtemVkLCBVKzAwREYgSVNPbGF0MQorICAgICd0YXUnOgknJiM5NjQ7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciB0YXUsIFUrMDNDNCBJU09ncmszCisgICAgJ3RoZXJlNCc6CScmIzg3NTY7JywgIAkjIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2gKKyAgICAndGhldGEnOgknJiM5NTI7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSwgVSswM0I4IElTT2dyazMKKyAgICAndGhldGFzeW0nOgknJiM5Nzc7JywgIAkjIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSBzeW1ib2wsIFUrMDNEMSBORVcKKyAgICAndGhpbnNwJzoJJyYjODIwMTsnLCAgCSMgdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YgorICAgICd0aG9ybic6CSdcMzc2JywgIAkjIGxhdGluIHNtYWxsIGxldHRlciB0aG9ybiB3aXRoLCBVKzAwRkUgSVNPbGF0MQorICAgICd0aWxkZSc6CScmIzczMjsnLCAgCSMgc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEKKyAgICAndGltZXMnOgknXDMyNycsICAJIyBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtCisgICAgJ3RyYWRlJzoJJyYjODQ4MjsnLCAgCSMgdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtCisgICAgJ3VBcnInOgknJiM4NjU3OycsICAJIyB1cHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQxIElTT2Ftc2EKKyAgICAndWFjdXRlJzoJJ1wzNzInLCAgCSMgbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBhY3V0ZSwgVSswMEZBIElTT2xhdDEKKyAgICAndWFycic6CScmIzg1OTM7JywgIAkjIHVwd2FyZHMgYXJyb3csIFUrMjE5MSBJU09udW0KKyAgICAndWNpcmMnOgknXDM3MycsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBGQiBJU09sYXQxCisgICAgJ3VncmF2ZSc6CSdcMzcxJywgIAkjIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZ3JhdmUsIFUrMDBGOSBJU09sYXQxCisgICAgJ3VtbCc6CSdcMjUwJywgIAkjIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLCBVKzAwQTggSVNPZGlhCisgICAgJ3Vwc2loJzoJJyYjOTc4OycsICAJIyBncmVlayB1cHNpbG9uIHdpdGggaG9vayBzeW1ib2wsIFUrMDNEMiBORVcKKyAgICAndXBzaWxvbic6CScmIzk2NTsnLCAgCSMgZ3JlZWsgc21hbGwgbGV0dGVyIHVwc2lsb24sIFUrMDNDNSBJU09ncmszCisgICAgJ3V1bWwnOgknXDM3NCcsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcywgVSswMEZDIElTT2xhdDEKKyAgICAnd2VpZXJwJzoJJyYjODQ3MjsnLCAgCSMgc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldCA9IFdlaWVyc3RyYXNzIHAsIFUrMjExOCBJU09hbXNvCisgICAgJ3hpJzoJJyYjOTU4OycsICAJIyBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszCisgICAgJ3lhY3V0ZSc6CSdcMzc1JywgIAkjIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggYWN1dGUsIFUrMDBGRCBJU09sYXQxCisgICAgJ3llbic6CSdcMjQ1JywgIAkjIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtCisgICAgJ3l1bWwnOgknXDM3NycsICAJIyBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGRpYWVyZXNpcywgVSswMEZGIElTT2xhdDEKKyAgICAnemV0YSc6CScmIzk1MDsnLCAgCSMgZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszCisgICAgJ3p3aic6CScmIzgyMDU7JywgIAkjIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwCisgICAgJ3p3bmonOgknJiM4MjA0OycsICAJIyB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsIFUrMjAwQyBORVcgUkZDIDIwNzAKKwogfQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvbGluZWNhY2gucHkgYi9MaWIvZG9zLTh4My9saW5lY2FjaC5weQppbmRleCA3ZGUzNzNmLi5iY2E0MGIyIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My9saW5lY2FjaC5weQorKysgYi9MaWIvZG9zLTh4My9saW5lY2FjaC5weQpAQCAtMSwxOCArMSwyMCBAQAotIyBDYWNoZSBsaW5lcyBmcm9tIGZpbGVzLgotIyBUaGlzIGlzIGludGVuZGVkIHRvIHJlYWQgbGluZXMgZnJvbSBtb2R1bGVzIGltcG9ydGVkIC0tIGhlbmNlIGlmIGEgZmlsZW5hbWUKLSMgaXMgbm90IGZvdW5kLCBpdCB3aWxsIGxvb2sgZG93biB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoIGZvciBhIGZpbGUgYnkKLSMgdGhhdCBuYW1lLgorIiIiQ2FjaGUgbGluZXMgZnJvbSBmaWxlcy4KKworVGhpcyBpcyBpbnRlbmRlZCB0byByZWFkIGxpbmVzIGZyb20gbW9kdWxlcyBpbXBvcnRlZCAtLSBoZW5jZSBpZiBhIGZpbGVuYW1lCitpcyBub3QgZm91bmQsIGl0IHdpbGwgbG9vayBkb3duIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggZm9yIGEgZmlsZSBieQordGhhdCBuYW1lLgorIiIiCiAKIGltcG9ydCBzeXMKIGltcG9ydCBvcwogZnJvbSBzdGF0IGltcG9ydCAqCiAKIGRlZiBnZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pOgotCWxpbmVzID0gZ2V0bGluZXMoZmlsZW5hbWUpCi0JaWYgMSA8PSBsaW5lbm8gPD0gbGVuKGxpbmVzKToKLQkJcmV0dXJuIGxpbmVzW2xpbmVuby0xXQotCWVsc2U6Ci0JCXJldHVybiAnJworICAgIGxpbmVzID0gZ2V0bGluZXMoZmlsZW5hbWUpCisgICAgaWYgMSA8PSBsaW5lbm8gPD0gbGVuKGxpbmVzKToKKyAgICAgICAgcmV0dXJuIGxpbmVzW2xpbmVuby0xXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJwogCiAKICMgVGhlIGNhY2hlCkBAIC0yMCw3MSArMjIsNzEgQEAKIGNhY2hlID0ge30gIyBUaGUgY2FjaGUKIAogCi0jIENsZWFyIHRoZSBjYWNoZSBlbnRpcmVseQotCiBkZWYgY2xlYXJjYWNoZSgpOgotCWdsb2JhbCBjYWNoZQotCWNhY2hlID0ge30KKyAgICAiIiJDbGVhciB0aGUgY2FjaGUgZW50aXJlbHkuIiIiCiAKKyAgICBnbG9iYWwgY2FjaGUKKyAgICBjYWNoZSA9IHt9CiAKLSMgR2V0IHRoZSBsaW5lcyBmb3IgYSBmaWxlIGZyb20gdGhlIGNhY2hlLgotIyBVcGRhdGUgdGhlIGNhY2hlIGlmIGl0IGRvZXNuJ3QgY29udGFpbiBhbiBlbnRyeSBmb3IgdGhpcyBmaWxlIGFscmVhZHkuCiAKIGRlZiBnZXRsaW5lcyhmaWxlbmFtZSk6Ci0JaWYgY2FjaGUuaGFzX2tleShmaWxlbmFtZSk6Ci0JCXJldHVybiBjYWNoZVtmaWxlbmFtZV1bMl0KLQllbHNlOgotCQlyZXR1cm4gdXBkYXRlY2FjaGUoZmlsZW5hbWUpCisgICAgIiIiR2V0IHRoZSBsaW5lcyBmb3IgYSBmaWxlIGZyb20gdGhlIGNhY2hlLgorICAgIFVwZGF0ZSB0aGUgY2FjaGUgaWYgaXQgZG9lc24ndCBjb250YWluIGFuIGVudHJ5IGZvciB0aGlzIGZpbGUgYWxyZWFkeS4iIiIKIAorICAgIGlmIGNhY2hlLmhhc19rZXkoZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gY2FjaGVbZmlsZW5hbWVdWzJdCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHVwZGF0ZWNhY2hlKGZpbGVuYW1lKQogCi0jIERpc2NhcmQgY2FjaGUgZW50cmllcyB0aGF0IGFyZSBvdXQgb2YgZGF0ZS4KLSMgKFRoaXMgaXMgbm90IGNoZWNrZWQgdXBvbiBlYWNoIGNhbGwhKQogCiBkZWYgY2hlY2tjYWNoZSgpOgotCWZvciBmaWxlbmFtZSBpbiBjYWNoZS5rZXlzKCk6Ci0JCXNpemUsIG10aW1lLCBsaW5lcywgZnVsbG5hbWUgPSBjYWNoZVtmaWxlbmFtZV0KLQkJdHJ5OgotCQkJc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCi0JCWV4Y2VwdCBvcy5lcnJvcjoKLQkJCWRlbCBjYWNoZVtmaWxlbmFtZV0KLQkJCWNvbnRpbnVlCi0JCWlmIHNpemUgPD4gc3RhdFtTVF9TSVpFXSBvciBtdGltZSA8PiBzdGF0W1NUX01USU1FXToKLQkJCWRlbCBjYWNoZVtmaWxlbmFtZV0KKyAgICAiIiJEaXNjYXJkIGNhY2hlIGVudHJpZXMgdGhhdCBhcmUgb3V0IG9mIGRhdGUuCisgICAgKFRoaXMgaXMgbm90IGNoZWNrZWQgdXBvbiBlYWNoIGNhbGwhKSIiIgogCisgICAgZm9yIGZpbGVuYW1lIGluIGNhY2hlLmtleXMoKToKKyAgICAgICAgc2l6ZSwgbXRpbWUsIGxpbmVzLCBmdWxsbmFtZSA9IGNhY2hlW2ZpbGVuYW1lXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdGF0ID0gb3Muc3RhdChmdWxsbmFtZSkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgc2l6ZSA8PiBzdGF0W1NUX1NJWkVdIG9yIG10aW1lIDw+IHN0YXRbU1RfTVRJTUVdOgorICAgICAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQogCi0jIFVwZGF0ZSBhIGNhY2hlIGVudHJ5IGFuZCByZXR1cm4gaXRzIGxpc3Qgb2YgbGluZXMuCi0jIElmIHNvbWV0aGluZydzIHdyb25nLCBwcmludCBhIG1lc3NhZ2UsIGRpc2NhcmQgdGhlIGNhY2hlIGVudHJ5LAotIyBhbmQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCiAKIGRlZiB1cGRhdGVjYWNoZShmaWxlbmFtZSk6Ci0JaWYgY2FjaGUuaGFzX2tleShmaWxlbmFtZSk6Ci0JCWRlbCBjYWNoZVtmaWxlbmFtZV0KLQlpZiBub3QgZmlsZW5hbWUgb3IgZmlsZW5hbWVbMF0gKyBmaWxlbmFtZVstMV0gPT0gJzw+JzoKLQkJcmV0dXJuIFtdCi0JZnVsbG5hbWUgPSBmaWxlbmFtZQotCXRyeToKLQkJc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCi0JZXhjZXB0IG9zLmVycm9yLCBtc2c6Ci0JCSMgVHJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoCi0JCWJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0KLQkJZm9yIGRpcm5hbWUgaW4gc3lzLnBhdGg6Ci0JCQlmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBiYXNlbmFtZSkKLQkJCXRyeToKLQkJCQlzdGF0ID0gb3Muc3RhdChmdWxsbmFtZSkKLQkJCQlicmVhawotCQkJZXhjZXB0IG9zLmVycm9yOgotCQkJCXBhc3MKLQkJZWxzZToKLQkJCSMgTm8gbHVjawotIyMJCQlwcmludCAnKioqIENhbm5vdCBzdGF0JywgZmlsZW5hbWUsICc6JywgbXNnCi0JCQlyZXR1cm4gW10KLQl0cnk6Ci0JCWZwID0gb3BlbihmdWxsbmFtZSwgJ3InKQotCQlsaW5lcyA9IGZwLnJlYWRsaW5lcygpCi0JCWZwLmNsb3NlKCkKLQlleGNlcHQgSU9FcnJvciwgbXNnOgotIyMJCXByaW50ICcqKiogQ2Fubm90IG9wZW4nLCBmdWxsbmFtZSwgJzonLCBtc2cKLQkJcmV0dXJuIFtdCi0Jc2l6ZSwgbXRpbWUgPSBzdGF0W1NUX1NJWkVdLCBzdGF0W1NUX01USU1FXQotCWNhY2hlW2ZpbGVuYW1lXSA9IHNpemUsIG10aW1lLCBsaW5lcywgZnVsbG5hbWUKLQlyZXR1cm4gbGluZXMKKyAgICAiIiJVcGRhdGUgYSBjYWNoZSBlbnRyeSBhbmQgcmV0dXJuIGl0cyBsaXN0IG9mIGxpbmVzLgorICAgIElmIHNvbWV0aGluZydzIHdyb25nLCBwcmludCBhIG1lc3NhZ2UsIGRpc2NhcmQgdGhlIGNhY2hlIGVudHJ5LAorICAgIGFuZCByZXR1cm4gYW4gZW1wdHkgbGlzdC4iIiIKKworICAgIGlmIGNhY2hlLmhhc19rZXkoZmlsZW5hbWUpOgorICAgICAgICBkZWwgY2FjaGVbZmlsZW5hbWVdCisgICAgaWYgbm90IGZpbGVuYW1lIG9yIGZpbGVuYW1lWzBdICsgZmlsZW5hbWVbLTFdID09ICc8Pic6CisgICAgICAgIHJldHVybiBbXQorICAgIGZ1bGxuYW1lID0gZmlsZW5hbWUKKyAgICB0cnk6CisgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQorICAgIGV4Y2VwdCBvcy5lcnJvciwgbXNnOgorICAgICAgICAjIFRyeSBsb29raW5nIHRocm91Z2ggdGhlIG1vZHVsZSBzZWFyY2ggcGF0aAorICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWzFdCisgICAgICAgIGZvciBkaXJuYW1lIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgYmFzZW5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE5vIGx1Y2sKKyMjICAgICAgICAgIHByaW50ICcqKiogQ2Fubm90IHN0YXQnLCBmaWxlbmFtZSwgJzonLCBtc2cKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgIHRyeToKKyAgICAgICAgZnAgPSBvcGVuKGZ1bGxuYW1lLCAncicpCisgICAgICAgIGxpbmVzID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisjIyAgICAgIHByaW50ICcqKiogQ2Fubm90IG9wZW4nLCBmdWxsbmFtZSwgJzonLCBtc2cKKyAgICAgICAgcmV0dXJuIFtdCisgICAgc2l6ZSwgbXRpbWUgPSBzdGF0W1NUX1NJWkVdLCBzdGF0W1NUX01USU1FXQorICAgIGNhY2hlW2ZpbGVuYW1lXSA9IHNpemUsIG10aW1lLCBsaW5lcywgZnVsbG5hbWUKKyAgICByZXR1cm4gbGluZXMKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL21hY3VybDJwLnB5IGIvTGliL2Rvcy04eDMvbWFjdXJsMnAucHkKaW5kZXggN2QyNzNiYy4uYzk3MWVkYSAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvbWFjdXJsMnAucHkKKysrIGIvTGliL2Rvcy04eDMvbWFjdXJsMnAucHkKQEAgLTEsNSArMSw2IEBACi0iIiJNYWMgc3BlY2lmaWMgbW9kdWxlIGZvciBjb252ZXJzaW9uIGJldHdlZW4gcGF0aG5hbWVzIGFuZCBVUkxzLgotRG8gbm90IGltcG9ydCBkaXJlY3RseSwgdXNlIHVybGxpYiBpbnN0ZWFkLiIiIgorIiIiTWFjaW50b3NoLXNwZWNpZmljIG1vZHVsZSBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIHBhdGhuYW1lcyBhbmQgVVJMcy4KKworRG8gbm90IGltcG9ydCBkaXJlY3RseTsgdXNlIHVybGxpYiBpbnN0ZWFkLiIiIgogCiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgdXJsbGliCkBAIC0xMyw2ICsxNCwxMSBAQAogICAgIHRwID0gdXJsbGliLnNwbGl0dHlwZShwYXRobmFtZSlbMF0KICAgICBpZiB0cCBhbmQgdHAgPD4gJ2ZpbGUnOgogICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdDYW5ub3QgY29udmVydCBub24tbG9jYWwgVVJMIHRvIHBhdGhuYW1lJworICAgICMgVHVybiBzdGFydGluZyAvLy8gaW50byAvLCBhbiBlbXB0eSBob3N0bmFtZSBtZWFucyBjdXJyZW50IGhvc3QKKyAgICBpZiBwYXRobmFtZVs6M10gPT0gJy8vLyc6CisgICAgCXBhdGhuYW1lID0gcGF0aG5hbWVbMjpdCisgICAgZWxpZiBwYXRobmFtZVs6Ml0gPT0gJy8vJzoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnQ2Fubm90IGNvbnZlcnQgbm9uLWxvY2FsIFVSTCB0byBwYXRobmFtZScKICAgICBjb21wb25lbnRzID0gc3RyaW5nLnNwbGl0KHBhdGhuYW1lLCAnLycpCiAgICAgIyBSZW1vdmUgLiBhbmQgZW1iZWRkZWQgLi4KICAgICBpID0gMApkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvbWltZXBhcnMucHkgYi9MaWIvZG9zLTh4My9taW1lcGFycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmZlOWViCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvbWltZXBhcnMucHkKQEAgLTAsMCArMSwyNDYgQEAKKyIiIkdlbmVyaWMgTUlNRSBwYXJzZXIuCisKK0NsYXNzZXM6CisKKyAgICAgICAgTWltZVBhcnNlciAtIEdlbmVyaWMgTUlNRSBwYXJzZXIuCisKK0V4Y2VwdGlvbnM6CisKKyAgICAgICAgTWltZUVycm9yIC0gRXhjZXB0aW9uIHJhaXNlZCBieSBNaW1lUGFyc2VyIGNsYXNzLgorCitYWFggVG8gZG86CisKKy0gQ29udGVudC10cmFuc2Zlci1lbmNvZGluZyBpc3N1ZXMKKy0gVXNlIENvbnRlbnQtbGVuZ3RoIGhlYWRlciBpbiByYXdib2R5KCk/CistIENhY2hlIHBhcnRzIGluc3RlYWQgb2YgcmVwYXJzaW5nIGVhY2ggdGltZQorLSBUaGUgbWVzc2FnZSBzdHJpbmdzIGluIGV4Y2VwdGlvbnMgY291bGQgdXNlIHNvbWUgd29yaworCisiIiIKKworZnJvbSB0eXBlcyBpbXBvcnQgKiAgICAgICAgICAgICAgICAgICAgICMgUHl0aG9uIHR5cGVzLCBub3QgTUlNRSB0eXBlcyA6LSkKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCByZWdleAoraW1wb3J0IFN1YkZpbGUKK2ltcG9ydCBtaW1ldG9vbHMKKworCitNaW1lRXJyb3IgPSAiTWltZVBhcnNlci5NaW1lRXJyb3IiICAgICAgIyBFeGNlcHRpb24gcmFpc2VkIGJ5IHRoaXMgY2xhc3MKKworCitjbGFzcyBNaW1lUGFyc2VyOgorCisgICAgIiIiR2VuZXJpYyBNSU1FIHBhcnNlci4KKworICAgIFRoaXMgcmVxdWlyZXMgYSBzZWVrYWJsZSBmaWxlLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnApOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvcjogc3RvcmUgdGhlIGZpbGUgcG9pbnRlciBhbmQgcGFyc2UgdGhlIGhlYWRlcnMuIiIiCisgICAgICAgIHNlbGYuX2ZwID0gZnAKKyAgICAgICAgc2VsZi5fc3RhcnQgPSBmcC50ZWxsKCkKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IGggPSBtaW1ldG9vbHMuTWVzc2FnZShmcCkKKyAgICAgICAgc2VsZi5fYm9keXN0YXJ0ID0gZnAudGVsbCgpCisgICAgICAgIHNlbGYuX211bHRpcGFydCA9IGguZ2V0bWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JworCisgICAgZGVmIG11bHRpcGFydChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIG11bHRpcGFydCBtZXNzYWdlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fbXVsdGlwYXJ0CisKKyAgICBkZWYgaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBoZWFkZXJzIG9mIHRoZSBNSU1FIG1lc3NhZ2UsIGFzIGEgTWVzc2FnZSBvYmplY3QuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9oZWFkZXJzCisKKyAgICBkZWYgcmF3Ym9keShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSByYXcgYm9keSBvZiB0aGUgTUlNRSBtZXNzYWdlLCBhcyBhIGZpbGUtbGlrZSBvYmplY3QuCisKKyAgICAgICAgVGhpcyBpcyBhIGZhaXJseSBsb3ctbGV2ZWwgaW50ZXJmYWNlIC0tIGZvciBhIG11bHRpcGFydAorICAgICAgICBtZXNzYWdlLCB5b3UnZCBoYXZlIHRvIHBhcnNlIHRoZSBib2R5IHlvdXJzZWxmLCBhbmQgaXQgZG9lc24ndAorICAgICAgICB0cmFuc2xhdGUgdGhlIENvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcuCisgICAgICAgIAorICAgICAgICAiIiIKKyAgICAgICAgIyBYWFggVXNlIENvbnRlbnQtbGVuZ3RoIHRvIHNldCBlbmQgaWYgaXQgZXhpc3RzPworICAgICAgICByZXR1cm4gU3ViRmlsZS5TdWJGaWxlKHNlbGYuX2ZwLCBzZWxmLl9ib2R5c3RhcnQpCisKKyAgICBkZWYgYm9keShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBib2R5IG9mIGEgMS1wYXJ0IE1JTUUgbWVzc2FnZSwgYXMgYSBmaWxlLWxpa2Ugb2JqZWN0LgorCisgICAgICAgIFRoaXMgc2hvdWxkIGludGVycHJldCB0aGUgQ29udGVudC10cmFuc2Zlci1lbmNvZGluZywgaWYgYW55CisgICAgICAgIChYWFggY3VycmVudGx5IGl0IGRvZXNuJ3QpLgorICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX211bHRpcGFydDoKKyAgICAgICAgICAgIHJhaXNlIE1pbWVFcnJvciwgImJvZHkoKSBvbmx5IHdvcmtzIGZvciAxLXBhcnQgbWVzc2FnZXMiCisgICAgICAgIHJldHVybiBzZWxmLnJhd2JvZHkoKQorCisgICAgX3JlX2NvbnRlbnRfbGVuZ3RoID0gcmVnZXguY29tcGlsZSgnY29udGVudC1sZW5ndGg6WyBcdF0qXChbMC05XStcKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5jYXNlZm9sZCkKKworICAgIGRlZiByYXdwYXJ0cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSByYXcgYm9keSBwYXJ0cyBvZiBhIG11bHRpcGFydCBNSU1FIG1lc3NhZ2UuCisKKyAgICAgICAgVGhpcyByZXR1cm5zIGEgbGlzdCBvZiBTdWJGaWxlKCkgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAgICBwYXJ0cy4gIE5vdGUgdGhhdCB0aGUgcGhhbnRvbSBwYXJ0IGJlZm9yZSB0aGUgZmlyc3Qgc2VwYXJhdG9yCisgICAgICAgIGlzIHJldHVybmVkIHRvbywgYXMgbGlzdCBpdGVtIDAuICBJZiB0aGUgZmluYWwgcGFydCBpcyBub3QKKyAgICAgICAgZm9sbG93ZWQgYnkgYSB0ZXJtaW5hdG9yLCBpdCBpcyBpZ25vcmVkLCBhbmQgdGhpcyBlcnJvciBpcyBub3QKKyAgICAgICAgcmVwb3J0ZWQuICAoWFhYOiB0aGUgZXJyb3Igc2hvdWxkIGJlIHJhaXNlZCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9tdWx0aXBhcnQ6CisgICAgICAgICAgICByYWlzZSBNaW1lRXJyb3IsICJbcmF3XXBhcnRzKCkgb25seSB3b3JrcyBmb3IgbXVsdGlwYXJ0IG1lc3NhZ2VzIgorICAgICAgICBoID0gc2VsZi5faGVhZGVycworICAgICAgICBzZXBhcmF0b3IgPSBoLmdldHBhcmFtKCdib3VuZGFyeScpCisgICAgICAgIGlmIG5vdCBzZXBhcmF0b3I6CisgICAgICAgICAgICByYWlzZSBNaW1lRXJyb3IsICJtdWx0aXBhcnQgYm91bmRhcnkgbm90IHNwZWNpZmllZCIKKyAgICAgICAgc2VwYXJhdG9yID0gIi0tIiArIHNlcGFyYXRvcgorICAgICAgICB0ZXJtaW5hdG9yID0gc2VwYXJhdG9yICsgIi0tIgorICAgICAgICBucyA9IGxlbihzZXBhcmF0b3IpCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBmID0gc2VsZi5fZnAKKyAgICAgICAgc3RhcnQgPSBmLnRlbGwoKQorICAgICAgICBjbGVuZ3RoID0gLTEKKyAgICAgICAgYm9keXN0YXJ0ID0gLTEKKyAgICAgICAgaW5oZWFkZXJzID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgZW5kID0gZi50ZWxsKCkKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lWzoyXSAhPSAiLS0iIG9yIGxpbmVbOm5zXSAhPSBzZXBhcmF0b3I6CisgICAgICAgICAgICAgICAgaWYgaW5oZWFkZXJzOgorICAgICAgICAgICAgICAgICAgICByZSA9IHNlbGYuX3JlX2NvbnRlbnRfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIGlmIHJlLm1hdGNoKGxpbmUpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVuZ3RoID0gc3RyaW5nLmF0b2kocmUuZ3JvdXAoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgc3RyaW5nLmF0b2lfZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RyaW5nLnN0cmlwKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5oZWFkZXJzID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgYm9keXN0YXJ0ID0gZi50ZWxsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNsZW5ndGggPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2tpcCBiaW5hcnkgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucmVhZChjbGVuZ3RoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsaW5lID0gc3RyaW5nLnN0cmlwKGxpbmUpCisgICAgICAgICAgICBpZiBsaW5lID09IHRlcm1pbmF0b3Igb3IgbGluZSA9PSBzZXBhcmF0b3I6CisgICAgICAgICAgICAgICAgaWYgY2xlbmd0aCA+PSAwOgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBDb250ZW50LWxlbmd0aCBoZWFkZXIgZGV0ZXJtaW5lcyB0aGUgc3ViZmlsZSBzaXplCisgICAgICAgICAgICAgICAgICAgIGVuZCA9IGJvZHlzdGFydCArIGNsZW5ndGgKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBmaW5hbCBuZXdsaW5lIGlzIG5vdCBwYXJ0IG9mIHRoZSBjb250ZW50CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZC0xCisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoU3ViRmlsZS5TdWJGaWxlKGYsIHN0YXJ0LCBlbmQpKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gZi50ZWxsKCkKKyAgICAgICAgICAgICAgICBjbGVuZ3RoID0gLTEKKyAgICAgICAgICAgICAgICBpbmhlYWRlcnMgPSAxCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSB0ZXJtaW5hdG9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gbGlzdAorCisgICAgZGVmIHBhcnRzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHBhcnNlZCBib2R5IHBhcnRzIG9mIGEgbXVsdGlwYXJ0IE1JTUUgbWVzc2FnZS4KKworICAgICAgICBUaGlzIHJldHVybnMgYSBsaXN0IG9mIE1pbWVQYXJzZXIoKSBpbnN0YW5jZXMgY29ycmVzcG9uZGluZyB0bworICAgICAgICB0aGUgcGFydHMuICBUaGUgcGhhbnRvbSBwYXJ0IGJlZm9yZSB0aGUgZmlyc3Qgc2VwYXJhdG9yIGlzIG5vdAorICAgICAgICBpbmNsdWRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIG1hcChNaW1lUGFyc2VyLCBzZWxmLnJhd3BhcnRzKClbMTpdKQorCisgICAgZGVmIGdldHN1YnBhcnRieXBvc2l0aW9uKHNlbGYsIGluZGljZXMpOgorICAgICAgICBwYXJ0ID0gc2VsZgorICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgorICAgICAgICAgICAgcGFydCA9IHBhcnQucGFydHMoKVtpXQorICAgICAgICByZXR1cm4gcGFydAorCisgICAgZGVmIGdldHN1YnBhcnRieWlkKHNlbGYsIGlkKToKKyAgICAgICAgaCA9IHNlbGYuX2hlYWRlcnMKKyAgICAgICAgY2lkID0gaC5nZXRoZWFkZXIoJ2NvbnRlbnQtaWQnKQorICAgICAgICBpZiBjaWQgYW5kIGNpZCA9PSBpZDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGlmIHNlbGYuX211bHRpcGFydDoKKyAgICAgICAgICAgIGZvciBwYXJ0IGluIHNlbGYucGFydHMoKToKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBNaW1lUGFyc2VyKHBhcnQpCisgICAgICAgICAgICAgICAgaGl0ID0gcGFyc2VyLmdldHN1YnBhcnRieWlkKGlkKQorICAgICAgICAgICAgICAgIGlmIGhpdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhpdAorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGluZGV4KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW4gaW5kZXggb2YgdGhlIE1JTUUgZmlsZS4KKworICAgICAgICBUaGlzIHBhcnNlcyB0aGUgZW50aXJlIGZpbGUgYW5kIHJldHVybnMgaW5kZXggaW5mb3JtYXRpb24KKyAgICAgICAgYWJvdXQgaXQsIGluIHRoZSBmb3JtIG9mIGEgdHVwbGUKKworICAgICAgICAgICAgKGN0eXBlLCBoZWFkZXJzLCBib2R5KQorCisgICAgICAgIHdoZXJlICdjdHlwZScgaXMgdGhlIGNvbnRlbnQgdHlwZSBzdHJpbmcgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgKGUuZy4gYHRleHQvcGxhaW4nIG9yIGBtdWx0aXBhcnQvbWl4ZWQnKSBhbmQgJ2hlYWRlcnMnIGlzIGEKKyAgICAgICAgTWVzc2FnZSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBtZXNzYWdlIGhlYWRlcnMgKHdoaWNoIHNob3VsZAorICAgICAgICBiZSB0cmVhdGVkIGFzIHJlYWQtb25seSkuCisKKyAgICAgICAgVGhlICdib2R5JyBpdGVtIGRlcGVuZHMgb24gdGhlIGNvbnRlbnQgdHlwZToKKworICAgICAgICAtIElmIGl0IGlzIGFuIGF0b21pYyBtZXNzYWdlIChhbnl0aGluZyBleGNlcHQgZm9yIGNvbnRlbnQgdHlwZQorICAgICAgICAgIG11bHRpcGFydC8qKSwgaXQgaXMgdGhlIGZpbGUtbGlrZSBvYmplY3QgcmV0dXJuZWQgYnkKKyAgICAgICAgICBzZWxmLmJvZHkoKS4KKworICAgICAgICAtIEZvciBhIGNvbnRlbnQgdHlwZSBvZiBtdWx0aXBhcnQvKiwgaXQgaXMgdGhlIGxpc3Qgb2YKKyAgICAgICAgICBNaW1lUGFyc2VyKCkgb2JqZWN0cyByZXR1cm5lZCBieSBzZWxmLnBhcnRzKCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX211bHRpcGFydDoKKyAgICAgICAgICAgIGJvZHkgPSBzZWxmLnBhcnRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJvZHkgPSBzZWxmLmJvZHkoKQorICAgICAgICByZXR1cm4gc2VsZi5faGVhZGVycy5nZXR0eXBlKCksIHNlbGYuX2hlYWRlcnMsIGJvZHkKKworCitkZWYgX3Nob3cocGFyc2VyLCBsZXZlbD0wKToKKyAgICAiIiJIZWxwZXIgZm9yIF90ZXN0KCkuIiIiCisgICAgY3R5cGUsIGhlYWRlcnMsIGJvZHkgPSBwYXJzZXIuaW5kZXgoKQorICAgIHByaW50IGN0eXBlLAorICAgIGlmIHR5cGUoYm9keSkgPT0gTGlzdFR5cGU6CisgICAgICAgIG5wYXJ0cyA9IGxlbihib2R5KQorICAgICAgICBwcmludCAiKCVkIHBhcnQlcyk6IiAlIChucGFydHMsIG5wYXJ0cyAhPSAxIGFuZCAicyIgb3IgIiIpCisgICAgICAgIG4gPSAwCisgICAgICAgIGZvciBwYXJ0IGluIGJvZHk6CisgICAgICAgICAgICBuID0gbisxCisgICAgICAgICAgICBwcmludCAiJSpkLiIgJSAoNCpsZXZlbCsyLCBuKSwKKyAgICAgICAgICAgIF9zaG93KHBhcnQsIGxldmVsKzEpCisgICAgZWxzZToKKyAgICAgICAgYm9keWxpbmVzID0gYm9keS5yZWFkbGluZXMoKQorICAgICAgICBwcmludCAiKCVkIGhlYWRlciBsaW5lcywgJWQgYm9keSBsaW5lcykiICUgKAorICAgICAgICAgICAgbGVuKGhlYWRlcnMuaGVhZGVycyksIGxlbihib2R5bGluZXMpKQorICAgICAgICBmb3IgbGluZSBpbiBoZWFkZXJzLmhlYWRlcnMgKyBbJ1xuJ10gKyBib2R5bGluZXM6CisgICAgICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzogbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgcHJpbnQgIiAgICAiKmxldmVsICsgbGluZQorCitkZWYgX3Rlc3QoYXJncyA9IE5vbmUpOgorICAgICIiIlRlc3QgcHJvZ3JhbSBpbnZva2VkIHdoZW4gcnVuIGFzIGEgc2NyaXB0LgorCisgICAgV2hlbiBhIGZpbGVuYW1lIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgaXQgcmVhZHMgZnJvbSB0aGF0IGZpbGUuCisgICAgV2hlbiBubyBhcmd1bWVudHMgYXJlIHByZXNlbnQsIGl0IGRlZmF1bHRzIHRvICd0ZXN0a3AudHh0JyBpZiBpdAorICAgIGV4aXN0cywgZWxzZSBpdCBkZWZhdWx0cyB0byBzdGRpbi4KKworICAgICIiIgorICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBpZiBhcmdzOgorICAgICAgICBmbiA9IGFyZ3NbMF0KKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgZm4gPSAndGVzdGtwLnR4dCcKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgIGZuID0gJy0nCisgICAgaWYgZm4gPT0gJy0nOgorICAgICAgICBmcCA9IHN5cy5zdGRpbgorICAgIGVsc2U6CisgICAgICAgIGZwID0gb3BlbihmbikKKyAgICBtcCA9IE1pbWVQYXJzZXIoZnApCisgICAgX3Nob3cobXApCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHN5cworICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL21pbWV0b29sLnB5IGIvTGliL2Rvcy04eDMvbWltZXRvb2wucHkKaW5kZXggZmM3MmM3OS4uMjc5OTZlMCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvbWltZXRvb2wucHkKKysrIGIvTGliL2Rvcy04eDMvbWltZXRvb2wucHkKQEAgLTEsNCArMSw0IEBACi0jIFZhcmlvdXMgdG9vbHMgdXNlZCBieSBNSU1FLXJlYWRpbmcgb3IgTUlNRS13cml0aW5nIHByb2dyYW1zLgorIiIiVmFyaW91cyB0b29scyB1c2VkIGJ5IE1JTUUtcmVhZGluZyBvciBNSU1FLXdyaXRpbmcgcHJvZ3JhbXMuIiIiCiAKIAogaW1wb3J0IG9zCkBAIC03LDEwICs3LDkgQEAKIGltcG9ydCB0ZW1wZmlsZQogCiAKLSMgQSBkZXJpdmVkIGNsYXNzIG9mIHJmYzgyMi5NZXNzYWdlIHRoYXQga25vd3MgYWJvdXQgTUlNRSBoZWFkZXJzIGFuZAotIyBjb250YWlucyBzb21lIGhvb2tzIGZvciBkZWNvZGluZyBlbmNvZGVkIGFuZCBtdWx0aXBhcnQgbWVzc2FnZXMuCi0KIGNsYXNzIE1lc3NhZ2UocmZjODIyLk1lc3NhZ2UpOgorCSIiIkEgZGVyaXZlZCBjbGFzcyBvZiByZmM4MjIuTWVzc2FnZSB0aGF0IGtub3dzIGFib3V0IE1JTUUgaGVhZGVycyBhbmQKKwljb250YWlucyBzb21lIGhvb2tzIGZvciBkZWNvZGluZyBlbmNvZGVkIGFuZCBtdWx0aXBhcnQgbWVzc2FnZXMuIiIiCiAKIAlkZWYgX19pbml0X18oc2VsZiwgZnAsIHNlZWthYmxlID0gMSk6CiAJCXJmYzgyMi5NZXNzYWdlLl9faW5pdF9fKHNlbGYsIGZwLCBzZWVrYWJsZSkKQEAgLTk2LDE3ICs5NSwxNyBAQAogIyAtLS0tLS0tLS0tLS0tLS0tLQogCiAKLSMgUmV0dXJuIGEgcmFuZG9tIHN0cmluZyB1c2FibGUgYXMgYSBtdWx0aXBhcnQgYm91bmRhcnkuCi0jIFRoZSBtZXRob2QgdXNlZCBpcyBzbyB0aGF0IGl0IGlzICp2ZXJ5KiB1bmxpa2VseSB0aGF0IHRoZSBzYW1lCi0jIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHdpbGwgZXZlcnkgb2NjdXIgYWdhaW4gaW4gdGhlIFVuaXZlcnNlLAotIyBzbyB0aGUgY2FsbGVyIG5lZWRuJ3QgY2hlY2sgdGhlIGRhdGEgaXQgaXMgcGFja2luZyBmb3IgdGhlCi0jIG9jY3VycmVuY2Ugb2YgdGhlIGJvdW5kYXJ5LgotIwotIyBUaGUgYm91bmRhcnkgY29udGFpbnMgZG90cyBzbyB5b3UgaGF2ZSB0byBxdW90ZSBpdCBpbiB0aGUgaGVhZGVyLgotCiBfcHJlZml4ID0gTm9uZQogCiBkZWYgY2hvb3NlX2JvdW5kYXJ5KCk6CisJIiIiUmV0dXJuIGEgcmFuZG9tIHN0cmluZyB1c2FibGUgYXMgYSBtdWx0aXBhcnQgYm91bmRhcnkuCisJVGhlIG1ldGhvZCB1c2VkIGlzIHNvIHRoYXQgaXQgaXMgKnZlcnkqIHVubGlrZWx5IHRoYXQgdGhlIHNhbWUKKwlzdHJpbmcgb2YgY2hhcmFjdGVycyB3aWxsIGV2ZXJ5IG9jY3VyIGFnYWluIGluIHRoZSBVbml2ZXJzZSwKKwlzbyB0aGUgY2FsbGVyIG5lZWRuJ3QgY2hlY2sgdGhlIGRhdGEgaXQgaXMgcGFja2luZyBmb3IgdGhlCisJb2NjdXJyZW5jZSBvZiB0aGUgYm91bmRhcnkuCisKKwlUaGUgYm91bmRhcnkgY29udGFpbnMgZG90cyBzbyB5b3UgaGF2ZSB0byBxdW90ZSBpdCBpbiB0aGUgaGVhZGVyLiIiIgorCiAJZ2xvYmFsIF9wcmVmaXgKIAlpbXBvcnQgdGltZQogCWltcG9ydCByYW5kb20KQEAgLTEzMSw2ICsxMzAsNyBAQAogIyBTdWJyb3V0aW5lcyBmb3IgZGVjb2Rpbmcgc29tZSBjb21tb24gY29udGVudC10cmFuc2Zlci10eXBlcwogCiBkZWYgZGVjb2RlKGlucHV0LCBvdXRwdXQsIGVuY29kaW5nKToKKwkiIiJEZWNvZGUgY29tbW9uIGNvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmdzIChiYXNlNjQsIHF1b3ByaSwgdXVlbmNvZGUpLiIiIgogCWlmIGVuY29kaW5nID09ICdiYXNlNjQnOgogCQlpbXBvcnQgYmFzZTY0CiAJCXJldHVybiBiYXNlNjQuZGVjb2RlKGlucHV0LCBvdXRwdXQpCkBAIC0xNDAsNiArMTQwLDggQEAKIAlpZiBlbmNvZGluZyBpbiAoJ3V1ZW5jb2RlJywgJ3gtdXVlbmNvZGUnLCAndXVlJywgJ3gtdXVlJyk6CiAJCWltcG9ydCB1dQogCQlyZXR1cm4gdXUuZGVjb2RlKGlucHV0LCBvdXRwdXQpCisJaWYgZW5jb2RpbmcgaW4gKCc3Yml0JywgJzhiaXQnKToKKwkJb3V0cHV0LndyaXRlKGlucHV0LnJlYWQoKSkKIAlpZiBkZWNvZGV0YWIuaGFzX2tleShlbmNvZGluZyk6CiAJCXBpcGV0aHJvdWdoKGlucHV0LCBkZWNvZGV0YWJbZW5jb2RpbmddLCBvdXRwdXQpCiAJZWxzZToKQEAgLTE0Nyw2ICsxNDksNyBAQAogCQkgICAgICAndW5rbm93biBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAlcycgJSBlbmNvZGluZwogCiBkZWYgZW5jb2RlKGlucHV0LCBvdXRwdXQsIGVuY29kaW5nKToKKwkiIiJFbmNvZGUgY29tbW9uIGNvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmdzIChiYXNlNjQsIHF1b3ByaSwgdXVlbmNvZGUpLiIiIgogCWlmIGVuY29kaW5nID09ICdiYXNlNjQnOgogCQlpbXBvcnQgYmFzZTY0CiAJCXJldHVybiBiYXNlNjQuZW5jb2RlKGlucHV0LCBvdXRwdXQpCkBAIC0xNTYsNiArMTU5LDggQEAKIAlpZiBlbmNvZGluZyBpbiAoJ3V1ZW5jb2RlJywgJ3gtdXVlbmNvZGUnLCAndXVlJywgJ3gtdXVlJyk6CiAJCWltcG9ydCB1dQogCQlyZXR1cm4gdXUuZW5jb2RlKGlucHV0LCBvdXRwdXQpCisJaWYgZW5jb2RpbmcgaW4gKCc3Yml0JywgJzhiaXQnKToKKwkJb3V0cHV0LndyaXRlKGlucHV0LnJlYWQoKSkKIAlpZiBlbmNvZGV0YWIuaGFzX2tleShlbmNvZGluZyk6CiAJCXBpcGV0aHJvdWdoKGlucHV0LCBlbmNvZGV0YWJbZW5jb2RpbmddLCBvdXRwdXQpCiAJZWxzZToKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL21pbWV0eXBlLnB5IGIvTGliL2Rvcy04eDMvbWltZXR5cGUucHkKaW5kZXggZjE1MTYwZi4uOWRjMzY0NSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvbWltZXR5cGUucHkKKysrIGIvTGliL2Rvcy04eDMvbWltZXR5cGUucHkKQEAgLTMwLDggKzMwLDggQEAKIGtub3duZmlsZXMgPSBbCiAgICAgIi91c3IvbG9jYWwvZXRjL2h0dHBkL2NvbmYvbWltZS50eXBlcyIsCiAgICAgIi91c3IvbG9jYWwvbGliL25ldHNjYXBlL21pbWUudHlwZXMiLAotICAgICIvdXNyL2xvY2FsL2V0Yy9odHRwZC9jb25mL21pbWUudHlwZXMiLAkjIEFwYWNoZSAxLjIKLSAgICAiL3Vzci9sb2NhbC9ldGMvbWltZS50eXBlcyIsCQkjIEFwYWNoZSAxLjMKKyAgICAiL3Vzci9sb2NhbC9ldGMvaHR0cGQvY29uZi9taW1lLnR5cGVzIiwgICAgICMgQXBhY2hlIDEuMgorICAgICIvdXNyL2xvY2FsL2V0Yy9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAgIyBBcGFjaGUgMS4zCiAgICAgXQogCiBpbml0ZWQgPSAwCkBAIC01NiwyNCArNTYsMjQgQEAKICAgICAgICAgaW5pdCgpCiAgICAgc2NoZW1lLCB1cmwgPSB1cmxsaWIuc3BsaXR0eXBlKHVybCkKICAgICBpZiBzY2hlbWUgPT0gJ2RhdGEnOgotCSMgc3ludGF4IG9mIGRhdGEgVVJMczoKLQkjIGRhdGF1cmwgICA6PSAiZGF0YToiIFsgbWVkaWF0eXBlIF0gWyAiO2Jhc2U2NCIgXSAiLCIgZGF0YQotCSMgbWVkaWF0eXBlIDo9IFsgdHlwZSAiLyIgc3VidHlwZSBdICooICI7IiBwYXJhbWV0ZXIgKQotCSMgZGF0YSAgICAgIDo9ICp1cmxjaGFyCi0JIyBwYXJhbWV0ZXIgOj0gYXR0cmlidXRlICI9IiB2YWx1ZQotCSMgdHlwZS9zdWJ0eXBlIGRlZmF1bHRzIHRvICJ0ZXh0L3BsYWluIgotCWNvbW1hID0gc3RyaW5nLmZpbmQodXJsLCAnLCcpCi0JaWYgY29tbWEgPCAwOgotCSAgICAjIGJhZCBkYXRhIFVSTAotCSAgICByZXR1cm4gTm9uZSwgTm9uZQotCXNlbWkgPSBzdHJpbmcuZmluZCh1cmwsICc7JywgMCwgY29tbWEpCi0JaWYgc2VtaSA+PSAwOgotCSAgICB0eXBlID0gdXJsWzpzZW1pXQotCWVsc2U6Ci0JICAgIHR5cGUgPSB1cmxbOmNvbW1hXQotCWlmICc9JyBpbiB0eXBlIG9yICcvJyBub3QgaW4gdHlwZToKLQkgICAgdHlwZSA9ICd0ZXh0L3BsYWluJwotCXJldHVybiB0eXBlLCBOb25lCQkjIG5ldmVyIGNvbXByZXNzZWQsIHNvIGVuY29kaW5nIGlzIE5vbmUKKyAgICAgICAgIyBzeW50YXggb2YgZGF0YSBVUkxzOgorICAgICAgICAjIGRhdGF1cmwgICA6PSAiZGF0YToiIFsgbWVkaWF0eXBlIF0gWyAiO2Jhc2U2NCIgXSAiLCIgZGF0YQorICAgICAgICAjIG1lZGlhdHlwZSA6PSBbIHR5cGUgIi8iIHN1YnR5cGUgXSAqKCAiOyIgcGFyYW1ldGVyICkKKyAgICAgICAgIyBkYXRhICAgICAgOj0gKnVybGNoYXIKKyAgICAgICAgIyBwYXJhbWV0ZXIgOj0gYXR0cmlidXRlICI9IiB2YWx1ZQorICAgICAgICAjIHR5cGUvc3VidHlwZSBkZWZhdWx0cyB0byAidGV4dC9wbGFpbiIKKyAgICAgICAgY29tbWEgPSBzdHJpbmcuZmluZCh1cmwsICcsJykKKyAgICAgICAgaWYgY29tbWEgPCAwOgorICAgICAgICAgICAgIyBiYWQgZGF0YSBVUkwKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgIHNlbWkgPSBzdHJpbmcuZmluZCh1cmwsICc7JywgMCwgY29tbWEpCisgICAgICAgIGlmIHNlbWkgPj0gMDoKKyAgICAgICAgICAgIHR5cGUgPSB1cmxbOnNlbWldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0eXBlID0gdXJsWzpjb21tYV0KKyAgICAgICAgaWYgJz0nIGluIHR5cGUgb3IgJy8nIG5vdCBpbiB0eXBlOgorICAgICAgICAgICAgdHlwZSA9ICd0ZXh0L3BsYWluJworICAgICAgICByZXR1cm4gdHlwZSwgTm9uZSAgICAgICAgICAgICAgICMgbmV2ZXIgY29tcHJlc3NlZCwgc28gZW5jb2RpbmcgaXMgTm9uZQogICAgIGJhc2UsIGV4dCA9IHBvc2l4cGF0aC5zcGxpdGV4dCh1cmwpCiAgICAgd2hpbGUgc3VmZml4X21hcC5oYXNfa2V5KGV4dCk6CiAgICAgICAgIGJhc2UsIGV4dCA9IHBvc2l4cGF0aC5zcGxpdGV4dChiYXNlICsgc3VmZml4X21hcFtleHRdKQpAQCAtMTc1LDYgKzE3NSw3IEBACiAgICAgJy5qcGUnOiAnaW1hZ2UvanBlZycsCiAgICAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLAogICAgICcuanBnJzogJ2ltYWdlL2pwZWcnLAorICAgICcuanMnOiAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JywKICAgICAnLmxhdGV4JzogJ2FwcGxpY2F0aW9uL3gtbGF0ZXgnLAogICAgICcubWFuJzogJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbWFuJywKICAgICAnLm1lJzogJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbWUnLApkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvbXVsdGlmaWwucHkgYi9MaWIvZG9zLTh4My9tdWx0aWZpbC5weQppbmRleCBjZTg0MDg3Li45NzdiOTJmIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My9tdWx0aWZpbC5weQorKysgYi9MaWIvZG9zLTh4My9tdWx0aWZpbC5weQpAQCAtMSwyOCArMSwzMSBAQAotIyBBIGNsYXNzIHRoYXQgbWFrZXMgZWFjaCBwYXJ0IG9mIGEgbXVsdGlwYXJ0IG1lc3NhZ2UgImZlZWwiIGxpa2UgYW4KLSMgb3JkaW5hcnkgZmlsZSwgYXMgbG9uZyBhcyB5b3UgdXNlIGZwLnJlYWRsaW5lKCkuICBBbGxvd3MgcmVjdXJzaXZlCi0jIHVzZSwgZm9yIG5lc3RlZCBtdWx0aXBhcnQgbWVzc2FnZXMuICBQcm9iYWJseSBiZXN0IHVzZWQgdG9nZXRoZXIKLSMgd2l0aCBtb2R1bGUgbWltZXRvb2xzLgotIwotIyBTdWdnZXN0ZWQgdXNlOgotIwotIyByZWFsX2ZwID0gb3BlbiguLi4pCi0jIGZwID0gTXVsdGlGaWxlKHJlYWxfZnApCi0jCi0jICJyZWFkIHNvbWUgbGluZXMgZnJvbSBmcCIKLSMgZnAucHVzaChzZXBhcmF0b3IpCi0jIHdoaWxlIDE6Ci0jCSJyZWFkIGxpbmVzIGZyb20gZnAgdW50aWwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmciIChBKQotIwlpZiBub3QgZnAubmV4dCgpOiBicmVhawotIyBmcC5wb3AoKQotIyAicmVhZCByZW1haW5pbmcgbGluZXMgZnJvbSBmcCB1bnRpbCBpdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyIKLSMKLSMgVGhlIGxhdHRlciBzZXF1ZW5jZSBtYXkgYmUgdXNlZCByZWN1cnNpdmVseSBhdCAoQSkuCi0jIEl0IGlzIGFsc28gYWxsb3dlZCB0byB1c2UgbXVsdGlwbGUgcHVzaCgpLi4ucG9wKCkgc2VxdWVuY2VzLgotIwotIyBJZiBzZWVrYWJsZSBpcyBnaXZlbiBhcyAwLCB0aGUgY2xhc3MgY29kZSB3aWxsIG5vdCBkbyB0aGUgYm9va2VlcGluZwotIyBpdCBub3JtYWxseSBhdHRlbXB0cyBpbiBvcmRlciB0byBtYWtlIHNlZWtzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0jIGN1cnJlbnQgZmlsZSBwYXJ0LiAgVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gdXNpbmcgTXVsdGlGaWxlIHdpdGggYSBub24tCi0jIHNlZWthYmxlIHN0cmVhbSBvYmplY3QuCisiIiJBIHJlYWRsaW5lKCktc3R5bGUgaW50ZXJmYWNlIHRvIHRoZSBwYXJ0cyBvZiBhIG11bHRpcGFydCBtZXNzYWdlLgorCitUaGUgTXVsdGlGaWxlIGNsYXNzIG1ha2VzIGVhY2ggcGFydCBvZiBhIG11bHRpcGFydCBtZXNzYWdlICJmZWVsIiBsaWtlCithbiBvcmRpbmFyeSBmaWxlLCBhcyBsb25nIGFzIHlvdSB1c2UgZnAucmVhZGxpbmUoKS4gIEFsbG93cyByZWN1cnNpdmUKK3VzZSwgZm9yIG5lc3RlZCBtdWx0aXBhcnQgbWVzc2FnZXMuICBQcm9iYWJseSBiZXN0IHVzZWQgdG9nZXRoZXIKK3dpdGggbW9kdWxlIG1pbWV0b29scy4KKworU3VnZ2VzdGVkIHVzZToKKworcmVhbF9mcCA9IG9wZW4oLi4uKQorZnAgPSBNdWx0aUZpbGUocmVhbF9mcCkKKworInJlYWQgc29tZSBsaW5lcyBmcm9tIGZwIgorZnAucHVzaChzZXBhcmF0b3IpCit3aGlsZSAxOgorCSJyZWFkIGxpbmVzIGZyb20gZnAgdW50aWwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmciIChBKQorCWlmIG5vdCBmcC5uZXh0KCk6IGJyZWFrCitmcC5wb3AoKQorInJlYWQgcmVtYWluaW5nIGxpbmVzIGZyb20gZnAgdW50aWwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmciCisKK1RoZSBsYXR0ZXIgc2VxdWVuY2UgbWF5IGJlIHVzZWQgcmVjdXJzaXZlbHkgYXQgKEEpLgorSXQgaXMgYWxzbyBhbGxvd2VkIHRvIHVzZSBtdWx0aXBsZSBwdXNoKCkuLi5wb3AoKSBzZXF1ZW5jZXMuCisKK0lmIHNlZWthYmxlIGlzIGdpdmVuIGFzIDAsIHRoZSBjbGFzcyBjb2RlIHdpbGwgbm90IGRvIHRoZSBib29rZWVwaW5nCitpdCBub3JtYWxseSBhdHRlbXB0cyBpbiBvcmRlciB0byBtYWtlIHNlZWtzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCitjdXJyZW50IGZpbGUgcGFydC4gIFRoaXMgbWF5IGJlIHVzZWZ1bCB3aGVuIHVzaW5nIE11bHRpRmlsZSB3aXRoIGEgbm9uLQorc2Vla2FibGUgc3RyZWFtIG9iamVjdC4KKyIiIgogCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3RyaW5nCkBAIC0zMCw5ICszMyw5IEBACiBFcnJvciA9ICdtdWx0aWZpbGUuRXJyb3InCiAKIGNsYXNzIE11bHRpRmlsZToKLQkjCisKIAlzZWVrYWJsZSA9IDAKLQkjCisKIAlkZWYgX19pbml0X18oc2VsZiwgZnAsIHNlZWthYmxlPTEpOgogCQlzZWxmLmZwID0gZnAKIAkJc2VsZi5zdGFjayA9IFtdICMgR3Jvd3MgZG93bgpAQCAtNDIsMTIgKzQ1LDEyIEBACiAJCQlzZWxmLnNlZWthYmxlID0gMQogCQkJc2VsZi5zdGFydCA9IHNlbGYuZnAudGVsbCgpCiAJCQlzZWxmLnBvc3N0YWNrID0gW10gIyBHcm93cyBkb3duCi0JIworCiAJZGVmIHRlbGwoc2VsZik6CiAJCWlmIHNlbGYubGV2ZWwgPiAwOgogCQkJcmV0dXJuIHNlbGYubGFzdHBvcwogCQlyZXR1cm4gc2VsZi5mcC50ZWxsKCkgLSBzZWxmLnN0YXJ0Ci0JIworCiAJZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9MCk6CiAJCWhlcmUgPSBzZWxmLnRlbGwoKQogCQlpZiB3aGVuY2U6CkBAIC02NCw3ICs2Nyw3IEBACiAJCXNlbGYuZnAuc2Vlayhwb3MgKyBzZWxmLnN0YXJ0KQogCQlzZWxmLmxldmVsID0gMAogCQlzZWxmLmxhc3QgPSAwCi0JIworCiAJZGVmIHJlYWRsaW5lKHNlbGYpOgogCQlpZiBzZWxmLmxldmVsID4gMDoKIAkJCXJldHVybiAnJwpAQCAtMTA1LDcgKzEwOCw3IEBACiAJCWlmIHNlbGYubGV2ZWwgPiAxOgogCQkJcmFpc2UgRXJyb3IsJ01pc3NpbmcgZW5kbWFya2VyIGluIE11bHRpRmlsZS5yZWFkbGluZSgpJwogCQlyZXR1cm4gJycKLQkjCisKIAlkZWYgcmVhZGxpbmVzKHNlbGYpOgogCQlsaXN0ID0gW10KIAkJd2hpbGUgMToKQEAgLTExMywxMCArMTE2LDEwIEBACiAJCQlpZiBub3QgbGluZTogYnJlYWsKIAkJCWxpc3QuYXBwZW5kKGxpbmUpCiAJCXJldHVybiBsaXN0Ci0JIworCiAJZGVmIHJlYWQoc2VsZik6ICMgTm90ZTogbm8gc2l6ZSBhcmd1bWVudCAtLSByZWFkIHVudGlsIEVPRiBvbmx5IQogCQlyZXR1cm4gc3RyaW5nLmpvaW5maWVsZHMoc2VsZi5yZWFkbGluZXMoKSwgJycpCi0JIworCiAJZGVmIG5leHQoc2VsZik6CiAJCXdoaWxlIHNlbGYucmVhZGxpbmUoKTogcGFzcwogCQlpZiBzZWxmLmxldmVsID4gMSBvciBzZWxmLmxhc3Q6CkBAIC0xMjYsNyArMTI5LDcgQEAKIAkJaWYgc2VsZi5zZWVrYWJsZToKIAkJCXNlbGYuc3RhcnQgPSBzZWxmLmZwLnRlbGwoKQogCQlyZXR1cm4gMQotCSMKKwogCWRlZiBwdXNoKHNlbGYsIHNlcCk6CiAJCWlmIHNlbGYubGV2ZWwgPiAwOgogCQkJcmFpc2UgRXJyb3IsICdiYWQgTXVsdGlGaWxlLnB1c2goKSBjYWxsJwpAQCAtMTM0LDcgKzEzNyw3IEBACiAJCWlmIHNlbGYuc2Vla2FibGU6CiAJCQlzZWxmLnBvc3N0YWNrLmluc2VydCgwLCBzZWxmLnN0YXJ0KQogCQkJc2VsZi5zdGFydCA9IHNlbGYuZnAudGVsbCgpCi0JIworCiAJZGVmIHBvcChzZWxmKToKIAkJaWYgc2VsZi5zdGFjayA9PSBbXToKIAkJCXJhaXNlIEVycm9yLCAnYmFkIE11bHRpRmlsZS5wb3AoKSBjYWxsJwpAQCAtMTQ5LDEyICsxNTIsMTIgQEAKIAkJCWRlbCBzZWxmLnBvc3N0YWNrWzBdCiAJCQlpZiBzZWxmLmxldmVsID4gMDoKIAkJCQlzZWxmLmxhc3Rwb3MgPSBhYnNsYXN0cG9zIC0gc2VsZi5zdGFydAotCSMKKwogCWRlZiBpc19kYXRhKHNlbGYsIGxpbmUpOgogCQlyZXR1cm4gbGluZVs6Ml0gPD4gJy0tJwotCSMKKwogCWRlZiBzZWN0aW9uX2RpdmlkZXIoc2VsZiwgc3RyKToKIAkJcmV0dXJuICItLSIgKyBzdHIKLQkjCisKIAlkZWYgZW5kX21hcmtlcihzZWxmLCBzdHIpOgogCQlyZXR1cm4gIi0tIiArIHN0ciArICItLSIKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL250dXJsMnBhLnB5IGIvTGliL2Rvcy04eDMvbnR1cmwycGEucHkKaW5kZXggOGMwMjA0OS4uYWUyNjFiYSAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvbnR1cmwycGEucHkKKysrIGIvTGliL2Rvcy04eDMvbnR1cmwycGEucHkKQEAgLTEsNiArMSw0IEBACi0jCi0jIG50dXJsMnBhdGggY29udmVydCBhIE5UIHBhdGhuYW1lIHRvIGEgZmlsZSBVUkwgYW5kIAotIyB2aWNlIHZlcnNhICAKKyIiIkNvbnZlcnQgYSBOVCBwYXRobmFtZSB0byBhIGZpbGUgVVJMIGFuZCB2aWNlIHZlcnNhLiIiIgogCiBkZWYgdXJsMnBhdGhuYW1lKHVybCk6CiAJIiIiIENvbnZlcnQgYSBVUkwgdG8gYSBET1MgcGF0aC4uLgpAQCAtMzQsNyArMzIsNiBAQAogCXJldHVybiBwYXRoCiAKIGRlZiBwYXRobmFtZTJ1cmwocCk6Ci0KIAkiIiIgQ29udmVydCBhIERPUyBwYXRoIG5hbWUgdG8gYSBmaWxlIHVybC4uLgogCQlDOlxmb29cYmFyXHNwYW0uZm9vCiAKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Bvc2l4ZmlsLnB5IGIvTGliL2Rvcy04eDMvcG9zaXhmaWwucHkKaW5kZXggMmNkNDE2OC4uMmRiMzdlMCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvcG9zaXhmaWwucHkKKysrIGIvTGliL2Rvcy04eDMvcG9zaXhmaWwucHkKQEAgLTEsNjQgKzEsNjEgQEAKLSMKLSMgU3RhcnQgb2YgcG9zaXhmaWxlLnB5Ci0jCisiIiJFeHRlbmRlZCBmaWxlIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGluIFBPU0lYLgogCi0jCi0jIEV4dGVuZGVkIGZpbGUgb3BlcmF0aW9ucwotIwotIyBmID0gcG9zaXhmaWxlLm9wZW4oZmlsZW5hbWUsIFttb2RlLCBbYnVmc2l6ZV1dKQotIyAgICAgICB3aWxsIGNyZWF0ZSBhIG5ldyBwb3NpeGZpbGUgb2JqZWN0Ci0jCi0jIGYgPSBwb3NpeGZpbGUuZmlsZW9wZW4oZmlsZW9iamVjdCkKLSMgICAgICAgd2lsbCBjcmVhdGUgYSBwb3NpeGZpbGUgb2JqZWN0IGZyb20gYSBidWlsdGluIGZpbGUgb2JqZWN0Ci0jCi0jIGYuZmlsZSgpCi0jICAgICAgIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBidWlsdGluIGZpbGUgb2JqZWN0Ci0jCi0jIGYuZHVwKCkKLSMgICAgICAgd2lsbCByZXR1cm4gYSBuZXcgZmlsZSBvYmplY3QgYmFzZWQgb24gYSBuZXcgZmlsZWRlc2NyaXB0b3IKLSMKLSMgZi5kdXAyKGZkKQotIyAgICAgICB3aWxsIHJldHVybiBhIG5ldyBmaWxlIG9iamVjdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZmlsZWRlc2NyaXB0b3IKLSMKLSMgZi5mbGFncyhtb2RlKQotIyAgICAgICB3aWxsIHR1cm4gb24gdGhlIGFzc29jaWF0ZWQgZmxhZyAobWVyZ2UpCi0jICAgICAgIG1vZGUgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgotIwotIyAgIChjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIGEgZmxhZykKLSMgICAgICAgYSAgICAgICBhcHBlbmQgb25seSBmbGFnCi0jICAgICAgIGMgICAgICAgY2xvc2Ugb24gZXhlYyBmbGFnCi0jICAgICAgIG4gICAgICAgbm8gZGVsYXkgZmxhZwotIyAgICAgICBzICAgICAgIHN5bmNocm9uaXphdGlvbiBmbGFnCi0jICAgKG1vZGlmaWVycykKLSMgICAgICAgISAgICAgICB0dXJuIGZsYWdzICdvZmYnIGluc3RlYWQgb2YgZGVmYXVsdCAnb24nCi0jICAgICAgID0gICAgICAgY29weSBmbGFncyAnYXMgaXMnIGluc3RlYWQgb2YgZGVmYXVsdCAnbWVyZ2UnCi0jICAgICAgID8gICAgICAgcmV0dXJuIGEgc3RyaW5nIGluIHdoaWNoIHRoZSBjaGFyYWN0ZXJzIHJlcHJlc2VudCB0aGUgZmxhZ3MKLSMgICAgICAgICAgICAgICB0aGF0IGFyZSBzZXQKLSMKLSMgICAgICAgbm90ZTogLSB0aGUgJyEnIGFuZCAnPScgbW9kaWZpZXJzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCi0jICAgICAgICAgICAgIC0gdGhlICc/JyBtb2RpZmllciB3aWxsIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBmbGFncyBhZnRlciB0aGV5Ci0jICAgICAgICAgICAgICAgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgb3RoZXIgY2hhcmFjdGVycyBpbiB0aGUgbW9kZSBzdHJpbmcKLSMKLSMgZi5sb2NrKG1vZGUgWywgbGVuIFssIHN0YXJ0IFssIHdoZW5jZV1dXSkKLSMgICAgICAgd2lsbCAodW4pbG9jayBhIHJlZ2lvbgotIyAgICAgICBtb2RlIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLSMKLSMgICAoY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0eXBlIG9mIGxvY2spCi0jICAgICAgIHUgICAgICAgdW5sb2NrCi0jICAgICAgIHIgICAgICAgcmVhZCBsb2NrCi0jICAgICAgIHcgICAgICAgd3JpdGUgbG9jawotIyAgIChtb2RpZmllcnMpCi0jICAgICAgIHwgICAgICAgd2FpdCB1bnRpbCB0aGUgbG9jayBjYW4gYmUgZ3JhbnRlZAotIyAgICAgICA/ICAgICAgIHJldHVybiB0aGUgZmlyc3QgbG9jayBjb25mbGljdGluZyB3aXRoIHRoZSByZXF1ZXN0ZWQgbG9jawotIyAgICAgICAgICAgICAgIG9yICdOb25lJyBpZiB0aGVyZSBpcyBubyBjb25mbGljdC4gVGhlIGxvY2sgcmV0dXJuZWQgaXMgaW4gdGhlCi0jICAgICAgICAgICAgICAgZm9ybWF0IChtb2RlLCBsZW4sIHN0YXJ0LCB3aGVuY2UsIHBpZCkgd2hlcmUgbW9kZSBpcyBhCi0jICAgICAgICAgICAgICAgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBsb2NrICgncicgb3IgJ3cnKQotIwotIyAgICAgICBub3RlOiAtIHRoZSAnPycgbW9kaWZpZXIgcHJldmVudHMgYSByZWdpb24gZnJvbSBiZWluZyBsb2NrZWQ7IGl0IGlzCi0jICAgICAgICAgICAgICAgcXVlcnkgb25seQotIworZiA9IHBvc2l4ZmlsZS5vcGVuKGZpbGVuYW1lLCBbbW9kZSwgW2J1ZnNpemVdXSkKKyAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IHBvc2l4ZmlsZSBvYmplY3QKKworZiA9IHBvc2l4ZmlsZS5maWxlb3BlbihmaWxlb2JqZWN0KQorICAgICAgd2lsbCBjcmVhdGUgYSBwb3NpeGZpbGUgb2JqZWN0IGZyb20gYSBidWlsdGluIGZpbGUgb2JqZWN0CisKK2YuZmlsZSgpCisgICAgICB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgYnVpbHRpbiBmaWxlIG9iamVjdAorCitmLmR1cCgpCisgICAgICB3aWxsIHJldHVybiBhIG5ldyBmaWxlIG9iamVjdCBiYXNlZCBvbiBhIG5ldyBmaWxlZGVzY3JpcHRvcgorCitmLmR1cDIoZmQpCisgICAgICB3aWxsIHJldHVybiBhIG5ldyBmaWxlIG9iamVjdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZmlsZWRlc2NyaXB0b3IKKworZi5mbGFncyhtb2RlKQorICAgICAgd2lsbCB0dXJuIG9uIHRoZSBhc3NvY2lhdGVkIGZsYWcgKG1lcmdlKQorICAgICAgbW9kZSBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6CisKKyAgKGNoYXJhY3RlciByZXByZXNlbnRpbmcgYSBmbGFnKQorICAgICAgYSAgICAgICBhcHBlbmQgb25seSBmbGFnCisgICAgICBjICAgICAgIGNsb3NlIG9uIGV4ZWMgZmxhZworICAgICAgbiAgICAgICBubyBkZWxheSBmbGFnCisgICAgICBzICAgICAgIHN5bmNocm9uaXphdGlvbiBmbGFnCisgIChtb2RpZmllcnMpCisgICAgICAhICAgICAgIHR1cm4gZmxhZ3MgJ29mZicgaW5zdGVhZCBvZiBkZWZhdWx0ICdvbicKKyAgICAgID0gICAgICAgY29weSBmbGFncyAnYXMgaXMnIGluc3RlYWQgb2YgZGVmYXVsdCAnbWVyZ2UnCisgICAgICA/ICAgICAgIHJldHVybiBhIHN0cmluZyBpbiB3aGljaCB0aGUgY2hhcmFjdGVycyByZXByZXNlbnQgdGhlIGZsYWdzCisgICAgICAgICAgICAgIHRoYXQgYXJlIHNldAorCisgICAgICBub3RlOiAtIHRoZSAnIScgYW5kICc9JyBtb2RpZmllcnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKyAgICAgICAgICAgIC0gdGhlICc/JyBtb2RpZmllciB3aWxsIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBmbGFncyBhZnRlciB0aGV5CisgICAgICAgICAgICAgIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IG90aGVyIGNoYXJhY3RlcnMgaW4gdGhlIG1vZGUgc3RyaW5nCisKK2YubG9jayhtb2RlIFssIGxlbiBbLCBzdGFydCBbLCB3aGVuY2VdXV0pCisgICAgICB3aWxsICh1bilsb2NrIGEgcmVnaW9uCisgICAgICBtb2RlIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKKworICAoY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0eXBlIG9mIGxvY2spCisgICAgICB1ICAgICAgIHVubG9jaworICAgICAgciAgICAgICByZWFkIGxvY2sKKyAgICAgIHcgICAgICAgd3JpdGUgbG9jaworICAobW9kaWZpZXJzKQorICAgICAgfCAgICAgICB3YWl0IHVudGlsIHRoZSBsb2NrIGNhbiBiZSBncmFudGVkCisgICAgICA/ICAgICAgIHJldHVybiB0aGUgZmlyc3QgbG9jayBjb25mbGljdGluZyB3aXRoIHRoZSByZXF1ZXN0ZWQgbG9jaworICAgICAgICAgICAgICBvciAnTm9uZScgaWYgdGhlcmUgaXMgbm8gY29uZmxpY3QuIFRoZSBsb2NrIHJldHVybmVkIGlzIGluIHRoZQorICAgICAgICAgICAgICBmb3JtYXQgKG1vZGUsIGxlbiwgc3RhcnQsIHdoZW5jZSwgcGlkKSB3aGVyZSBtb2RlIGlzIGEKKyAgICAgICAgICAgICAgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBsb2NrICgncicgb3IgJ3cnKQorCisgICAgICBub3RlOiAtIHRoZSAnPycgbW9kaWZpZXIgcHJldmVudHMgYSByZWdpb24gZnJvbSBiZWluZyBsb2NrZWQ7IGl0IGlzCisgICAgICAgICAgICAgIHF1ZXJ5IG9ubHkKKyIiIgogCiBjbGFzcyBfcG9zaXhmaWxlXzoKKyAgICAiIiJGaWxlIHdyYXBwZXIgY2xhc3MgdGhhdCBwcm92aWRlcyBleHRyYSBQT1NJWCBmaWxlIHJvdXRpbmVzLiIiIgorCiAgICAgc3RhdGVzID0gWydvcGVuJywgJ2Nsb3NlZCddCiAKICAgICAjCkBAIC0xNzgsNiArMTc1LDcgQEAKICAgICAgICAgIyBhZGRpdGlvbnMgZm9yIEFJWCBieSBWbGFkaW1pci5NYXJhbmdvem92QGltYWcuZnIKICAgICAgICAgaW1wb3J0IHN5cywgb3MKICAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnbmV0YnNkMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJlZWJzZDInLCAnZnJlZWJzZDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdic2RvczInLCAnYnNkb3MzJywgJ2JzZG9zNCcpOgogICAgICAgICAgICAgZmxvY2sgPSBzdHJ1Y3QucGFjaygnbHh4eHhseHh4eGxoaCcsIFwKQEAgLTE5Myw2ICsxOTEsNyBAQAogCiAgICAgICAgIGlmICc/JyBpbiBob3c6CiAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JzZG9zMicsICdic2RvczMnLCAnYnNkb3M0Jyk6CiAgICAgICAgICAgICAgICAgbF9zdGFydCwgbF9sZW4sIGxfcGlkLCBsX3R5cGUsIGxfd2hlbmNlID0gXApAQCAtMjEzLDEzICsyMTIsMTIgQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3cnLCBsX2xlbiwgbF9zdGFydCwgbF93aGVuY2UsIGxfcGlkCiAKLSMKLSMgUHVibGljIHJvdXRpbmUgdG8gb2J0YWluIGEgcG9zaXhmaWxlIG9iamVjdAotIwogZGVmIG9wZW4obmFtZSwgbW9kZT0ncicsIGJ1ZnNpemU9LTEpOgorICAgICIiIlB1YmxpYyByb3V0aW5lIHRvIG9wZW4gYSBmaWxlIGFzIGEgcG9zaXhmaWxlIG9iamVjdC4iIiIKICAgICByZXR1cm4gX3Bvc2l4ZmlsZV8oKS5vcGVuKG5hbWUsIG1vZGUsIGJ1ZnNpemUpCiAKIGRlZiBmaWxlb3BlbihmaWxlKToKKyAgICAiIiJQdWJsaWMgcm91dGluZSB0byBnZXQgYSBwb3NpeGZpbGUgb2JqZWN0IGZyb20gYSBQeXRob24gZmlsZSBvYmplY3QuIiIiCiAgICAgcmV0dXJuIF9wb3NpeGZpbGVfKCkuZmlsZW9wZW4oZmlsZSkKIAogIwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvcG9zaXhwYXQucHkgYi9MaWIvZG9zLTh4My9wb3NpeHBhdC5weQppbmRleCAzNmVkYzgwLi5hNjAzZTllIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My9wb3NpeHBhdC5weQorKysgYi9MaWIvZG9zLTh4My9wb3NpeHBhdC5weQpAQCAtMSwxMyArMSwxMyBAQAotIyBNb2R1bGUgJ3Bvc2l4cGF0aCcgLS0gY29tbW9uIG9wZXJhdGlvbnMgb24gUG9zaXggcGF0aG5hbWVzLgotIyBTb21lIG9mIHRoaXMgY2FuIGFjdHVhbGx5IGJlIHVzZWZ1bCBvbiBub24tUG9zaXggc3lzdGVtcyB0b28sIGUuZy4KLSMgZm9yIG1hbmlwdWxhdGlvbiBvZiB0aGUgcGF0aG5hbWUgY29tcG9uZW50IG9mIFVSTHMuCi0jIFRoZSAib3MucGF0aCIgbmFtZSBpcyBhbiBhbGlhcyBmb3IgdGhpcyBtb2R1bGUgb24gUG9zaXggc3lzdGVtczsKLSMgb24gb3RoZXIgc3lzdGVtcyAoZS5nLiBNYWMsIFdpbmRvd3MpLCBvcy5wYXRoIHByb3ZpZGVzIHRoZSBzYW1lCi0jIG9wZXJhdGlvbnMgaW4gYSBtYW5uZXIgc3BlY2lmaWMgdG8gdGhhdCBwbGF0Zm9ybSwgYW5kIGlzIGFuIGFsaWFzCi0jIHRvIGFub3RoZXIgbW9kdWxlIChlLmcuIG1hY3BhdGgsIG50cGF0aCkuCi0iIiJDb21tb24gcGF0aG5hbWUgbWFuaXB1bGF0aW9ucywgUG9zaXggdmVyc2lvbi4gCi1JbnN0ZWFkIG9mIGltcG9ydGluZyB0aGlzIG1vZHVsZQotZGlyZWN0bHksIGltcG9ydCBvcyBhbmQgcmVmZXIgdG8gdGhpcyBtb2R1bGUgYXMgb3MucGF0aC4KKyIiIkNvbW1vbiBvcGVyYXRpb25zIG9uIFBvc2l4IHBhdGhuYW1lcy4KKworSW5zdGVhZCBvZiBpbXBvcnRpbmcgdGhpcyBtb2R1bGUgZGlyZWN0bHksIGltcG9ydCBvcyBhbmQgcmVmZXIgdG8KK3RoaXMgbW9kdWxlIGFzIG9zLnBhdGguICBUaGUgIm9zLnBhdGgiIG5hbWUgaXMgYW4gYWxpYXMgZm9yIHRoaXMKK21vZHVsZSBvbiBQb3NpeCBzeXN0ZW1zOyBvbiBvdGhlciBzeXN0ZW1zIChlLmcuIE1hYywgV2luZG93cyksCitvcy5wYXRoIHByb3ZpZGVzIHRoZSBzYW1lIG9wZXJhdGlvbnMgaW4gYSBtYW5uZXIgc3BlY2lmaWMgdG8gdGhhdAorcGxhdGZvcm0sIGFuZCBpcyBhbiBhbGlhcyB0byBhbm90aGVyIG1vZHVsZSAoZS5nLiBtYWNwYXRoLCBudHBhdGgpLgorCitTb21lIG9mIHRoaXMgY2FuIGFjdHVhbGx5IGJlIHVzZWZ1bCBvbiBub24tUG9zaXggc3lzdGVtcyB0b28sIGUuZy4KK2ZvciBtYW5pcHVsYXRpb24gb2YgdGhlIHBhdGhuYW1lIGNvbXBvbmVudCBvZiBVUkxzLgogIiIiCiAKIGltcG9ydCBvcwpAQCAtMTQzLDcgKzE0Myw3IEBACiBkZWYgZ2V0YXRpbWUoZmlsZW5hbWUpOgogICAgICIiIlJldHVybiB0aGUgbGFzdCBhY2Nlc3MgdGltZSBvZiBhIGZpbGUsIHJlcG9ydGVkIGJ5IG9zLnN0YXQoKS4iIiIKICAgICBzdCA9IG9zLnN0YXQoZmlsZW5hbWUpCi0gICAgcmV0dXJuIHN0W3N0YXQuU1RfTVRJTUVdCisgICAgcmV0dXJuIHN0W3N0YXQuU1RfQVRJTUVdCiAKIAogIyBJcyBhIHBhdGggYSBzeW1ib2xpYyBsaW5rPwpAQCAtMjU0LDcgKzI1NCw3IEBACiAjIG9yIHRvIGltcG9zZSBhIGRpZmZlcmVudCBvcmRlciBvZiB2aXNpdGluZy4KIAogZGVmIHdhbGsodG9wLCBmdW5jLCBhcmcpOgotICAgICIiIndhbGsodG9wLGZ1bmMsYXJncykgY2FsbHMgZnVuYyhhcmcsIGQsIGZpbGVzKSBmb3IgZWFjaCBkaXJlY3RvcnkgImQiIAorICAgICIiIndhbGsodG9wLGZ1bmMsYXJnKSBjYWxscyBmdW5jKGFyZywgZCwgZmlsZXMpIGZvciBlYWNoIGRpcmVjdG9yeSAiZCIgCiBpbiB0aGUgdHJlZSAgcm9vdGVkIGF0ICJ0b3AiIChpbmNsdWRpbmcgInRvcCIgaXRzZWxmKS4gICJmaWxlcyIgaXMgYSBsaXN0CiBvZiBhbGwgdGhlIGZpbGVzIGFuZCBzdWJkaXJzIGluIGRpcmVjdG9yeSAiZCIuCiAiIiIKQEAgLTI2MywxMSArMjYzLDEwIEBACiAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICByZXR1cm4KICAgICBmdW5jKGFyZywgdG9wLCBuYW1lcykKLSAgICBleGNlcHRpb25zID0gKCcuJywgJy4uJykKICAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgaWYgbmFtZSBub3QgaW4gZXhjZXB0aW9uczoKICAgICAgICAgICAgIG5hbWUgPSBqb2luKHRvcCwgbmFtZSkKLSAgICAgICAgICAgIGlmIGlzZGlyKG5hbWUpIGFuZCBub3QgaXNsaW5rKG5hbWUpOgorICAgICAgICAgICAgc3QgPSBvcy5sc3RhdChuYW1lKQorICAgICAgICAgICAgaWYgc3RhdC5TX0lTRElSKHN0W3N0YXQuU1RfTU9ERV0pOgogICAgICAgICAgICAgICAgIHdhbGsobmFtZSwgZnVuYywgYXJnKQogCiAKQEAgLTM2OSw4ICszNjgsOCBAQAogICAgIHJldHVybiBzbGFzaGVzICsgc3RyaW5nLmpvaW5maWVsZHMoY29tcHMsICcvJykKIAogCi0jIFJldHVybiBhbiBhYnNvbHV0ZSBwYXRoLgogZGVmIGFic3BhdGgocGF0aCk6CisgICAgIiIiUmV0dXJuIGFuIGFic29sdXRlIHBhdGguIiIiCiAgICAgaWYgbm90IGlzYWJzKHBhdGgpOgogICAgICAgICBwYXRoID0gam9pbihvcy5nZXRjd2QoKSwgcGF0aCkKICAgICByZXR1cm4gbm9ybXBhdGgocGF0aCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3B5X2NvbXBpLnB5IGIvTGliL2Rvcy04eDMvcHlfY29tcGkucHkKaW5kZXggZTFkMGQ3MC4uYzU0ZDYxYiAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvcHlfY29tcGkucHkKKysrIGIvTGliL2Rvcy04eDMvcHlfY29tcGkucHkKQEAgLTcsNyArNyw3IEBACiBNQUdJQyA9IGltcC5nZXRfbWFnaWMoKQogCiBkZWYgd3JfbG9uZyhmLCB4KToKLSAgICAiSW50ZXJuYWw7IHdyaXRlIGEgMzItYml0IGludCB0byBhIGZpbGUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4iCisgICAgIiIiSW50ZXJuYWw7IHdyaXRlIGEgMzItYml0IGludCB0byBhIGZpbGUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4iIiIKICAgICBmLndyaXRlKGNociggeCAgICAgICAgJiAweGZmKSkKICAgICBmLndyaXRlKGNocigoeCA+PiA4KSAgJiAweGZmKSkKICAgICBmLndyaXRlKGNocigoeCA+PiAxNikgJiAweGZmKSkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3F1ZXVlLnB5IGIvTGliL2Rvcy04eDMvcXVldWUucHkKaW5kZXggNzljNDg4MC4uY2IwNDAwNiAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvcXVldWUucHkKKysrIGIvTGliL2Rvcy04eDMvcXVldWUucHkKQEAgLTEsNCArMSw0IEBACi0jIEEgbXVsdGktcHJvZHVjZXIsIG11bHRpLWNvbnN1bWVyIHF1ZXVlLgorIiIiQSBtdWx0aS1wcm9kdWNlciwgbXVsdGktY29uc3VtZXIgcXVldWUuIiIiCiAKICMgZGVmaW5lIHRoaXMgZXhjZXB0aW9uIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMS41J3MgY2xhc3MKICMgZXhjZXB0aW9ucywgYnV0IGFsc28gd2hlbiAtWCBvcHRpb24gaXMgdXNlZC4KQEAgLTE1LDcgKzE1LDcgQEAKICAgICBGdWxsID0gJ1F1ZXVlLkZ1bGwnCiAKIGNsYXNzIFF1ZXVlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4c2l6ZT0wKToKICAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIHF1ZXVlIG9iamVjdCB3aXRoIGEgZ2l2ZW4gbWF4aW11bSBzaXplLgogCiAgICAgICAgIElmIG1heHNpemUgaXMgPD0gMCwgdGhlIHF1ZXVlIHNpemUgaXMgaW5maW5pdGUuCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9yZWdleF9zeS5weSBiL0xpYi9kb3MtOHgzL3JlZ2V4X3N5LnB5CmluZGV4IDg2MzFmNDIuLmFhYjdlN2EgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3JlZ2V4X3N5LnB5CisrKyBiL0xpYi9kb3MtOHgzL3JlZ2V4X3N5LnB5CkBAIC0xLDUgKzEsMTEgQEAKLSMgVGhlc2UgYml0cyBhcmUgcGFzc2VkIHRvIHJlZ2V4LnNldF9zeW50YXgoKSB0byBjaG9vc2UgYW1vbmcKLSMgYWx0ZXJuYXRpdmUgcmVnZXhwIHN5bnRheGVzLgorIiIiQ29uc3RhbnRzIGZvciBzZWxlY3RpbmcgcmVnZXhwIHN5bnRheGVzIGZvciB0aGUgb2Jzb2xldGUgcmVnZXggbW9kdWxlLgorCitUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgInJlZ2V4IiBoYXMgbm93CitiZWVuIHJlcGxhY2VkIGJ5IHRoZSBuZXcgcmVndWxhciBleHByZXNzaW9uIG1vZHVsZSwgInJlIi4KKworVGhlc2UgYml0cyBhcmUgcGFzc2VkIHRvIHJlZ2V4LnNldF9zeW50YXgoKSB0byBjaG9vc2UgYW1vbmcKK2FsdGVybmF0aXZlIHJlZ2V4cCBzeW50YXhlcy4KKyIiIgogCiAjIDEgbWVhbnMgcGxhaW4gcGFyZW50aGVzZXMgc2VydmUgYXMgZ3JvdXBpbmcsIGFuZCBiYWNrc2xhc2gKICMgICBwYXJlbnRoZXNlcyBhcmUgbmVlZGVkIGZvciBsaXRlcmFsIHNlYXJjaGluZy4KZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3JmYzgyMi1uLnB5IGIvTGliL2Rvcy04eDMvcmZjODIyLW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3YWI0MwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9kb3MtOHgzL3JmYzgyMi1uLnB5CkBAIC0wLDAgKzEsOTQ2IEBACisiIiJSRkMtODIyIG1lc3NhZ2UgbWFuaXB1bGF0aW9uIGNsYXNzLgorCitYWFggVGhpcyBpcyBvbmx5IGEgdmVyeSByb3VnaCBza2V0Y2ggb2YgYSBmdWxsIFJGQy04MjIgcGFyc2VyOworaW4gcGFydGljdWxhciB0aGUgdG9rZW5pemluZyBvZiBhZGRyZXNzZXMgZG9lcyBub3QgYWRoZXJlIHRvIGFsbCB0aGUKK3F1b3RpbmcgcnVsZXMuCisKK0RpcmVjdGlvbnMgZm9yIHVzZToKKworVG8gY3JlYXRlIGEgTWVzc2FnZSBvYmplY3Q6IGZpcnN0IG9wZW4gYSBmaWxlLCBlLmcuOgorICBmcCA9IG9wZW4oZmlsZSwgJ3InKQorWW91IGNhbiB1c2UgYW55IG90aGVyIGxlZ2FsIHdheSBvZiBnZXR0aW5nIGFuIG9wZW4gZmlsZSBvYmplY3QsIGUuZy4gdXNlCitzeXMuc3RkaW4gb3IgY2FsbCBvcy5wb3BlbigpLgorVGhlbiBwYXNzIHRoZSBvcGVuIGZpbGUgb2JqZWN0IHRvIHRoZSBNZXNzYWdlKCkgY29uc3RydWN0b3I6CisgIG0gPSBNZXNzYWdlKGZwKQorCitUaGlzIGNsYXNzIGNhbiB3b3JrIHdpdGggYW55IGlucHV0IG9iamVjdCB0aGF0IHN1cHBvcnRzIGEgcmVhZGxpbmUKK21ldGhvZC4gIElmIHRoZSBpbnB1dCBvYmplY3QgaGFzIHNlZWsgYW5kIHRlbGwgY2FwYWJpbGl0eSwgdGhlCityZXdpbmRib2R5IG1ldGhvZCB3aWxsIHdvcms7IGFsc28gaWxsZWdhbCBsaW5lcyB3aWxsIGJlIHB1c2hlZCBiYWNrCitvbnRvIHRoZSBpbnB1dCBzdHJlYW0uICBJZiB0aGUgaW5wdXQgb2JqZWN0IGxhY2tzIHNlZWsgYnV0IGhhcyBhbgorYHVucmVhZCcgbWV0aG9kIHRoYXQgY2FuIHB1c2ggYmFjayBhIGxpbmUgb2YgaW5wdXQsIE1lc3NhZ2Ugd2lsbCB1c2UKK3RoYXQgdG8gcHVzaCBiYWNrIGlsbGVnYWwgbGluZXMuICBUaHVzIHRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gcGFyc2UKK21lc3NhZ2VzIGNvbWluZyBmcm9tIGEgYnVmZmVyZWQgc3RyZWFtLgorCitUaGUgb3B0aW9uYWwgYHNlZWthYmxlJyBhcmd1bWVudCBpcyBwcm92aWRlZCBhcyBhIHdvcmthcm91bmQgZm9yCitjZXJ0YWluIHN0ZGlvIGxpYnJhcmllcyBpbiB3aGljaCB0ZWxsKCkgZGlzY2FyZHMgYnVmZmVyZWQgZGF0YSBiZWZvcmUKK2Rpc2NvdmVyaW5nIHRoYXQgdGhlIGxzZWVrKCkgc3lzdGVtIGNhbGwgZG9lc24ndCB3b3JrLiAgRm9yIG1heGltdW0KK3BvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIHNldCB0aGUgc2Vla2FibGUgYXJndW1lbnQgdG8gemVybyB0byBwcmV2ZW50Cit0aGF0IGluaXRpYWwgXGNvZGV7dGVsbH0gd2hlbiBwYXNzaW5nIGluIGFuIHVuc2Vla2FibGUgb2JqZWN0IHN1Y2ggYXMKK2EgYSBmaWxlIG9iamVjdCBjcmVhdGVkIGZyb20gYSBzb2NrZXQgb2JqZWN0LiAgSWYgaXQgaXMgMSBvbiBlbnRyeSAtLQord2hpY2ggaXQgaXMgYnkgZGVmYXVsdCAtLSB0aGUgdGVsbCgpIG1ldGhvZCBvZiB0aGUgb3BlbiBmaWxlIG9iamVjdCBpcworY2FsbGVkIG9uY2U7IGlmIHRoaXMgcmFpc2VzIGFuIGV4Y2VwdGlvbiwgc2Vla2FibGUgaXMgcmVzZXQgdG8gMC4gIEZvciAKK290aGVyIG5vbnplcm8gdmFsdWVzIG9mIHNlZWthYmxlLCB0aGlzIHRlc3QgaXMgbm90IG1hZGUuCisKK1RvIGdldCB0aGUgdGV4dCBvZiBhIHBhcnRpY3VsYXIgaGVhZGVyIHRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHM6CisgIHN0ciA9IG0uZ2V0aGVhZGVyKG5hbWUpCisgIHN0ciA9IG0uZ2V0cmF3aGVhZGVyKG5hbWUpCit3aGVyZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIsIGUuZy4gJ1N1YmplY3QnLgorVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBnZXRoZWFkZXIoKSBzdHJpcHMgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nCit3aGl0ZXNwYWNlLCB3aGlsZSBnZXRyYXdoZWFkZXIoKSBkb2Vzbid0LiAgQm90aCBmdW5jdGlvbnMgcmV0YWluCitlbWJlZGRlZCB3aGl0ZXNwYWNlIChpbmNsdWRpbmcgbmV3bGluZXMpIGV4YWN0bHkgYXMgdGhleSBhcmUKK3NwZWNpZmllZCBpbiB0aGUgaGVhZGVyLCBhbmQgbGVhdmUgdGhlIGNhc2Ugb2YgdGhlIHRleHQgdW5jaGFuZ2VkLgorCitGb3IgYWRkcmVzc2VzIGFuZCBhZGRyZXNzIGxpc3RzIHRoZXJlIGFyZSBmdW5jdGlvbnMKKyAgcmVhbG5hbWUsIG1haWxhZGRyZXNzID0gbS5nZXRhZGRyKG5hbWUpIGFuZAorICBsaXN0ID0gbS5nZXRhZGRybGlzdChuYW1lKQord2hlcmUgdGhlIGxhdHRlciByZXR1cm5zIGEgbGlzdCBvZiAocmVhbG5hbWUsIG1haWxhZGRyKSB0dXBsZXMuCisKK1RoZXJlIGlzIGFsc28gYSBtZXRob2QKKyAgdGltZSA9IG0uZ2V0ZGF0ZShuYW1lKQord2hpY2ggcGFyc2VzIGEgRGF0ZS1saWtlIGZpZWxkIGFuZCByZXR1cm5zIGEgdGltZS1jb21wYXRpYmxlIHR1cGxlLAoraS5lLiBhIHR1cGxlIHN1Y2ggYXMgcmV0dXJuZWQgYnkgdGltZS5sb2NhbHRpbWUoKSBvciBhY2NlcHRlZCBieQordGltZS5ta3RpbWUoKS4KKworU2VlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGZvciBsb3dlciBsZXZlbCBhY2Nlc3MgbWV0aG9kcy4KKworVGhlcmUgYXJlIGFsc28gc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBoZXJlLgorIiIiCisjIENsZWFudXAgYW5kIGV4dGVuc2lvbnMgYnkgRXJpYyBTLiBSYXltb25kIDxlc3JAdGh5cnN1cy5jb20+CisKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCB0aW1lCisKKworX2JsYW5rbGluZXMgPSAoJ1xyXG4nLCAnXG4nKSAgICAgICAgICAgICMgT3B0aW1pemF0aW9uIGZvciBpc2xhc3QoKQorCisKK2NsYXNzIE1lc3NhZ2U6CisgICAgIiIiUmVwcmVzZW50cyBhIHNpbmdsZSBSRkMtODIyLWNvbXBsaWFudCBtZXNzYWdlLiIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgc2Vla2FibGUgPSAxKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSB0aGUgY2xhc3MgaW5zdGFuY2UgYW5kIHJlYWQgdGhlIGhlYWRlcnMuIiIiCisgICAgICAgIGlmIHNlZWthYmxlID09IDE6CisgICAgICAgICAgICAjIEV4ZXJjaXNlIHRlbGwoKSB0byBtYWtlIHN1cmUgaXQgd29ya3MKKyAgICAgICAgICAgICMgKGFuZCB0aGVuIGFzc3VtZSBzZWVrKCkgd29ya3MsIHRvbykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmcC50ZWxsKCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWVrYWJsZSA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2Vla2FibGUgPSAxCisgICAgICAgIHNlbGYuZnAgPSBmcAorICAgICAgICBzZWxmLnNlZWthYmxlID0gc2Vla2FibGUKKyAgICAgICAgc2VsZi5zdGFydG9maGVhZGVycyA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGFydG9mYm9keSA9IE5vbmUKKyAgICAgICAgIworICAgICAgICBpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRvZmhlYWRlcnMgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5zZWVrYWJsZSA9IDAKKyAgICAgICAgIworICAgICAgICBzZWxmLnJlYWRoZWFkZXJzKCkKKyAgICAgICAgIworICAgICAgICBpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRvZmJvZHkgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5zZWVrYWJsZSA9IDAKKyAgICAKKyAgICBkZWYgcmV3aW5kYm9keShzZWxmKToKKyAgICAgICAgIiIiUmV3aW5kIHRoZSBmaWxlIHRvIHRoZSBzdGFydCBvZiB0aGUgYm9keSAoaWYgc2Vla2FibGUpLiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJ1bnNlZWthYmxlIGZpbGUiCisgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0b2Zib2R5KQorICAgIAorICAgIGRlZiByZWFkaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmVhZCBoZWFkZXIgbGluZXMuCisgICAgICAgIAorICAgICAgICBSZWFkIGhlYWRlciBsaW5lcyB1cCB0byB0aGUgZW50aXJlbHkgYmxhbmsgbGluZSB0aGF0CisgICAgICAgIHRlcm1pbmF0ZXMgdGhlbS4gIFRoZSAobm9ybWFsbHkgYmxhbmspIGxpbmUgdGhhdCBlbmRzIHRoZQorICAgICAgICBoZWFkZXJzIGlzIHNraXBwZWQsIGJ1dCBub3QgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIGxpc3QuCisgICAgICAgIElmIGEgbm9uLWhlYWRlciBsaW5lIGVuZHMgdGhlIGhlYWRlcnMsICh3aGljaCBpcyBhbiBlcnJvciksCisgICAgICAgIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBiYWNrc3BhY2Ugb3ZlciBpdDsgaXQgaXMgbmV2ZXIKKyAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIGxpc3QuCisgICAgICAgIAorICAgICAgICBUaGUgdmFyaWFibGUgc2VsZi5zdGF0dXMgaXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgYWxsCisgICAgICAgIHdlbnQgd2VsbCwgb3RoZXJ3aXNlIGl0IGlzIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICAgIFRoZSB2YXJpYWJsZSBzZWxmLmhlYWRlcnMgaXMgYSBjb21wbGV0ZWx5IHVuaW50ZXJwcmV0ZWQgbGlzdAorICAgICAgICBvZiBsaW5lcyBjb250YWluZWQgaW4gdGhlIGhlYWRlciAoc28gcHJpbnRpbmcgdGhlbSB3aWxsCisgICAgICAgIHJlcHJvZHVjZSB0aGUgaGVhZGVyIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgZmlsZSkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmRpY3QgPSB7fQorICAgICAgICBzZWxmLl9fZ2FtaF9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYuX19naF9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYudW5peGZyb20gPSAnJworICAgICAgICBzZWxmLmhlYWRlcnMgPSBsaXN0ID0gW10KKyAgICAgICAgc2VsZi5zdGF0dXMgPSAnJworICAgICAgICBoZWFkZXJzZWVuID0gIiIKKyAgICAgICAgZmlyc3RsaW5lID0gMQorICAgICAgICBzdGFydG9mbGluZSA9IHVucmVhZCA9IHRlbGwgPSBOb25lCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5mcCwgJ3VucmVhZCcpOgorICAgICAgICAgICAgdW5yZWFkID0gc2VsZi5mcC51bnJlYWQKKyAgICAgICAgZWxpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgdGVsbCA9IHNlbGYuZnAudGVsbAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgaWYgdGVsbDoKKyAgICAgICAgICAgICAgICBzdGFydG9mbGluZSA9IHRlbGwoKQorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSAnRU9GIGluIGhlYWRlcnMnCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICMgU2tpcCB1bml4IEZyb20gbmFtZSB0aW1lIGxpbmVzCisgICAgICAgICAgICBpZiBmaXJzdGxpbmUgYW5kIGxpbmVbOjVdID09ICdGcm9tICc6CisgICAgICAgICAgICAgICAgc2VsZi51bml4ZnJvbSA9IHNlbGYudW5peGZyb20gKyBsaW5lCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZpcnN0bGluZSA9IDAKKyAgICAgICAgICAgIGlmIGhlYWRlcnNlZW4gYW5kIGxpbmVbMF0gaW4gJyBcdCc6CisgICAgICAgICAgICAgICAgIyBJdCdzIGEgY29udGludWF0aW9uIGxpbmUuCisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fZ2FtaF9jYWNoZVtoZWFkZXJzZWVuXS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICAgICB4ID0gc3RyaW5nLmxzdHJpcCgKKyAgICAgICAgICAgICAgICAgICAgIiVzXG4gJXMiICUgKHNlbGYuZGljdFtoZWFkZXJzZWVuXSwgc3RyaW5nLnN0cmlwKGxpbmUpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmRpY3RbaGVhZGVyc2Vlbl0gPSB4CisgICAgICAgICAgICAgICAgc2VsZi5fX2doX2NhY2hlW2hlYWRlcnNlZW5dWy0xXSA9IHgKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzZWxmLmlzY29tbWVudChsaW5lKToKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSBjb21tZW50LiAgSWdub3JlIGl0LgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHNlbGYuaXNsYXN0KGxpbmUpOgorICAgICAgICAgICAgICAgICMgTm90ZSEgTm8gcHVzaGJhY2sgaGVyZSEgIFRoZSBkZWxpbWl0ZXIgbGluZSBnZXRzIGVhdGVuLgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBoZWFkZXJzZWVuID0gc2VsZi5pc2hlYWRlcihsaW5lKQorICAgICAgICAgICAgaWYgaGVhZGVyc2VlbjoKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSBsZWdhbCBoZWFkZXIgbGluZSwgc2F2ZSBpdC4KKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIGwgPSBzZWxmLl9fZ2FtaF9jYWNoZS5nZXQoaGVhZGVyc2VlbikKKyAgICAgICAgICAgICAgICBpZiBub3QgbDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2dhbWhfY2FjaGVbaGVhZGVyc2Vlbl0gPSBsID0gW10KKyAgICAgICAgICAgICAgICBsLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIHggPSBzdHJpbmcuc3RyaXAobGluZVtsZW4oaGVhZGVyc2VlbikrMTpdKQorICAgICAgICAgICAgICAgIHNlbGYuZGljdFtoZWFkZXJzZWVuXSA9IHgKKyAgICAgICAgICAgICAgICBsID0gc2VsZi5fX2doX2NhY2hlLmdldChoZWFkZXJzZWVuKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZ2hfY2FjaGVbaGVhZGVyc2Vlbl0gPSBsID0gW10KKyAgICAgICAgICAgICAgICBsLmFwcGVuZCh4KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgSXQncyBub3QgYSBoZWFkZXIgbGluZTsgdGhyb3cgaXQgYmFjayBhbmQgc3RvcCBoZXJlLgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRpY3Q6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gJ05vIGhlYWRlcnMnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSAnTm9uLWhlYWRlciBsaW5lIHdoZXJlIGhlYWRlciBleHBlY3RlZCcKKyAgICAgICAgICAgICAgICAjIFRyeSB0byB1bmRvIHRoZSByZWFkLgorICAgICAgICAgICAgICAgIGlmIHVucmVhZDoKKyAgICAgICAgICAgICAgICAgICAgdW5yZWFkKGxpbmUpCisgICAgICAgICAgICAgICAgZWxpZiB0ZWxsOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsoc3RhcnRvZmxpbmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBzZWxmLnN0YXR1cyArICc7IGJhZCBzZWVrJworICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgaXNoZWFkZXIoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gbGluZSBpcyBhIGxlZ2FsIGhlYWRlci4KKworICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBoZWFkZXIgbmFtZSwgc3VpdGFibHkgY2Fub25pY2FsaXplZC4KKyAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBvcmRlciB0byB1c2UgTWVzc2FnZSBwYXJzaW5nCisgICAgICAgIG9uIHRhZ2dlZCBkYXRhIGluIFJGQzgyMi1saWtlIGZvcm1hdHMgd2l0aCBzcGVjaWFsIGhlYWRlciBmb3JtYXRzLgorICAgICAgICAiIiIKKyAgICAgICAgaSA9IHN0cmluZy5maW5kKGxpbmUsICc6JykKKyAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLmxvd2VyKGxpbmVbOmldKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAKKyAgICBkZWYgaXNsYXN0KHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJEZXRlcm1pbmUgd2hldGhlciBhIGxpbmUgaXMgYSBsZWdhbCBlbmQgb2YgUkZDLTgyMiBoZWFkZXJzLgorICAgICAgICAKKyAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3VyIGFwcGxpY2F0aW9uIHdhbnRzCisgICAgICAgIHRvIGJlbmQgdGhlIHJ1bGVzLCBlLmcuIHRvIHN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UsCisgICAgICAgIG9yIHRvIHJlY29nbmlzZSBNSCB0ZW1wbGF0ZSBzZXBhcmF0b3JzICgnLS0tLS0tLS0nKS4KKyAgICAgICAgRm9yIGNvbnZlbmllbmNlIChlLmcuIGZvciBjb2RlIHJlYWRpbmcgZnJvbSBzb2NrZXRzKSBhCisgICAgICAgIGxpbmUgY29uc2lzdGluZyBvZiBcclxuIGFsc28gbWF0Y2hlcy4gICAgICAgICAgICAgICAgCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gbGluZSBpbiBfYmxhbmtsaW5lcworCisgICAgZGVmIGlzY29tbWVudChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiRGV0ZXJtaW5lIHdoZXRoZXIgYSBsaW5lIHNob3VsZCBiZSBza2lwcGVkIGVudGlyZWx5LgorCisgICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gdXNlIE1lc3NhZ2UgcGFyc2luZworICAgICAgICBvbiB0YWdnZWQgZGF0YSBpbiBSRkM4MjItbGlrZSBmb3JtYXRzIHRoYXQgc3VwcG9ydCBlbWJlZGRlZAorICAgICAgICBjb21tZW50cyBvciBmcmVlLXRleHQgZGF0YS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzKHNlbGYsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNwZWVkIGhhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IHN0cmluZy5sb3dlcik6CisgICAgICAgICIiIkZpbmQgYWxsIGhlYWRlciBsaW5lcyBtYXRjaGluZyBhIGdpdmVuIGhlYWRlciBuYW1lLgorICAgICAgICAKKyAgICAgICAgTG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIGhlYWRlcnMgYW5kIGZpbmQgYWxsIGxpbmVzCisgICAgICAgIG1hdGNoaW5nIGEgZ2l2ZW4gaGVhZGVyIG5hbWUgKGFuZCB0aGVpciBjb250aW51YXRpb24KKyAgICAgICAgbGluZXMpLiAgQSBsaXN0IG9mIHRoZSBsaW5lcyBpcyByZXR1cm5lZCwgd2l0aG91dAorICAgICAgICBpbnRlcnByZXRhdGlvbi4gIElmIHRoZSBoZWFkZXIgZG9lcyBub3Qgb2NjdXIsIGFuCisgICAgICAgIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuICBJZiB0aGUgaGVhZGVyIG9jY3VycyBtdWx0aXBsZQorICAgICAgICB0aW1lcywgYWxsIG9jY3VycmVuY2VzIGFyZSByZXR1cm5lZC4gIENhc2UgaXMgbm90CisgICAgICAgIGltcG9ydGFudCBpbiB0aGUgaGVhZGVyIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICByID0gc2VsZi5fX2dhbWhfY2FjaGUuZ2V0KGxvd2VyKG5hbWUpKQorICAgICAgICBpZiByOgorICAgICAgICAgICAgcmV0dXJuIHJbOl0KKyAgICAgICAgcmV0dXJuIFtdCisgICAgCisgICAgZGVmIGdldGZpcnN0bWF0Y2hpbmdoZWFkZXIoc2VsZiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNwZWVkIGhhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBzdHJpbmcubG93ZXIpOgorICAgICAgICAiIiJHZXQgdGhlIGZpcnN0IGhlYWRlciBsaW5lIG1hdGNoaW5nIG5hbWUuCisgICAgICAgIAorICAgICAgICBUaGlzIGlzIHNpbWlsYXIgdG8gZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzLCBidXQgaXQgcmV0dXJucworICAgICAgICBvbmx5IHRoZSBmaXJzdCBtYXRjaGluZyBoZWFkZXIgKGFuZCBpdHMgY29udGludWF0aW9uCisgICAgICAgIGxpbmVzKS4KKyAgICAgICAgIiIiCisgICAgICAgIGwgPSBzZWxmLl9fZ2FtaF9jYWNoZS5nZXQobG93ZXIobmFtZSkpCisgICAgICAgIGlmIG5vdCBsOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHIgPSBbXQorICAgICAgICBmb3IgaXRlbSBpbiBsOgorICAgICAgICAgICAgaWYgciBhbmQgaXRlbVswXSBub3QgaW4gIiBcdCI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHIuYXBwZW5kKGl0ZW0pCisgICAgICAgIHJldHVybiByCisgICAgCisgICAgZGVmIGdldHJhd2hlYWRlcihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiQSBoaWdoZXItbGV2ZWwgaW50ZXJmYWNlIHRvIGdldGZpcnN0bWF0Y2hpbmdoZWFkZXIoKS4KKyAgICAgICAgCisgICAgICAgIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBsaXRlcmFsIHRleHQgb2YgdGhlCisgICAgICAgIGhlYWRlciBidXQgd2l0aCB0aGUga2V5d29yZCBzdHJpcHBlZC4gIEFsbCBsZWFkaW5nLAorICAgICAgICB0cmFpbGluZyBhbmQgZW1iZWRkZWQgd2hpdGVzcGFjZSBpcyBrZXB0IGluIHRoZQorICAgICAgICBzdHJpbmcsIGhvd2V2ZXIuCisgICAgICAgIFJldHVybiBOb25lIGlmIHRoZSBoZWFkZXIgZG9lcyBub3Qgb2NjdXIuCisgICAgICAgICIiIgorICAgICAgICAKKyAgICAgICAgbGlzdCA9IHNlbGYuZ2V0Zmlyc3RtYXRjaGluZ2hlYWRlcihuYW1lKQorICAgICAgICBpZiBub3QgbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGxpc3RbMF0gPSBsaXN0WzBdW2xlbihuYW1lKSArIDE6XQorICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW5maWVsZHMobGlzdCwgJycpCisgICAgCisgICAgZGVmIGdldGhlYWRlcihzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJHZXQgdGhlIGhlYWRlciB2YWx1ZSBmb3IgYSBuYW1lLgorICAgICAgICAKKyAgICAgICAgVGhpcyBpcyB0aGUgbm9ybWFsIGludGVyZmFjZTogaXQgcmV0dXJucyBhIHN0cmlwcGVkCisgICAgICAgIHZlcnNpb24gb2YgdGhlIGhlYWRlciB2YWx1ZSBmb3IgYSBnaXZlbiBoZWFkZXIgbmFtZSwKKyAgICAgICAgb3IgTm9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0LiAgVGhpcyB1c2VzIHRoZSBkaWN0aW9uYXJ5CisgICAgICAgIHZlcnNpb24gd2hpY2ggZmluZHMgdGhlICpsYXN0KiBzdWNoIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRpY3Rbc3RyaW5nLmxvd2VyKG5hbWUpXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgIGdldCA9IGdldGhlYWRlcgorCisgICAgZGVmIGdldGhlYWRlcnMoc2VsZiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAjIHNwZWVkIGhhY2s6CisgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBzdHJpbmcubG93ZXIpOgorICAgICAgICAiIiJHZXQgYWxsIHZhbHVlcyBmb3IgYSBoZWFkZXIuCisKKyAgICAgICAgVGhpcyByZXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgZm9yIGhlYWRlcnMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2U7CisgICAgICAgIGVhY2ggdmFsdWUgaW4gdGhlIHJlc3VsdCBsaXN0IGlzIHN0cmlwcGVkIGluIHRoZSBzYW1lIHdheSBhcyB0aGUKKyAgICAgICAgcmVzdWx0IG9mIGdldGhlYWRlcigpLiAgSWYgdGhlIGhlYWRlciBpcyBub3QgZ2l2ZW4sIHJldHVybiBhbgorICAgICAgICBlbXB0eSBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgciA9IHNlbGYuX19naF9jYWNoZS5nZXQobG93ZXIobmFtZSkpCisgICAgICAgIGlmIHI6CisgICAgICAgICAgICByZXR1cm4gcls6XQorICAgICAgICByZXR1cm4gW10KKyAgICAKKyAgICBkZWYgZ2V0YWRkcihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiR2V0IGEgc2luZ2xlIGFkZHJlc3MgZnJvbSBhIGhlYWRlciwgYXMgYSB0dXBsZS4KKyAgICAgICAgCisgICAgICAgIEFuIGV4YW1wbGUgcmV0dXJuIHZhbHVlOgorICAgICAgICAoJ0d1aWRvIHZhbiBSb3NzdW0nLCAnZ3VpZG9AY3dpLm5sJykKKyAgICAgICAgIiIiCisgICAgICAgICMgTmV3LCBieSBCZW4gRXNjb3RvCisgICAgICAgIGFsaXN0ID0gc2VsZi5nZXRhZGRybGlzdChuYW1lKQorICAgICAgICBpZiBhbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBhbGlzdFswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lKQorICAgIAorICAgIGRlZiBnZXRhZGRybGlzdChzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiBhZGRyZXNzZXMgZnJvbSBhIGhlYWRlci4KKworICAgICAgICBSZXRyaWV2ZXMgYSBsaXN0IG9mIGFkZHJlc3NlcyBmcm9tIGEgaGVhZGVyLCB3aGVyZSBlYWNoIGFkZHJlc3MgaXMgYQorICAgICAgICB0dXBsZSBhcyByZXR1cm5lZCBieSBnZXRhZGRyKCkuICBTY2FucyBhbGwgbmFtZWQgaGVhZGVycywgc28gaXQgd29ya3MKKyAgICAgICAgcHJvcGVybHkgd2l0aCBtdWx0aXBsZSBUbzogb3IgQ2M6IGhlYWRlcnMgZm9yIGV4YW1wbGUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJhdyA9IFtdCisgICAgICAgIGZvciBoIGluIHNlbGYuZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzKG5hbWUpOgorCSAgICBpZiBoWzBdIGluICcgXHQnOgorCSAgICAgICAgcmF3LmFwcGVuZChoKQorCSAgICBlbHNlOgorCSAgICAgICAgaWYgcmF3OgorCQkgICAgcmF3LmFwcGVuZCgnLCAnKQorICAgICAgICAgICAgICAgIGkgPSBzdHJpbmcuZmluZChoLCAnOicpCisgICAgICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBoW2krMTpdCisgICAgICAgICAgICAgICAgcmF3LmFwcGVuZChhZGRyKQorICAgICAgICBhbGxhZGRycyA9IHN0cmluZy5qb2luKHJhdywgJycpCisgICAgICAgIGEgPSBBZGRybGlzdENsYXNzKGFsbGFkZHJzKQorICAgICAgICByZXR1cm4gYS5nZXRhZGRybGlzdCgpCisgICAgCisgICAgZGVmIGdldGRhdGUoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHJpZXZlIGEgZGF0ZSBmaWVsZCBmcm9tIGEgaGVhZGVyLgorICAgICAgICAKKyAgICAgICAgUmV0cmlldmVzIGEgZGF0ZSBmaWVsZCBmcm9tIHRoZSBuYW1lZCBoZWFkZXIsIHJldHVybmluZworICAgICAgICBhIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLm1rdGltZSgpLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHNlbGZbbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHBhcnNlZGF0ZShkYXRhKQorICAgIAorICAgIGRlZiBnZXRkYXRlX3R6KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXRyaWV2ZSBhIGRhdGUgZmllbGQgZnJvbSBhIGhlYWRlciBhcyBhIDEwLXR1cGxlLgorICAgICAgICAKKyAgICAgICAgVGhlIGZpcnN0IDkgZWxlbWVudHMgbWFrZSB1cCBhIHR1cGxlIGNvbXBhdGlibGUgd2l0aAorICAgICAgICB0aW1lLm1rdGltZSgpLCBhbmQgdGhlIDEwdGggaXMgdGhlIG9mZnNldCBvZiB0aGUgcG9zdGVyJ3MKKyAgICAgICAgdGltZSB6b25lIGZyb20gR01UL1VUQy4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmW25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBwYXJzZWRhdGVfdHooZGF0YSkKKyAgICAKKyAgICAKKyAgICAjIEFjY2VzcyBhcyBhIGRpY3Rpb25hcnkgKG9ubHkgZmluZHMgKmxhc3QqIGhlYWRlciBvZiBlYWNoIHR5cGUpOgorICAgIAorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIG51bWJlciBvZiBoZWFkZXJzIGluIGEgbWVzc2FnZS4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmRpY3QpCisgICAgCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJHZXQgYSBzcGVjaWZpYyBoZWFkZXIsIGFzIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5kaWN0W3N0cmluZy5sb3dlcihuYW1lKV0KKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICIiIlNldCB0aGUgdmFsdWUgb2YgYSBoZWFkZXIuCisKKyAgICAgICAgTm90ZTogVGhpcyBpcyBub3QgYSBwZXJmZWN0IGludmVyc2lvbiBvZiBfX2dldGl0ZW1fXywgYmVjYXVzZSAKKyAgICAgICAgYW55IGNoYW5nZWQgaGVhZGVycyBnZXQgc3R1Y2sgYXQgdGhlIGVuZCBvZiB0aGUgcmF3LWhlYWRlcnMgbGlzdAorICAgICAgICByYXRoZXIgdGhhbiB3aGVyZSB0aGUgYWx0ZXJlZCBoZWFkZXIgd2FzLgorICAgICAgICAiIiIKKyAgICAgICAgZGVsIHNlbGZbbmFtZV0gIyBXb24ndCBmYWlsIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgc2VsZi5kaWN0W3N0cmluZy5sb3dlcihuYW1lKV0gPSB2YWx1ZQorICAgICAgICB0ZXh0ID0gbmFtZSArICI6ICIgKyB2YWx1ZQorICAgICAgICBsaW5lcyA9IHN0cmluZy5zcGxpdCh0ZXh0LCAiXG4iKQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIHNlbGYuaGVhZGVycy5hcHBlbmQobGluZSArICJcbiIpCisgICAgCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJEZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIGEgc3BlY2lmaWMgaGVhZGVyLCBpZiBpdCBpcyBwcmVzZW50LiIiIgorICAgICAgICBuYW1lID0gc3RyaW5nLmxvd2VyKG5hbWUpCisgICAgICAgIGlmIG5vdCBzZWxmLmRpY3QuaGFzX2tleShuYW1lKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkZWwgc2VsZi5kaWN0W25hbWVdCisgICAgICAgIG5hbWUgPSBuYW1lICsgJzonCisgICAgICAgIG4gPSBsZW4obmFtZSkKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIGhpdCA9IDAKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuaGVhZGVycykpOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuaGVhZGVyc1tpXQorICAgICAgICAgICAgaWYgc3RyaW5nLmxvd2VyKGxpbmVbOm5dKSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIGhpdCA9IDEKKyAgICAgICAgICAgIGVsaWYgbGluZVs6MV0gbm90IGluIHN0cmluZy53aGl0ZXNwYWNlOgorICAgICAgICAgICAgICAgIGhpdCA9IDAKKyAgICAgICAgICAgIGlmIGhpdDoKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChpKQorICAgICAgICBsaXN0LnJldmVyc2UoKQorICAgICAgICBmb3IgaSBpbiBsaXN0OgorICAgICAgICAgICAgZGVsIHNlbGYuaGVhZGVyc1tpXQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkRldGVybWluZSB3aGV0aGVyIGEgbWVzc2FnZSBjb250YWlucyB0aGUgbmFtZWQgaGVhZGVyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5kaWN0Lmhhc19rZXkoc3RyaW5nLmxvd2VyKG5hbWUpKQorICAgIAorICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAiIiJHZXQgYWxsIG9mIGEgbWVzc2FnZSdzIGhlYWRlciBmaWVsZCBuYW1lcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGljdC5rZXlzKCkKKyAgICAKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAiIiJHZXQgYWxsIG9mIGEgbWVzc2FnZSdzIGhlYWRlciBmaWVsZCB2YWx1ZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRpY3QudmFsdWVzKCkKKyAgICAKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgICIiIkdldCBhbGwgb2YgYSBtZXNzYWdlJ3MgaGVhZGVycy4KKyAgICAgICAgCisgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIG5hbWUsIHZhbHVlIHR1cGxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRpY3QuaXRlbXMoKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHN0ciA9ICcnCisgICAgICAgIGZvciBoZHIgaW4gc2VsZi5oZWFkZXJzOgorICAgICAgICAgICAgc3RyID0gc3RyICsgaGRyCisgICAgICAgIHJldHVybiBzdHIKKworCisjIFV0aWxpdHkgZnVuY3Rpb25zCisjIC0tLS0tLS0tLS0tLS0tLS0tCisKKyMgWFhYIFNob3VsZCBmaXggdW5xdW90ZSgpIGFuZCBxdW90ZSgpIHRvIGJlIHJlYWxseSBjb25mb3JtYW50LgorIyBYWFggVGhlIGludmVyc2VzIG9mIHRoZSBwYXJzZSBmdW5jdGlvbnMgbWF5IGFsc28gYmUgdXNlZnVsLgorCisKK2RlZiB1bnF1b3RlKHN0cik6CisgICAgIiIiUmVtb3ZlIHF1b3RlcyBmcm9tIGEgc3RyaW5nLiIiIgorICAgIGlmIGxlbihzdHIpID4gMToKKyAgICAgICAgaWYgc3RyWzBdID09ICciJyBhbmQgc3RyWy0xOl0gPT0gJyInOgorICAgICAgICAgICAgcmV0dXJuIHN0clsxOi0xXQorICAgICAgICBpZiBzdHJbMF0gPT0gJzwnIGFuZCBzdHJbLTE6XSA9PSAnPic6CisgICAgICAgICAgICByZXR1cm4gc3RyWzE6LTFdCisgICAgcmV0dXJuIHN0cgorCisKK2RlZiBxdW90ZShzdHIpOgorICAgICIiIkFkZCBxdW90ZXMgYXJvdW5kIGEgc3RyaW5nLiIiIgorICAgIHJldHVybiAnIiVzIicgJSBzdHJpbmcuam9pbigKKyAgICBzdHJpbmcuc3BsaXQoCisgICAgc3RyaW5nLmpvaW4oCisgICAgc3RyaW5nLnNwbGl0KHN0ciwgJ1xcJyksCisgICAgJ1xcXFwnKSwKKyAgICAnIicpLAorICAgICdcXCInKQorCisKK2RlZiBwYXJzZWFkZHIoYWRkcmVzcyk6CisgICAgIiIiUGFyc2UgYW4gYWRkcmVzcyBpbnRvIGEgKHJlYWxuYW1lLCBtYWlsYWRkcikgdHVwbGUuIiIiCisgICAgYSA9IEFkZHJsaXN0Q2xhc3MoYWRkcmVzcykKKyAgICBsaXN0ID0gYS5nZXRhZGRybGlzdCgpCisgICAgaWYgbm90IGxpc3Q6CisgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gbGlzdFswXQorCisKK2NsYXNzIEFkZHJsaXN0Q2xhc3M6CisgICAgIiIiQWRkcmVzcyBwYXJzZXIgY2xhc3MgYnkgQmVuIEVzY290by4KKyAgICAKKyAgICBUbyB1bmRlcnN0YW5kIHdoYXQgdGhpcyBjbGFzcyBkb2VzLCBpdCBoZWxwcyB0byBoYXZlIGEgY29weSBvZgorICAgIFJGQy04MjIgaW4gZnJvbnQgb2YgeW91LgorCisgICAgTm90ZTogdGhpcyBjbGFzcyBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICBVc2UgcmZjODIyLkFkZHJlc3NMaXN0IGluc3RlYWQuCisgICAgIiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpZWxkKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgCisgICAgICAgIGBmaWVsZCcgaXMgYW4gdW5wYXJzZWQgYWRkcmVzcyBoZWFkZXIgZmllbGQsIGNvbnRhaW5pbmcKKyAgICAgICAgb25lIG9yIG1vcmUgYWRkcmVzc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zcGVjaWFscyA9ICcoKTw+QCw6Oy5cIltdJworICAgICAgICBzZWxmLnBvcyA9IDAKKyAgICAgICAgc2VsZi5MV1MgPSAnIFx0JworICAgICAgICBzZWxmLkNSID0gJ1xyXG4nCisgICAgICAgIHNlbGYuYXRvbWVuZHMgPSBzZWxmLnNwZWNpYWxzICsgc2VsZi5MV1MgKyBzZWxmLkNSCisgICAgICAgIHNlbGYuZmllbGQgPSBmaWVsZAorICAgICAgICBzZWxmLmNvbW1lbnRsaXN0ID0gW10KKyAgICAKKyAgICBkZWYgZ290b25leHQoc2VsZik6CisgICAgICAgICIiIlBhcnNlIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBhZGRyZXNzLiIiIgorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuTFdTICsgJ1xuXHInOgorICAgICAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1lbnRsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgIGVsc2U6IGJyZWFrCisgICAgCisgICAgZGVmIGdldGFkZHJsaXN0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhbGwgYWRkcmVzc2VzLgorICAgICAgICAKKyAgICAgICAgUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhbGwgb2YgdGhlIGFkZHJlc3Nlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGFkID0gc2VsZi5nZXRhZGRyZXNzKCkKKyAgICAgICAgaWYgYWQ6CisgICAgICAgICAgICByZXR1cm4gYWQgKyBzZWxmLmdldGFkZHJsaXN0KCkKKyAgICAgICAgZWxzZTogcmV0dXJuIFtdCisgICAgCisgICAgZGVmIGdldGFkZHJlc3Moc2VsZik6CisgICAgICAgICIiIlBhcnNlIHRoZSBuZXh0IGFkZHJlc3MuIiIiCisgICAgICAgIHNlbGYuY29tbWVudGxpc3QgPSBbXQorICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgCisgICAgICAgIG9sZHBvcyA9IHNlbGYucG9zCisgICAgICAgIG9sZGNsID0gc2VsZi5jb21tZW50bGlzdAorICAgICAgICBwbGlzdCA9IHNlbGYuZ2V0cGhyYXNlbGlzdCgpCisgICAgICAgIAorICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgcmV0dXJubGlzdCA9IFtdCisgICAgICAgIAorICAgICAgICBpZiBzZWxmLnBvcyA+PSBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICAjIEJhZCBlbWFpbCBhZGRyZXNzIHRlY2huaWNhbGx5LCBubyBkb21haW4uCisgICAgICAgICAgICBpZiBwbGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gWyhzdHJpbmcuam9pbihzZWxmLmNvbW1lbnRsaXN0KSwgcGxpc3RbMF0pXQorICAgICAgICAgICAgCisgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gJy5AJzoKKyAgICAgICAgICAgICMgZW1haWwgYWRkcmVzcyBpcyBqdXN0IGFuIGFkZHJzcGVjCisgICAgICAgICAgICAjIHRoaXMgaXNuJ3QgdmVyeSBlZmZpY2llbnQgc2luY2Ugd2Ugc3RhcnQgb3ZlcgorICAgICAgICAgICAgc2VsZi5wb3MgPSBvbGRwb3MKKyAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QgPSBvbGRjbAorICAgICAgICAgICAgYWRkcnNwZWMgPSBzZWxmLmdldGFkZHJzcGVjKCkKKyAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKHN0cmluZy5qb2luKHNlbGYuY29tbWVudGxpc3QpLCBhZGRyc3BlYyldCisgICAgICAgICAgICAKKyAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnOic6CisgICAgICAgICAgICAjIGFkZHJlc3MgaXMgYSBncm91cAorICAgICAgICAgICAgcmV0dXJubGlzdCA9IFtdCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpZWxkbGVuID0gbGVuKHNlbGYuZmllbGQpCisgICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zICsgMQorICAgICAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3MgPCBmaWVsZGxlbiBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJzsnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zICsgMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSByZXR1cm5saXN0ICsgc2VsZi5nZXRhZGRyZXNzKCkKKyAgICAgICAgICAgIAorICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc8JzoKKyAgICAgICAgICAgICMgQWRkcmVzcyBpcyBhIHBocmFzZSB0aGVuIGEgcm91dGUgYWRkcgorICAgICAgICAgICAgcm91dGVhZGRyID0gc2VsZi5nZXRyb3V0ZWFkZHIoKQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBzZWxmLmNvbW1lbnRsaXN0OgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKHN0cmluZy5qb2luKHBsaXN0KSArICcgKCcgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmpvaW4oc2VsZi5jb21tZW50bGlzdCkgKyAnKScsIHJvdXRlYWRkcildCisgICAgICAgICAgICBlbHNlOiByZXR1cm5saXN0ID0gWyhzdHJpbmcuam9pbihwbGlzdCksIHJvdXRlYWRkcildCisgICAgICAgICAgICAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHBsaXN0OgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKHN0cmluZy5qb2luKHNlbGYuY29tbWVudGxpc3QpLCBwbGlzdFswXSldCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuc3BlY2lhbHM6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgPSBzZWxmLnBvcyArIDEKKyAgICAgICAgCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICBpZiBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKSBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJywnOgorICAgICAgICAgICAgc2VsZi5wb3MgPSBzZWxmLnBvcyArIDEKKyAgICAgICAgcmV0dXJuIHJldHVybmxpc3QKKyAgICAKKyAgICBkZWYgZ2V0cm91dGVhZGRyKHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHJvdXRlIGFkZHJlc3MgKFJldHVybi1wYXRoIHZhbHVlKS4KKyAgICAgICAgCisgICAgICAgIFRoaXMgbWV0aG9kIGp1c3Qgc2tpcHMgYWxsIHRoZSByb3V0ZSBzdHVmZiBhbmQgcmV0dXJucyB0aGUgYWRkcnNwZWMuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSAhPSAnPCc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgCisgICAgICAgIGV4cGVjdHJvdXRlID0gMAorICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zICsgMQorICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgYWRsaXN0ID0gTm9uZQorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIGV4cGVjdHJvdXRlOgorICAgICAgICAgICAgICAgIHNlbGYuZ2V0ZG9tYWluKCkKKyAgICAgICAgICAgICAgICBleHBlY3Ryb3V0ZSA9IDAKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJz4nOgorICAgICAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJ0AnOgorICAgICAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgICAgICAgICAgZXhwZWN0cm91dGUgPSAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc6JzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zICsgMQorICAgICAgICAgICAgICAgIGV4cGVjdGFkZHJzcGVjID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhZGxpc3QgPSBzZWxmLmdldGFkZHJzcGVjKCkKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zICsgMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgCisgICAgICAgIHJldHVybiBhZGxpc3QKKyAgICAKKyAgICBkZWYgZ2V0YWRkcnNwZWMoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFuIFJGQy04MjIgYWRkci1zcGVjLiIiIgorICAgICAgICBhc2xpc3QgPSBbXQorICAgICAgICAKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJy4nOgorICAgICAgICAgICAgICAgIGFzbGlzdC5hcHBlbmQoJy4nKQorICAgICAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICciJzoKKyAgICAgICAgICAgICAgICBhc2xpc3QuYXBwZW5kKCciJXMiJyAlIHNlbGYuZ2V0cXVvdGUoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5hdG9tZW5kczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZTogYXNsaXN0LmFwcGVuZChzZWxmLmdldGF0b20oKSkKKyAgICAgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICAKKyAgICAgICAgaWYgc2VsZi5wb3MgPj0gbGVuKHNlbGYuZmllbGQpIG9yIHNlbGYuZmllbGRbc2VsZi5wb3NdICE9ICdAJzoKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuam9pbihhc2xpc3QsICcnKQorICAgICAgICAKKyAgICAgICAgYXNsaXN0LmFwcGVuZCgnQCcpCisgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oYXNsaXN0LCAnJykgKyBzZWxmLmdldGRvbWFpbigpCisgICAgCisgICAgZGVmIGdldGRvbWFpbihzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjb21wbGV0ZSBkb21haW4gbmFtZSBmcm9tIGFuIGFkZHJlc3MuIiIiCisgICAgICAgIHNkbGlzdCA9IFtdCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5MV1M6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgPSBzZWxmLnBvcyArIDEKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnWyc6CisgICAgICAgICAgICAgICAgc2RsaXN0LmFwcGVuZChzZWxmLmdldGRvbWFpbmxpdGVyYWwoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJy4nOgorICAgICAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgICAgICAgICAgc2RsaXN0LmFwcGVuZCgnLicpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6IHNkbGlzdC5hcHBlbmQoc2VsZi5nZXRhdG9tKCkpCisgICAgICAgIHJldHVybiBzdHJpbmcuam9pbihzZGxpc3QsICcnKQorICAgIAorICAgIGRlZiBnZXRkZWxpbWl0ZWQoc2VsZiwgYmVnaW5jaGFyLCBlbmRjaGFycywgYWxsb3djb21tZW50cyA9IDEpOgorICAgICAgICAiIiJQYXJzZSBhIGhlYWRlciBmcmFnbWVudCBkZWxpbWl0ZWQgYnkgc3BlY2lhbCBjaGFyYWN0ZXJzLgorICAgICAgICAKKyAgICAgICAgYGJlZ2luY2hhcicgaXMgdGhlIHN0YXJ0IGNoYXJhY3RlciBmb3IgdGhlIGZyYWdtZW50LgorICAgICAgICBJZiBzZWxmIGlzIG5vdCBsb29raW5nIGF0IGFuIGluc3RhbmNlIG9mIGBiZWdpbmNoYXInIHRoZW4KKyAgICAgICAgZ2V0ZGVsaW1pdGVkIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgICAgCisgICAgICAgIGBlbmRjaGFycycgaXMgYSBzZXF1ZW5jZSBvZiBhbGxvd2FibGUgZW5kLWRlbGltaXRpbmcgY2hhcmFjdGVycy4KKyAgICAgICAgUGFyc2luZyBzdG9wcyB3aGVuIG9uZSBvZiB0aGVzZSBpcyBlbmNvdW50ZXJlZC4KKyAgICAgICAgCisgICAgICAgIElmIGBhbGxvd2NvbW1lbnRzJyBpcyBub24temVybywgZW1iZWRkZWQgUkZDLTgyMiBjb21tZW50cworICAgICAgICBhcmUgYWxsb3dlZCB3aXRoaW4gdGhlIHBhcnNlZCBmcmFnbWVudC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdICE9IGJlZ2luY2hhcjoKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICAKKyAgICAgICAgc2xpc3QgPSBbJyddCisgICAgICAgIHF1b3RlID0gMAorICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zICsgMQorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHF1b3RlID09IDE6CisgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKHNlbGYuZmllbGRbc2VsZi5wb3NdKQorICAgICAgICAgICAgICAgIHF1b3RlID0gMAorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBlbmRjaGFyczoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zICsgMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGFsbG93Y29tbWVudHMgYW5kIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoc2VsZi5nZXRjb21tZW50KCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICdcXCc6CisgICAgICAgICAgICAgICAgcXVvdGUgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNsaXN0LmFwcGVuZChzZWxmLmZpZWxkW3NlbGYucG9zXSkKKyAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgIAorICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oc2xpc3QsICcnKQorICAgIAorICAgIGRlZiBnZXRxdW90ZShzZWxmKToKKyAgICAgICAgIiIiR2V0IGEgcXVvdGUtZGVsaW1pdGVkIGZyYWdtZW50IGZyb20gc2VsZidzIGZpZWxkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXRkZWxpbWl0ZWQoJyInLCAnIlxyJywgMCkKKyAgICAKKyAgICBkZWYgZ2V0Y29tbWVudChzZWxmKToKKyAgICAgICAgIiIiR2V0IGEgcGFyZW50aGVzaXMtZGVsaW1pdGVkIGZyYWdtZW50IGZyb20gc2VsZidzIGZpZWxkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXRkZWxpbWl0ZWQoJygnLCAnKVxyJywgMSkKKyAgICAKKyAgICBkZWYgZ2V0ZG9tYWlubGl0ZXJhbChzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYW4gUkZDLTgyMiBkb21haW4tbGl0ZXJhbC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0ZGVsaW1pdGVkKCdbJywgJ11ccicsIDApCisgICAgCisgICAgZGVmIGdldGF0b20oc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFuIFJGQy04MjIgYXRvbS4iIiIKKyAgICAgICAgYXRvbWxpc3QgPSBbJyddCisgICAgICAgIAorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6IGF0b21saXN0LmFwcGVuZChzZWxmLmZpZWxkW3NlbGYucG9zXSkKKyAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgIAorICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oYXRvbWxpc3QsICcnKQorICAgIAorICAgIGRlZiBnZXRwaHJhc2VsaXN0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHNlcXVlbmNlIG9mIFJGQy04MjIgcGhyYXNlcy4KKyAgICAgICAgCisgICAgICAgIEEgcGhyYXNlIGlzIGEgc2VxdWVuY2Ugb2Ygd29yZHMsIHdoaWNoIGFyZSBpbiB0dXJuIGVpdGhlcgorICAgICAgICBSRkMtODIyIGF0b21zIG9yIHF1b3RlZC1zdHJpbmdzLiAgUGhyYXNlcyBhcmUgY2Fub25pY2FsaXplZAorICAgICAgICBieSBzcXVlZXppbmcgYWxsIHJ1bnMgb2YgY29udGludW91cyB3aGl0ZXNwYWNlIGludG8gb25lIHNwYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgcGxpc3QgPSBbXQorICAgICAgICAKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLkxXUzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zICsgMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnIic6CisgICAgICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHNlbGYuZ2V0cXVvdGUoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLmF0b21lbmRzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOiBwbGlzdC5hcHBlbmQoc2VsZi5nZXRhdG9tKCkpCisgICAgICAgIAorICAgICAgICByZXR1cm4gcGxpc3QKKworY2xhc3MgQWRkcmVzc0xpc3QoQWRkcmxpc3RDbGFzcyk6CisgICAgIiIiQW4gQWRkcmVzc0xpc3QgZW5jYXBzdWxhdGVzIGEgbGlzdCBvZiBwYXJzZWQgUkZDODIyIGFkZHJlc3Nlcy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmllbGQpOgorICAgICAgICBBZGRybGlzdENsYXNzLl9faW5pdF9fKHNlbGYsIGZpZWxkKQorICAgICAgICBpZiBmaWVsZDoKKyAgICAgICAgICAgIHNlbGYuYWRkcmVzc2xpc3QgPSBzZWxmLmdldGFkZHJsaXN0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYWRkcmVzc2xpc3QgPSBbXQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5hZGRyZXNzbGlzdCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW5maWVsZHMobWFwKGR1bXBfYWRkcmVzc19wYWlyLCBzZWxmLmFkZHJlc3NsaXN0KSwiLCAiKQorCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIFNldCB1bmlvbgorICAgICAgICBuZXdhZGRyID0gQWRkcmVzc0xpc3QoTm9uZSkKKyAgICAgICAgbmV3YWRkci5hZGRyZXNzbGlzdCA9IHNlbGYuYWRkcmVzc2xpc3RbOl0KKyAgICAgICAgZm9yIHggaW4gb3RoZXIuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICBpZiBub3QgeCBpbiBzZWxmLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgICAgIG5ld2FkZHIuYWRkcmVzc2xpc3QuYXBwZW5kKHgpCisgICAgICAgIHJldHVybiBuZXdhZGRyCisKKyAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgU2V0IGRpZmZlcmVuY2UKKyAgICAgICAgbmV3YWRkciA9IEFkZHJlc3NMaXN0KE5vbmUpCisgICAgICAgIGZvciB4IGluIHNlbGYuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICBpZiBub3QgeCBpbiBvdGhlci5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgICAgICBuZXdhZGRyLmFkZHJlc3NsaXN0LmFwcGVuZCh4KQorICAgICAgICByZXR1cm4gbmV3YWRkcgorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgIyBNYWtlIGluZGV4aW5nLCBzbGljZXMsIGFuZCAnaW4nIHdvcmsKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRkcmVzc2xpc3RbaW5kZXhdCisKK2RlZiBkdW1wX2FkZHJlc3NfcGFpcihwYWlyKToKKyAgICAiIiJEdW1wIGEgKG5hbWUsIGFkZHJlc3MpIHBhaXIgaW4gYSBjYW5vbmljYWxpemVkIGZvcm0uIiIiCisgICAgaWYgcGFpclswXToKKyAgICAgICAgcmV0dXJuICciJyArIHBhaXJbMF0gKyAnIiA8JyArIHBhaXJbMV0gKyAnPicKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcGFpclsxXQorCisjIFBhcnNlIGEgZGF0ZSBmaWVsZAorCitfbW9udGhuYW1lcyA9IFsnamFuJywgJ2ZlYicsICdtYXInLCAnYXByJywgJ21heScsICdqdW4nLCAnanVsJywKKyAgICAgICAgICAgICAgICdhdWcnLCAnc2VwJywgJ29jdCcsICdub3YnLCAnZGVjJywKKwkgICAgICAgJ2phbnVhcnknLCAnZmVicnVhcnknLCAnbWFyY2gnLCAnYXByaWwnLCAnbWF5JywgJ2p1bmUnLCAnanVseScsCisgICAgICAgICAgICAgICAnYXVndXN0JywgJ3NlcHRlbWJlcicsICdvY3RvYmVyJywgJ25vdmVtYmVyJywgJ2RlY2VtYmVyJ10KK19kYXluYW1lcyA9IFsnbW9uJywgJ3R1ZScsICd3ZWQnLCAndGh1JywgJ2ZyaScsICdzYXQnLCAnc3VuJ10KKworIyBUaGUgdGltZXpvbmUgdGFibGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgbWlsaXRhcnkgdGltZSB6b25lcyBkZWZpbmVkCisjIGluIFJGQzgyMiwgb3RoZXIgdGhhbiBaLiAgQWNjb3JkaW5nIHRvIFJGQzExMjMsIHRoZSBkZXNjcmlwdGlvbiBpbgorIyBSRkM4MjIgZ2V0cyB0aGUgc2lnbnMgd3JvbmcsIHNvIHdlIGNhbid0IHJlbHkgb24gYW55IHN1Y2ggdGltZQorIyB6b25lcy4gIFJGQzExMjMgcmVjb21tZW5kcyB0aGF0IG51bWVyaWMgdGltZXpvbmUgaW5kaWNhdG9ycyBiZSB1c2VkCisjIGluc3RlYWQgb2YgdGltZXpvbmUgbmFtZXMuCisKK190aW1lem9uZXMgPSB7J1VUJzowLCAnVVRDJzowLCAnR01UJzowLCAnWic6MCwgCisgICAgICAgICAgICAgICdBU1QnOiAtNDAwLCAnQURUJzogLTMwMCwgICMgQXRsYW50aWMgKHVzZWQgaW4gQ2FuYWRhKQorICAgICAgICAgICAgICAnRVNUJzogLTUwMCwgJ0VEVCc6IC00MDAsICAjIEVhc3Rlcm4KKyAgICAgICAgICAgICAgJ0NTVCc6IC02MDAsICdDRFQnOiAtNTAwLCAgIyBDZW50cmFsCisgICAgICAgICAgICAgICdNU1QnOiAtNzAwLCAnTURUJzogLTYwMCwgICMgTW91bnRhaW4KKyAgICAgICAgICAgICAgJ1BTVCc6IC04MDAsICdQRFQnOiAtNzAwICAgIyBQYWNpZmljCisgICAgICAgICAgICAgIH0gICAgCisKKworZGVmIHBhcnNlZGF0ZV90eihkYXRhKToKKyAgICAiIiJDb252ZXJ0IGEgZGF0ZSBzdHJpbmcgdG8gYSB0aW1lIHR1cGxlLgorICAgIAorICAgIEFjY291bnRzIGZvciBtaWxpdGFyeSB0aW1lem9uZXMuCisgICAgIiIiCisgICAgZGF0YSA9IHN0cmluZy5zcGxpdChkYXRhKQorICAgIGlmIGRhdGFbMF1bLTFdIGluICgnLCcsICcuJykgb3Igc3RyaW5nLmxvd2VyKGRhdGFbMF0pIGluIF9kYXluYW1lczoKKyAgICAgICAgIyBUaGVyZSdzIGEgZGF5bmFtZSBoZXJlLiBTa2lwIGl0CisgICAgICAgIGRlbCBkYXRhWzBdCisgICAgaWYgbGVuKGRhdGEpID09IDM6ICMgUkZDIDg1MCBkYXRlLCBkZXByZWNhdGVkCisgICAgICAgIHN0dWZmID0gc3RyaW5nLnNwbGl0KGRhdGFbMF0sICctJykKKyAgICAgICAgaWYgbGVuKHN0dWZmKSA9PSAzOgorICAgICAgICAgICAgZGF0YSA9IHN0dWZmICsgZGF0YVsxOl0KKyAgICBpZiBsZW4oZGF0YSkgPT0gNDoKKyAgICAgICAgcyA9IGRhdGFbM10KKyAgICAgICAgaSA9IHN0cmluZy5maW5kKHMsICcrJykKKyAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICBkYXRhWzM6XSA9IFtzWzppXSwgc1tpKzE6XV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKCcnKSAjIER1bW15IHR6CisgICAgaWYgbGVuKGRhdGEpIDwgNToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBkYXRhID0gZGF0YVs6NV0KKyAgICBbZGQsIG1tLCB5eSwgdG0sIHR6XSA9IGRhdGEKKyAgICBtbSA9IHN0cmluZy5sb3dlcihtbSkKKyAgICBpZiBub3QgbW0gaW4gX21vbnRobmFtZXM6CisgICAgICAgIGRkLCBtbSA9IG1tLCBzdHJpbmcubG93ZXIoZGQpCisgICAgICAgIGlmIG5vdCBtbSBpbiBfbW9udGhuYW1lczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgbW0gPSBfbW9udGhuYW1lcy5pbmRleChtbSkrMQorICAgIGlmIG1tID4gMTI6IG1tID0gbW0gLSAxMgorICAgIGlmIGRkWy0xXSA9PSAnLCc6CisJZGQgPSBkZFs6LTFdCisgICAgaSA9IHN0cmluZy5maW5kKHl5LCAnOicpCisgICAgaWYgaSA+IDA6CisJeXksIHRtID0gdG0sIHl5CisgICAgaWYgeXlbLTFdID09ICcsJzoKKwl5eSA9IHl5WzotMV0KKyAgICBpZiB5eVswXSBub3QgaW4gc3RyaW5nLmRpZ2l0czoKKwl5eSwgdHogPSB0eiwgeXkKKyAgICBpZiB0bVstMV0gPT0gJywnOgorCXRtID0gdG1bOi0xXQorICAgIHRtID0gc3RyaW5nLnNwbGl0ZmllbGRzKHRtLCAnOicpCisgICAgaWYgbGVuKHRtKSA9PSAyOgorICAgICAgICBbdGhoLCB0bW1dID0gdG0KKyAgICAgICAgdHNzID0gJzAnCisgICAgZWxpZiBsZW4odG0pID09IDM6CisgICAgICAgIFt0aGgsIHRtbSwgdHNzXSA9IHRtCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB0cnk6CisgICAgICAgIHl5ID0gc3RyaW5nLmF0b2koeXkpCisgICAgICAgIGRkID0gc3RyaW5nLmF0b2koZGQpCisgICAgICAgIHRoaCA9IHN0cmluZy5hdG9pKHRoaCkKKyAgICAgICAgdG1tID0gc3RyaW5nLmF0b2kodG1tKQorICAgICAgICB0c3MgPSBzdHJpbmcuYXRvaSh0c3MpCisgICAgZXhjZXB0IHN0cmluZy5hdG9pX2Vycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHR6b2Zmc2V0PU5vbmUKKyAgICB0ej1zdHJpbmcudXBwZXIodHopCisgICAgaWYgX3RpbWV6b25lcy5oYXNfa2V5KHR6KToKKyAgICAgICAgdHpvZmZzZXQ9X3RpbWV6b25lc1t0el0KKyAgICBlbHNlOgorICAgICAgICB0cnk6IAorICAgICAgICAgICAgdHpvZmZzZXQ9c3RyaW5nLmF0b2kodHopCisgICAgICAgIGV4Y2VwdCBzdHJpbmcuYXRvaV9lcnJvcjogCisgICAgICAgICAgICBwYXNzCisgICAgIyBDb252ZXJ0IGEgdGltZXpvbmUgb2Zmc2V0IGludG8gc2Vjb25kcyA7IC0wNTAwIC0+IC0xODAwMAorICAgIGlmIHR6b2Zmc2V0OgorICAgICAgICBpZiB0em9mZnNldCA8IDA6CisgICAgICAgICAgICB0enNpZ24gPSAtMQorICAgICAgICAgICAgdHpvZmZzZXQgPSAtdHpvZmZzZXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6c2lnbiA9IDEKKyAgICAgICAgdHpvZmZzZXQgPSB0enNpZ24gKiAoICh0em9mZnNldC8xMDApKjM2MDAgKyAodHpvZmZzZXQgJSAxMDApKjYwKQorICAgIHR1cGxlID0gKHl5LCBtbSwgZGQsIHRoaCwgdG1tLCB0c3MsIDAsIDAsIDAsIHR6b2Zmc2V0KQorICAgIHJldHVybiB0dXBsZQorCisKK2RlZiBwYXJzZWRhdGUoZGF0YSk6CisgICAgIiIiQ29udmVydCBhIHRpbWUgc3RyaW5nIHRvIGEgdGltZSB0dXBsZS4iIiIKKyAgICB0PXBhcnNlZGF0ZV90eihkYXRhKQorICAgIGlmIHR5cGUodCk9PXR5cGUoICgpICk6CisgICAgICAgIHJldHVybiB0Wzo5XQorICAgIGVsc2U6IHJldHVybiB0ICAgIAorCisKK2RlZiBta3RpbWVfdHooZGF0YSk6CisgICAgIiIiVHVybiBhIDEwLXR1cGxlIGFzIHJldHVybmVkIGJ5IHBhcnNlZGF0ZV90eigpIGludG8gYSBVVEMgdGltZXN0YW1wLiIiIgorICAgIGlmIGRhdGFbOV0gaXMgTm9uZToKKyAgICAgICAgIyBObyB6b25lIGluZm8sIHNvIGxvY2FsdGltZSBpcyBiZXR0ZXIgYXNzdW1wdGlvbiB0aGFuIEdNVAorICAgICAgICByZXR1cm4gdGltZS5ta3RpbWUoZGF0YVs6OF0gKyAoLTEsKSkKKyAgICBlbHNlOgorICAgICAgICB0ID0gdGltZS5ta3RpbWUoZGF0YVs6OF0gKyAoMCwpKQorICAgICAgICByZXR1cm4gdCAtIGRhdGFbOV0gLSB0aW1lLnRpbWV6b25lCisKK2RlZiBmb3JtYXRkYXRlKHRpbWV2YWw9Tm9uZSk6CisgICAgIiIiUmV0dXJucyB0aW1lIGZvcm1hdCBwcmVmZXJyZWQgZm9yIEludGVybmV0IHN0YW5kYXJkcy4KKworICAgIFN1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UICA7IFJGQyA4MjIsIHVwZGF0ZWQgYnkgUkZDIDExMjMKKyAgICAiIiIKKyAgICBpZiB0aW1ldmFsIGlzIE5vbmU6CisgICAgICAgIHRpbWV2YWwgPSB0aW1lLnRpbWUoKQorICAgIHJldHVybiAiJXMiICUgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIEdNVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKHRpbWV2YWwpKQorCisKKyMgV2hlbiB1c2VkIGFzIHNjcmlwdCwgcnVuIGEgc21hbGwgdGVzdCBwcm9ncmFtLgorIyBUaGUgZmlyc3QgY29tbWFuZCBsaW5lIGFyZ3VtZW50IG11c3QgYmUgYSBmaWxlbmFtZSBjb250YWluaW5nIG9uZQorIyBtZXNzYWdlIGluIFJGQy04MjIgZm9ybWF0LgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMsIG9zCisgICAgZmlsZSA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uWydIT01FJ10sICdNYWlsL2luYm94LzEnKQorICAgIGlmIHN5cy5hcmd2WzE6XTogZmlsZSA9IHN5cy5hcmd2WzFdCisgICAgZiA9IG9wZW4oZmlsZSwgJ3InKQorICAgIG0gPSBNZXNzYWdlKGYpCisgICAgcHJpbnQgJ0Zyb206JywgbS5nZXRhZGRyKCdmcm9tJykKKyAgICBwcmludCAnVG86JywgbS5nZXRhZGRybGlzdCgndG8nKQorICAgIHByaW50ICdTdWJqZWN0OicsIG0uZ2V0aGVhZGVyKCdzdWJqZWN0JykKKyAgICBwcmludCAnRGF0ZTonLCBtLmdldGhlYWRlcignZGF0ZScpCisgICAgZGF0ZSA9IG0uZ2V0ZGF0ZV90eignZGF0ZScpCisgICAgaWYgZGF0ZToKKyAgICAgICAgcHJpbnQgJ1BhcnNlZERhdGU6JywgdGltZS5hc2N0aW1lKGRhdGVbOi0xXSksCisgICAgICAgIGhobW1zcyA9IGRhdGVbLTFdCisgICAgICAgIGhobW0sIHNzID0gZGl2bW9kKGhobW1zcywgNjApCisgICAgICAgIGhoLCBtbSA9IGRpdm1vZChoaG1tLCA2MCkKKyAgICAgICAgcHJpbnQgIiUrMDNkJTAyZCIgJSAoaGgsIG1tKSwKKyAgICAgICAgaWYgc3M6IHByaW50ICIuJTAyZCIgJSBzcywKKyAgICAgICAgcHJpbnQKKyAgICBlbHNlOgorICAgICAgICBwcmludCAnUGFyc2VkRGF0ZTonLCBOb25lCisgICAgbS5yZXdpbmRib2R5KCkKKyAgICBuID0gMAorICAgIHdoaWxlIGYucmVhZGxpbmUoKToKKyAgICAgICAgbiA9IG4gKyAxCisgICAgcHJpbnQgJ0xpbmVzOicsIG4KKyAgICBwcmludCAnLScqNzAKKyAgICBwcmludCAnbGVuID0nLCBsZW4obSkKKyAgICBpZiBtLmhhc19rZXkoJ0RhdGUnKTogcHJpbnQgJ0RhdGUgPScsIG1bJ0RhdGUnXQorICAgIGlmIG0uaGFzX2tleSgnWC1Ob25zZW5zZScpOiBwYXNzCisgICAgcHJpbnQgJ2tleXMgPScsIG0ua2V5cygpCisgICAgcHJpbnQgJ3ZhbHVlcyA9JywgbS52YWx1ZXMoKQorICAgIHByaW50ICdpdGVtcyA9JywgbS5pdGVtcygpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9ybGNvbXBsZS5weSBiL0xpYi9kb3MtOHgzL3JsY29tcGxlLnB5CmluZGV4IDkyNjMzYWIuLmFhMWRkMDIgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3JsY29tcGxlLnB5CisrKyBiL0xpYi9kb3MtOHgzL3JsY29tcGxlLnB5CkBAIC0xLDcgKzEsNiBAQAogIiIiV29yZCBjb21wbGV0aW9uIGZvciBHTlUgcmVhZGxpbmUgMi4wLgogCiBUaGlzIHJlcXVpcmVzIHRoZSBsYXRlc3QgZXh0ZW5zaW9uIHRvIHRoZSByZWFkbGluZSBtb2R1bGUgKHRoZQotc2V0X2NvbXBsZXRlcigpIGZ1bmN0aW9uKS4gIFdoZW4gY29tcGxldGluZyBhIHNpbXBsZSBpZGVudGlmaWVyLCBpdAogY29tcGxldGVzIGtleXdvcmRzLCBidWlsdC1pbnMgYW5kIGdsb2JhbHMgaW4gX19tYWluX187IHdoZW4gY29tcGxldGluZwogTkFNRS5OQU1FLi4uLCBpdCBldmFsdWF0ZXMgKCEpIHRoZSBleHByZXNzaW9uIHVwIHRvIHRoZSBsYXN0IGRvdCBhbmQKIGNvbXBsZXRlcyBpdHMgYXR0cmlidXRlcy4KQEAgLTg3LDcgKzg2LDggQEAKICAgICAgICAgQXNzdW1pbmcgdGhlIHRleHQgaXMgb2YgdGhlIGZvcm0gTkFNRS5OQU1FLi4uLltOQU1FXSwgYW5kIGlzCiAgICAgICAgIGV2YWx1YWJhYmxlIGluIHRoZSBnbG9iYWxzIG9mIF9fbWFpbl9fLCBpdCB3aWxsIGJlIGV2YWx1YXRlZAogICAgICAgICBhbmQgaXRzIGF0dHJpYnV0ZXMgKGFzIHJldmVhbGVkIGJ5IGRpcigpKSBhcmUgdXNlZCBhcyBwb3NzaWJsZQotICAgICAgICBjb21wbGV0aW9ucy4KKyAgICAgICAgY29tcGxldGlvbnMuICAoRm9yIGNsYXNzIGluc3RhbmNlcywgY2xhc3MgbWVtYmVycyBhcmUgYXJlIGFsc28KKyAgICAgICAgY29uc2lkZXJlZC4pCiAKICAgICAgICAgV0FSTklORzogdGhpcyBjYW4gc3RpbGwgaW52b2tlIGFyYml0cmFyeSBDIGNvZGUsIGlmIGFuIG9iamVjdAogICAgICAgICB3aXRoIGEgX19nZXRhdHRyX18gaG9vayBpcyBldmFsdWF0ZWQuCkBAIC05OCw3ICs5OCwxMSBAQAogICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBleHByLCBhdHRyID0gbS5ncm91cCgxLCAzKQotICAgICAgICB3b3JkcyA9IGRpcihldmFsKGV4cHIsIF9fbWFpbl9fLl9fZGljdF9fKSkKKyAgICAgICAgb2JqZWN0ID0gZXZhbChleHByLCBfX21haW5fXy5fX2RpY3RfXykKKyAgICAgICAgd29yZHMgPSBkaXIob2JqZWN0KQorICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwnX19jbGFzc19fJyk6CisgICAgICAgICAgICB3b3Jkcy5hcHBlbmQoJ19fY2xhc3NfXycpCisgICAgICAgICAgICB3b3JkcyA9IHdvcmRzICsgZ2V0X2NsYXNzX21lbWJlcnMob2JqZWN0Ll9fY2xhc3NfXykKICAgICAgICAgbWF0Y2hlcyA9IFtdCiAgICAgICAgIG4gPSBsZW4oYXR0cikKICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CkBAIC0xMDYsNCArMTEwLDExIEBACiAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoIiVzLiVzIiAlIChleHByLCB3b3JkKSkKICAgICAgICAgcmV0dXJuIG1hdGNoZXMKIAorZGVmIGdldF9jbGFzc19tZW1iZXJzKGtsYXNzKToKKyAgICByZXQgPSBkaXIoa2xhc3MpCisgICAgaWYgaGFzYXR0cihrbGFzcywnX19iYXNlc19fJyk6CisgICAgICAgIGZvciBiYXNlIGluIGtsYXNzLl9fYmFzZXNfXzoKKyAgICAgICAgICAgIHJldCA9IHJldCArIGdldF9jbGFzc19tZW1iZXJzKGJhc2UpCisgICAgcmV0dXJuIHJldAorCiByZWFkbGluZS5zZXRfY29tcGxldGVyKENvbXBsZXRlcigpLmNvbXBsZXRlKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvcm9ib3RwYXIucHkgYi9MaWIvZG9zLTh4My9yb2JvdHBhci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQzOTZiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvcm9ib3RwYXIucHkKQEAgLTAsMCArMSw5NyBAQAorIiIiCisKK1JvYm90cy50eHQgZmlsZSBwYXJzZXIgY2xhc3MuICBBY2NlcHRzIGEgbGlzdCBvZiBsaW5lcyBvciByb2JvdHMudHh0IFVSTCBhcworaW5wdXQsIGJ1aWxkcyBhIHNldCBvZiBydWxlcyBmcm9tIHRoYXQgbGlzdCwgdGhlbiBhbnN3ZXJzIHF1ZXN0aW9ucyBhYm91dAorZmV0Y2hhYmlsaXR5IG9mIG90aGVyIFVSTHMuCisKKyIiIgorCitjbGFzcyBSb2JvdEZpbGVQYXJzZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucnVsZXMgPSB7fQorICAgICAgICBzZWxmLmRlYnVnID0gMAorICAgICAgICBzZWxmLnVybCA9ICcnCisgICAgICAgIHNlbGYubGFzdF9jaGVja2VkID0gMAorCisgICAgZGVmIG10aW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sYXN0X2NoZWNrZWQKKworICAgIGRlZiBtb2RpZmllZChzZWxmKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgc2VsZi5sYXN0X2NoZWNrZWQgPSB0aW1lLnRpbWUoKQorCisgICAgZGVmIHNldF91cmwoc2VsZiwgdXJsKToKKyAgICAgICAgc2VsZi51cmwgPSB1cmwKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBpbXBvcnQgdXJsbGliCisgICAgICAgIHNlbGYucGFyc2UodXJsbGliLnVybG9wZW4oc2VsZi51cmwpLnJlYWRsaW5lcygpKQorCisgICAgZGVmIHBhcnNlKHNlbGYsIGxpbmVzKToKKyAgICAgICAgIiIicGFyc2UgdGhlIGlucHV0IGxpbmVzIGZyb20gYSByb2JvdC50eHQgZmlsZSIiIgorICAgICAgICBpbXBvcnQgc3RyaW5nLCByZQorICAgICAgICBhY3RpdmUgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6IHByaW50ICc+JywgbGluZSwKKyAgICAgICAgICAgICMgYmxhbmsgbGluZSB0ZXJtaW5hdGVzIGN1cnJlbnQgcmVjb3JkCisgICAgICAgICAgICBpZiBub3QgbGluZVs6LTFdOgorICAgICAgICAgICAgICAgIGFjdGl2ZSA9IFtdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgcmVtb3ZlIG9wdGlvbmFsIGNvbW1lbnQgYW5kIHN0cmlwIGxpbmUKKyAgICAgICAgICAgIGxpbmUgPSBzdHJpbmcuc3RyaXAobGluZVs6c3RyaW5nLmZpbmQobGluZSwgJyMnKV0pCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGluZSA9IHJlLnNwbGl0KCcgKjogKicsIGxpbmUpCisgICAgICAgICAgICBpZiBsZW4obGluZSkgPT0gMjoKKyAgICAgICAgICAgICAgICBsaW5lWzBdID0gc3RyaW5nLmxvd2VyKGxpbmVbMF0pCisgICAgICAgICAgICAgICAgaWYgbGluZVswXSA9PSAndXNlci1hZ2VudCc6CisgICAgICAgICAgICAgICAgICAgICMgdGhpcyByZWNvcmQgYXBwbGllcyB0byB0aGlzIHVzZXIgYWdlbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzogcHJpbnQgJz4+IHVzZXItYWdlbnQ6JywgbGluZVsxXQorICAgICAgICAgICAgICAgICAgICBhY3RpdmUuYXBwZW5kKGxpbmVbMV0pCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJ1bGVzLmhhc19rZXkobGluZVsxXSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bGVzW2xpbmVbMV1dID0gW10KKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gJ2Rpc2FsbG93JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZVsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6IHByaW50ICc+PiBkaXNhbGxvdzonLCBsaW5lWzFdCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWdlbnQgaW4gYWN0aXZlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVsZXNbYWdlbnRdLmFwcGVuZChyZS5jb21waWxlKGxpbmVbMV0pKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFnZW50IGluIGFjdGl2ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOiBwcmludCAnPj4gYWxsb3cnLCBhZ2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVsZXNbYWdlbnRdID0gW10KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOiBwcmludCAnPj4gdW5rbm93bjonLCBsaW5lCisKKyAgICAgICAgc2VsZi5tb2RpZmllZCgpCisKKyAgICAjIHJldHVybnMgdHJ1ZSBpZiBhZ2VudCBpcyBhbGxvd2VkIHRvIGZldGNoIHVybAorICAgIGRlZiBjYW5fZmV0Y2goc2VsZiwgdXNlcmFnZW50LCB1cmwpOgorICAgICAgICAiIiJ1c2luZyB0aGUgcGFyc2VkIHJvYm90cy50eHQgZGVjaWRlIGlmIHVzZXJhZ2VudCBjYW4gZmV0Y2ggdXJsIiIiCisgICAgICAgIGltcG9ydCB1cmxwYXJzZQorICAgICAgICBhZyA9IHVzZXJhZ2VudAorICAgICAgICBpZiBub3Qgc2VsZi5ydWxlcy5oYXNfa2V5KGFnKTogYWcgPSAnKicKKyAgICAgICAgaWYgbm90IHNlbGYucnVsZXMuaGFzX2tleShhZyk6CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOiBwcmludCAnPj4gYWxsb3dpbmcnLCB1cmwsICdmZXRjaCBieScsIHVzZXJhZ2VudAorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcGF0aCA9IHVybHBhcnNlLnVybHBhcnNlKHVybClbMl0KKyAgICAgICAgZm9yIHJ1bGUgaW4gc2VsZi5ydWxlc1thZ106CisgICAgICAgICAgICBpZiBydWxlLm1hdGNoKHBhdGgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6IHByaW50ICc+PiBkaXNhbGxvd2luZycsIHVybCwgJ2ZldGNoIGJ5JywgdXNlcmFnZW50CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaWYgc2VsZi5kZWJ1ZzogcHJpbnQgJz4+IGFsbG93aW5nJywgdXJsLCAnZmV0Y2ggYnknLCB1c2VyYWdlbnQKKyAgICAgICAgcmV0dXJuIDEKKworZGVmIF90ZXN0KCk6CisgICAgcnAgPSBSb2JvdEZpbGVQYXJzZXIoKQorICAgIHJwLmRlYnVnID0gMQorICAgIHJwLnNldF91cmwoJ2h0dHA6Ly93d3cubXVzaS1jYWwuY29tL3JvYm90cy50eHQnKQorICAgIHJwLnJlYWQoKQorICAgIHByaW50IHJwLnJ1bGVzCisgICAgcHJpbnQgcnAuY2FuX2ZldGNoKCcqJywgJ2h0dHA6Ly93d3cubXVzaS1jYWwuY29tLmNvbS8nKQorICAgIHByaW50IHJwLmNhbl9mZXRjaCgnTXVzaS1DYWwtUm9ib3QnLAorICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3dy5tdXNpLWNhbC5jb20vY2dpLWJpbi9ldmVudC1zZWFyY2g/Y2l0eT1TYW4rRnJhbmNpc2NvJykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9zaW1wbGVodC5weSBiL0xpYi9kb3MtOHgzL3NpbXBsZWh0LnB5CmluZGV4IDkyNjBlN2UuLmE0NTE3ZGMgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3NpbXBsZWh0LnB5CisrKyBiL0xpYi9kb3MtOHgzL3NpbXBsZWh0LnB5CkBAIC0xMCwxMyArMTAsMTAgQEAKIAogCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKLWltcG9ydCB0aW1lCi1pbXBvcnQgc29ja2V0CiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgcG9zaXhwYXRoCi1pbXBvcnQgU29ja2V0U2VydmVyCiBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKK2ltcG9ydCB1cmxsaWIKIAogCiBjbGFzcyBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CkBAIC04MSw3ICs3OCw3IEBACiAgICAgICAgIHByb2JhYmx5IGJlIGRpYWdub3NlZC4pCiAKICAgICAgICAgIiIiCi0gICAgICAgIHBhdGggPSBwb3NpeHBhdGgubm9ybXBhdGgocGF0aCkKKyAgICAgICAgcGF0aCA9IHBvc2l4cGF0aC5ub3JtcGF0aCh1cmxsaWIudW5xdW90ZShwYXRoKSkKICAgICAgICAgd29yZHMgPSBzdHJpbmcuc3BsaXRmaWVsZHMocGF0aCwgJy8nKQogICAgICAgICB3b3JkcyA9IGZpbHRlcihOb25lLCB3b3JkcykKICAgICAgICAgcGF0aCA9IG9zLmdldGN3ZCgpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9zb2NrZXRzZS5weSBiL0xpYi9kb3MtOHgzL3NvY2tldHNlLnB5CmluZGV4IDIzZjNhOGUuLjJjNzMzNTYgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3NvY2tldHNlLnB5CisrKyBiL0xpYi9kb3MtOHgzL3NvY2tldHNlLnB5CkBAIC0yMDcsNyArMjA3LDEwIEBACiAKICAgICBkZWYgaGFuZGxlX3JlcXVlc3Qoc2VsZik6CiAgICAgICAgICIiIkhhbmRsZSBvbmUgcmVxdWVzdCwgcG9zc2libHkgYmxvY2tpbmcuIiIiCi0gICAgICAgIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzID0gc2VsZi5nZXRfcmVxdWVzdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzID0gc2VsZi5nZXRfcmVxdWVzdCgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgc2VsZi52ZXJpZnlfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCkBAIC0yNzgsMTEgKzI4MSwyMSBAQAogICAgICIiIk1peC1pbiBjbGFzcyB0byBoYW5kbGUgZWFjaCByZXF1ZXN0IGluIGEgbmV3IHByb2Nlc3MuIiIiCiAKICAgICBhY3RpdmVfY2hpbGRyZW4gPSBOb25lCisgICAgbWF4X2NoaWxkcmVuID0gNDAKIAogICAgIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgogICAgICAgICAiIiJJbnRlcm5hbCByb3V0aW5lIHRvIHdhaXQgZm9yIGRpZWQgY2hpbGRyZW4uIiIiCiAgICAgICAgIHdoaWxlIHNlbGYuYWN0aXZlX2NoaWxkcmVuOgotICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKDAsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5hY3RpdmVfY2hpbGRyZW4pIDwgc2VsZi5tYXhfY2hpbGRyZW46CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9zLldOT0hBTkcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBJZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYXJlIGFscmVhZHkKKyAgICAgICAgICAgICAgICAjIHJ1bm5pbmcsIGJsb2NrIHdoaWxlIHdhaXRpbmcgZm9yIGEgY2hpbGQgdG8gZXhpdAorICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAwCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKDAsIG9wdGlvbnMpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGlkID0gTm9uZQogICAgICAgICAgICAgaWYgbm90IHBpZDogYnJlYWsKICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLnJlbW92ZShwaWQpCiAKQEAgLTMwMCw2ICszMTMsNyBAQAogICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzLgogICAgICAgICAgICAgIyBUaGlzIG11c3QgbmV2ZXIgcmV0dXJuLCBoZW5jZSBvcy5fZXhpdCgpIQogICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKICAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQogICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCiAgICAgICAgICAgICBleGNlcHQ6CkBAIC0zMTEsMTQgKzMyNSwxNCBAQAogCiAKIGNsYXNzIFRocmVhZGluZ01peEluOgotCiAgICAgIiIiTWl4LWluIGNsYXNzIHRvIGhhbmRsZSBlYWNoIHJlcXVlc3QgaW4gYSBuZXcgdGhyZWFkLiIiIgogCiAgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CiAgICAgICAgICIiIlN0YXJ0IGEgbmV3IHRocmVhZCB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LiIiIgotICAgICAgICBpbXBvcnQgdGhyZWFkCi0gICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHNlbGYuZmluaXNoX3JlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykpCisgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0ID0gc2VsZi5maW5pc2hfcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykpCisgICAgICAgIHQuc3RhcnQoKQogCiAKIGNsYXNzIEZvcmtpbmdVRFBTZXJ2ZXIoRm9ya2luZ01peEluLCBVRFBTZXJ2ZXIpOiBwYXNzCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9zcmVfY29tcC5weSBiL0xpYi9kb3MtOHgzL3NyZV9jb21wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MzgwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZG9zLTh4My9zcmVfY29tcC5weQpAQCAtMCwwICsxLDE4NyBAQAorIworIyBTZWNyZXQgTGFicycgUmVndWxhciBFeHByZXNzaW9uIEVuZ2luZQorIyAkSWQkCisjCisjIGNvbnZlcnQgdGVtcGxhdGUgdG8gaW50ZXJuYWwgZm9ybWF0CisjCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIDEuNiBhbHBoYSB0ZXN0aW5nLiAgQWxsIG90aGVyIHVzZQorIyByZXF1aXJlIGV4cGxpY2l0IHBlcm1pc3Npb24gZnJvbSBTZWNyZXQgTGFicyBBQi4KKyMKKyMgUG9ydGlvbnMgb2YgdGhpcyBlbmdpbmUgaGF2ZSBiZWVuIGRldmVsb3BlZCBpbiBjb29wZXJhdGlvbiB3aXRoCisjIENOUkkuICBIZXdsZXR0LVBhY2thcmQgcHJvdmlkZWQgZnVuZGluZyBmb3IgMS42IGludGVncmF0aW9uIGFuZAorIyBvdGhlciBjb21wYXRpYmlsaXR5IHdvcmsuCisjCisKKyMgRklYTUU6IDxmbD4gZm9ybWFsaXplIChvYmplY3RpZnk/KSBhbmQgZG9jdW1lbnQgdGhlIGNvbXBpbGVyIGNvZGUKKyMgZm9ybWF0LCBzbyB0aGF0IG90aGVyIGZyb250ZW5kcyBjYW4gdXNlIHRoaXMgY29tcGlsZXIKKworaW1wb3J0IGFycmF5LCBzdHJpbmcsIHN5cworCitpbXBvcnQgX3NyZQorCitmcm9tIHNyZV9jb25zdGFudHMgaW1wb3J0ICoKKworIyBmaW5kIGFuIGFycmF5IHR5cGUgY29kZSB0aGF0IG1hdGNoZXMgdGhlIGVuZ2luZSdzIGNvZGUgc2l6ZQorZm9yIFdPUkRTSVpFIGluICJCSGlsIjoKKyAgICBpZiBsZW4oYXJyYXkuYXJyYXkoV09SRFNJWkUsIFswXSkudG9zdHJpbmcoKSkgPT0gX3NyZS5nZXRjb2Rlc2l6ZSgpOgorCWJyZWFrCitlbHNlOgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImNhbm5vdCBmaW5kIGEgdXNlYWJsZSBhcnJheSB0eXBlIgorCisjIEZJWE1FOiA8Zmw+IHNob3VsZCBtb3ZlIHNvbWUgb3B0aW1pemF0aW9ucyBmcm9tIHRoZSBwYXJzZXIgdG8gaGVyZSEKKworY2xhc3MgQ29kZToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisJc2VsZi5kYXRhID0gW10KKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKwlyZXR1cm4gbGVuKHNlbGYuZGF0YSkKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorCXJldHVybiBzZWxmLmRhdGFbaW5kZXhdCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBjb2RlKToKKwlzZWxmLmRhdGFbaW5kZXhdID0gY29kZQorICAgIGRlZiBhcHBlbmQoc2VsZiwgY29kZSk6CisJc2VsZi5kYXRhLmFwcGVuZChjb2RlKQorICAgIGRlZiB0b2RhdGEoc2VsZik6CisJIyBwcmludCBzZWxmLmRhdGEKKwlyZXR1cm4gYXJyYXkuYXJyYXkoV09SRFNJWkUsIHNlbGYuZGF0YSkudG9zdHJpbmcoKQorCitkZWYgX2xvd2VyKGxpdGVyYWwpOgorICAgICMgcmV0dXJuIF9zcmUuX2xvd2VyKGxpdGVyYWwpICMgRklYTUUKKyAgICByZXR1cm4gc3RyaW5nLmxvd2VyKGxpdGVyYWwpCisKK2RlZiBfY29tcGlsZShjb2RlLCBwYXR0ZXJuLCBmbGFncyk6CisgICAgYXBwZW5kID0gY29kZS5hcHBlbmQKKyAgICBmb3Igb3AsIGF2IGluIHBhdHRlcm46CisJaWYgb3AgaXMgQU5ZOgorCSAgICBpZiAicyIgaW4gZmxhZ3M6CisJCWFwcGVuZChDT0RFU1tvcF0pICMgYW55IGNoYXJhY3RlciBhdCBhbGwhCisJICAgIGVsc2U6CisJCWFwcGVuZChDT0RFU1tOT1RfTElURVJBTF0pCisJCWFwcGVuZCgxMCkKKwllbGlmIG9wIGluIChTVUNDRVNTLCBGQUlMVVJFKToKKwkgICAgYXBwZW5kKENPREVTW29wXSkKKwllbGlmIG9wIGlzIEFUOgorCSAgICBhcHBlbmQoQ09ERVNbb3BdKQorCSAgICBhcHBlbmQoUE9TSVRJT05TW2F2XSkKKwllbGlmIG9wIGlzIEJSQU5DSDoKKwkgICAgYXBwZW5kKENPREVTW29wXSkKKwkgICAgdGFpbCA9IFtdCisJICAgIGZvciBhdiBpbiBhdlsxXToKKwkJc2tpcCA9IGxlbihjb2RlKTsgYXBwZW5kKDApCisJCV9jb21waWxlKGNvZGUsIGF2LCBmbGFncykKKwkJYXBwZW5kKENPREVTW0pVTVBdKQorCQl0YWlsLmFwcGVuZChsZW4oY29kZSkpOyBhcHBlbmQoMCkKKwkJY29kZVtza2lwXSA9IGxlbihjb2RlKSAtIHNraXAKKwkgICAgYXBwZW5kKDApICMgZW5kIG9mIGJyYW5jaAorCSAgICBmb3IgdGFpbCBpbiB0YWlsOgorCQljb2RlW3RhaWxdID0gbGVuKGNvZGUpIC0gdGFpbAorCWVsaWYgb3AgaXMgQ0FMTDoKKwkgICAgYXBwZW5kKENPREVTW29wXSkKKwkgICAgc2tpcCA9IGxlbihjb2RlKTsgYXBwZW5kKDApCisJICAgIF9jb21waWxlKGNvZGUsIGF2LCBmbGFncykKKwkgICAgYXBwZW5kKENPREVTW1NVQ0NFU1NdKQorCSAgICBjb2RlW3NraXBdID0gbGVuKGNvZGUpIC0gc2tpcAorCWVsaWYgb3AgaXMgQ0FURUdPUlk6ICMgbm90IHVzZWQgYnkgY3VycmVudCBwYXJzZXIKKwkgICAgYXBwZW5kKENPREVTW29wXSkKKwkgICAgYXBwZW5kKENBVEVHT1JJRVNbYXZdKQorCWVsaWYgb3AgaXMgR1JPVVA6CisJICAgIGlmICJpIiBpbiBmbGFnczoKKwkJYXBwZW5kKENPREVTW01BUF9JR05PUkVbb3BdXSkKKwkgICAgZWxzZToKKwkJYXBwZW5kKENPREVTW29wXSkKKwkgICAgYXBwZW5kKGF2KQorCWVsaWYgb3AgaXMgSU46CisJICAgIGlmICJpIiBpbiBmbGFnczoKKwkJYXBwZW5kKENPREVTW01BUF9JR05PUkVbb3BdXSkKKwkJZGVmIGZpeHVwKGxpdGVyYWwpOgorCQkgICAgcmV0dXJuIG9yZChfbG93ZXIobGl0ZXJhbCkpCisJICAgIGVsc2U6CisJCWFwcGVuZChDT0RFU1tvcF0pCisJCWZpeHVwID0gb3JkCisJICAgIHNraXAgPSBsZW4oY29kZSk7IGFwcGVuZCgwKQorCSAgICBmb3Igb3AsIGF2IGluIGF2OgorCQlhcHBlbmQoQ09ERVNbb3BdKQorCQlpZiBvcCBpcyBORUdBVEU6CisJCSAgICBwYXNzCisJCWVsaWYgb3AgaXMgTElURVJBTDoKKwkJICAgIGFwcGVuZChmaXh1cChhdikpCisJCWVsaWYgb3AgaXMgUkFOR0U6CisJCSAgICBhcHBlbmQoZml4dXAoYXZbMF0pKQorCQkgICAgYXBwZW5kKGZpeHVwKGF2WzFdKSkKKwkJZWxpZiBvcCBpcyBDQVRFR09SWToKKwkJICAgIGFwcGVuZChDQVRFR09SSUVTW2F2XSkKKwkJZWxzZToKKwkJICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bnN1cHBvcnRlZCBzZXQgb3BlcmF0b3IiCisJICAgIGFwcGVuZChDT0RFU1tGQUlMVVJFXSkKKwkgICAgY29kZVtza2lwXSA9IGxlbihjb2RlKSAtIHNraXAKKwllbGlmIG9wIGluIChMSVRFUkFMLCBOT1RfTElURVJBTCk6CisJICAgIGlmICJpIiBpbiBmbGFnczoKKwkJYXBwZW5kKENPREVTW01BUF9JR05PUkVbb3BdXSkKKwkJYXBwZW5kKG9yZChfbG93ZXIoYXYpKSkKKwkgICAgZWxzZToKKwkJYXBwZW5kKENPREVTW29wXSkKKwkJYXBwZW5kKG9yZChhdikpCisJZWxpZiBvcCBpcyBNQVJLOgorCSAgICBhcHBlbmQoQ09ERVNbb3BdKQorCSAgICBhcHBlbmQoYXYpCisgCWVsaWYgb3AgaW4gKFJFUEVBVCwgTUlOX1JFUEVBVCwgTUFYX1JFUEVBVCk6CisJICAgIGxvLCBoaSA9IGF2WzJdLmdldHdpZHRoKCkKKyAJICAgIGlmIGxvID09IDA6CisgCQlyYWlzZSBTeW50YXhFcnJvciwgImNhbm5vdCByZXBlYXQgemVyby13aWR0aCBpdGVtcyIKKwkgICAgaWYgbG8gPT0gaGkgPT0gMSBhbmQgb3AgaXMgTUFYX1JFUEVBVDoKKwkJYXBwZW5kKENPREVTW01BWF9SRVBFQVRfT05FXSkKKwkJc2tpcCA9IGxlbihjb2RlKTsgYXBwZW5kKDApCisJCWFwcGVuZChhdlswXSkKKwkJYXBwZW5kKGF2WzFdKQorCQlfY29tcGlsZShjb2RlLCBhdlsyXSwgZmxhZ3MpCisJCWFwcGVuZChDT0RFU1tTVUNDRVNTXSkKKwkJY29kZVtza2lwXSA9IGxlbihjb2RlKSAtIHNraXAKKwkgICAgZWxzZToKKwkJYXBwZW5kKENPREVTW29wXSkKKwkJc2tpcCA9IGxlbihjb2RlKTsgYXBwZW5kKDApCisJCWFwcGVuZChhdlswXSkKKwkJYXBwZW5kKGF2WzFdKQorCQlfY29tcGlsZShjb2RlLCBhdlsyXSwgZmxhZ3MpCisJCWlmIG9wIGlzIE1JTl9SRVBFQVQ6CisJCSAgICBhcHBlbmQoQ09ERVNbTUlOX1VOVElMXSkKKwkJZWxzZToKKwkJICAgICMgRklYTUU6IE1BWF9SRVBFQVQgUFJPQkFCTFkgRE9FU04nVCBXT1JLICg/KQorCQkgICAgYXBwZW5kKENPREVTW01BWF9VTlRJTF0pCisJCWNvZGVbc2tpcF0gPSBsZW4oY29kZSkgLSBza2lwCisJZWxpZiBvcCBpcyBTVUJQQVRURVJOOgorIyMgCSAgICBncm91cCA9IGF2WzBdCisjIyAJICAgIGlmIGdyb3VwOgorIyMgCQlhcHBlbmQoQ09ERVNbTUFSS10pCisjIyAJCWFwcGVuZCgoZ3JvdXAtMSkqMikKKwkgICAgX2NvbXBpbGUoY29kZSwgYXZbMV0sIGZsYWdzKQorIyMgCSAgICBpZiBncm91cDoKKyMjIAkJYXBwZW5kKENPREVTW01BUktdKQorIyMgCQlhcHBlbmQoKGdyb3VwLTEpKjIrMSkKKwllbHNlOgorCSAgICByYWlzZSBWYWx1ZUVycm9yLCAoInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZSIsIG9wKQorCitkZWYgY29tcGlsZShwLCBmbGFncz0oKSk6CisgICAgIyBjb252ZXJ0IHBhdHRlcm4gbGlzdCB0byBpbnRlcm5hbCBmb3JtYXQKKyAgICBpZiB0eXBlKHApIGluICh0eXBlKCIiKSwgdHlwZSh1IiIpKToKKwlpbXBvcnQgc3JlX3BhcnNlCisJcGF0dGVybiA9IHAKKwlwID0gc3JlX3BhcnNlLnBhcnNlKHApCisgICAgZWxzZToKKwlwYXR0ZXJuID0gTm9uZQorICAgICMgcHJpbnQgcC5nZXR3aWR0aCgpCisgICAgIyBwcmludCBwCisgICAgY29kZSA9IENvZGUoKQorICAgIF9jb21waWxlKGNvZGUsIHAuZGF0YSwgcC5wYXR0ZXJuLmZsYWdzKQorICAgIGNvZGUuYXBwZW5kKENPREVTW1NVQ0NFU1NdKQorICAgICMgcHJpbnQgbGlzdChjb2RlLmRhdGEpCisgICAgZGF0YSA9IGNvZGUudG9kYXRhKCkKKyAgICBpZiAwOiAjIGRlYnVnZ2luZworCXByaW50CisJcHJpbnQgIi0iICogNjgKKwlpbXBvcnQgc3JlX2Rpc2FzbQorCXNyZV9kaXNhc20uZGlzYXNtKGRhdGEpCisJcHJpbnQgIi0iICogNjgKKyAgICAjIHByaW50IGxlbihkYXRhKSwgcC5wYXR0ZXJuLmdyb3VwcywgbGVuKHAucGF0dGVybi5ncm91cGRpY3QpCisgICAgcmV0dXJuIF9zcmUuY29tcGlsZShwYXR0ZXJuLCBkYXRhLCBwLnBhdHRlcm4uZ3JvdXBzLTEsIHAucGF0dGVybi5ncm91cGRpY3QpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9zcmVfY29ucy5weSBiL0xpYi9kb3MtOHgzL3NyZV9jb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODgzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZG9zLTh4My9zcmVfY29ucy5weQpAQCAtMCwwICsxLDEzMSBAQAorIworIyBTZWNyZXQgTGFicycgUmVndWxhciBFeHByZXNzaW9uIEVuZ2luZQorIyAkSWQkCisjCisjIHZhcmlvdXMgc3ltYm9scyB1c2VkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lLgorIyBydW4gdGhpcyBzY3JpcHQgdG8gdXBkYXRlIHRoZSBfc3JlIGluY2x1ZGUgZmlsZXMhCisjCisjIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIDEuNiBhbHBoYSB0ZXN0aW5nLiAgQWxsIG90aGVyIHVzZQorIyByZXF1aXJlIGV4cGxpY2l0IHBlcm1pc3Npb24gZnJvbSBTZWNyZXQgTGFicyBBQi4KKyMKKyMgUG9ydGlvbnMgb2YgdGhpcyBlbmdpbmUgaGF2ZSBiZWVuIGRldmVsb3BlZCBpbiBjb29wZXJhdGlvbiB3aXRoCisjIENOUkkuICBIZXdsZXR0LVBhY2thcmQgcHJvdmlkZWQgZnVuZGluZyBmb3IgMS42IGludGVncmF0aW9uIGFuZAorIyBvdGhlciBjb21wYXRpYmlsaXR5IHdvcmsuCisjCisKKyMgb3BlcmF0b3JzCisKK0ZBSUxVUkUgPSAiZmFpbHVyZSIKK1NVQ0NFU1MgPSAic3VjY2VzcyIKKworQU5ZID0gImFueSIKK0FTU0VSVCA9ICJhc3NlcnQiCitBVCA9ICJhdCIKK0JSQU5DSCA9ICJicmFuY2giCitDQUxMID0gImNhbGwiCitDQVRFR09SWSA9ICJjYXRlZ29yeSIKK0dST1VQID0gImdyb3VwIgorR1JPVVBfSUdOT1JFID0gImdyb3VwX2lnbm9yZSIKK0lOID0gImluIgorSU5fSUdOT1JFID0gImluX2lnbm9yZSIKK0pVTVAgPSAianVtcCIKK0xJVEVSQUwgPSAibGl0ZXJhbCIKK0xJVEVSQUxfSUdOT1JFID0gImxpdGVyYWxfaWdub3JlIgorTUFSSyA9ICJtYXJrIgorTUFYX1JFUEVBVCA9ICJtYXhfcmVwZWF0IgorTUFYX1JFUEVBVF9PTkUgPSAibWF4X3JlcGVhdF9vbmUiCitNQVhfVU5USUwgPSAibWF4X3VudGlsIgorTUlOX1JFUEVBVCA9ICJtaW5fcmVwZWF0IgorTUlOX1VOVElMID0gIm1pbl91bnRpbCIKK05FR0FURSA9ICJuZWdhdGUiCitOT1RfTElURVJBTCA9ICJub3RfbGl0ZXJhbCIKK05PVF9MSVRFUkFMX0lHTk9SRSA9ICJub3RfbGl0ZXJhbF9pZ25vcmUiCitSQU5HRSA9ICJyYW5nZSIKK1JFUEVBVCA9ICJyZXBlYXQiCitTVUJQQVRURVJOID0gInN1YnBhdHRlcm4iCisKKyMgcG9zaXRpb25zCitBVF9CRUdJTk5JTkcgPSAiYXRfYmVnaW5uaW5nIgorQVRfQk9VTkRBUlkgPSAiYXRfYm91bmRhcnkiCitBVF9OT05fQk9VTkRBUlkgPSAiYXRfbm9uX2JvdW5kYXJ5IgorQVRfRU5EID0gImF0X2VuZCIKKworIyBjYXRlZ29yaWVzCisKK0NBVEVHT1JZX0RJR0lUID0gImNhdGVnb3J5X2RpZ2l0IgorQ0FURUdPUllfTk9UX0RJR0lUID0gImNhdGVnb3J5X25vdF9kaWdpdCIKK0NBVEVHT1JZX1NQQUNFID0gImNhdGVnb3J5X3NwYWNlIgorQ0FURUdPUllfTk9UX1NQQUNFID0gImNhdGVnb3J5X25vdF9zcGFjZSIKK0NBVEVHT1JZX1dPUkQgPSAiY2F0ZWdvcnlfd29yZCIKK0NBVEVHT1JZX05PVF9XT1JEID0gImNhdGVnb3J5X25vdF93b3JkIgorCitDT0RFUyA9IFsKKworICAgICMgZmFpbHVyZT0wIHN1Y2Nlc3M9MSAoanVzdCBiZWNhdXNlIGl0IGxvb2tzIGJldHRlciB0aGF0IHdheSA6LSkKKyAgICBGQUlMVVJFLCBTVUNDRVNTLAorCisgICAgQU5ZLAorICAgIEFTU0VSVCwKKyAgICBBVCwKKyAgICBCUkFOQ0gsCisgICAgQ0FMTCwKKyAgICBDQVRFR09SWSwKKyAgICBHUk9VUCwgR1JPVVBfSUdOT1JFLAorICAgIElOLCBJTl9JR05PUkUsCisgICAgSlVNUCwKKyAgICBMSVRFUkFMLCBMSVRFUkFMX0lHTk9SRSwKKyAgICBNQVJLLAorICAgIE1BWF9SRVBFQVQsIE1BWF9VTlRJTCwKKyAgICBNQVhfUkVQRUFUX09ORSwKKyAgICBNSU5fUkVQRUFULCBNSU5fVU5USUwsCisgICAgTk9UX0xJVEVSQUwsIE5PVF9MSVRFUkFMX0lHTk9SRSwKKyAgICBORUdBVEUsCisgICAgUkFOR0UsCisgICAgUkVQRUFUCisKK10KKworIyBjb252ZXJ0IHRvIGRpY3Rpb25hcnkKK2MgPSB7fQoraSA9IDAKK2ZvciBjb2RlIGluIENPREVTOgorICAgIGNbY29kZV0gPSBpCisgICAgaSA9IGkgKyAxCitDT0RFUyA9IGMKKworIyByZXBsYWNlbWVudCBvcGVyYXRpb25zIGZvciAiaWdub3JlIGNhc2UiIG1vZGUKK01BUF9JR05PUkUgPSB7CisgICAgR1JPVVA6IEdST1VQX0lHTk9SRSwKKyAgICBJTjogSU5fSUdOT1JFLAorICAgIExJVEVSQUw6IExJVEVSQUxfSUdOT1JFLAorICAgIE5PVF9MSVRFUkFMOiBOT1RfTElURVJBTF9JR05PUkUKK30KKworUE9TSVRJT05TID0geworICAgIEFUX0JFR0lOTklORzogb3JkKCJhIiksCisgICAgQVRfQk9VTkRBUlk6IG9yZCgiYiIpLAorICAgIEFUX05PTl9CT1VOREFSWTogb3JkKCJCIiksCisgICAgQVRfRU5EOiBvcmQoInoiKSwKK30KKworQ0FURUdPUklFUyA9IHsKKyAgICBDQVRFR09SWV9ESUdJVDogb3JkKCJkIiksCisgICAgQ0FURUdPUllfTk9UX0RJR0lUOiBvcmQoIkQiKSwKKyAgICBDQVRFR09SWV9TUEFDRTogb3JkKCJzIiksCisgICAgQ0FURUdPUllfTk9UX1NQQUNFOiBvcmQoIlMiKSwKKyAgICBDQVRFR09SWV9XT1JEOiBvcmQoInciKSwKKyAgICBDQVRFR09SWV9OT1RfV09SRDogb3JkKCJXIiksCit9CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHN0cmluZworICAgIGl0ZW1zID0gQ09ERVMuaXRlbXMoKQorICAgIGl0ZW1zLnNvcnQobGFtYmRhIGEsIGI6IGNtcChhWzFdLCBiWzFdKSkKKyAgICBmID0gb3Blbigic3JlX2NvbnN0YW50cy5oIiwgInciKQorICAgIGYud3JpdGUoIi8qIGdlbmVyYXRlZCBieSBzcmVfY29uc3RhbnRzLnB5ICovXG4iKQorICAgIGZvciBrLCB2IGluIGl0ZW1zOgorCWYud3JpdGUoIiNkZWZpbmUgU1JFX09QXyIgKyBzdHJpbmcudXBwZXIoaykgKyAiICIgKyBzdHIodikgKyAiXG4iKQorICAgIGYuY2xvc2UoKQorICAgIHByaW50ICJkb25lIgpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvc3JlX3BhcnMucHkgYi9MaWIvZG9zLTh4My9zcmVfcGFycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjY4ZWExCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvc3JlX3BhcnMucHkKQEAgLTAsMCArMSw0OTcgQEAKKyMKKyMgU2VjcmV0IExhYnMnIFJlZ3VsYXIgRXhwcmVzc2lvbiBFbmdpbmUKKyMgJElkJAorIworIyBjb252ZXJ0IHJlLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBTUkUgdGVtcGxhdGUuICB0aGUgY3VycmVudAorIyBpbXBsZW1lbnRhdGlvbiBpcyBzb21ld2hhdCBpbmNvbXBsZXRlLCBhbmQgbm90IHZlcnkgZmFzdC4gIHNob3VsZAorIyBkZWZpbml0ZWx5IGJlIHJld3JpdHRlbiBiZWZvcmUgUHl0aG9uIDEuNiBnb2VzIGJldGEuCisjCisjIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIDEuNiBhbHBoYSB0ZXN0aW5nLiAgQWxsIG90aGVyIHVzZQorIyByZXF1aXJlIGV4cGxpY2l0IHBlcm1pc3Npb24gZnJvbSBTZWNyZXQgTGFicyBBQi4KKyMKKyMgUG9ydGlvbnMgb2YgdGhpcyBlbmdpbmUgaGF2ZSBiZWVuIGRldmVsb3BlZCBpbiBjb29wZXJhdGlvbiB3aXRoCisjIENOUkkuICBIZXdsZXR0LVBhY2thcmQgcHJvdmlkZWQgZnVuZGluZyBmb3IgMS42IGludGVncmF0aW9uIGFuZAorIyBvdGhlciBjb21wYXRpYmlsaXR5IHdvcmsuCisjCisKKyMgRklYTUU6IGNvbW1lbnRzIG1hcmtlZCB3aXRoIHRoZSBGSVhNRSB0YWcgYXJlIG9wZW4gaXNzdWVzLiAgYWxsIHN1Y2gKKyMgaXNzdWVzIHNob3VsZCBiZSBjbG9zZWQgYmVmb3JlIHRoZSBmaW5hbCBiZXRhLgorCitpbXBvcnQgc3RyaW5nLCBzeXMKKworZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCAqCisKK1NQRUNJQUxfQ0hBUlMgPSAiLlxcW3soKSorP14kfCIKK1JFUEVBVF9DSEFSUyAgPSAiKis/eyIKKworIyBGSVhNRTogc3RyaW5nIGluIHR1cGxlIHRlc3RzIG1heSBleHBsb2RlIHdpdGggaWYgY2hhciBpcyB1bmljb2RlIDotKAorRElHSVRTID0gdHVwbGUoc3RyaW5nLmRpZ2l0cykKKworT0NURElHSVRTID0gdHVwbGUoIjAxMjM0NTY3IikKK0hFWERJR0lUUyA9IHR1cGxlKCIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGIikKKworRVNDQVBFUyA9IHsKKyAgICAiXFxhIjogKExJVEVSQUwsIGNocig3KSksCisgICAgIlxcYiI6IChMSVRFUkFMLCBjaHIoOCkpLAorICAgICJcXGYiOiAoTElURVJBTCwgY2hyKDEyKSksCisgICAgIlxcbiI6IChMSVRFUkFMLCBjaHIoMTApKSwKKyAgICAiXFxyIjogKExJVEVSQUwsIGNocigxMykpLAorICAgICJcXHQiOiAoTElURVJBTCwgY2hyKDkpKSwKKyAgICAiXFx2IjogKExJVEVSQUwsIGNocigxMSkpCit9CisKK0NBVEVHT1JJRVMgPSB7CisgICAgIlxcQSI6IChBVCwgQVRfQkVHSU5OSU5HKSwgIyBzdGFydCBvZiBzdHJpbmcKKyAgICAiXFxiIjogKEFULCBBVF9CT1VOREFSWSksCisgICAgIlxcQiI6IChBVCwgQVRfTk9OX0JPVU5EQVJZKSwKKyAgICAiXFxkIjogKElOLCBbKENBVEVHT1JZLCBDQVRFR09SWV9ESUdJVCldKSwKKyAgICAiXFxEIjogKElOLCBbKENBVEVHT1JZLCBDQVRFR09SWV9OT1RfRElHSVQpXSksCisgICAgIlxccyI6IChJTiwgWyhDQVRFR09SWSwgQ0FURUdPUllfU1BBQ0UpXSksCisgICAgIlxcUyI6IChJTiwgWyhDQVRFR09SWSwgQ0FURUdPUllfTk9UX1NQQUNFKV0pLAorICAgICJcXHciOiAoSU4sIFsoQ0FURUdPUlksIENBVEVHT1JZX1dPUkQpXSksCisgICAgIlxcVyI6IChJTiwgWyhDQVRFR09SWSwgQ0FURUdPUllfTk9UX1dPUkQpXSksCisgICAgIlxcWiI6IChBVCwgQVRfRU5EKSwgIyBlbmQgb2Ygc3RyaW5nCit9CisKK2NsYXNzIFBhdHRlcm46CisgICAgIyBGSVhNRTogPGZsPiByZW5hbWUgY2xhc3MsIGFuZCBzdG9yZSBmbGFncyBpbiBoZXJlIHRvbyEKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisJc2VsZi5mbGFncyA9IFtdCisJc2VsZi5ncm91cHMgPSAxCisJc2VsZi5ncm91cGRpY3QgPSB7fQorICAgIGRlZiBnZXRncm91cChzZWxmLCBuYW1lPU5vbmUpOgorCWdpZCA9IHNlbGYuZ3JvdXBzCisJc2VsZi5ncm91cHMgPSBnaWQgKyAxCisJaWYgbmFtZToKKwkgICAgc2VsZi5ncm91cGRpY3RbbmFtZV0gPSBnaWQKKwlyZXR1cm4gZ2lkCisgICAgZGVmIHNldGZsYWcoc2VsZiwgZmxhZyk6CisJaWYgZmxhZyBpbiBzZWxmLmZsYWdzOgorCSAgICBzZWxmLmZsYWdzLmFwcGVuZChmbGFnKQorCitjbGFzcyBTdWJQYXR0ZXJuOgorICAgICMgYSBzdWJwYXR0ZXJuLCBpbiBpbnRlcm1lZGlhdGUgZm9ybQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXR0ZXJuLCBkYXRhPU5vbmUpOgorCXNlbGYucGF0dGVybiA9IHBhdHRlcm4KKwlpZiBub3QgZGF0YToKKwkgICAgZGF0YSA9IFtdCisJc2VsZi5kYXRhID0gZGF0YQorCXNlbGYuZmxhZ3MgPSBbXQorCXNlbGYud2lkdGggPSBOb25lCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorCXJldHVybiByZXByKHNlbGYuZGF0YSkKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKwlyZXR1cm4gbGVuKHNlbGYuZGF0YSkKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOgorCWRlbCBzZWxmLmRhdGFbaW5kZXhdCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKwlyZXR1cm4gc2VsZi5kYXRhW2luZGV4XQorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgY29kZSk6CisJc2VsZi5kYXRhW2luZGV4XSA9IGNvZGUKKyAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wKToKKwlyZXR1cm4gU3ViUGF0dGVybihzZWxmLnBhdHRlcm4sIHNlbGYuZGF0YVtzdGFydDpzdG9wXSkKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBjb2RlKToKKwlzZWxmLmRhdGEuaW5zZXJ0KGluZGV4LCBjb2RlKQorICAgIGRlZiBhcHBlbmQoc2VsZiwgY29kZSk6CisJc2VsZi5kYXRhLmFwcGVuZChjb2RlKQorICAgIGRlZiBnZXR3aWR0aChzZWxmKToKKwkjIGRldGVybWluZSB0aGUgd2lkdGggKG1pbiwgbWF4KSBmb3IgdGhpcyBzdWJwYXR0ZXJuCisJaWYgc2VsZi53aWR0aDoKKwkgICAgcmV0dXJuIHNlbGYud2lkdGgKKwlsbyA9IGhpID0gMEwKKwlmb3Igb3AsIGF2IGluIHNlbGYuZGF0YToKKwkgICAgaWYgb3AgaXMgQlJBTkNIOgorCQlsID0gc3lzLm1heGludAorCQloID0gMAorCQlmb3IgYXYgaW4gYXZbMV06CisJCSAgICBpLCBqID0gYXYuZ2V0d2lkdGgoKQorCQkgICAgbCA9IG1pbihsLCBpKQorCQkgICAgaCA9IG1pbihoLCBqKQorCQlsbyA9IGxvICsgaQorCQloaSA9IGhpICsgagorCSAgICBlbGlmIG9wIGlzIENBTEw6CisJCWksIGogPSBhdi5nZXR3aWR0aCgpCisJCWxvID0gbG8gKyBpCisJCWhpID0gaGkgKyBqCisJICAgIGVsaWYgb3AgaXMgU1VCUEFUVEVSTjoKKwkJaSwgaiA9IGF2WzFdLmdldHdpZHRoKCkKKwkJbG8gPSBsbyArIGkKKwkJaGkgPSBoaSArIGoKKwkgICAgZWxpZiBvcCBpbiAoTUlOX1JFUEVBVCwgTUFYX1JFUEVBVCk6CisJCWksIGogPSBhdlsyXS5nZXR3aWR0aCgpCisJCWxvID0gbG8gKyBpICogYXZbMF0KKwkJaGkgPSBoaSArIGogKiBhdlsxXQorCSAgICBlbGlmIG9wIGluIChBTlksIFJBTkdFLCBJTiwgTElURVJBTCwgTk9UX0xJVEVSQUwsIENBVEVHT1JZKToKKwkJbG8gPSBsbyArIDEKKwkJaGkgPSBoaSArIDEKKwkgICAgZWxpZiBvcCA9PSBTVUNDRVNTOgorCQlicmVhaworCXNlbGYud2lkdGggPSBpbnQobWluKGxvLCBzeXMubWF4aW50KSksIGludChtaW4oaGksIHN5cy5tYXhpbnQpKQorCXJldHVybiBzZWxmLndpZHRoCisgICAgZGVmIHNldChzZWxmLCBmbGFnKToKKwlpZiBub3QgZmxhZyBpbiBzZWxmLmZsYWdzOgorCSAgICBzZWxmLmZsYWdzLmFwcGVuZChmbGFnKQorICAgIGRlZiByZXNldChzZWxmLCBmbGFnKToKKwlpZiBmbGFnIGluIHNlbGYuZmxhZ3M6CisJICAgIHNlbGYuZmxhZ3MucmVtb3ZlKGZsYWcpCisKK2NsYXNzIFRva2VuaXplcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyaW5nKToKKwlzZWxmLnN0cmluZyA9IGxpc3Qoc3RyaW5nKQorCXNlbGYubmV4dCA9IHNlbGYuX19uZXh0KCkKKyAgICBkZWYgX19uZXh0KHNlbGYpOgorCWlmIG5vdCBzZWxmLnN0cmluZzoKKwkgICAgcmV0dXJuIE5vbmUKKwljaGFyID0gc2VsZi5zdHJpbmdbMF0KKwlpZiBjaGFyWzBdID09ICJcXCI6CisJICAgIHRyeToKKwkJYyA9IHNlbGYuc3RyaW5nWzFdCisJICAgIGV4Y2VwdCBJbmRleEVycm9yOgorCQlyYWlzZSBTeW50YXhFcnJvciwgImJvZ3VzIGVzY2FwZSIKKwkgICAgY2hhciA9IGNoYXIgKyBjCisJICAgIHRyeToKKwkJaWYgYyA9PSAieCI6CisJCSAgICAjIGhleGFkZWNpbWFsIGNvbnN0YW50CisJCSAgICBmb3IgaSBpbiB4cmFuZ2UoMiwgc3lzLm1heGludCk6CisJCQljID0gc2VsZi5zdHJpbmdbaV0KKwkJCWlmIHN0cihjKSBub3QgaW4gSEVYRElHSVRTOgorCQkJICAgIGJyZWFrCisJCQljaGFyID0gY2hhciArIGMKKwkJZWxpZiBzdHIoYykgaW4gRElHSVRTOgorCQkgICAgIyBkZWNpbWFsIChvciBvY3RhbCkgbnVtYmVyCisJCSAgICBmb3IgaSBpbiB4cmFuZ2UoMiwgc3lzLm1heGludCk6CisJCQljID0gc2VsZi5zdHJpbmdbaV0KKwkJCSMgRklYTUU6IGlmIGxhcmdlciB0aGFuIGN1cnJlbnQgbnVtYmVyIG9mCisJCQkjIGdyb3VwcywgaW50ZXJwcmV0IGFzIGFuIG9jdGFsIG51bWJlciAKKwkJCWlmIHN0cihjKSBub3QgaW4gRElHSVRTOgorCQkJICAgIGJyZWFrCisJCQljaGFyID0gY2hhciArIGMKKwkgICAgZXhjZXB0IEluZGV4RXJyb3I6CisJCXBhc3MgIyB1c2Ugd2hhdCB3ZSd2ZSBnb3QgdGhpcyBmYXIKKwlkZWwgc2VsZi5zdHJpbmdbMDpsZW4oY2hhcildCisJcmV0dXJuIGNoYXIKKyAgICBkZWYgbWF0Y2goc2VsZiwgY2hhcik6CisJaWYgY2hhciA9PSBzZWxmLm5leHQ6CisJICAgIHNlbGYubmV4dCA9IHNlbGYuX19uZXh0KCkKKwkgICAgcmV0dXJuIDEKKwlyZXR1cm4gMAorICAgIGRlZiBtYXRjaF9zZXQoc2VsZiwgc2V0KToKKwlpZiBzZWxmLm5leHQgYW5kIHNlbGYubmV4dCBpbiBzZXQ6CisJICAgIHNlbGYubmV4dCA9IHNlbGYuX19uZXh0KCkKKwkgICAgcmV0dXJuIDEKKwlyZXR1cm4gMAorICAgIGRlZiBnZXQoc2VsZik6CisJdGhpcyA9IHNlbGYubmV4dAorCXNlbGYubmV4dCA9IHNlbGYuX19uZXh0KCkKKwlyZXR1cm4gdGhpcworCitkZWYgX2ZpeGVzY2FwZShlc2NhcGUsIGNoYXJhY3Rlcl9jbGFzcz0wKToKKyAgICAjIGNvbnZlcnQgZXNjYXBlIHRvICh0eXBlLCB2YWx1ZSkKKyAgICBpZiBjaGFyYWN0ZXJfY2xhc3M6CisJIyBpbnNpZGUgYSBjaGFyYWN0ZXIgY2xhc3MsIHdlJ2xsIGxvb2sgaW4gdGhlIGNoYXJhY3RlcgorCSMgZXNjYXBlcyBkaWN0aW9uYXJ5IGZpcnN0CisJY29kZSA9IEVTQ0FQRVMuZ2V0KGVzY2FwZSkKKwlpZiBjb2RlOgorCSAgICByZXR1cm4gY29kZQorCWNvZGUgPSBDQVRFR09SSUVTLmdldChlc2NhcGUpCisgICAgZWxzZToKKwljb2RlID0gQ0FURUdPUklFUy5nZXQoZXNjYXBlKQorCWlmIGNvZGU6CisJICAgIHJldHVybiBjb2RlCisJY29kZSA9IEVTQ0FQRVMuZ2V0KGVzY2FwZSkKKyAgICBpZiBjb2RlOgorCXJldHVybiBjb2RlCisgICAgaWYgbm90IGNoYXJhY3Rlcl9jbGFzczoKKwl0cnk6CisJICAgIGdyb3VwID0gaW50KGVzY2FwZVsxOl0pCisJICAgICMgRklYTUU6IG9ubHkgdmFsaWQgaWYgZ3JvdXAgPD0gY3VycmVudCBudW1iZXIgb2YgZ3JvdXBzCisJICAgIHJldHVybiBHUk9VUCwgZ3JvdXAKKwlleGNlcHQgVmFsdWVFcnJvcjoKKwkgICAgcGFzcworICAgIHRyeToKKwlpZiBlc2NhcGVbMToyXSA9PSAieCI6CisJICAgIGVzY2FwZSA9IGVzY2FwZVsyOl0KKwkgICAgcmV0dXJuIExJVEVSQUwsIGNocihpbnQoZXNjYXBlWy0yOl0sIDE2KSAmIDB4ZmYpCisJZWxpZiBzdHIoZXNjYXBlWzE6Ml0pIGluIERJR0lUUzoKKwkgICAgcmV0dXJuIExJVEVSQUwsIGNocihpbnQoZXNjYXBlWzE6XSwgOCkgJiAweGZmKQorCWVsaWYgbGVuKGVzY2FwZSkgPT0gMjoKKwkgICAgcmV0dXJuIExJVEVSQUwsIGVzY2FwZVsxXQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorCXBhc3MKKyAgICByYWlzZSBTeW50YXhFcnJvciwgImJvZ3VzIGVzY2FwZTogJXMiICUgcmVwcihlc2NhcGUpCisKK2RlZiBfYnJhbmNoKHN1YnBhdHRlcm4sIGl0ZW1zKToKKworICAgICMgZm9ybSBhIGJyYW5jaCBvcGVyYXRvciBmcm9tIGEgc2V0IG9mIGl0ZW1zIChGSVhNRTogbW92ZSB0aGlzCisgICAgIyBvcHRpbWl6YXRpb24gdG8gdGhlIGNvbXBpbGVyIG1vZHVsZSEpCisKKyAgICAjIGNoZWNrIGlmIGFsbCBpdGVtcyBzaGFyZSBhIGNvbW1vbiBwcmVmaXgKKyAgICB3aGlsZSAxOgorCXByZWZpeCA9IE5vbmUKKwlmb3IgaXRlbSBpbiBpdGVtczoKKwkgICAgaWYgbm90IGl0ZW06CisJCWJyZWFrCisJICAgIGlmIHByZWZpeCBpcyBOb25lOgorCQlwcmVmaXggPSBpdGVtWzBdCisJICAgIGVsaWYgaXRlbVswXSAhPSBwcmVmaXg6CisJCWJyZWFrCisJZWxzZToKKwkgICAgIyBhbGwgc3ViaXRlbXMgc3RhcnQgd2l0aCBhIGNvbW1vbiAicHJlZml4Ii4KKwkgICAgIyBtb3ZlIGl0IG91dCBvZiB0aGUgYnJhbmNoCisJICAgIGZvciBpdGVtIGluIGl0ZW1zOgorCQlkZWwgaXRlbVswXQorCSAgICBzdWJwYXR0ZXJuLmFwcGVuZChwcmVmaXgpCisJICAgIGNvbnRpbnVlICMgY2hlY2sgbmV4dCBvbmUKKwlicmVhaworCisgICAgIyBjaGVjayBpZiB0aGUgYnJhbmNoIGNhbiBiZSByZXBsYWNlZCBieSBhIGNoYXJhY3RlciBzZXQKKyAgICBmb3IgaXRlbSBpbiBpdGVtczoKKwlpZiBsZW4oaXRlbSkgIT0gMSBvciBpdGVtWzBdWzBdICE9IExJVEVSQUw6CisJICAgIGJyZWFrCisgICAgZWxzZToKKwkjIHdlIGNhbiBzdG9yZSB0aGlzIGFzIGEgY2hhcmFjdGVyIHNldCBpbnN0ZWFkIG9mIGEKKwkjIGJyYW5jaCAoRklYTUU6IHVzZSBhIHJhbmdlIGlmIHBvc3NpYmxlKQorCXNldCA9IFtdCisJZm9yIGl0ZW0gaW4gaXRlbXM6CisJICAgIHNldC5hcHBlbmQoaXRlbVswXSkKKwlzdWJwYXR0ZXJuLmFwcGVuZCgoSU4sIHNldCkpCisJcmV0dXJuCisKKyAgICBzdWJwYXR0ZXJuLmFwcGVuZCgoQlJBTkNILCAoTm9uZSwgaXRlbXMpKSkKKworZGVmIF9wYXJzZShzb3VyY2UsIHBhdHRlcm4sIGZsYWdzPSgpKToKKworICAgICMgcGFyc2UgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gaW50byBhbiBvcGVyYXRvciBsaXN0LgorCisgICAgc3VicGF0dGVybiA9IFN1YlBhdHRlcm4ocGF0dGVybikKKworICAgIHRoaXMgPSBOb25lCisKKyAgICB3aGlsZSAxOgorCisJaWYgc3RyKHNvdXJjZS5uZXh0KSBpbiAoInwiLCAiKSIpOgorCSAgICBicmVhayAjIGVuZCBvZiBzdWJwYXR0ZXJuCisJdGhpcyA9IHNvdXJjZS5nZXQoKQorCWlmIHRoaXMgaXMgTm9uZToKKwkgICAgYnJlYWsgIyBlbmQgb2YgcGF0dGVybgorCisJaWYgdGhpcyBhbmQgdGhpc1swXSBub3QgaW4gU1BFQ0lBTF9DSEFSUzoKKwkgICAgc3VicGF0dGVybi5hcHBlbmQoKExJVEVSQUwsIHRoaXMpKQorCisJZWxpZiB0aGlzID09ICJbIjoKKwkgICAgIyBjaGFyYWN0ZXIgc2V0CisJICAgIHNldCA9IFtdCisjIyAJICAgIGlmIHNvdXJjZS5tYXRjaCgiOiIpOgorIyMgCQlwYXNzICMgaGFuZGxlIGNoYXJhY3RlciBjbGFzc2VzCisJICAgIGlmIHNvdXJjZS5tYXRjaCgiXiIpOgorCQlzZXQuYXBwZW5kKChORUdBVEUsIE5vbmUpKQorCSAgICAjIGNoZWNrIHJlbWFpbmluZyBjaGFyYWN0ZXJzCisJICAgIHN0YXJ0ID0gc2V0WzpdCisJICAgIHdoaWxlIDE6CisJCXRoaXMgPSBzb3VyY2UuZ2V0KCkKKwkJaWYgdGhpcyA9PSAiXSIgYW5kIHNldCAhPSBzdGFydDoKKwkJICAgIGJyZWFrCisJCWVsaWYgdGhpcyBhbmQgdGhpc1swXSA9PSAiXFwiOgorCQkgICAgY29kZTEgPSBfZml4ZXNjYXBlKHRoaXMsIDEpCisJCWVsaWYgdGhpczoKKwkJICAgIGNvZGUxID0gTElURVJBTCwgdGhpcworCQllbHNlOgorCQkgICAgcmFpc2UgU3ludGF4RXJyb3IsICJ1bmV4cGVjdGVkIGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb24iCisJCWlmIHNvdXJjZS5tYXRjaCgiLSIpOgorCQkgICAgIyBwb3RlbnRpYWwgcmFuZ2UKKwkJICAgIHRoaXMgPSBzb3VyY2UuZ2V0KCkKKwkJICAgIGlmIHRoaXMgPT0gIl0iOgorCQkJc2V0LmFwcGVuZChjb2RlMSkKKwkJCXNldC5hcHBlbmQoKExJVEVSQUwsICItIikpCisJCQlicmVhaworCQkgICAgZWxzZToKKwkJCWlmIHRoaXNbMF0gPT0gIlxcIjoKKwkJCSAgICBjb2RlMiA9IF9maXhlc2NhcGUodGhpcywgMSkKKwkJCWVsc2U6CisJCQkgICAgY29kZTIgPSBMSVRFUkFMLCB0aGlzCisJCQlpZiBjb2RlMVswXSAhPSBMSVRFUkFMIG9yIGNvZGUyWzBdICE9IExJVEVSQUw6CisJCQkgICAgcmFpc2UgU3ludGF4RXJyb3IsICJpbGxlZ2FsIHJhbmdlIgorCQkJaWYgbGVuKGNvZGUxWzFdKSAhPSAxIG9yIGxlbihjb2RlMlsxXSkgIT0gMToKKwkJCSAgICByYWlzZSBTeW50YXhFcnJvciwgImlsbGVnYWwgcmFuZ2UiCisJCQlzZXQuYXBwZW5kKChSQU5HRSwgKGNvZGUxWzFdLCBjb2RlMlsxXSkpKQorCQllbHNlOgorCQkgICAgaWYgY29kZTFbMF0gaXMgSU46CisJCQljb2RlMSA9IGNvZGUxWzFdWzBdCisJCSAgICBzZXQuYXBwZW5kKGNvZGUxKQorCisJICAgICMgRklYTUU6IDxmbD4gbW92ZSBzZXQgb3B0aW1pemF0aW9uIHRvIHN1cHBvcnQgZnVuY3Rpb24KKwkgICAgaWYgbGVuKHNldCk9PTEgYW5kIHNldFswXVswXSBpcyBMSVRFUkFMOgorCQlzdWJwYXR0ZXJuLmFwcGVuZChzZXRbMF0pICMgb3B0aW1pemF0aW9uCisJICAgIGVsaWYgbGVuKHNldCk9PTIgYW5kIHNldFswXVswXSBpcyBORUdBVEUgYW5kIHNldFsxXVswXSBpcyBMSVRFUkFMOgorCQlzdWJwYXR0ZXJuLmFwcGVuZCgoTk9UX0xJVEVSQUwsIHNldFsxXVsxXSkpICMgb3B0aW1pemF0aW9uCisJICAgIGVsc2U6CisJCSMgRklYTUU6IDxmbD4gYWRkIGNoYXJtYXAgb3B0aW1pemF0aW9uCisJCXN1YnBhdHRlcm4uYXBwZW5kKChJTiwgc2V0KSkKKworCWVsaWYgdGhpcyBhbmQgdGhpc1swXSBpbiBSRVBFQVRfQ0hBUlM6CisJICAgICMgcmVwZWF0IHByZXZpb3VzIGl0ZW0KKwkgICAgaWYgdGhpcyA9PSAiPyI6CisJCW1pbiwgbWF4ID0gMCwgMQorCSAgICBlbGlmIHRoaXMgPT0gIioiOgorCQltaW4sIG1heCA9IDAsIHN5cy5tYXhpbnQKKwkgICAgZWxpZiB0aGlzID09ICIrIjoKKwkJbWluLCBtYXggPSAxLCBzeXMubWF4aW50CisJICAgIGVsaWYgdGhpcyA9PSAieyI6CisJCW1pbiwgbWF4ID0gMCwgc3lzLm1heGludAorCQlsbyA9IGhpID0gIiIKKwkJd2hpbGUgc3RyKHNvdXJjZS5uZXh0KSBpbiBESUdJVFM6CisJCSAgICBsbyA9IGxvICsgc291cmNlLmdldCgpCisJCWlmIHNvdXJjZS5tYXRjaCgiLCIpOgorCQkgICAgd2hpbGUgc3RyKHNvdXJjZS5uZXh0KSBpbiBESUdJVFM6CisJCQloaSA9IGhpICsgc291cmNlLmdldCgpCisJCWVsc2U6CisJCSAgICBoaSA9IGxvCisJCWlmIG5vdCBzb3VyY2UubWF0Y2goIn0iKToKKwkJICAgIHJhaXNlIFN5bnRheEVycm9yLCAiYm9ndXMgcmFuZ2UiCisJCWlmIGxvOgorCQkgICAgbWluID0gaW50KGxvKQorCQlpZiBoaToKKwkJICAgIG1heCA9IGludChoaSkKKwkJIyBGSVhNRTogPGZsPiBjaGVjayB0aGF0IGhpID49IGxvIQorCSAgICBlbHNlOgorCQlyYWlzZSBTeW50YXhFcnJvciwgIm5vdCBzdXBwb3J0ZWQiCisJICAgICMgZmlndXJlIG91dCB3aGljaCBpdGVtIHRvIHJlcGVhdAorCSAgICAjIEZJWE1FOiBzaG91bGQgYmFjayB1cCB0byB0aGUgcmlnaHQgbWFyaywgcmlnaHQ/CisJICAgIGlmIHN1YnBhdHRlcm46CisJCWluZGV4ID0gbGVuKHN1YnBhdHRlcm4pLTEKKwkJd2hpbGUgc3VicGF0dGVybltpbmRleF1bMF0gaXMgTUFSSzoKKwkJICAgIGluZGV4ID0gaW5kZXggLSAxCisJCWl0ZW0gPSBzdWJwYXR0ZXJuW2luZGV4OmluZGV4KzFdCisJICAgIGVsc2U6CisJCXJhaXNlIFN5bnRheEVycm9yLCAibm90aGluZyB0byByZXBlYXQiCisJICAgIGlmIHNvdXJjZS5tYXRjaCgiPyIpOgorCQlzdWJwYXR0ZXJuW2luZGV4XSA9IChNSU5fUkVQRUFULCAobWluLCBtYXgsIGl0ZW0pKQorCSAgICBlbHNlOgorCQlzdWJwYXR0ZXJuW2luZGV4XSA9IChNQVhfUkVQRUFULCAobWluLCBtYXgsIGl0ZW0pKQorCWVsaWYgdGhpcyA9PSAiLiI6CisJICAgIHN1YnBhdHRlcm4uYXBwZW5kKChBTlksIE5vbmUpKQorCWVsaWYgdGhpcyA9PSAiKCI6CisJICAgIGdyb3VwID0gMQorCSAgICBuYW1lID0gTm9uZQorCSAgICBpZiBzb3VyY2UubWF0Y2goIj8iKToKKwkJZ3JvdXAgPSAwCisJCSMgb3B0aW9ucworCQlpZiBzb3VyY2UubWF0Y2goIlAiKToKKwkJICAgICMgbmFtZWQgZ3JvdXA6IHNraXAgZm9yd2FyZCB0byBlbmQgb2YgbmFtZQorCQkgICAgaWYgc291cmNlLm1hdGNoKCI8Iik6CisJCQluYW1lID0gIiIKKwkJCXdoaWxlIDE6CisJCQkgICAgY2hhciA9IHNvdXJjZS5nZXQoKQorCQkJICAgIGlmIGNoYXIgaXMgTm9uZSBvciBjaGFyID09ICI+IjoKKwkJCQlicmVhaworCQkJICAgIG5hbWUgPSBuYW1lICsgY2hhcgorCQkJZ3JvdXAgPSAxCisJCWVsaWYgc291cmNlLm1hdGNoKCI6Iik6CisJCSAgICAjIG5vbi1jYXB0dXJpbmcgZ3JvdXAKKwkJICAgIGdyb3VwID0gMgorCQllbGlmIHNvdXJjZS5tYXRjaF9zZXQoImlJIik6CisJCSAgICBwYXR0ZXJuLnNldGZsYWcoImkiKQorCQllbGlmIHNvdXJjZS5tYXRjaF9zZXQoImxMIik6CisJCSAgICBwYXR0ZXJuLnNldGZsYWcoImwiKQorCQllbGlmIHNvdXJjZS5tYXRjaF9zZXQoIm1NIik6CisJCSAgICBwYXR0ZXJuLnNldGZsYWcoIm0iKQorCQllbGlmIHNvdXJjZS5tYXRjaF9zZXQoInNTIik6CisJCSAgICBwYXR0ZXJuLnNldGZsYWcoInMiKQorCQllbGlmIHNvdXJjZS5tYXRjaF9zZXQoInhYIik6CisJCSAgICBwYXR0ZXJuLnNldGZsYWcoIngiKQorCSAgICBpZiBncm91cDoKKwkJIyBwYXJzZSBncm91cCBjb250ZW50cworCQliID0gW10KKwkJaWYgZ3JvdXAgPT0gMjoKKwkJICAgICMgYW5vbnltb3VzIGdyb3VwCisJCSAgICBncm91cCA9IE5vbmUKKwkJZWxzZToKKwkJICAgIGdyb3VwID0gcGF0dGVybi5nZXRncm91cChuYW1lKQorIAkJaWYgZ3JvdXA6CisgCQkgICAgc3VicGF0dGVybi5hcHBlbmQoKE1BUkssIChncm91cC0xKSoyKSkKKwkJd2hpbGUgMToKKwkJICAgIHAgPSBfcGFyc2Uoc291cmNlLCBwYXR0ZXJuLCBmbGFncykKKwkJICAgIGlmIHNvdXJjZS5tYXRjaCgiKSIpOgorCQkJaWYgYjoKKwkJCSAgICBiLmFwcGVuZChwKQorCQkJICAgIF9icmFuY2goc3VicGF0dGVybiwgYikKKwkJCWVsc2U6CisJCQkgICAgc3VicGF0dGVybi5hcHBlbmQoKFNVQlBBVFRFUk4sIChncm91cCwgcCkpKQorCQkJYnJlYWsKKwkJICAgIGVsaWYgc291cmNlLm1hdGNoKCJ8Iik6CisJCQliLmFwcGVuZChwKQorCQkgICAgZWxzZToKKwkJCXJhaXNlIFN5bnRheEVycm9yLCAiZ3JvdXAgbm90IHByb3Blcmx5IGNsb3NlZCIKKyAJCWlmIGdyb3VwOgorIAkJICAgIHN1YnBhdHRlcm4uYXBwZW5kKChNQVJLLCAoZ3JvdXAtMSkqMisxKSkKKwkgICAgZWxzZToKKwkJIyBGSVhNRTogc2hvdWxkIHRoaXMgcmVhbGx5IGJlIGEgd2hpbGUgbG9vcD8KKwkJd2hpbGUgMToKKwkJICAgIGNoYXIgPSBzb3VyY2UuZ2V0KCkKKwkJICAgIGlmIGNoYXIgaXMgTm9uZSBvciBjaGFyID09ICIpIjoKKwkJCWJyZWFrCisKKwllbGlmIHRoaXMgPT0gIl4iOgorCSAgICBzdWJwYXR0ZXJuLmFwcGVuZCgoQVQsIEFUX0JFR0lOTklORykpCisKKwllbGlmIHRoaXMgPT0gIiQiOgorCSAgICBzdWJwYXR0ZXJuLmFwcGVuZCgoQVQsIEFUX0VORCkpCisKKwllbGlmIHRoaXMgYW5kIHRoaXNbMF0gPT0gIlxcIjoKKwkgICAgY29kZSA9X2ZpeGVzY2FwZSh0aGlzKQorCSAgICBzdWJwYXR0ZXJuLmFwcGVuZChjb2RlKQorCisJZWxzZToKKwkgICAgcmFpc2UgU3ludGF4RXJyb3IsICJwYXJzZXIgZXJyb3IiCisKKyAgICByZXR1cm4gc3VicGF0dGVybgorCitkZWYgcGFyc2Uoc291cmNlLCBmbGFncz0oKSk6CisgICAgcyA9IFRva2VuaXplcihzb3VyY2UpCisgICAgZyA9IFBhdHRlcm4oKQorICAgIGIgPSBbXQorICAgIHdoaWxlIDE6CisJcCA9IF9wYXJzZShzLCBnLCBmbGFncykKKwl0YWlsID0gcy5nZXQoKQorCWlmIHRhaWwgPT0gInwiOgorCSAgICBiLmFwcGVuZChwKQorCWVsaWYgdGFpbCA9PSAiKSI6CisJICAgIHJhaXNlIFN5bnRheEVycm9yLCAidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyIKKwllbGlmIHRhaWwgaXMgTm9uZToKKwkgICAgaWYgYjoKKwkJYi5hcHBlbmQocCkKKwkJcCA9IFN1YlBhdHRlcm4oZykKKwkJX2JyYW5jaChwLCBiKQorCSAgICBicmVhaworCWVsc2U6CisJICAgIHJhaXNlIFN5bnRheEVycm9yLCAiYm9ndXMgY2hhcmFjdGVycyBhdCBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uIgorICAgIHJldHVybiBwCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorICAgIGZyb20gdGVzdHBhdHRlcm5zIGltcG9ydCBQQVRURVJOUworICAgIGEgPSBiID0gYyA9IDAKKyAgICBmb3IgcGF0dGVybiwgZmxhZ3MgaW4gUEFUVEVSTlM6CisJaWYgZmxhZ3M6CisJICAgIGNvbnRpbnVlCisJcHJpbnQgIi0iKjY4CisJdHJ5OgorCSAgICBwID0gcGFyc2UocGF0dGVybikKKwkgICAgcHJpbnQgcmVwcihwYXR0ZXJuKSwgIi0+IgorCSAgICBwcHJpbnQocC5kYXRhKQorCSAgICBpbXBvcnQgc3JlX2NvbXBpbGUKKwkgICAgdHJ5OgorCQljb2RlID0gc3JlX2NvbXBpbGUuY29tcGlsZShwKQorCQljID0gYyArIDEKKwkgICAgZXhjZXB0OgorCQlwYXNzCisJICAgIGEgPSBhICsgMQorCWV4Y2VwdCBTeW50YXhFcnJvciwgdjoKKwkgICAgcHJpbnQgIioqIiwgcmVwcihwYXR0ZXJuKSwgdgorCWIgPSBiICsgMQorICAgIHByaW50ICItIio2OAorICAgIHByaW50IGEsICJvZiIsIGIsICJwYXR0ZXJucyBzdWNjZXNzZnVsbHkgcGFyc2VkIgorICAgIHByaW50IGMsICJvZiIsIGIsICJwYXR0ZXJucyBzdWNjZXNzZnVsbHkgY29tcGlsZWQiCisKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3N0YXRjYWNoLnB5IGIvTGliL2Rvcy04eDMvc3RhdGNhY2gucHkKaW5kZXggNzcwYWVmMC4uYjUxNDdjMiAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvc3RhdGNhY2gucHkKKysrIGIvTGliL2Rvcy04eDMvc3RhdGNhY2gucHkKQEAgLTEsNyArMSw3IEBACi0jIE1vZHVsZSAnc3RhdGNhY2hlJwotIwotIyBNYWludGFpbiBhIGNhY2hlIG9mIGZpbGUgc3RhdHMuCi0jIFRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gcmVzZXQgdGhlIGNhY2hlIG9yIHRvIHNlbGVjdGl2ZWx5IHJlbW92ZSBpdGVtcy4KKyIiIk1haW50YWluIGEgY2FjaGUgb2Ygc3RhdCgpIGluZm9ybWF0aW9uIG9uIGZpbGVzLgorCitUaGVyZSBhcmUgZnVuY3Rpb25zIHRvIHJlc2V0IHRoZSBjYWNoZSBvciB0byBzZWxlY3RpdmVseSByZW1vdmUgaXRlbXMuCisiIiIKIAogaW1wb3J0IG9zCiBmcm9tIHN0YXQgaW1wb3J0ICoKQEAgLTEyLDQyICsxMiwzNyBAQAogY2FjaGUgPSB7fQogCiAKLSMgU3RhdCBhIGZpbGUsIHBvc3NpYmx5IG91dCBvZiB0aGUgY2FjaGUuCi0jCiBkZWYgc3RhdChwYXRoKToKKwkiIiJTdGF0IGEgZmlsZSwgcG9zc2libHkgb3V0IG9mIHRoZSBjYWNoZS4iIiIKIAlpZiBjYWNoZS5oYXNfa2V5KHBhdGgpOgogCQlyZXR1cm4gY2FjaGVbcGF0aF0KIAljYWNoZVtwYXRoXSA9IHJldCA9IG9zLnN0YXQocGF0aCkKIAlyZXR1cm4gcmV0CiAKIAotIyBSZXNldCB0aGUgY2FjaGUgY29tcGxldGVseS4KLSMKIGRlZiByZXNldCgpOgorCSIiIlJlc2V0IHRoZSBjYWNoZSBjb21wbGV0ZWx5LiIiIgogCWdsb2JhbCBjYWNoZQogCWNhY2hlID0ge30KIAogCi0jIFJlbW92ZSBhIGdpdmVuIGl0ZW0gZnJvbSB0aGUgY2FjaGUsIGlmIGl0IGV4aXN0cy4KLSMKIGRlZiBmb3JnZXQocGF0aCk6CisJIiIiUmVtb3ZlIGEgZ2l2ZW4gaXRlbSBmcm9tIHRoZSBjYWNoZSwgaWYgaXQgZXhpc3RzLiIiIgogCWlmIGNhY2hlLmhhc19rZXkocGF0aCk6CiAJCWRlbCBjYWNoZVtwYXRoXQogCiAKLSMgUmVtb3ZlIGFsbCBwYXRobmFtZXMgd2l0aCBhIGdpdmVuIHByZWZpeC4KLSMKIGRlZiBmb3JnZXRfcHJlZml4KHByZWZpeCk6CisJIiIiUmVtb3ZlIGFsbCBwYXRobmFtZXMgd2l0aCBhIGdpdmVuIHByZWZpeC4iIiIKIAluID0gbGVuKHByZWZpeCkKIAlmb3IgcGF0aCBpbiBjYWNoZS5rZXlzKCk6CiAJCWlmIHBhdGhbOm5dID09IHByZWZpeDoKIAkJCWRlbCBjYWNoZVtwYXRoXQogCiAKLSMgRm9yZ2V0IGFib3V0IGEgZGlyZWN0b3J5IGFuZCBhbGwgZW50cmllcyBpbiBpdCwgYnV0IG5vdCBhYm91dAotIyBlbnRyaWVzIGluIHN1YmRpcmVjdG9yaWVzLgotIwogZGVmIGZvcmdldF9kaXIocHJlZml4KToKKwkiIiJGb3JnZXQgYWJvdXQgYSBkaXJlY3RvcnkgYW5kIGFsbCBlbnRyaWVzIGluIGl0LCBidXQgbm90IGFib3V0CisJZW50cmllcyBpbiBzdWJkaXJlY3Rvcmllcy4iIiIKIAlpZiBwcmVmaXhbLTE6XSA9PSAnLycgYW5kIHByZWZpeCA8PiAnLyc6CiAJCXByZWZpeCA9IHByZWZpeFs6LTFdCiAJZm9yZ2V0KHByZWZpeCkKQEAgLTYyLDE5ICs1NywxNyBAQAogCQkJCWRlbCBjYWNoZVtwYXRoXQogCiAKLSMgUmVtb3ZlIGFsbCBwYXRobmFtZXMgZXhjZXB0IHdpdGggYSBnaXZlbiBwcmVmaXguCi0jIE5vcm1hbGx5IHVzZWQgd2l0aCBwcmVmaXggPSAnLycgYWZ0ZXIgYSBjaGRpcigpLgotIwogZGVmIGZvcmdldF9leGNlcHRfcHJlZml4KHByZWZpeCk6CisJIiIiUmVtb3ZlIGFsbCBwYXRobmFtZXMgZXhjZXB0IHdpdGggYSBnaXZlbiBwcmVmaXguCisJTm9ybWFsbHkgdXNlZCB3aXRoIHByZWZpeCA9ICcvJyBhZnRlciBhIGNoZGlyKCkuIiIiCiAJbiA9IGxlbihwcmVmaXgpCiAJZm9yIHBhdGggaW4gY2FjaGUua2V5cygpOgogCQlpZiBwYXRoWzpuXSA8PiBwcmVmaXg6CiAJCQlkZWwgY2FjaGVbcGF0aF0KIAogCi0jIENoZWNrIGZvciBkaXJlY3RvcnkuCi0jCiBkZWYgaXNkaXIocGF0aCk6CisJIiIiQ2hlY2sgZm9yIGRpcmVjdG9yeS4iIiIKIAl0cnk6CiAJCXN0ID0gc3RhdChwYXRoKQogCWV4Y2VwdCBvcy5lcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3N0cmluZ2lvLnB5IGIvTGliL2Rvcy04eDMvc3RyaW5naW8ucHkKaW5kZXggZmMxOTViOS4uOGVmZDdkOCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvc3RyaW5naW8ucHkKKysrIGIvTGliL2Rvcy04eDMvc3RyaW5naW8ucHkKQEAgLTEsMzAgKzEsMzIgQEAKLSMgY2xhc3MgU3RyaW5nSU8gaW1wbGVtZW50cyAgZmlsZS1saWtlIG9iamVjdHMgdGhhdCByZWFkL3dyaXRlIGEKLSMgc3RyaW5nIGJ1ZmZlciAoYS5rLmEuICJtZW1vcnkgZmlsZXMiKS4KLSMKLSMgVGhpcyBpbXBsZW1lbnRzIChuZWFybHkpIGFsbCBzdGRpbyBtZXRob2RzLgotIwotIyBmID0gU3RyaW5nSU8oKSAgICAgICMgcmVhZHkgZm9yIHdyaXRpbmcKLSMgZiA9IFN0cmluZ0lPKGJ1ZikgICAjIHJlYWR5IGZvciByZWFkaW5nCi0jIGYuY2xvc2UoKSAgICAgICAgICAgIyBleHBsaWNpdGx5IHJlbGVhc2UgcmVzb3VyY2VzIGhlbGQKLSMgZmxhZyA9IGYuaXNhdHR5KCkgICAjIGFsd2F5cyBmYWxzZQotIyBwb3MgPSBmLnRlbGwoKSAgICAgICMgZ2V0IGN1cnJlbnQgcG9zaXRpb24KLSMgZi5zZWVrKHBvcykgICAgICAgICAjIHNldCBjdXJyZW50IHBvc2l0aW9uCi0jIGYuc2Vlayhwb3MsIG1vZGUpICAgIyBtb2RlIDA6IGFic29sdXRlOyAxOiByZWxhdGl2ZTsgMjogcmVsYXRpdmUgdG8gRU9GCi0jIGJ1ZiA9IGYucmVhZCgpICAgICAgIyByZWFkIHVudGlsIEVPRgotIyBidWYgPSBmLnJlYWQobikgICAgICMgcmVhZCB1cCB0byBuIGJ5dGVzCi0jIGJ1ZiA9IGYucmVhZGxpbmUoKSAgIyByZWFkIHVudGlsIGVuZCBvZiBsaW5lICgnXG4nKSBvciBFT0YKLSMgbGlzdCA9IGYucmVhZGxpbmVzKCkjIGxpc3Qgb2YgZi5yZWFkbGluZSgpIHJlc3VsdHMgdW50aWwgRU9GCi0jIGYud3JpdGUoYnVmKSAgICAgICAgIyB3cml0ZSBhdCBjdXJyZW50IHBvc2l0aW9uCi0jIGYud3JpdGVsaW5lcyhsaXN0KSAgIyBmb3IgbGluZSBpbiBsaXN0OiBmLndyaXRlKGxpbmUpCi0jIGYuZ2V0dmFsdWUoKSAgICAgICAgIyByZXR1cm4gd2hvbGUgZmlsZSdzIGNvbnRlbnRzIGFzIGEgc3RyaW5nCi0jCi0jIE5vdGVzOgotIyAtIFVzaW5nIGEgcmVhbCBmaWxlIGlzIG9mdGVuIGZhc3RlciAoYnV0IGxlc3MgY29udmVuaWVudCkuCi0jIC0gZmlsZW5vKCkgaXMgbGVmdCB1bmltcGxlbWVudGVkIHNvIHRoYXQgY29kZSB3aGljaCB1c2VzIGl0IHRyaWdnZXJzCi0jICAgYW4gZXhjZXB0aW9uIGVhcmx5LgotIyAtIFNlZWtpbmcgZmFyIGJleW9uZCBFT0YgYW5kIHRoZW4gd3JpdGluZyB3aWxsIGluc2VydCByZWFsIG51bGwKLSMgICBieXRlcyB0aGF0IG9jY3VweSBzcGFjZSBpbiB0aGUgYnVmZmVyLgotIyAtIFRoZXJlJ3MgYSBzaW1wbGUgdGVzdCBzZXQgKHNlZSBlbmQgb2YgdGhpcyBmaWxlKS4KKyIiIkZpbGUtbGlrZSBvYmplY3RzIHRoYXQgcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGEgc3RyaW5nIGJ1ZmZlci4KKworVGhpcyBpbXBsZW1lbnRzIChuZWFybHkpIGFsbCBzdGRpbyBtZXRob2RzLgorCitmID0gU3RyaW5nSU8oKSAgICAgICMgcmVhZHkgZm9yIHdyaXRpbmcKK2YgPSBTdHJpbmdJTyhidWYpICAgIyByZWFkeSBmb3IgcmVhZGluZworZi5jbG9zZSgpICAgICAgICAgICAjIGV4cGxpY2l0bHkgcmVsZWFzZSByZXNvdXJjZXMgaGVsZAorZmxhZyA9IGYuaXNhdHR5KCkgICAjIGFsd2F5cyBmYWxzZQorcG9zID0gZi50ZWxsKCkgICAgICAjIGdldCBjdXJyZW50IHBvc2l0aW9uCitmLnNlZWsocG9zKSAgICAgICAgICMgc2V0IGN1cnJlbnQgcG9zaXRpb24KK2Yuc2Vlayhwb3MsIG1vZGUpICAgIyBtb2RlIDA6IGFic29sdXRlOyAxOiByZWxhdGl2ZTsgMjogcmVsYXRpdmUgdG8gRU9GCitidWYgPSBmLnJlYWQoKSAgICAgICMgcmVhZCB1bnRpbCBFT0YKK2J1ZiA9IGYucmVhZChuKSAgICAgIyByZWFkIHVwIHRvIG4gYnl0ZXMKK2J1ZiA9IGYucmVhZGxpbmUoKSAgIyByZWFkIHVudGlsIGVuZCBvZiBsaW5lICgnXG4nKSBvciBFT0YKK2xpc3QgPSBmLnJlYWRsaW5lcygpIyBsaXN0IG9mIGYucmVhZGxpbmUoKSByZXN1bHRzIHVudGlsIEVPRgorZi53cml0ZShidWYpICAgICAgICAjIHdyaXRlIGF0IGN1cnJlbnQgcG9zaXRpb24KK2Yud3JpdGVsaW5lcyhsaXN0KSAgIyBmb3IgbGluZSBpbiBsaXN0OiBmLndyaXRlKGxpbmUpCitmLmdldHZhbHVlKCkgICAgICAgICMgcmV0dXJuIHdob2xlIGZpbGUncyBjb250ZW50cyBhcyBhIHN0cmluZworCitOb3RlczoKKy0gVXNpbmcgYSByZWFsIGZpbGUgaXMgb2Z0ZW4gZmFzdGVyIChidXQgbGVzcyBjb252ZW5pZW50KS4KKy0gVGhlcmUncyBhbHNvIGEgbXVjaCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gaW4gQywgY2FsbGVkIGNTdHJpbmdJTywgYnV0CisgIGl0J3Mgbm90IHN1YmNsYXNzYWJsZS4KKy0gZmlsZW5vKCkgaXMgbGVmdCB1bmltcGxlbWVudGVkIHNvIHRoYXQgY29kZSB3aGljaCB1c2VzIGl0IHRyaWdnZXJzCisgIGFuIGV4Y2VwdGlvbiBlYXJseS4KKy0gU2Vla2luZyBmYXIgYmV5b25kIEVPRiBhbmQgdGhlbiB3cml0aW5nIHdpbGwgaW5zZXJ0IHJlYWwgbnVsbAorICBieXRlcyB0aGF0IG9jY3VweSBzcGFjZSBpbiB0aGUgYnVmZmVyLgorLSBUaGVyZSdzIGEgc2ltcGxlIHRlc3Qgc2V0IChzZWUgZW5kIG9mIHRoaXMgZmlsZSkuCisiIiIKIAogaW1wb3J0IHN0cmluZwogCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9zdHJpbmdvbC5weSBiL0xpYi9kb3MtOHgzL3N0cmluZ29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTdkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZG9zLTh4My9zdHJpbmdvbC5weQpAQCAtMCwwICsxLDQzMSBAQAorIyBtb2R1bGUgJ3N0cmluZycgLS0gQSBjb2xsZWN0aW9uIG9mIHN0cmluZyBvcGVyYXRpb25zCisKKyMgV2FybmluZzogbW9zdCBvZiB0aGUgY29kZSB5b3Ugc2VlIGhlcmUgaXNuJ3Qgbm9ybWFsbHkgdXNlZCBub3dhZGF5cy4gIFdpdGgKKyMgUHl0aG9uIDEuNiwgbWFueSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIG1ldGhvZHMgb24gdGhlCisjIHN0YW5kYXJkIHN0cmluZyBvYmplY3QuIFRoZXkgdXNlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBhIGJ1aWx0LWluIG1vZHVsZQorIyBjYWxsZWQgc3Ryb3AsIGJ1dCBzdHJvcCBpcyBub3cgb2Jzb2xldGUgaXRzZWxmLgorCisiIiJDb21tb24gc3RyaW5nIG1hbmlwdWxhdGlvbnMuCisKK1B1YmxpYyBtb2R1bGUgdmFyaWFibGVzOgorCit3aGl0ZXNwYWNlIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCB3aGl0ZXNwYWNlCitsb3dlcmNhc2UgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIGxvd2VyY2FzZSBsZXR0ZXJzCit1cHBlcmNhc2UgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIHVwcGVyY2FzZSBsZXR0ZXJzCitsZXR0ZXJzIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBsZXR0ZXJzCitkaWdpdHMgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIGRlY2ltYWwgZGlnaXRzCitoZXhkaWdpdHMgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIGhleGFkZWNpbWFsIGRpZ2l0cworb2N0ZGlnaXRzIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBvY3RhbCBkaWdpdHMKKworIiIiCisKKyMgU29tZSBzdHJpbmdzIGZvciBjdHlwZS1zdHlsZSBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24KK3doaXRlc3BhY2UgPSAnIFx0XG5cclx2XGYnCitsb3dlcmNhc2UgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCit1cHBlcmNhc2UgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCitsZXR0ZXJzID0gbG93ZXJjYXNlICsgdXBwZXJjYXNlCitkaWdpdHMgPSAnMDEyMzQ1Njc4OScKK2hleGRpZ2l0cyA9IGRpZ2l0cyArICdhYmNkZWYnICsgJ0FCQ0RFRicKK29jdGRpZ2l0cyA9ICcwMTIzNDU2NycKKworIyBDYXNlIGNvbnZlcnNpb24gaGVscGVycworX2lkbWFwID0gJycKK2ZvciBpIGluIHJhbmdlKDI1Nik6IF9pZG1hcCA9IF9pZG1hcCArIGNocihpKQorZGVsIGkKKworIyBCYWNrd2FyZCBjb21wYXRpYmxlIG5hbWVzIGZvciBleGNlcHRpb25zCitpbmRleF9lcnJvciA9IFZhbHVlRXJyb3IKK2F0b2lfZXJyb3IgPSBWYWx1ZUVycm9yCithdG9mX2Vycm9yID0gVmFsdWVFcnJvcgorYXRvbF9lcnJvciA9IFZhbHVlRXJyb3IKKworIyBjb252ZXJ0IFVQUEVSIENBU0UgbGV0dGVycyB0byBsb3dlciBjYXNlCitkZWYgbG93ZXIocyk6CisgICAgIiIibG93ZXIocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMubG93ZXIoKQorCisjIENvbnZlcnQgbG93ZXIgY2FzZSBsZXR0ZXJzIHRvIFVQUEVSIENBU0UKK2RlZiB1cHBlcihzKToKKyAgICAiIiJ1cHBlcihzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy51cHBlcigpCisKKyMgU3dhcCBsb3dlciBjYXNlIGxldHRlcnMgYW5kIFVQUEVSIENBU0UKK2RlZiBzd2FwY2FzZShzKToKKyAgICAiIiJzd2FwY2FzZShzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggdXBwZXIgY2FzZSBjaGFyYWN0ZXJzCisgICAgY29udmVydGVkIHRvIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS4KKworICAgICIiIgorICAgIHJldHVybiBzLnN3YXBjYXNlKCkKKworIyBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB0YWJzIGFuZCBzcGFjZXMKK2RlZiBzdHJpcChzKToKKyAgICAiIiJzdHJpcChzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcKKyAgICB3aGl0ZXNwYWNlIHJlbW92ZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5zdHJpcCgpCisKKyMgU3RyaXAgbGVhZGluZyB0YWJzIGFuZCBzcGFjZXMKK2RlZiBsc3RyaXAocyk6CisgICAgIiIibHN0cmlwKHMpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC4KKworICAgICIiIgorICAgIHJldHVybiBzLmxzdHJpcCgpCisKKyMgU3RyaXAgdHJhaWxpbmcgdGFicyBhbmQgc3BhY2VzCitkZWYgcnN0cmlwKHMpOgorICAgICIiInJzdHJpcChzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgIHJlbW92ZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5yc3RyaXAoKQorCisKKyMgU3BsaXQgYSBzdHJpbmcgaW50byBhIGxpc3Qgb2Ygc3BhY2UvdGFiLXNlcGFyYXRlZCB3b3JkcworIyBOQjogc3BsaXQocykgaXMgTk9UIHRoZSBzYW1lIGFzIHNwbGl0ZmllbGRzKHMsICcgJykhCitkZWYgc3BsaXQocywgc2VwPU5vbmUsIG1heHNwbGl0PTApOgorICAgICIiInNwbGl0KHN0ciBbLHNlcCBbLG1heHNwbGl0XV0pIC0+IGxpc3Qgb2Ygc3RyaW5ncworCisgICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZyBzLCB1c2luZyBzZXAgYXMgdGhlCisgICAgZGVsaW1pdGVyIHN0cmluZy4gIElmIG1heHNwbGl0IGlzIG5vbnplcm8sIHNwbGl0cyBpbnRvIGF0IG1vc3QKKyAgICBtYXhzcGxpdCB3b3JkcyBJZiBzZXAgaXMgbm90IHNwZWNpZmllZCwgYW55IHdoaXRlc3BhY2Ugc3RyaW5nCisgICAgaXMgYSBzZXBhcmF0b3IuICBNYXhzcGxpdCBkZWZhdWx0cyB0byAwLgorCisgICAgKHNwbGl0IGFuZCBzcGxpdGZpZWxkcyBhcmUgc3lub255bW91cykKKworICAgICIiIgorICAgIHJldHVybiBzLnNwbGl0KHNlcCwgbWF4c3BsaXQpCitzcGxpdGZpZWxkcyA9IHNwbGl0CisKKyMgSm9pbiBmaWVsZHMgd2l0aCBvcHRpb25hbCBzZXBhcmF0b3IKK2RlZiBqb2luKHdvcmRzLCBzZXAgPSAnICcpOgorICAgICIiImpvaW4obGlzdCBbLHNlcF0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgc3RyaW5nIGNvbXBvc2VkIG9mIHRoZSB3b3JkcyBpbiBsaXN0LCB3aXRoCisgICAgaW50ZXJ2ZW5pbmcgb2NjdXJlbmNlcyBvZiBzZXAuICBUaGUgZGVmYXVsdCBzZXBhcmF0b3IgaXMgYQorICAgIHNpbmdsZSBzcGFjZS4KKworICAgIChqb2luZmllbGRzIGFuZCBqb2luIGFyZSBzeW5vbnltb3VzKQorCisgICAgIiIiCisgICAgcmV0dXJuIHNlcC5qb2luKHdvcmRzKQoram9pbmZpZWxkcyA9IGpvaW4KKworIyBmb3IgYSBsaXR0bGUgYml0IG9mIHNwZWVkCitfYXBwbHkgPSBhcHBseQorCisjIEZpbmQgc3Vic3RyaW5nLCByYWlzZSBleGNlcHRpb24gaWYgbm90IGZvdW5kCitkZWYgaW5kZXgocywgKmFyZ3MpOgorICAgICIiImluZGV4KHMsIHN1YiBbLHN0YXJ0IFssZW5kXV0pIC0+IGludAorCisgICAgTGlrZSBmaW5kIGJ1dCByYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9hcHBseShzLmluZGV4LCBhcmdzKQorCisjIEZpbmQgbGFzdCBzdWJzdHJpbmcsIHJhaXNlIGV4Y2VwdGlvbiBpZiBub3QgZm91bmQKK2RlZiByaW5kZXgocywgKmFyZ3MpOgorICAgICIiInJpbmRleChzLCBzdWIgWyxzdGFydCBbLGVuZF1dKSAtPiBpbnQKKworICAgIExpa2UgcmZpbmQgYnV0IHJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2FwcGx5KHMucmluZGV4LCBhcmdzKQorCisjIENvdW50IG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcKK2RlZiBjb3VudChzLCAqYXJncyk6CisgICAgIiIiY291bnQocywgc3ViWywgc3RhcnRbLGVuZF1dKSAtPiBpbnQKKworICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBzdWIgaW4gc3RyaW5nCisgICAgc1tzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlCisgICAgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2FwcGx5KHMuY291bnQsIGFyZ3MpCisKKyMgRmluZCBzdWJzdHJpbmcsIHJldHVybiAtMSBpZiBub3QgZm91bmQKK2RlZiBmaW5kKHMsICphcmdzKToKKyAgICAiIiJmaW5kKHMsIHN1YiBbLHN0YXJ0IFssZW5kXV0pIC0+IGluCisKKyAgICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBzIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsCisgICAgc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIHNbc3RhcnQsZW5kXS4gIE9wdGlvbmFsCisgICAgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLgorCisgICAgUmV0dXJuIC0xIG9uIGZhaWx1cmUuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2FwcGx5KHMuZmluZCwgYXJncykKKworIyBGaW5kIGxhc3Qgc3Vic3RyaW5nLCByZXR1cm4gLTEgaWYgbm90IGZvdW5kCitkZWYgcmZpbmQocywgKmFyZ3MpOgorICAgICIiInJmaW5kKHMsIHN1YiBbLHN0YXJ0IFssZW5kXV0pIC0+IGludAorCisgICAgUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIHMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCwKKyAgICBzdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gc1tzdGFydCxlbmRdLiAgT3B0aW9uYWwKKyAgICBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uCisKKyAgICBSZXR1cm4gLTEgb24gZmFpbHVyZS4KKworICAgICIiIgorICAgIHJldHVybiBfYXBwbHkocy5yZmluZCwgYXJncykKKworIyBmb3IgYSBiaXQgb2Ygc3BlZWQKK19mbG9hdCA9IGZsb2F0CitfaW50ID0gaW50CitfbG9uZyA9IGxvbmcKK19TdHJpbmdUeXBlID0gdHlwZSgnJykKKworIyBDb252ZXJ0IHN0cmluZyB0byBmbG9hdAorZGVmIGF0b2Yocyk6CisgICAgIiIiYXRvZihzKSAtPiBmbG9hdAorCisgICAgUmV0dXJuIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyBzLgorCisgICAgIiIiCisgICAgaWYgdHlwZShzKSA9PSBfU3RyaW5nVHlwZToKKyAgICAgICAgcmV0dXJuIF9mbG9hdChzKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXJndW1lbnQgMTogZXhwZWN0ZWQgc3RyaW5nLCAlcyBmb3VuZCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShzKS5fX25hbWVfXykKKworIyBDb252ZXJ0IHN0cmluZyB0byBpbnRlZ2VyCitkZWYgYXRvaSgqYXJncyk6CisgICAgIiIiYXRvaShzIFssYmFzZV0pIC0+IGludAorCisgICAgUmV0dXJuIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgcyBpbiB0aGUgZ2l2ZW4KKyAgICBiYXNlLCB3aGljaCBkZWZhdWx0cyB0byAxMC4gIFRoZSBzdHJpbmcgcyBtdXN0IGNvbnNpc3Qgb2Ygb25lCisgICAgb3IgbW9yZSBkaWdpdHMsIHBvc3NpYmx5IHByZWNlZGVkIGJ5IGEgc2lnbi4gIElmIGJhc2UgaXMgMCwgaXQKKyAgICBpcyBjaG9zZW4gZnJvbSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzIG9mIHMsIDAgZm9yIG9jdGFsLCAweCBvcgorICAgIDBYIGZvciBoZXhhZGVjaW1hbC4gIElmIGJhc2UgaXMgMTYsIGEgcHJlY2VkaW5nIDB4IG9yIDBYIGlzCisgICAgYWNjZXB0ZWQuCisKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHMgPSBhcmdzWzBdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZnVuY3Rpb24gcmVxdWlyZXMgYXQgbGVhc3QgMSBhcmd1bWVudDogJWQgZ2l2ZW4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcmdzKSkKKyAgICAjIERvbid0IGNhdGNoIHR5cGUgZXJyb3IgcmVzdWx0aW5nIGZyb20gdG9vIG1hbnkgYXJndW1lbnRzIHRvIGludCgpLiAgVGhlCisgICAgIyBlcnJvciBtZXNzYWdlIGlzbid0IGNvbXBhdGlibGUgYnV0IHRoZSBlcnJvciB0eXBlIGlzLCBhbmQgdGhpcyBmdW5jdGlvbgorICAgICMgaXMgY29tcGxpY2F0ZWQgZW5vdWdoIGFscmVhZHkuCisgICAgaWYgdHlwZShzKSA9PSBfU3RyaW5nVHlwZToKKyAgICAgICAgcmV0dXJuIF9hcHBseShfaW50LCBhcmdzKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXJndW1lbnQgMTogZXhwZWN0ZWQgc3RyaW5nLCAlcyBmb3VuZCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShzKS5fX25hbWVfXykKKworCisjIENvbnZlcnQgc3RyaW5nIHRvIGxvbmcgaW50ZWdlcgorZGVmIGF0b2woKmFyZ3MpOgorICAgICIiImF0b2wocyBbLGJhc2VdKSAtPiBsb25nCisKKyAgICBSZXR1cm4gdGhlIGxvbmcgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIHMgaW4gdGhlCisgICAgZ2l2ZW4gYmFzZSwgd2hpY2ggZGVmYXVsdHMgdG8gMTAuICBUaGUgc3RyaW5nIHMgbXVzdCBjb25zaXN0CisgICAgb2Ygb25lIG9yIG1vcmUgZGlnaXRzLCBwb3NzaWJseSBwcmVjZWRlZCBieSBhIHNpZ24uICBJZiBiYXNlCisgICAgaXMgMCwgaXQgaXMgY2hvc2VuIGZyb20gdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBvZiBzLCAwIGZvcgorICAgIG9jdGFsLCAweCBvciAwWCBmb3IgaGV4YWRlY2ltYWwuICBJZiBiYXNlIGlzIDE2LCBhIHByZWNlZGluZworICAgIDB4IG9yIDBYIGlzIGFjY2VwdGVkLiAgQSB0cmFpbGluZyBMIG9yIGwgaXMgbm90IGFjY2VwdGVkLAorICAgIHVubGVzcyBiYXNlIGlzIDAuCisKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHMgPSBhcmdzWzBdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZnVuY3Rpb24gcmVxdWlyZXMgYXQgbGVhc3QgMSBhcmd1bWVudDogJWQgZ2l2ZW4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcmdzKSkKKyAgICAjIERvbid0IGNhdGNoIHR5cGUgZXJyb3IgcmVzdWx0aW5nIGZyb20gdG9vIG1hbnkgYXJndW1lbnRzIHRvIGxvbmcoKS4gIFRoZQorICAgICMgZXJyb3IgbWVzc2FnZSBpc24ndCBjb21wYXRpYmxlIGJ1dCB0aGUgZXJyb3IgdHlwZSBpcywgYW5kIHRoaXMgZnVuY3Rpb24KKyAgICAjIGlzIGNvbXBsaWNhdGVkIGVub3VnaCBhbHJlYWR5LgorICAgIGlmIHR5cGUocykgPT0gX1N0cmluZ1R5cGU6CisgICAgICAgIHJldHVybiBfYXBwbHkoX2xvbmcsIGFyZ3MpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhcmd1bWVudCAxOiBleHBlY3RlZCBzdHJpbmcsICVzIGZvdW5kJyAlCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHMpLl9fbmFtZV9fKQorCisKKyMgTGVmdC1qdXN0aWZ5IGEgc3RyaW5nCitkZWYgbGp1c3Qocywgd2lkdGgpOgorICAgICIiImxqdXN0KHMsIHdpZHRoKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGxlZnQtanVzdGlmaWVkIHZlcnNpb24gb2YgcywgaW4gYSBmaWVsZCBvZiB0aGUKKyAgICBzcGVjaWZpZWQgd2lkdGgsIHBhZGRlZCB3aXRoIHNwYWNlcyBhcyBuZWVkZWQuICBUaGUgc3RyaW5nIGlzCisgICAgbmV2ZXIgdHJ1bmNhdGVkLgorCisgICAgIiIiCisgICAgbiA9IHdpZHRoIC0gbGVuKHMpCisgICAgaWYgbiA8PSAwOiByZXR1cm4gcworICAgIHJldHVybiBzICsgJyAnKm4KKworIyBSaWdodC1qdXN0aWZ5IGEgc3RyaW5nCitkZWYgcmp1c3Qocywgd2lkdGgpOgorICAgICIiInJqdXN0KHMsIHdpZHRoKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIHJpZ2h0LWp1c3RpZmllZCB2ZXJzaW9uIG9mIHMsIGluIGEgZmllbGQgb2YgdGhlCisgICAgc3BlY2lmaWVkIHdpZHRoLCBwYWRkZWQgd2l0aCBzcGFjZXMgYXMgbmVlZGVkLiAgVGhlIHN0cmluZyBpcworICAgIG5ldmVyIHRydW5jYXRlZC4KKworICAgICIiIgorICAgIG4gPSB3aWR0aCAtIGxlbihzKQorICAgIGlmIG4gPD0gMDogcmV0dXJuIHMKKyAgICByZXR1cm4gJyAnKm4gKyBzCisKKyMgQ2VudGVyIGEgc3RyaW5nCitkZWYgY2VudGVyKHMsIHdpZHRoKToKKyAgICAiIiJjZW50ZXIocywgd2lkdGgpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY2VudGVyIHZlcnNpb24gb2YgcywgaW4gYSBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkCisgICAgd2lkdGguIHBhZGRlZCB3aXRoIHNwYWNlcyBhcyBuZWVkZWQuICBUaGUgc3RyaW5nIGlzIG5ldmVyCisgICAgdHJ1bmNhdGVkLgorCisgICAgIiIiCisgICAgbiA9IHdpZHRoIC0gbGVuKHMpCisgICAgaWYgbiA8PSAwOiByZXR1cm4gcworICAgIGhhbGYgPSBuLzIKKyAgICBpZiBuJTIgYW5kIHdpZHRoJTI6CisgICAgICAgICMgVGhpcyBlbnN1cmVzIHRoYXQgY2VudGVyKGNlbnRlcihzLCBpKSwgaikgPSBjZW50ZXIocywgaikKKyAgICAgICAgaGFsZiA9IGhhbGYrMQorICAgIHJldHVybiAnICcqaGFsZiArICBzICsgJyAnKihuLWhhbGYpCisKKyMgWmVyby1maWxsIGEgbnVtYmVyLCBlLmcuLCAoMTIsIDMpIC0tPiAnMDEyJyBhbmQgKC0zLCAzKSAtLT4gJy0wMycKKyMgRGVjYWRlbnQgZmVhdHVyZTogdGhlIGFyZ3VtZW50IG1heSBiZSBhIHN0cmluZyBvciBhIG51bWJlcgorIyAoVXNlIG9mIHRoaXMgaXMgZGVwcmVjYXRlZDsgaXQgc2hvdWxkIGJlIGEgc3RyaW5nIGFzIHdpdGggbGp1c3QgYy5zLikKK2RlZiB6ZmlsbCh4LCB3aWR0aCk6CisgICAgIiIiemZpbGwoeCwgd2lkdGgpIC0+IHN0cmluZworCisgICAgUGFkIGEgbnVtZXJpYyBzdHJpbmcgeCB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGQKKyAgICBvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgVGhlIHN0cmluZyB4IGlzIG5ldmVyIHRydW5jYXRlZC4KKworICAgICIiIgorICAgIGlmIHR5cGUoeCkgPT0gdHlwZSgnJyk6IHMgPSB4CisgICAgZWxzZTogcyA9IGB4YAorICAgIG4gPSBsZW4ocykKKyAgICBpZiBuID49IHdpZHRoOiByZXR1cm4gcworICAgIHNpZ24gPSAnJworICAgIGlmIHNbMF0gaW4gKCctJywgJysnKToKKyAgICAgICAgc2lnbiwgcyA9IHNbMF0sIHNbMTpdCisgICAgcmV0dXJuIHNpZ24gKyAnMCcqKHdpZHRoLW4pICsgcworCisjIEV4cGFuZCB0YWJzIGluIGEgc3RyaW5nLgorIyBEb2Vzbid0IHRha2Ugbm9uLXByaW50aW5nIGNoYXJzIGludG8gYWNjb3VudCwgYnV0IGRvZXMgdW5kZXJzdGFuZCBcbi4KK2RlZiBleHBhbmR0YWJzKHMsIHRhYnNpemU9OCk6CisgICAgIiIiZXhwYW5kdGFicyhzIFssdGFic2l6ZV0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCBhbGwgdGFiIGNoYXJhY3RlcnMgcmVwbGFjZWQKKyAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50CisgICAgY29sdW1uLCBhbmQgdGhlIHRhYnNpemUgKGRlZmF1bHQgOCkuCisKKyAgICAiIiIKKyAgICByZXMgPSBsaW5lID0gJycKKyAgICBmb3IgYyBpbiBzOgorICAgICAgICBpZiBjID09ICdcdCc6CisgICAgICAgICAgICBjID0gJyAnKih0YWJzaXplIC0gbGVuKGxpbmUpICUgdGFic2l6ZSkKKyAgICAgICAgbGluZSA9IGxpbmUgKyBjCisgICAgICAgIGlmIGMgPT0gJ1xuJzoKKyAgICAgICAgICAgIHJlcyA9IHJlcyArIGxpbmUKKyAgICAgICAgICAgIGxpbmUgPSAnJworICAgIHJldHVybiByZXMgKyBsaW5lCisKKyMgQ2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRocm91Z2ggbG9vay11cCB0YWJsZS4KK2RlZiB0cmFuc2xhdGUocywgdGFibGUsIGRlbGV0aW9ucz0iIik6CisgICAgIiIidHJhbnNsYXRlKHMsdGFibGUgWyxkZWxldGVjaGFyc10pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMsIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZworICAgIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGVjaGFycyBhcmUgcmVtb3ZlZCwgYW5kIHRoZQorICAgIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW4KKyAgICB0cmFuc2xhdGlvbiB0YWJsZSwgd2hpY2ggbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMjU2LgorCisgICAgIiIiCisgICAgcmV0dXJuIHMudHJhbnNsYXRlKHRhYmxlLCBkZWxldGlvbnMpCisKKyMgQ2FwaXRhbGl6ZSBhIHN0cmluZywgZS5nLiAiYUJjICBkRWYiIC0+ICJBYmMgIGRlZiIuCitkZWYgY2FwaXRhbGl6ZShzKToKKyAgICAiIiJjYXBpdGFsaXplKHMpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCBvbmx5IGl0cyBmaXJzdCBjaGFyYWN0ZXIKKyAgICBjYXBpdGFsaXplZC4KKworICAgICIiIgorICAgIHJldHVybiBzLmNhcGl0YWxpemUoKQorCisjIENhcGl0YWxpemUgdGhlIHdvcmRzIGluIGEgc3RyaW5nLCBlLmcuICIgYUJjICBkRWYgIiAtPiAiQWJjIERlZiIuCisjIFNlZSBhbHNvIHJlZ3N1Yi5jYXB3b3JkcygpLgorZGVmIGNhcHdvcmRzKHMsIHNlcD1Ob25lKToKKyAgICAiIiJjYXB3b3JkcyhzLCBbc2VwXSkgLT4gc3RyaW5nCisKKyAgICBTcGxpdCB0aGUgYXJndW1lbnQgaW50byB3b3JkcyB1c2luZyBzcGxpdCwgY2FwaXRhbGl6ZSBlYWNoCisgICAgd29yZCB1c2luZyBjYXBpdGFsaXplLCBhbmQgam9pbiB0aGUgY2FwaXRhbGl6ZWQgd29yZHMgdXNpbmcKKyAgICBqb2luLiBOb3RlIHRoYXQgdGhpcyByZXBsYWNlcyBydW5zIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBieQorICAgIGEgc2luZ2xlIHNwYWNlLgorCisgICAgIiIiCisgICAgcmV0dXJuIGpvaW4obWFwKGNhcGl0YWxpemUsIHMuc3BsaXQoc2VwKSksIHNlcCBvciAnICcpCisKKyMgQ29uc3RydWN0IGEgdHJhbnNsYXRpb24gc3RyaW5nCitfaWRtYXBMID0gTm9uZQorZGVmIG1ha2V0cmFucyhmcm9tc3RyLCB0b3N0cik6CisgICAgIiIibWFrZXRyYW5zKGZybSwgdG8pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgdHJhbnNsYXRpb24gdGFibGUgKGEgc3RyaW5nIG9mIDI1NiBieXRlcyBsb25nKQorICAgIHN1aXRhYmxlIGZvciB1c2UgaW4gc3RyaW5nLnRyYW5zbGF0ZS4gIFRoZSBzdHJpbmdzIGZybSBhbmQgdG8KKyAgICBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KKworICAgICIiIgorICAgIGlmIGxlbihmcm9tc3RyKSAhPSBsZW4odG9zdHIpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibWFrZXRyYW5zIGFyZ3VtZW50cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgiCisgICAgZ2xvYmFsIF9pZG1hcEwKKyAgICBpZiBub3QgX2lkbWFwTDoKKyAgICAgICAgX2lkbWFwTCA9IG1hcChOb25lLCBfaWRtYXApCisgICAgTCA9IF9pZG1hcExbOl0KKyAgICBmcm9tc3RyID0gbWFwKG9yZCwgZnJvbXN0cikKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oZnJvbXN0cikpOgorICAgICAgICBMW2Zyb21zdHJbaV1dID0gdG9zdHJbaV0KKyAgICByZXR1cm4gam9pbmZpZWxkcyhMLCAiIikKKworIyBTdWJzdHJpbmcgcmVwbGFjZW1lbnQgKGdsb2JhbCkKK2RlZiByZXBsYWNlKHMsIG9sZCwgbmV3LCBtYXhzcGxpdD0wKToKKyAgICAiIiJyZXBsYWNlIChzdHIsIG9sZCwgbmV3WywgbWF4c3BsaXRdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2Ygc3RyaW5nIHN0ciB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcKKyAgICBvbGQgcmVwbGFjZWQgYnkgbmV3LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgbWF4c3BsaXQgaXMKKyAgICBnaXZlbiwgb25seSB0aGUgZmlyc3QgbWF4c3BsaXQgb2NjdXJyZW5jZXMgYXJlIHJlcGxhY2VkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMucmVwbGFjZShvbGQsIG5ldywgbWF4c3BsaXQpCisKKworIyBYWFg6IHRyYW5zaXRpb25hbAorIworIyBJZiBzdHJpbmcgb2JqZWN0cyBkbyBub3QgaGF2ZSBtZXRob2RzLCB0aGVuIHdlIG5lZWQgdG8gdXNlIHRoZSBvbGQgc3RyaW5nLnB5CisjIGxpYnJhcnksIHdoaWNoIHVzZXMgc3Ryb3AgZm9yIG1hbnkgbW9yZSB0aGluZ3MgdGhhbiBqdXN0IHRoZSBmZXcgb3V0bGluZWQKKyMgYmVsb3cuCit0cnk6CisgICAgJycudXBwZXIKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBmcm9tIHN0cmluZ29sZCBpbXBvcnQgKgorCisjIFRyeSBpbXBvcnRpbmcgb3B0aW9uYWwgYnVpbHQtaW4gbW9kdWxlICJzdHJvcCIgLS0gaWYgaXQgZXhpc3RzLAorIyBpdCByZWRlZmluZXMgc29tZSBzdHJpbmcgb3BlcmF0aW9ucyB0aGF0IGFyZSAxMDAtMTAwMCB0aW1lcyBmYXN0ZXIuCisjIEl0IGFsc28gZGVmaW5lcyB2YWx1ZXMgZm9yIHdoaXRlc3BhY2UsIGxvd2VyY2FzZSBhbmQgdXBwZXJjYXNlCisjIHRoYXQgbWF0Y2ggPGN0eXBlLmg+J3MgZGVmaW5pdGlvbnMuCisKK3RyeToKKyAgICBmcm9tIHN0cm9wIGltcG9ydCBtYWtldHJhbnMsIGxvd2VyY2FzZSwgdXBwZXJjYXNlLCB3aGl0ZXNwYWNlCisgICAgbGV0dGVycyA9IGxvd2VyY2FzZSArIHVwcGVyY2FzZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSB0aGUgb3JpZ2luYWwgdmVyc2lvbnMKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3RlbG5ldGxpLnB5IGIvTGliL2Rvcy04eDMvdGVsbmV0bGkucHkKaW5kZXggZWZiMmI0MC4uZGZkNTQ5ZSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVsbmV0bGkucHkKKysrIGIvTGliL2Rvcy04eDMvdGVsbmV0bGkucHkKQEAgLTMyOSw2ICszMjksNyBAQAogICAgICAgICAgICAgICAgICAgICBvcHQgPSBzZWxmLnJhd3FfZ2V0Y2hhcigpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYubXNnKCdJQUMgJXMgJWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID09IFdJTEwgYW5kICdXSUxMJyBvciAnV09OVCcsIG9yZChjKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLnNlbmQoSUFDICsgRE9OVCArIG9wdCkKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBzZWxmLm1zZygnSUFDICVzIG5vdCByZWNvZ25pemVkJyAlIGBjYCkKICAgICAgICAgZXhjZXB0IEVPRkVycm9yOiAjIHJhaXNlZCBieSBzZWxmLnJhd3FfZ2V0Y2hhcigpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2Jpbi5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfYmluLnB5CmluZGV4IGZlMzg0M2QuLjI4OTA4ZWYgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfYmluLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfYmluLnB5CkBAIC0xLDQ2ICsxLDkzIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0iIiJUZXN0IHNjcmlwdCBmb3IgdGhlIGJpbmFzY2lpIEMgbW9kdWxlCisiIiJUZXN0IHRoZSBiaW5hc2NpaSBDIG1vZHVsZS4iIiIKIAotICAgVXNlcyB0aGUgbWVjaGFuaXNtIG9mIHRoZSBweXRob24gYmluaGV4IG1vZHVsZQotICAgUm9nZXIgRS4gTWFzc2UKLSIiIgotaW1wb3J0IGJpbmhleAotaW1wb3J0IHRlbXBmaWxlCiBmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQoraW1wb3J0IGJpbmFzY2lpCiAKLWRlZiB0ZXN0KCk6CisjIFNob3cgbW9kdWxlIGRvYyBzdHJpbmcKK3ByaW50IGJpbmFzY2lpLl9fZG9jX18KIAotICAgIHRyeToKLSAgICAgICAgZm5hbWUxID0gdGVtcGZpbGUubWt0ZW1wKCkKLSAgICAgICAgZm5hbWUyID0gdGVtcGZpbGUubWt0ZW1wKCkKLSAgICAgICAgZiA9IG9wZW4oZm5hbWUxLCAndycpCi0gICAgZXhjZXB0OgotICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIkNhbm5vdCB0ZXN0IGJpbmFzY2lpIHdpdGhvdXQgYSB0ZW1wIGZpbGUiCisjIFNob3cgbW9kdWxlIGV4Y2VwdGlvbnMKK3ByaW50IGJpbmFzY2lpLkVycm9yCitwcmludCBiaW5hc2NpaS5JbmNvbXBsZXRlCiAKLSAgICBzdGFydCA9ICdKYWNrIGlzIG15IGhlcm8nCi0gICAgZi53cml0ZShzdGFydCkKLSAgICBmLmNsb3NlKCkKLSAgICAKLSAgICBiaW5oZXguYmluaGV4KGZuYW1lMSwgZm5hbWUyKQotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICdiaW5oZXgnCisjIENoZWNrIHByZXNlbmNlIGFuZCBkaXNwbGF5IGRvYyBzdHJpbmdzIG9mIGFsbCBmdW5jdGlvbnMKK2Z1bmNzID0gW10KK2ZvciBzdWZmaXggaW4gImJhc2U2NCIsICJocXgiLCAidXUiOgorICAgIHByZWZpeGVzID0gWyJhMmJfIiwgImIyYV8iXQorICAgIGlmIHN1ZmZpeCA9PSAiaHF4IjoKKyAgICAgICAgcHJlZml4ZXMuZXh0ZW5kKFsiY3JjXyIsICJybGVjb2RlXyIsICJybGVkZWNvZGVfIl0pCisgICAgZm9yIHByZWZpeCBpbiBwcmVmaXhlczoKKyAgICAgICAgbmFtZSA9IHByZWZpeCArIHN1ZmZpeAorICAgICAgICBmdW5jcy5hcHBlbmQoZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSkpCitmb3IgZnVuYyBpbiBmdW5jczoKKyAgICBwcmludCAiJS0xNXM6ICVzIiAlIChmdW5jLl9fbmFtZV9fLCBmdW5jLl9fZG9jX18pCiAKLSAgICBiaW5oZXguaGV4YmluKGZuYW1lMiwgZm5hbWUxKQotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICdoZXhiaW4nCisjIENyZWF0ZSBiaW5hcnkgdGVzdCBkYXRhCit0ZXN0ZGF0YSA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLlxyXG4iCitmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICMgQmUgc2xvdyBzbyB3ZSBkb24ndCBkZXBlbmQgb24gb3RoZXIgbW9kdWxlcworICAgIHRlc3RkYXRhID0gdGVzdGRhdGEgKyBjaHIoaSkKK3Rlc3RkYXRhID0gdGVzdGRhdGEgKyAiXHJcbkhlbGxvIHdvcmxkLlxuIgogCi0gICAgZiA9IG9wZW4oZm5hbWUxLCAncicpCi0gICAgZmluaXNoID0gZi5yZWFkbGluZSgpCisjIFRlc3QgYmFzZTY0IHdpdGggdmFsaWQgZGF0YQorcHJpbnQgImJhc2U2NCB0ZXN0IgorTUFYX0JBU0U2NCA9IDU3CitsaW5lcyA9IFtdCitmb3IgaSBpbiByYW5nZSgwLCBsZW4odGVzdGRhdGEpLCBNQVhfQkFTRTY0KToKKyAgICBiID0gdGVzdGRhdGFbaTppK01BWF9CQVNFNjRdCisgICAgYSA9IGJpbmFzY2lpLmIyYV9iYXNlNjQoYikKKyAgICBsaW5lcy5hcHBlbmQoYSkKKyAgICBwcmludCBhLAorcmVzID0gIiIKK2ZvciBsaW5lIGluIGxpbmVzOgorICAgIGIgPSBiaW5hc2NpaS5hMmJfYmFzZTY0KGxpbmUpCisgICAgcmVzID0gcmVzICsgYgorYXNzZXJ0IHJlcyA9PSB0ZXN0ZGF0YQogCi0gICAgaWYgc3RhcnQgPD4gZmluaXNoOgotICAgICAgICBwcmludCAnRXJyb3I6IGJpbmhleCA8PiBoZXhiaW4nCi0gICAgZWxpZiB2ZXJib3NlOgotICAgICAgICBwcmludCAnYmluaGV4ID09IGhleGJpbicKKyMgVGVzdCBiYXNlNjQgd2l0aCByYW5kb20gaW52YWxpZCBjaGFyYWN0ZXJzIHNwcmlua2xlZCB0aHJvdWdob3V0CisjIChUaGlzIHJlcXVpcmVzIGEgbmV3IHZlcnNpb24gb2YgYmluYXNjaWkuKQorZmlsbGVycyA9ICIiCit2YWxpZCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSsvIgorZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICBjID0gY2hyKGkpCisgICAgaWYgYyBub3QgaW4gdmFsaWQ6CisgICAgICAgIGZpbGxlcnMgPSBmaWxsZXJzICsgYworZGVmIGFkZG5vaXNlKGxpbmUpOgorICAgIG5vaXNlID0gZmlsbGVycworICAgIHJhdGlvID0gbGVuKGxpbmUpIC8gbGVuKG5vaXNlKQorICAgIHJlcyA9ICIiCisgICAgd2hpbGUgbGluZSBhbmQgbm9pc2U6CisgICAgICAgIGlmIGxlbihsaW5lKSAvIGxlbihub2lzZSkgPiByYXRpbzoKKyAgICAgICAgICAgIGMsIGxpbmUgPSBsaW5lWzBdLCBsaW5lWzE6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYywgbm9pc2UgPSBub2lzZVswXSwgbm9pc2VbMTpdCisgICAgICAgIHJlcyA9IHJlcyArIGMKKyAgICByZXR1cm4gcmVzICsgbm9pc2UgKyBsaW5lCityZXMgPSAiIgorZm9yIGxpbmUgaW4gbWFwKGFkZG5vaXNlLCBsaW5lcyk6CisgICAgYiA9IGJpbmFzY2lpLmEyYl9iYXNlNjQobGluZSkKKyAgICByZXMgPSByZXMgKyBiCithc3NlcnQgcmVzID09IHRlc3RkYXRhCiAKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBvcwotICAgICAgICBvcy51bmxpbmsoZm5hbWUxKQotICAgICAgICBvcy51bmxpbmsoZm5hbWUyKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcGFzcwotdGVzdCgpCisjIFRlc3QgdXUKK3ByaW50ICJ1dSB0ZXN0IgorTUFYX1VVID0gNDUKK2xpbmVzID0gW10KK2ZvciBpIGluIHJhbmdlKDAsIGxlbih0ZXN0ZGF0YSksIE1BWF9VVSk6CisgICAgYiA9IHRlc3RkYXRhW2k6aStNQVhfVVVdCisgICAgYSA9IGJpbmFzY2lpLmIyYV91dShiKQorICAgIGxpbmVzLmFwcGVuZChhKQorICAgIHByaW50IGEsCityZXMgPSAiIgorZm9yIGxpbmUgaW4gbGluZXM6CisgICAgYiA9IGJpbmFzY2lpLmEyYl91dShsaW5lKQorICAgIHJlcyA9IHJlcyArIGIKK2Fzc2VydCByZXMgPT0gdGVzdGRhdGEKKworIyBUZXN0IGNyYzMyKCkKK2NyYyA9IGJpbmFzY2lpLmNyYzMyKCJUZXN0IHRoZSBDUkMtMzIgb2YiKQorY3JjID0gYmluYXNjaWkuY3JjMzIoIiB0aGlzIHN0cmluZy4iLCBjcmMpCitpZiBjcmMgIT0gMTU3MTIyMDMzMDoKKyAgICBwcmludCAiYmluYXNjaWkuY3JjMzIoKSBmYWlsZWQuIgorCisjIFRoZSBocXggdGVzdCBpcyBpbiB0ZXN0X2JpbmhleC5weQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9jb24ucHkgYi9MaWIvZG9zLTh4My90ZXN0X2Nvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTUxMzVmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9jb24ucHkKQEAgLTAsMCArMSwxNjggQEAKK2Zyb20gdGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkCisKK2NsYXNzIGJhc2Vfc2V0OgorCisJZGVmIF9faW5pdF9fKHNlbGYsIGVsKToKKwkJc2VsZi5lbCA9IGVsCisKK2NsYXNzIHNldChiYXNlX3NldCk6CisKKwlkZWYgX19jb250YWluc19fKHNlbGYsIGVsKToKKwkJcmV0dXJuIHNlbGYuZWwgPT0gZWwKKworY2xhc3Mgc2VxKGJhc2Vfc2V0KToKKworCWRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuKToKKwkJcmV0dXJuIFtzZWxmLmVsXVtuXQorCitkZWYgY2hlY2sob2ssICphcmdzKToKKyAgICBpZiBub3Qgb2s6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICIgIi5qb2luKG1hcChzdHIsIGFyZ3MpKQorCithID0gYmFzZV9zZXQoMSkKK2IgPSBzZXQoMSkKK2MgPSBzZXEoMSkKKworY2hlY2soMSBpbiBiLCAiMSBub3QgaW4gc2V0KDEpIikKK2NoZWNrKDAgbm90IGluIGIsICIwIGluIHNldCgxKSIpCitjaGVjaygxIGluIGMsICIxIG5vdCBpbiBzZXEoMSkiKQorY2hlY2soMCBub3QgaW4gYywgIjAgaW4gc2VxKDEpIikKKwordHJ5OgorCTEgaW4gYQorCWNoZWNrKDAsICJpbiBiYXNlX3NldCBkaWQgbm90IHJhaXNlIGVycm9yIikKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKwlwYXNzCisKK3RyeToKKwkxIG5vdCBpbiBhCisJY2hlY2soMCwgIm5vdCBpbiBiYXNlX3NldCBkaWQgbm90IHJhaXNlIGVycm9yIikKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKwlwYXNzCisKKyMgVGVzdCBjaGFyIGluIHN0cmluZworCitjaGVjaygnYycgaW4gJ2FiYycsICInYycgbm90IGluICdhYmMnIikKK2NoZWNrKCdkJyBub3QgaW4gJ2FiYycsICInZCcgaW4gJ2FiYyciKQorCit0cnk6CisJJycgaW4gJ2FiYycKKwljaGVjaygwLCAiJycgaW4gJ2FiYycgZGlkIG5vdCByYWlzZSBlcnJvciIpCitleGNlcHQgVHlwZUVycm9yOgorCXBhc3MKKwordHJ5OgorCSdhYicgaW4gJ2FiYycKKwljaGVjaygwLCAiJ2FiJyBpbiAnYWJjJyBkaWQgbm90IHJhaXNlIGVycm9yIikKK2V4Y2VwdCBUeXBlRXJyb3I6CisJcGFzcworCit0cnk6CisJTm9uZSBpbiAnYWJjJworCWNoZWNrKDAsICJOb25lIGluICdhYmMnIGRpZCBub3QgcmFpc2UgZXJyb3IiKQorZXhjZXB0IFR5cGVFcnJvcjoKKwlwYXNzCisKKyMgVGVzdCBjaGFyIGluIFVuaWNvZGUKKworY2hlY2soJ2MnIGluIHUnYWJjJywgIidjJyBub3QgaW4gdSdhYmMnIikKK2NoZWNrKCdkJyBub3QgaW4gdSdhYmMnLCAiJ2QnIGluIHUnYWJjJyIpCisKK3RyeToKKwknJyBpbiB1J2FiYycKKwljaGVjaygwLCAiJycgaW4gdSdhYmMnIGRpZCBub3QgcmFpc2UgZXJyb3IiKQorZXhjZXB0IFR5cGVFcnJvcjoKKwlwYXNzCisKK3RyeToKKwknYWInIGluIHUnYWJjJworCWNoZWNrKDAsICInYWInIGluIHUnYWJjJyBkaWQgbm90IHJhaXNlIGVycm9yIikKK2V4Y2VwdCBUeXBlRXJyb3I6CisJcGFzcworCit0cnk6CisJTm9uZSBpbiB1J2FiYycKKwljaGVjaygwLCAiTm9uZSBpbiB1J2FiYycgZGlkIG5vdCByYWlzZSBlcnJvciIpCitleGNlcHQgVHlwZUVycm9yOgorCXBhc3MKKworIyBUZXN0IFVuaWNvZGUgY2hhciBpbiBVbmljb2RlCisKK2NoZWNrKHUnYycgaW4gdSdhYmMnLCAidSdjJyBub3QgaW4gdSdhYmMnIikKK2NoZWNrKHUnZCcgbm90IGluIHUnYWJjJywgInUnZCcgaW4gdSdhYmMnIikKKwordHJ5OgorCXUnJyBpbiB1J2FiYycKKwljaGVjaygwLCAidScnIGluIHUnYWJjJyBkaWQgbm90IHJhaXNlIGVycm9yIikKK2V4Y2VwdCBUeXBlRXJyb3I6CisJcGFzcworCit0cnk6CisJdSdhYicgaW4gdSdhYmMnCisJY2hlY2soMCwgInUnYWInIGluIHUnYWJjJyBkaWQgbm90IHJhaXNlIGVycm9yIikKK2V4Y2VwdCBUeXBlRXJyb3I6CisJcGFzcworCisjIFRlc3QgVW5pY29kZSBjaGFyIGluIHN0cmluZworCitjaGVjayh1J2MnIGluICdhYmMnLCAidSdjJyBub3QgaW4gJ2FiYyciKQorY2hlY2sodSdkJyBub3QgaW4gJ2FiYycsICJ1J2QnIGluICdhYmMnIikKKwordHJ5OgorCXUnJyBpbiAnYWJjJworCWNoZWNrKDAsICJ1JycgaW4gJ2FiYycgZGlkIG5vdCByYWlzZSBlcnJvciIpCitleGNlcHQgVHlwZUVycm9yOgorCXBhc3MKKwordHJ5OgorCXUnYWInIGluICdhYmMnCisJY2hlY2soMCwgInUnYWInIGluICdhYmMnIGRpZCBub3QgcmFpc2UgZXJyb3IiKQorZXhjZXB0IFR5cGVFcnJvcjoKKwlwYXNzCisKKyMgQSBjb2xsZWN0aW9uIG9mIHRlc3RzIG9uIGJ1aWx0aW4gc2VxdWVuY2UgdHlwZXMKK2EgPSByYW5nZSgxMCkKK2ZvciBpIGluIGE6CisJY2hlY2soaSBpbiBhLCAiJXMgbm90IGluICVzIiAlIChgaWAsIGBhYCkpCitjaGVjaygxNiBub3QgaW4gYSwgIjE2IG5vdCBpbiAlcyIgJSBgYWApCitjaGVjayhhIG5vdCBpbiBhLCAiJXMgbm90IGluICVzIiAlIChgYWAsIGBhYCkpCisKK2EgPSB0dXBsZShhKQorZm9yIGkgaW4gYToKKwljaGVjayhpIGluIGEsICIlcyBub3QgaW4gJXMiICUgKGBpYCwgYGFgKSkKK2NoZWNrKDE2IG5vdCBpbiBhLCAiMTYgbm90IGluICVzIiAlIGBhYCkKK2NoZWNrKGEgbm90IGluIGEsICIlcyBub3QgaW4gJXMiICUgKGBhYCwgYGFgKSkKKworY2xhc3MgRGV2aWFudDE6CisJIiIiQmVoYXZlcyBzdHJhbmdlbHkgd2hlbiBjb21wYXJlZAorCisJVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29udGFpbnMgY29kZQorCXdvcmtzIHdoZW4gdGhlIGxpc3QgaXMgbW9kaWZpZWQgZHVyaW5nIHRoZSBjaGVjay4KKwkiIiIKKworCWFMaXN0ID0gcmFuZ2UoMTUpCisJCisJZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCQlpZiBvdGhlciA9PSAxMjoKKwkJCXNlbGYuYUxpc3QucmVtb3ZlKDEyKQorCQkJc2VsZi5hTGlzdC5yZW1vdmUoMTMpCisJCQlzZWxmLmFMaXN0LnJlbW92ZSgxNCkKKwkJcmV0dXJuIDEKKworY2hlY2soRGV2aWFudDEoKSBub3QgaW4gRGV2aWFudDEuYUxpc3QsICJEZXZpYW50MSBmYWlsZWQiKQorCitjbGFzcyBEZXZpYW50MjoKKwkiIiJCZWhhdmVzIHN0cmFuZ2VseSB3aGVuIGNvbXBhcmVkCisKKwlUaGlzIGNsYXNzIHJhaXNlcyBhbiBleGNlcHRpb24gZHVyaW5nIGNvbXBhcmlzb24uICBUaGF0IGluCisJdHVybiBjYXVzZXMgdGhlIGNvbXBhcmlzb24gdG8gZmFpbCB3aXRoIGEgVHlwZUVycm9yLgorCSIiIgorCisJZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCQlpZiBvdGhlciA9PSA0OgorCQkJcmFpc2UgUnVudGltZUVycm9yLCAiZ290Y2hhIgorCit0cnk6CisJY2hlY2soRGV2aWFudDIoKSBub3QgaW4gYSwgIm9vcHMiKQorZXhjZXB0IFR5cGVFcnJvcjoKKwlwYXNzCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2NwaS5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfY3BpLnB5CmluZGV4IDkwODhlYjcuLmY1ZTkyMGYgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfY3BpLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfY3BpLnB5CkBAIC03OSwxOCArNzksMjkgQEAKICAgICBmLmNsb3NlKCkKICAgICB0cnk6CiAgICAgICAgIGNQaWNrbGUuZHVtcCgxMjMsIGYpCi0gICAgZXhjZXB0IElPRXJyb3I6CisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgotICAgICAgICBwcmludCAiZHVtcCB0byBjbG9zZWQgZmlsZSBzaG91bGQgcmFpc2UgSU9FcnJvciIKKyAgICAgICAgcHJpbnQgImR1bXAgdG8gY2xvc2VkIGZpbGUgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IiCiAgICAgZiA9IG9wZW4oZm4sICJyIikKICAgICBmLmNsb3NlKCkKICAgICB0cnk6CiAgICAgICAgIGNQaWNrbGUubG9hZChmKQotICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKLSAgICAgICAgcHJpbnQgImxvYWQgZnJvbSBjbG9zZWQgZmlsZSBzaG91bGQgcmFpc2UgSU9FcnJvciIKKyAgICAgICAgcHJpbnQgImxvYWQgZnJvbSBjbG9zZWQgZmlsZSBzaG91bGQgcmFpc2UgVmFsdWVFcnJvciIKICAgICBvcy5yZW1vdmUoZm4pCiAKKyAgICAjIFRlc3Qgc3BlY2lmaWMgYmFkIGNhc2VzCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ID0gY1BpY2tsZS5sb2FkcygnZ2FyeXAnKQorICAgICAgICBleGNlcHQgY1BpY2tsZS5CYWRQaWNrbGVHZXQsIHk6CisgICAgICAgICAgICBkZWwgeQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgInVuZXhwZWN0ZWQgc3VjY2VzcyEiCisgICAgICAgICAgICBicmVhaworICAgIAorCiBkb3Rlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9leHQucHkgYi9MaWIvZG9zLTh4My90ZXN0X2V4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2NhMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9leHQucHkKQEAgLTAsMCArMSwxNDMgQEAKK2Zyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0CisKK2RlZiBmKCphLCAqKmspOgorICAgIHByaW50IGEsIGsKKworZGVmIGcoeCwgKnksICoqeik6CisgICAgcHJpbnQgeCwgeSwgegorCitkZWYgaChqPTEsIGE9MiwgaD0zKToKKyAgICBwcmludCBqLCBhLCBoCisKK2YoKQorZigxKQorZigxLCAyKQorZigxLCAyLCAzKQorCitmKDEsIDIsIDMsICooNCwgNSkpCitmKDEsIDIsIDMsICpbNCwgNV0pCitmKDEsIDIsIDMsICpVc2VyTGlzdChbNCwgNV0pKQorZigxLCAyLCAzLCAqKnsnYSc6NCwgJ2InOjV9KQorZigxLCAyLCAzLCAqKDQsIDUpLCAqKnsnYSc6NiwgJ2InOjd9KQorZigxLCAyLCAzLCB4PTQsIHk9NSwgKig2LCA3KSwgKip7J2EnOjgsICdiJzo5fSkKKwordHJ5OgorICAgIGcoKQorZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgIHByaW50ICJUeXBlRXJyb3I6IiwgZXJyCitlbHNlOgorICAgIHByaW50ICJzaG91bGQgcmFpc2UgVHlwZUVycm9yOiBub3QgZW5vdWdoIGFyZ3VtZW50czsgZXhwZWN0ZWQgMSwgZ290IDAiCisgICAgCit0cnk6CisgICAgZygqKCkpCitleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgcHJpbnQgIlR5cGVFcnJvcjoiLCBlcnIKK2Vsc2U6CisgICAgcHJpbnQgInNob3VsZCByYWlzZSBUeXBlRXJyb3I6IG5vdCBlbm91Z2ggYXJndW1lbnRzOyBleHBlY3RlZCAxLCBnb3QgMCIKKyAgICAKK3RyeToKKyAgICBnKCooKSwgKip7fSkKK2V4Y2VwdCBUeXBlRXJyb3IsIGVycjoKKyAgICBwcmludCAiVHlwZUVycm9yOiIsIGVycgorZWxzZToKKyAgICBwcmludCAic2hvdWxkIHJhaXNlIFR5cGVFcnJvcjogbm90IGVub3VnaCBhcmd1bWVudHM7IGV4cGVjdGVkIDEsIGdvdCAwIgorICAgIAorZygxKQorZygxLCAyKQorZygxLCAyLCAzKQorZygxLCAyLCAzLCAqKDQsIDUpKQorY2xhc3MgTm90aGluZzogcGFzcwordHJ5OgorICAgIGcoKk5vdGhpbmcoKSkKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgYXR0cjoKKyAgICBwYXNzCitlbHNlOgorICAgIHByaW50ICJzaG91bGQgcmFpc2UgQXR0cmlidXRlRXJyb3I6IF9fbGVuX18iCisKK2NsYXNzIE5vdGhpbmc6CisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiA1Cit0cnk6CisgICAgZygqTm90aGluZygpKQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBhdHRyOgorICAgIHBhc3MKK2Vsc2U6CisgICAgcHJpbnQgInNob3VsZCByYWlzZSBBdHRyaWJ1dGVFcnJvcjogX19nZXRpdGVtX18iCisgICAgCitjbGFzcyBOb3RoaW5nOgorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gNQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgaWYgaSA8IDM6CisgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvciwgaQorZygqTm90aGluZygpKQorCisjIG1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gY2FsbCBkb2Vzbid0IHN0b21wIG9uIHRoZSBkaWN0aW9uYXJ5PworZCA9IHsnYSc6IDEsICdiJzogMiwgJ2MnOiAzfQorZDIgPSBkLmNvcHkoKQorYXNzZXJ0IGQgPT0gZDIKK2coMSwgZD00LCAqKmQpCitwcmludCBkCitwcmludCBkMgorYXNzZXJ0IGQgPT0gZDIsICJmdW5jdGlvbiBjYWxsIG1vZGlmaWVkIGRpY3Rpb25hcnkiCisKKyMgd2hhdCBhYm91dCB3aWxsZnVsIG1pc2NvbmR1Y3Q/CitkZWYgc2Fib3RldXIoKiprdyk6CisgICAga3dbJ3gnXSA9IGxvY2FscygpCitkID0ge30KK3NhYm90ZXVyKGE9MSwgKipkKQorYXNzZXJ0IGQgPT0ge30KKyAgICAgICAgCit0cnk6CisgICAgZygxLCAyLCAzLCAqKnsneCc6NCwgJ3knOjV9KQorZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgIHByaW50IGVycgorZWxzZToKKyAgICBwcmludCAic2hvdWxkIHJhaXNlIFR5cGVFcnJvcjoga2V5d29yZCBwYXJhbWV0ZXIgcmVkZWZpbmVkIgorICAgIAordHJ5OgorICAgIGcoMSwgMiwgMywgYT00LCBiPTUsICooNiwgNyksICoqeydhJzo4LCAnYic6OX0pCitleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgcHJpbnQgZXJyCitlbHNlOgorICAgIHByaW50ICJzaG91bGQgcmFpc2UgVHlwZUVycm9yOiBrZXl3b3JkIHBhcmFtZXRlciByZWRlZmluZWQiCisKK3RyeToKKyAgICBmKCoqezE6Mn0pCitleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgcHJpbnQgZXJyCitlbHNlOgorICAgIHByaW50ICJzaG91bGQgcmFpc2UgVHlwZUVycm9yOiBrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3MiCisKK3RyeToKKyAgICBoKCoqeydlJzogMn0pCitleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgcHJpbnQgZXJyCitlbHNlOgorICAgIHByaW50ICJzaG91bGQgcmFpc2UgVHlwZUVycm9yOiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQ6IGUiCisKK3RyeToKKyAgICBoKCpoKQorZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgIHByaW50IGVycgorZWxzZToKKyAgICBwcmludCAic2hvdWxkIHJhaXNlIFR5cGVFcnJvcjogKiBhcmd1bWVudCBtdXN0IGJlIGEgdHVwbGUiCisKK3RyeToKKyAgICBoKCoqaCkKK2V4Y2VwdCBUeXBlRXJyb3IsIGVycjoKKyAgICBwcmludCBlcnIKK2Vsc2U6CisgICAgcHJpbnQgInNob3VsZCByYWlzZSBUeXBlRXJyb3I6ICoqIGFyZ3VtZW50IG11c3QgYmUgYSBkaWN0aW9uYXJ5IgorCitkZWYgZjIoKmEsICoqYik6CisgICAgcmV0dXJuIGEsIGIKKworZCA9IHt9Citmb3IgaSBpbiByYW5nZSg1MTIpOgorICAgIGtleSA9ICdrJWQnICUgaQorICAgIGRba2V5XSA9IGkKK2EsIGIgPSBmMigxLCAqKDIsIDMpLCAqKmQpCitwcmludCBsZW4oYSksIGxlbihiKSwgYiA9PSBkCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2Zjbi5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfZmNuLnB5CmluZGV4IDEwMTQ0YzMuLmI1OWVmZGEgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfZmNuLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfZmNuLnB5CkBAIC0xOCw3ICsxOCw4IEBACiAgICAgCiBpZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywKICAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywKLSAgICAgICAgICAgICAgICAgICAgJ2JzZG9zMicsICdic2RvczMnLCAnYnNkb3M0Jyk6CisgICAgICAgICAgICAgICAgICAgICdic2RvczInLCAnYnNkb3MzJywgJ2JzZG9zNCcsCisgICAgICAgICAgICAgICAgICAgICdvcGVuYnNkJywgJ29wZW5ic2QyJyk6CiAgICAgbG9ja2RhdGEgPSBzdHJ1Y3QucGFjaygnbHh4eHhseHh4eGxoaCcsIDAsIDAsIDAsIEZDTlRMLkZfV1JMQ0ssIDApCiBlbGlmIHN5cy5wbGF0Zm9ybSBpbiBbJ2FpeDMnLCAnYWl4NCddOgogICAgIGxvY2tkYXRhID0gc3RydWN0LnBhY2soJ2hobGxsaWknLCBGQ05UTC5GX1dSTENLLCAwLCAwLCAwLCAwLCAwLCAwKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9mb3IucHkgYi9MaWIvZG9zLTh4My90ZXN0X2Zvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2UzMGRmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9mb3IucHkKQEAgLTAsMCArMSw2OCBAQAorIiIiVGhpcyB0ZXN0IGNoZWNrcyBmb3IgY29ycmVjdCBmb3JrKCkgYmVoYXZpb3IuCisKK1dlIHdhbnQgZm9yazEoKSBzZW1hbnRpY3MgLS0gb25seSB0aGUgZm9ya2luZyB0aHJlYWQgc3Vydml2ZXMgaW4gdGhlCitjaGlsZCBhZnRlciBhIGZvcmsoKS4KKworT24gc29tZSBzeXN0ZW1zIChlLmcuIFNvbGFyaXMgd2l0aG91dCBwb3NpeCB0aHJlYWRzKSB3ZSBmaW5kIHRoYXQgYWxsCithY3RpdmUgdGhyZWFkcyBzdXJ2aXZlIGluIHRoZSBjaGlsZCBhZnRlciBhIGZvcmsoKTsgdGhpcyBpcyBhbiBlcnJvci4KKworIiIiCisKK2ltcG9ydCBvcywgc3lzLCB0aW1lLCB0aHJlYWQKKwordHJ5OgorICAgIG9zLmZvcmsKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSBJbXBvcnRFcnJvciwgIm9zLmZvcmsgbm90IGRlZmluZWQgLS0gc2tpcHBpbmcgdGVzdF9mb3JrMSIKKworTE9OR1NMRUVQID0gMgorCitTSE9SVFNMRUVQID0gMC41CisKK05VTV9USFJFQURTID0gNAorCithbGl2ZSA9IHt9CisKK3N0b3AgPSAwCisKK2RlZiBmKGlkKToKKyAgICB3aGlsZSBub3Qgc3RvcDoKKyAgICAgICAgYWxpdmVbaWRdID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGltZS5zbGVlcChTSE9SVFNMRUVQKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworZGVmIG1haW4oKToKKyAgICBmb3IgaSBpbiByYW5nZShOVU1fVEhSRUFEUyk6CisgICAgICAgIHRocmVhZC5zdGFydF9uZXcoZiwgKGksKSkKKworICAgIHRpbWUuc2xlZXAoTE9OR1NMRUVQKQorCisgICAgYSA9IGFsaXZlLmtleXMoKQorICAgIGEuc29ydCgpCisgICAgYXNzZXJ0IGEgPT0gcmFuZ2UoTlVNX1RIUkVBRFMpCisKKyAgICBwcmVmb3JrX2xpdmVzID0gYWxpdmUuY29weSgpCisKKyAgICBjcGlkID0gb3MuZm9yaygpCisKKyAgICBpZiBjcGlkID09IDA6CisgICAgICAgICMgQ2hpbGQKKyAgICAgICAgdGltZS5zbGVlcChMT05HU0xFRVApCisgICAgICAgIG4gPSAwCisgICAgICAgIGZvciBrZXkgaW4gYWxpdmUua2V5cygpOgorICAgICAgICAgICAgaWYgYWxpdmVba2V5XSAhPSBwcmVmb3JrX2xpdmVzW2tleV06CisgICAgICAgICAgICAgICAgbiA9IG4rMQorICAgICAgICBvcy5fZXhpdChuKQorICAgIGVsc2U6CisgICAgICAgICMgUGFyZW50CisgICAgICAgIHNwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoY3BpZCwgMCkKKyAgICAgICAgYXNzZXJ0IHNwaWQgPT0gY3BpZAorICAgICAgICBhc3NlcnQgc3RhdHVzID09IDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpCisgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgICMgVGVsbCB0aHJlYWRzIHRvIGRpZQorICAgICAgICBzdG9wID0gMQorICAgICAgICB0aW1lLnNsZWVwKDIqU0hPUlRTTEVFUCkgIyBXYWl0IGZvciB0aHJlYWRzIHRvIGRpZQorCittYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfZ2RiLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9nZGIucHkKaW5kZXggMjJkYjZhYS4uMDMwMjE4ZSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9nZGIucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9nZGIucHkKQEAgLTUsNyArNSw3IEBACiAgICAgCiBpbXBvcnQgZ2RibQogZnJvbSBnZGJtIGltcG9ydCBlcnJvcgotZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKK2Zyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBUZXN0RmFpbGVkCiAKIGZpbGVuYW1lPSAnL3RtcC9kZWxldGVfbWUnCiAKQEAgLTE4LDYgKzE4LDEyIEBACiAgICAgCiBnLmhhc19rZXkoJ2EnKQogZy5jbG9zZSgpCit0cnk6CisgICAgZ1snYSddCitleGNlcHQgZXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByYWlzZSBUZXN0RmFpbGVkLCAiZXhwZWN0ZWQgZ2RibS5lcnJvciBhY2Nlc3NpbmcgY2xvc2VkIGRhdGFiYXNlIgogZyA9IGdkYm0ub3BlbihmaWxlbmFtZSwgJ3InKQogZy5jbG9zZSgpCiBnID0gZ2RibS5vcGVuKGZpbGVuYW1lLCAncncnKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9ncmEucHkgYi9MaWIvZG9zLTh4My90ZXN0X2dyYS5weQppbmRleCAyMTAxMmQyLi5mYTA5ZThjIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My90ZXN0X2dyYS5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X2dyYS5weQpAQCAtMTQwLDExICsxNDAsMTcgQEAKIHByaW50ICdmdW5jZGVmJwogIyMjICdkZWYnIE5BTUUgcGFyYW1ldGVycyAnOicgc3VpdGUKICMjIyBwYXJhbWV0ZXJzOiAnKCcgW3ZhcmFyZ3NsaXN0XSAnKScKLSMjIyB2YXJhcmdzbGlzdDogKGZwZGVmIFsnPScgdGVzdF0gJywnKSogJyonIE5BTUUKLSMjIyAgICAgICAgICAgIHwgZnBkZWYgWyc9JyB0ZXN0XSAoJywnIGZwZGVmIFsnPScgdGVzdF0pKiBbJywnXQorIyMjIHZhcmFyZ3NsaXN0OiAoZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKiAoJyonIE5BTUUgWycsJyAoJyoqJ3wnKicgJyonKSBOQU1FXQorIyMjICAgICAgICAgICAgfCAoJyoqJ3wnKicgJyonKSBOQU1FKQorIyMjICAgICAgICAgICAgfCBmcGRlZiBbJz0nIHRlc3RdICgnLCcgZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddICAKICMjIyBmcGRlZjogTkFNRSB8ICcoJyBmcGxpc3QgJyknCiAjIyMgZnBsaXN0OiBmcGRlZiAoJywnIGZwZGVmKSogWycsJ10KKyMjIyBhcmdsaXN0OiAoYXJndW1lbnQgJywnKSogKGFyZ3VtZW50IHwgKicgdGVzdCBbJywnICcqKicgdGVzdF0gfCAnKionIHRlc3QpCisjIyMgYXJndW1lbnQ6IFt0ZXN0ICc9J10gdGVzdAkjIFJlYWxseSBba2V5d29yZCAnPSddIHRlc3QKIGRlZiBmMSgpOiBwYXNzCitmMSgpCitmMSgqKCkpCitmMSgqKCksICoqe30pCiBkZWYgZjIob25lX2FyZ3VtZW50KTogcGFzcwogZGVmIGYzKHR3bywgYXJndW1lbnRzKTogcGFzcwogZGVmIGY0KHR3bywgKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKSk6IHBhc3MKQEAgLTE1NywxNiArMTYzLDI3IEBACiBkZWYgZDAxKGE9MSk6IHBhc3MKIGQwMSgpCiBkMDEoMSkKK2QwMSgqKDEsKSkKK2QwMSgqKnsnYSc6Mn0pCiBkZWYgZDExKGEsIGI9MSk6IHBhc3MKIGQxMSgxKQogZDExKDEsIDIpCitkMTEoMSwgKip7J2InOjJ9KQogZGVmIGQyMShhLCBiLCBjPTEpOiBwYXNzCiBkMjEoMSwgMikKIGQyMSgxLCAyLCAzKQorZDIxKCooMSwgMiwgMykpCitkMjEoMSwgKigyLCAzKSkKK2QyMSgxLCAyLCAqKDMsKSkKK2QyMSgxLCAyLCAqKnsnYyc6M30pCiBkZWYgZDAyKGE9MSwgYj0yKTogcGFzcwogZDAyKCkKIGQwMigxKQogZDAyKDEsIDIpCitkMDIoKigxLCAyKSkKK2QwMigxLCAqKDIsKSkKK2QwMigxLCAqKnsnYic6Mn0pCitkMDIoKip7J2EnOiAxLCAnYic6IDJ9KQogZGVmIGQxMihhLCBiPTEsIGM9Mik6IHBhc3MKIGQxMigxKQogZDEyKDEsIDIpCkBAIC0xNzksNiArMTk2LDkgQEAKIGQwMXYoKQogZDAxdigxKQogZDAxdigxLCAyKQorZDAxdigqKDEsIDIsIDMsIDQpKQorZDAxdigqKDEsKSkKK2QwMXYoKip7J2EnOjJ9KQogZGVmIGQxMXYoYSwgYj0xLCAqcmVzdCk6IHBhc3MKIGQxMXYoMSkKIGQxMXYoMSwgMikKQEAgLTE4NywyMSArMjA3LDMxIEBACiBkMjF2KDEsIDIpCiBkMjF2KDEsIDIsIDMpCiBkMjF2KDEsIDIsIDMsIDQpCitkMjF2KCooMSwgMiwgMywgNCkpCitkMjF2KDEsIDIsICoqeydjJzogM30pCiBkZWYgZDAydihhPTEsIGI9MiwgKnJlc3QpOiBwYXNzCiBkMDJ2KCkKIGQwMnYoMSkKIGQwMnYoMSwgMikKIGQwMnYoMSwgMiwgMykKK2QwMnYoMSwgKigyLCAzLCA0KSkKK2QwMnYoKip7J2EnOiAxLCAnYic6IDJ9KQogZGVmIGQxMnYoYSwgYj0xLCBjPTIsICpyZXN0KTogcGFzcwogZDEydigxKQogZDEydigxLCAyKQogZDEydigxLCAyLCAzKQogZDEydigxLCAyLCAzLCA0KQorZDEydigqKDEsIDIsIDMsIDQpKQorZDEydigxLCAyLCAqKDMsIDQsIDUpKQorZDEydigxLCAqKDIsKSwgKip7J2MnOiAzfSkKIGRlZiBkMjJ2KGEsIGIsIGM9MSwgZD0yLCAqcmVzdCk6IHBhc3MKIGQyMnYoMSwgMikKIGQyMnYoMSwgMiwgMykKIGQyMnYoMSwgMiwgMywgNCkKIGQyMnYoMSwgMiwgMywgNCwgNSkKK2QyMnYoKigxLCAyLCAzLCA0KSkKK2QyMnYoMSwgMiwgKigzLCA0LCA1KSkKK2QyMnYoMSwgKigyLCAzKSwgKip7J2QnOiA0fSkKIAogIyMjIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdAogIyBUZXN0ZWQgYmVsb3cKQEAgLTQ1NSw2ICs0ODUsNyBAQAogdjMoMSwoMiwzKSkKIHYzKDEsKDIsMyksNCkKIHYzKDEsKDIsMyksNCw1LDYsNyw4LDksMCkKK3ByaW50CiBpbXBvcnQgc3lzLCB0aW1lCiBjID0gc3lzLnBhdGhbMF0KIHggPSB0aW1lLnRpbWUoKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9sb24ucHkgYi9MaWIvZG9zLTh4My90ZXN0X2xvbi5weQppbmRleCBmMjM1ZDljLi42YTFmMTE3IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X2xvbi5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X2xvbi5weQpAQCAtNzcsNiArNzcsOCBAQAogZGVmIHRlc3RfZGl2aXNpb25fMih4LCB5KToKICAgICBxLCByID0gZGl2bW9kKHgsIHkpCiAgICAgcTIsIHIyID0geC95LCB4JXkKKyAgICBwYWIsIHBiYSA9IHgqeSwgeSp4CisgICAgY2hlY2socGFiID09IHBiYSwgIm11bHRpcGxpY2F0aW9uIGRvZXMgbm90IGNvbW11dGUgZm9yIiwgeCwgeSkKICAgICBjaGVjayhxID09IHEyLCAiZGl2bW9kIHJldHVybnMgZGlmZmVyZW50IHF1b3RpZW50IHRoYW4gLyBmb3IiLCB4LCB5KQogICAgIGNoZWNrKHIgPT0gcjIsICJkaXZtb2QgcmV0dXJucyBkaWZmZXJlbnQgbW9kIHRoYW4gJSBmb3IiLCB4LCB5KQogICAgIGNoZWNrKHggPT0gcSp5ICsgciwgInggIT0gcSp5ICsgciBhZnRlciBkaXZtb2Qgb24iLCB4LCB5KQpAQCAtMTU5LDcgKzE2MSw3IEBACiAgICAgICAgICAgICB0ZXN0X2JpdG9wX2lkZW50aXRpZXNfMih4LCB5KQogICAgICAgICAgICAgdGVzdF9iaXRvcF9pZGVudGl0aWVzXzMoeCwgeSwgZ2V0cmFuKChsZW54ICsgbGVueSkvMikpCiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhleCBvY3Qgc3RyIGF0b2wKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZXggb2N0IHJlcHIgc3RyIGF0b2wKIAogZGVmIHNsb3dfZm9ybWF0KHgsIGJhc2UpOgogICAgIGlmICh4LCBiYXNlKSA9PSAoMCwgOCk6CkBAIC0xODEsMTIgKzE4MywxOCBAQAogCiBkZWYgdGVzdF9mb3JtYXRfMSh4KToKICAgICBmcm9tIHN0cmluZyBpbXBvcnQgYXRvbAotICAgIGZvciBiYXNlLCBtYXBwZXIgaW4gKDgsIG9jdCksICgxMCwgc3RyKSwgKDE2LCBoZXgpOgorICAgIGZvciBiYXNlLCBtYXBwZXIgaW4gKDgsIG9jdCksICgxMCwgcmVwciksICgxNiwgaGV4KToKICAgICAgICAgZ290ID0gbWFwcGVyKHgpCiAgICAgICAgIGV4cGVjdGVkID0gc2xvd19mb3JtYXQoeCwgYmFzZSkKICAgICAgICAgY2hlY2soZ290ID09IGV4cGVjdGVkLCBtYXBwZXIuX19uYW1lX18sICJyZXR1cm5lZCIsCiAgICAgICAgICAgICAgIGdvdCwgImJ1dCBleHBlY3RlZCIsIGV4cGVjdGVkLCAiZm9yIiwgeCkKICAgICAgICAgY2hlY2soYXRvbChnb3QsIDApID09IHgsICdhdG9sKCIlcyIsIDApICE9JyAlIGdvdCwgeCkKKyAgICAjIHN0cigpIGhhcyB0byBiZSBjaGVja2VkIGEgbGl0dGxlIGRpZmZlcmVudGx5IHNpbmNlIHRoZXJlJ3Mgbm8KKyAgICAjIHRyYWlsaW5nICJMIgorICAgIGdvdCA9IHN0cih4KQorICAgIGV4cGVjdGVkID0gc2xvd19mb3JtYXQoeCwgMTApWzotMV0KKyAgICBjaGVjayhnb3QgPT0gZXhwZWN0ZWQsIG1hcHBlci5fX25hbWVfXywgInJldHVybmVkIiwKKyAgICAgICAgICBnb3QsICJidXQgZXhwZWN0ZWQiLCBleHBlY3RlZCwgImZvciIsIHgpCiAKIGRlZiB0ZXN0X2Zvcm1hdChtYXhkaWdpdHM9TUFYRElHSVRTKToKICAgICBwcmludCAibG9uZyBzdHIvaGV4L29jdC9hdG9sIgpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9tbWEucHkgYi9MaWIvZG9zLTh4My90ZXN0X21tYS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRhMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9tbWEucHkKQEAgLTAsMCArMSw2NyBAQAorCitpbXBvcnQgbW1hcAoraW1wb3J0IHN0cmluZywgb3MsIHJlLCBzeXMKKworUEFHRVNJWkUgPSBtbWFwLlBBR0VTSVpFCisKK2RlZiB0ZXN0X2JvdGgoKToKKyAgICAiVGVzdCBtbWFwIG1vZHVsZSBvbiBVbml4IHN5c3RlbXMgYW5kIFdpbmRvd3MiCisgICAgCisgICAgIyBDcmVhdGUgYW4gbW1hcCdlZCBmaWxlCisgICAgZiA9IG9wZW4oJ2ZvbycsICd3KycpCisgICAgCisgICAgIyBXcml0ZSAyIHBhZ2VzIHdvcnRoIG9mIGRhdGEgdG8gdGhlIGZpbGUKKyAgICBmLndyaXRlKCdcMCcqIFBBR0VTSVpFKQorICAgIGYud3JpdGUoJ2ZvbycpCisgICAgZi53cml0ZSgnXDAnKiAoUEFHRVNJWkUtMykgKQorCisgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAyICogUEFHRVNJWkUpCisgICAgZi5jbG9zZSgpCisgICAgCisgICAgIyBTaW1wbGUgc2FuaXR5IGNoZWNrcworICAgIHByaW50ICcgIFBvc2l0aW9uIG9mIGZvbzonLCBzdHJpbmcuZmluZChtLCAnZm9vJykgLyBmbG9hdChQQUdFU0laRSksICdwYWdlcycKKyAgICBhc3NlcnQgc3RyaW5nLmZpbmQobSwgJ2ZvbycpID09IFBBR0VTSVpFCisgICAgCisgICAgcHJpbnQgJyAgTGVuZ3RoIG9mIGZpbGU6JywgbGVuKG0pIC8gZmxvYXQoUEFHRVNJWkUpLCAncGFnZXMnCisgICAgYXNzZXJ0IGxlbihtKSA9PSAyKlBBR0VTSVpFCisKKyAgICBwcmludCAnICBDb250ZW50cyBvZiBieXRlIDA6JywgcmVwcihtWzBdKQorICAgIGFzc2VydCBtWzBdID09ICdcMCcKKyAgICBwcmludCAnICBDb250ZW50cyBvZiBmaXJzdCAzIGJ5dGVzOicsIHJlcHIobVswOjNdKQorICAgIGFzc2VydCBtWzA6M10gPT0gJ1wwXDBcMCcKKyAgICAKKyAgICAjIE1vZGlmeSB0aGUgZmlsZSdzIGNvbnRlbnQKKyAgICBwcmludCAiXG4gIE1vZGlmeWluZyBmaWxlJ3MgY29udGVudC4uLiIKKyAgICBtWzBdID0gJzMnCisgICAgbVtQQUdFU0laRSArMzogUEFHRVNJWkUgKzMrM109J2JhcicKKyAgICAKKyAgICAjIENoZWNrIHRoYXQgdGhlIG1vZGlmaWNhdGlvbiB3b3JrZWQKKyAgICBwcmludCAnICBDb250ZW50cyBvZiBieXRlIDA6JywgcmVwcihtWzBdKQorICAgIGFzc2VydCBtWzBdID09ICczJworICAgIHByaW50ICcgIENvbnRlbnRzIG9mIGZpcnN0IDMgYnl0ZXM6JywgcmVwcihtWzA6M10pCisgICAgYXNzZXJ0IG1bMDozXSA9PSAnM1wwXDAnCisgICAgcHJpbnQgJyAgQ29udGVudHMgb2Ygc2Vjb25kIHBhZ2U6JywgIG1bUEFHRVNJWkUtMSA6IFBBR0VTSVpFICsgN10KKyAgICBhc3NlcnQgbVtQQUdFU0laRS0xIDogUEFHRVNJWkUgKyA3XSA9PSAnXDBmb29iYXJcMCcKKyAgICAKKyAgICBtLmZsdXNoKCkKKworICAgICMgVGVzdCBkb2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBpbiBhbiBtbWFwJ2VkIGZpbGUKKyAgICBtYXRjaD1yZS5zZWFyY2goJ1tBLVphLXpdKycsIG0pCisgICAgaWYgbWF0Y2ggPT0gTm9uZToKKyAgICAgICAgcHJpbnQgJyAgRVJST1I6IHJlZ2V4IG1hdGNoIG9uIG1tYXAgZmFpbGVkIScKKyAgICBlbHNlOgorICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigwKQorICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydCAgICAgICAgICAgICAgIAorCisgICAgICAgIHByaW50ICcgIFJlZ2V4IG1hdGNoIG9uIG1tYXAgKHBhZ2Ugc3RhcnQsIGxlbmd0aCBvZiBtYXRjaCk6JywKKyAgICAgICAgcHJpbnQgc3RhcnQgLyBmbG9hdChQQUdFU0laRSksIGxlbmd0aAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHN0YXJ0ID09IFBBR0VTSVpFCisgICAgICAgIGFzc2VydCBlbmQgPT0gUEFHRVNJWkUgKyA2CisgICAgICAgIAorICAgIG0uY2xvc2UoKQorICAgIG9zLnVubGluaygiZm9vIikKKyAgICBwcmludCAnIFRlc3QgcGFzc2VkJworCit0ZXN0X2JvdGgoKQorCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X3B5ZS5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfcHllLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNmQ4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZG9zLTh4My90ZXN0X3B5ZS5weQpAQCAtMCwwICsxLDEwNyBAQAorIyBWZXJ5IHNpbXBsZSB0ZXN0IC0gUGFyc2UgYSBmaWxlIGFuZCBwcmludCB3aGF0IGhhcHBlbnMKKworIyBYWFggVHlwZUVycm9ycyBvbiBjYWxsaW5nIGhhbmRsZXJzLCBvciBvbiBiYWQgcmV0dXJuIHZhbHVlcyBmcm9tIGEKKyMgaGFuZGxlciwgYXJlIG9ic2N1cmUgYW5kIHVuaGVscGZ1bC4KKyAgICAgICAgCitpbXBvcnQgc3lzLCBzdHJpbmcKK2ltcG9ydCBvcworCitpbXBvcnQgcHlleHBhdAorICAgICAgICAgICAgICAgIAorY2xhc3MgT3V0cHV0dGVyOgorICAgIGRlZiBTdGFydEVsZW1lbnRIYW5kbGVyKHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgcHJpbnQgJ1N0YXJ0IGVsZW1lbnQ6XG5cdCcsIG5hbWUsIGF0dHJzCisgICAgICAgIAorICAgIGRlZiBFbmRFbGVtZW50SGFuZGxlcihzZWxmLCBuYW1lKToKKyAgICAgICAgcHJpbnQgJ0VuZCBlbGVtZW50OlxuXHQnLCBuYW1lCisKKyAgICBkZWYgQ2hhcmFjdGVyRGF0YUhhbmRsZXIoc2VsZiwgZGF0YSk6CisgICAgICAgIGRhdGEgPSBzdHJpbmcuc3RyaXAoZGF0YSkKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHByaW50ICdDaGFyYWN0ZXIgZGF0YTonCisgICAgICAgICAgICBwcmludCAnXHQnLCByZXByKGRhdGEpCisKKyAgICBkZWYgUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICBwcmludCAnUEk6XG5cdCcsIHRhcmdldCwgZGF0YQorCisgICAgZGVmIFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoc2VsZiwgcHJlZml4LCB1cmkpOgorICAgICAgICBwcmludCAnTlMgZGVjbDpcblx0JywgcHJlZml4LCB1cmkKKworICAgIGRlZiBFbmROYW1lc3BhY2VEZWNsSGFuZGxlcihzZWxmLCBwcmVmaXgpOgorICAgICAgICBwcmludCAnRW5kIG9mIE5TIGRlY2w6XG5cdCcsIHByZWZpeAorCisgICAgZGVmIFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihzZWxmKToKKyAgICAgICAgcHJpbnQgJ1N0YXJ0IG9mIENEQVRBIHNlY3Rpb24nCisKKyAgICBkZWYgRW5kQ2RhdGFTZWN0aW9uSGFuZGxlcihzZWxmKToKKyAgICAgICAgcHJpbnQgJ0VuZCBvZiBDREFUQSBzZWN0aW9uJworCisgICAgZGVmIENvbW1lbnRIYW5kbGVyKHNlbGYsIHRleHQpOgorICAgICAgICBwcmludCAnQ29tbWVudDpcblx0JywgcmVwcih0ZXh0KQorCisgICAgZGVmIE5vdGF0aW9uRGVjbEhhbmRsZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBuYW1lLCBiYXNlLCBzeXNpZCwgcHViaWQgPSBhcmdzCisgICAgICAgIHByaW50ICdOb3RhdGlvbiBkZWNsYXJlZDonLCBhcmdzCisKKyAgICBkZWYgVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihzZWxmLCAqYXJncyk6CisgICAgICAgIGVudGl0eU5hbWUsIGJhc2UsIHN5c3RlbUlkLCBwdWJsaWNJZCwgbm90YXRpb25OYW1lID0gYXJncworICAgICAgICBwcmludCAnVW5wYXJzZWQgZW50aXR5IGRlY2w6XG5cdCcsIGFyZ3MKKyAgICAKKyAgICBkZWYgTm90U3RhbmRhbG9uZUhhbmRsZXIoc2VsZiwgdXNlckRhdGEpOgorICAgICAgICBwcmludCAnTm90IHN0YW5kYWxvbmUnCisgICAgICAgIHJldHVybiAxCisgICAgICAgIAorICAgIGRlZiBFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoc2VsZiwgY29udGV4dCwgYmFzZSwgc3lzSWQsIHB1YklkKToKKyAgICAgICAgcHJpbnQgJ0V4dGVybmFsIGVudGl0eSByZWY6JywgY29udGV4dCwgYmFzZSwgc3lzSWQsIHB1YklkCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgRGVmYXVsdEhhbmRsZXIoc2VsZiwgdXNlckRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgRGVmYXVsdEhhbmRsZXJFeHBhbmQoc2VsZiwgdXNlckRhdGEpOgorICAgICAgICBwYXNzCisKKworb3V0ID0gT3V0cHV0dGVyKCkKK3BhcnNlciA9IHB5ZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9JyEnKQorZm9yIG5hbWUgaW4gWydTdGFydEVsZW1lbnRIYW5kbGVyJywgJ0VuZEVsZW1lbnRIYW5kbGVyJywKKyAgICAgICAgICAgICAnQ2hhcmFjdGVyRGF0YUhhbmRsZXInLCAnUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcicsCisgICAgICAgICAgICAgJ1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXInLCAnTm90YXRpb25EZWNsSGFuZGxlcicsCisgICAgICAgICAgICAgJ1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXInLCAnRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXInLAorICAgICAgICAgICAgICdDb21tZW50SGFuZGxlcicsICdTdGFydENkYXRhU2VjdGlvbkhhbmRsZXInLAorICAgICAgICAgICAgICdFbmRDZGF0YVNlY3Rpb25IYW5kbGVyJywKKyAgICAgICAgICAgICAnRGVmYXVsdEhhbmRsZXInLCAnRGVmYXVsdEhhbmRsZXJFeHBhbmQnLAorICAgICAgICAgICAgICMnTm90U3RhbmRhbG9uZUhhbmRsZXInLAorICAgICAgICAgICAgICdFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXInCisgICAgICAgICAgICAgXToKKyAgICBzZXRhdHRyKHBhcnNlciwgbmFtZSwgZ2V0YXR0cihvdXQsIG5hbWUpICkKKworZGF0YSA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiIHN0YW5kYWxvbmU9Im5vIj8+Cis8P3htbC1zdHlsZXNoZWV0IGhyZWY9InN0eWxlc2hlZXQuY3NzIj8+Cis8IS0tIGNvbW1lbnQgZGF0YSAtLT4KKzwhRE9DVFlQRSBxdW90YXRpb25zIFNZU1RFTSAicXVvdGF0aW9ucy5kdGQiIFsKKzwhRUxFTUVOVCByb290IEFOWT4KKzwhTk9UQVRJT04gbm90YXRpb24gU1lTVEVNICJub3RhdGlvbi5qcGVnIj4KKzwhRU5USVRZIGFjaXJjICImIzIyNjsiPgorPCFFTlRJVFkgZXh0ZXJuYWxfZW50aXR5IFNZU1RFTSAiZW50aXR5LmZpbGUiPgorPCFFTlRJVFkgdW5wYXJzZWRfZW50aXR5IFNZU1RFTSAiZW50aXR5LmZpbGUiIE5EQVRBIG5vdGF0aW9uPgorJXVucGFyc2VkX2VudGl0eTsKK10+CisKKzxyb290PgorPG15bnM6c3ViZWxlbWVudCB4bWxuczpteW5zPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlIj4KKyAgICAgQ29udGVudHMgb2Ygc3ViZWxlbWVudHMKKzwvbXluczpzdWJlbGVtZW50PgorPHN1YjI+PCFbQ0RBVEFbY29udGVudHMgb2YgQ0RBVEEgc2VjdGlvbl1dPjwvc3ViMj4KKyZleHRlcm5hbF9lbnRpdHk7Cis8L3Jvb3Q+CisiIiIKKwordHJ5OgorICAgIHBhcnNlci5QYXJzZShkYXRhLCAxKQorZXhjZXB0IHB5ZXhwYXQuZXJyb3I6CisgICAgcHJpbnQgJyoqIEVycm9yJywgcGFyc2VyLkVycm9yQ29kZSwgcHlleHBhdC5FcnJvclN0cmluZyggcGFyc2VyLkVycm9yQ29kZSkKKyAgICBwcmludCAnKiogTGluZScsIHBhcnNlci5FcnJvckxpbmVOdW1iZXIKKyAgICBwcmludCAnKiogQ29sdW1uJywgcGFyc2VyLkVycm9yQ29sdW1uTnVtYmVyCisgICAgcHJpbnQgJyoqIEJ5dGUnLCBwYXJzZXIuRXJyb3JCeXRlSW5kZXgKKwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9yZmMucHkgYi9MaWIvZG9zLTh4My90ZXN0X3JmYy5weQppbmRleCBiOGFlOGM3Li4wZDRjNjZmIDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3JmYy5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3JmYy5weQpAQCAtMTEsNiArMTEsNyBAQAogICAgIGZwLnNlZWsoMCkKICAgICBtID0gcmZjODIyLk1lc3NhZ2UoZnApCiAgICAgaSA9IDAKKyAgICAKICAgICBmb3IgbiwgYSBpbiBtLmdldGFkZHJsaXN0KCd0bycpICsgbS5nZXRhZGRybGlzdCgnY2MnKToKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICduYW1lOicsIHJlcHIobiksICdhZGRyOicsIHJlcHIoYSkKQEAgLTI4LDYgKzI5LDIxIEBACiAgICAgICAgICAgICAgICAgcHJpbnQgJyAgICBbbm8gbWF0Y2hdJwogICAgICAgICAgICAgcHJpbnQgJ25vdCBmb3VuZDonLCByZXByKG4pLCByZXByKGEpCiAKKyAgICBvdXQgPSBtLmdldGRhdGUoJ2RhdGUnKQorICAgIGlmIG91dDoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdEYXRlOicsIG0uZ2V0aGVhZGVyKCdkYXRlJykKKyAgICAgICAgaWYgb3V0ID09ICgxOTk5LCAxLCAxMywgMjMsIDU3LCAzNSwgMCwgMCwgMCk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICcgICAgW21hdGNoZWRdJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnICAgIFtubyBtYXRjaF0nCisgICAgICAgICAgICBwcmludCAnRGF0ZSBjb252ZXJzaW9uIGZhaWxlZDonLCBvdXQKKworIyBOb3RlOiBhbGwgdGVzdCBjYXNlcyBtdXN0IGhhdmUgdGhlIHNhbWUgZGF0ZSAoaW4gdmFyaW91cyBmb3JtYXRzKSwKKyMgb3Igbm8gZGF0ZSEKKwogdGVzdCgnJydEYXRlOiAgICBXZWQsIDEzIEphbiAxOTk5IDIzOjU3OjM1IC0wNTAwCiBGcm9tOiAgICBHdWlkbyB2YW4gUm9zc3VtIDxndWlkb0BDTlJJLlJlc3Rvbi5WQS5VUz4KIFRvOiAgICAgICJHdWlkbyB2YW4KQEAgLTQwLDYgKzU2LDcgQEAKIHRlc3QoJycnRnJvbTogQmFycnkgPGJ3YXJzYXdAcHl0aG9uLm9yZwogVG86IGd1aWRvQHB5dGhvbi5vcmcgKEd1aWRvOiB0aGUgQmFyYmFyaWFuKQogU3ViamVjdDogbm9uc2Vuc2UKK0RhdGU6IFdlZG5lc2RheSwgSmFudWFyeSAxMyAxOTk5IDIzOjU3OjM1IC0wNTAwCiAKIHRlc3QnJycsIFsoJ0d1aWRvOiB0aGUgQmFyYmFyaWFuJywgJ2d1aWRvQHB5dGhvbi5vcmcnKSwKICAgICAgICAgICBdKQpAQCAtNDcsNiArNjQsNyBAQAogdGVzdCgnJydGcm9tOiBCYXJyeSA8YndhcnNhd0BweXRob24ub3JnCiBUbzogZ3VpZG9AcHl0aG9uLm9yZyAoR3VpZG86IHRoZSBCYXJiYXJpYW4pCiBDYzogIkd1aWRvOiB0aGUgTWFkbWFuIiA8Z3VpZG9AcHl0aG9uLm9yZz4KK0RhdGU6ICAxMy1KYW4tMTk5OSAyMzo1NzozNSBFU1QKIAogdGVzdCcnJywgWygnR3VpZG86IHRoZSBCYXJiYXJpYW4nLCAnZ3VpZG9AcHl0aG9uLm9yZycpLAogICAgICAgICAgICgnR3VpZG86IHRoZSBNYWRtYW4nLCAnZ3VpZG9AcHl0aG9uLm9yZycpCkBAIC01NCw2ICs3Miw3IEBACiAKIHRlc3QoJycnVG86ICJUaGUgbW9uc3RlciB3aXRoCiAgICAgIHRoZSB2ZXJ5IGxvbmcgbmFtZTogR3VpZG8iIDxndWlkb0BweXRob24ub3JnPgorRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMAogCiB0ZXN0JycnLCBbKCdUaGUgbW9uc3RlciB3aXRoXG4gICAgIHRoZSB2ZXJ5IGxvbmcgbmFtZTogR3VpZG8nLAogICAgICAgICAgICAnZ3VpZG9AcHl0aG9uLm9yZycpXSkKQEAgLTYzLDYgKzgyLDcgQEAKICAgICAgICAgIidzdHJpbmctc2lnQHB5dGhvbi5vcmcnIiA8c3RyaW5nLXNpZ0BweXRob24ub3JnPgogQ2M6IGZvb3pAYmF0LmNvbSwgYmFydEB0b29mLmNvbQogQ2M6IGdvaXRAbGlwLmNvbQorRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMAogCiB0ZXN0JycnLCBbKCdBbWl0IEouIFBhdGVsJywgJ2FtaXRwQFRoZW9yeS5TdGFuZm9yZC5FRFUnKSwKICAgICAgICAgICAoJ01pa2UgRmxldGNoZXInLCAnbWZsZXRjaEB2cnRlbGVjb20uY29tJyksCkBAIC03NSw4ICs5NSwyOCBAQAogIyBUaGlzIG9uZSBpcyBqdXN0IHR3aXN0ZWQuICBJIGRvbid0IGtub3cgd2hhdCB0aGUgcHJvcGVyIHJlc3VsdCBzaG91bGQgYmUsCiAjIGJ1dCBpdCBzaG91bGRuJ3QgYmUgdG8gaW5mbG9vcCwgd2hpY2ggaXMgd2hhdCB1c2VkIHRvIGhhcHBlbiEKIHRlc3QoJycnVG86IDxbc210cDpkZDQ3QG1haWwueHh4LmVkdV1fYXRfaG1ocUBoZHEtbWRtMS1pbWdvdXQuY29tcGFuYXkuY29tPgorRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMAogCiB0ZXN0JycnLCBbKCcnLCAnJyksCiAgICAgICAgICAgKCcnLCAnZGQ0N0BtYWlsLnh4eC5lZHUnKSwKICAgICAgICAgICAoJycsICdfYXRfaG1ocUBoZHEtbWRtMS1pbWdvdXQuY29tcGFuYXkuY29tJykKICAgICAgICAgICBdKQorCisjIFRoaXMgZXhlcmNpc2VzIHRoZSBvbGQgY29tbWFzLWluLWEtZnVsbC1uYW1lIGJ1Zywgd2hpY2ggc2hvdWxkIGJlIGRvaW5nIHRoZQorIyByaWdodCB0aGluZyBpbiByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIG1vZHVsZS4KK3Rlc3QoJycnVG86ICJsYXN0LCBmaXJzdCIgPHVzZXJpZEBmb28ubmV0PgorCit0ZXN0JycnLCBbKCdsYXN0LCBmaXJzdCcsICd1c2VyaWRAZm9vLm5ldCcpLAorICAgICAgICAgIF0pCisKK3Rlc3QoJycnVG86IChDb21tZW50IHN0dWZmKSAiUXVvdGVkIG5hbWUiQHNvbWV3aGVyZS5jb20KKwordGVzdCcnJywgWygnQ29tbWVudCBzdHVmZicsICciUXVvdGVkIG5hbWUiQHNvbWV3aGVyZS5jb20nKSwKKyAgICAgICAgICBdKQorCit0ZXN0KCcnJ1RvOiA6CitDYzogZ29pdEBsaXAuY29tCitEYXRlOiAgICBXZWQsIDEzIEphbiAxOTk5IDIzOjU3OjM1IC0wNTAwCisKK3Rlc3QnJycsIFsoJycsICdnb2l0QGxpcC5jb20nKV0pCisKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3Rfc29jLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9zb2MucHkKaW5kZXggNzcyYjg2Yi4uODMxMzVmOSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9zb2MucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9zb2MucHkKQEAgLTk3LDcgKzk3LDcgQEAKICAgICBpZiBub3QgY2FuZm9yayBvciBvcy5mb3JrKCk6CiAgICAgICAgICMgcGFyZW50IGlzIHNlcnZlcgogICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotICAgICAgICBzLmJpbmQoaG9zdG5hbWUsIFBPUlQpCisgICAgICAgIHMuYmluZCgoaG9zdG5hbWUsIFBPUlQpKQogICAgICAgICBzLmxpc3RlbigxKQogICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgJ3BhcmVudCBhY2NlcHRpbmcnCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgIHByaW50ICdjaGlsZCBjb25uZWN0aW5nJwotICAgICAgICAgICAgcy5jb25uZWN0KGhvc3RuYW1lLCBQT1JUKQorICAgICAgICAgICAgcy5jb25uZWN0KChob3N0bmFtZSwgUE9SVCkpCiAgICAgICAgICAgICBtc2cgPSAnc29ja2V0IHRlc3QnCiAgICAgICAgICAgICBzLnNlbmQobXNnKQogICAgICAgICAgICAgZGF0YSA9IHMucmVjdigxMDI0KQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF90eXAucHkgYi9MaWIvZG9zLTh4My90ZXN0X3R5cC5weQppbmRleCAwNzJlNmQyLi5lMjJiMGUyIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3R5cC5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3R5cC5weQpAQCAtMTMwLDcgKzEzMCw5IEBACiBpZiBsZW4oWzEsMiwzLDQsNSw2XSkgPD4gNjogcmFpc2UgVGVzdEZhaWxlZCwgJ2xlbihbMSwyLDMsNCw1LDZdKScKIGlmIFsxLDJdK1szLDRdIDw+IFsxLDIsMyw0XTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xpc3QgY29uY2F0ZW5hdGlvbicKIGlmIFsxLDJdKjMgPD4gWzEsMiwxLDIsMSwyXTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xpc3QgcmVwZXRpdGlvbiAqMycKK2lmIFsxLDJdKjNMIDw+IFsxLDIsMSwyLDEsMl06IHJhaXNlIFRlc3RGYWlsZWQsICdsaXN0IHJlcGV0aXRpb24gKjNMJwogaWYgMCpbMSwyLDNdIDw+IFtdOiByYWlzZSBUZXN0RmFpbGVkLCAnbGlzdCByZXBldGl0aW9uIDAqJworaWYgMEwqWzEsMiwzXSA8PiBbXTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xpc3QgcmVwZXRpdGlvbiAwTConCiBpZiBtaW4oWzEsMl0pIDw+IDEgb3IgbWF4KFsxLDJdKSA8PiAyOiByYWlzZSBUZXN0RmFpbGVkLCAnbWluL21heCBsaXN0JwogaWYgMCBpbiBbMCwxLDJdIGFuZCAxIGluIFswLDEsMl0gYW5kIDIgaW4gWzAsMSwyXSBhbmQgMyBub3QgaW4gWzAsMSwyXTogcGFzcwogZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2luL25vdCBpbiBsaXN0JwpAQCAtMTUwLDEwICsxNTIsMTcgQEAKIAogcHJpbnQgJzYuNS4zYSBBZGRpdGlvbmFsIGxpc3Qgb3BlcmF0aW9ucycKIGEgPSBbMCwxLDIsMyw0XQorYVswTF0gPSAxCithWzFMXSA9IDIKK2FbMkxdID0gMworaWYgYSA8PiBbMSwyLDMsMyw0XTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xpc3QgaXRlbSBhc3NpZ25tZW50IFswTF0sIFsxTF0sIFsyTF0nCiBhWzBdID0gNQogYVsxXSA9IDYKIGFbMl0gPSA3CiBpZiBhIDw+IFs1LDYsNywzLDRdOiByYWlzZSBUZXN0RmFpbGVkLCAnbGlzdCBpdGVtIGFzc2lnbm1lbnQgWzBdLCBbMV0sIFsyXScKK2FbLTJMXSA9IDg4CithWy0xTF0gPSA5OQoraWYgYSA8PiBbNSw2LDcsODgsOTldOiByYWlzZSBUZXN0RmFpbGVkLCAnbGlzdCBpdGVtIGFzc2lnbm1lbnQgWy0yTF0sIFstMUxdJwogYVstMl0gPSA4CiBhWy0xXSA9IDkKIGlmIGEgPD4gWzUsNiw3LDgsOV06IHJhaXNlIFRlc3RGYWlsZWQsICdsaXN0IGl0ZW0gYXNzaWdubWVudCBbLTJdLCBbLTFdJwpAQCAtMTYxLDEyICsxNzAsMjEgQEAKIGFbLTM6XSA9IFtdCiBhWzE6MV0gPSBbMSwyLDNdCiBpZiBhIDw+IFswLDEsMiwzLDRdOiByYWlzZSBUZXN0RmFpbGVkLCAnbGlzdCBzbGljZSBhc3NpZ25tZW50JworYVsgMUwgOiA0TF0gPSBbNyw4LDldCitpZiBhIDw+IFswLDcsOCw5LDRdOiByYWlzZSBUZXN0RmFpbGVkLCAnbGlzdCBzbGljZSBhc3NpZ25tZW50IHVzaW5nIGxvbmcgaW50cycKIGRlbCBhWzE6NF0KIGlmIGEgPD4gWzAsNF06IHJhaXNlIFRlc3RGYWlsZWQsICdsaXN0IHNsaWNlIGRlbGV0aW9uJwogZGVsIGFbMF0KIGlmIGEgPD4gWzRdOiByYWlzZSBUZXN0RmFpbGVkLCAnbGlzdCBpdGVtIGRlbGV0aW9uIFswXScKIGRlbCBhWy0xXQogaWYgYSA8PiBbXTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xpc3QgaXRlbSBkZWxldGlvbiBbLTFdJworYT1yYW5nZSgwLDUpCitkZWwgYVsxTDo0TF0KK2lmIGEgPD4gWzAsNF06IHJhaXNlIFRlc3RGYWlsZWQsICdsaXN0IHNsaWNlIGRlbGV0aW9uJworZGVsIGFbMExdCitpZiBhIDw+IFs0XTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xpc3QgaXRlbSBkZWxldGlvbiBbMF0nCitkZWwgYVstMUxdCitpZiBhIDw+IFtdOiByYWlzZSBUZXN0RmFpbGVkLCAnbGlzdCBpdGVtIGRlbGV0aW9uIFstMV0nCiBhLmFwcGVuZCgwKQogYS5hcHBlbmQoMSkKIGEuYXBwZW5kKDIpCkBAIC0xOTIsNiArMjEwLDEzIEBACiB6ID0gcmFuZ2UoMTIpCiB6LnNvcnQobXlDb21wYXJpc29uKQogCisjIFRlc3QgZXh0cmVtZSBjYXNlcyB3aXRoIGxvbmcgaW50cworYSA9IFswLDEsMiwzLDRdCitpZiBhWyAtcG93KDIsMTI4TCk6IDMgXSAhPSBbMCwxLDJdOiAKKwlyYWlzZSBUZXN0RmFpbGVkLCAibGlzdCBzbGljaW5nIHdpdGggdG9vLXNtYWxsIGxvbmcgaW50ZWdlciIKK2lmIGFbIDM6IHBvdygyLDE0NUwpIF0gIT0gWzMsNF06IAorCXJhaXNlIFRlc3RGYWlsZWQsICJsaXN0IHNsaWNpbmcgd2l0aCB0b28tbGFyZ2UgbG9uZyBpbnRlZ2VyIgorCiBwcmludCAnNi42IE1hcHBpbmdzID09IERpY3Rpb25hcmllcycKIGQgPSB7fQogaWYgZC5rZXlzKCkgPD4gW106IHJhaXNlIFRlc3RGYWlsZWQsICd7fS5rZXlzKCknCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X3VuaS5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfdW5pLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NDQ5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZG9zLTh4My90ZXN0X3VuaS5weQpAQCAtMCwwICsxLDQwMSBAQAorIiIiIFRlc3Qgc2NyaXB0IGZvciB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgorZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKK2ltcG9ydCBzeXMKKworZGVmIHRlc3QobWV0aG9kLCBpbnB1dCwgb3V0cHV0LCAqYXJncyk6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJyVzLiVzJXMgPT8gJXMuLi4gJyAlIChyZXByKGlucHV0KSwgbWV0aG9kLCBhcmdzLCBvdXRwdXQpLAorICAgIHRyeToKKyAgICAgICAgZiA9IGdldGF0dHIoaW5wdXQsIG1ldGhvZCkKKyAgICAgICAgdmFsdWUgPSBhcHBseShmLCBhcmdzKQorICAgIGV4Y2VwdDoKKyAgICAgICAgdmFsdWUgPSBzeXMuZXhjX3R5cGUKKyAgICAgICAgZXhjID0gc3lzLmV4Y19pbmZvKClbOjJdCisgICAgZWxzZToKKyAgICAgICAgZXhjID0gTm9uZQorICAgIGlmIHZhbHVlICE9IG91dHB1dDoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdubycKKyAgICAgICAgcHJpbnQgJyonLGYsIGBpbnB1dGAsIGBvdXRwdXRgLCBgdmFsdWVgCisgICAgICAgIGlmIGV4YzoKKyAgICAgICAgICAgIHByaW50ICcgIHZhbHVlID09ICVzOiAlcycgJSAoZXhjKQorICAgIGVsc2U6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAneWVzJworCit0ZXN0KCdjYXBpdGFsaXplJywgdScgaGVsbG8gJywgdScgaGVsbG8gJykKK3Rlc3QoJ2NhcGl0YWxpemUnLCB1J2hlbGxvICcsIHUnSGVsbG8gJykKKwordGVzdCgndGl0bGUnLCB1JyBoZWxsbyAnLCB1JyBIZWxsbyAnKQordGVzdCgndGl0bGUnLCB1J2hlbGxvICcsIHUnSGVsbG8gJykKK3Rlc3QoJ3RpdGxlJywgdSJmT3JNYVQgdGhJcyBhUyB0aXRMZSBTdHJpbmciLCB1J0Zvcm1hdCBUaGlzIEFzIFRpdGxlIFN0cmluZycpCit0ZXN0KCd0aXRsZScsIHUiZk9yTWFULHRoSXMtYVMqdGl0TGU7U3RyaW5nIiwgdSdGb3JtYXQsVGhpcy1BcypUaXRsZTtTdHJpbmcnKQordGVzdCgndGl0bGUnLCB1ImdldEludCIsIHUnR2V0aW50JykKKwordGVzdCgnZmluZCcsIHUnYWJjZGVmZ2hpYWJjJywgMCwgdSdhYmMnKQordGVzdCgnZmluZCcsIHUnYWJjZGVmZ2hpYWJjJywgOSwgdSdhYmMnLCAxKQordGVzdCgnZmluZCcsIHUnYWJjZGVmZ2hpYWJjJywgLTEsIHUnZGVmJywgNCkKKwordGVzdCgncmZpbmQnLCB1J2FiY2RlZmdoaWFiYycsIDksIHUnYWJjJykKKwordGVzdCgnbG93ZXInLCB1J0hlTExvJywgdSdoZWxsbycpCit0ZXN0KCdsb3dlcicsIHUnaGVsbG8nLCB1J2hlbGxvJykKKwordGVzdCgndXBwZXInLCB1J0hlTExvJywgdSdIRUxMTycpCit0ZXN0KCd1cHBlcicsIHUnSEVMTE8nLCB1J0hFTExPJykKKworaWYgMDoKKyAgICB0cmFuc3RhYmxlID0gJ1wwMDBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3ICEiIyQlJlwnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV5fYHh5emRlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flwxNzdcMjAwXDIwMVwyMDJcMjAzXDIwNFwyMDVcMjA2XDIwN1wyMTBcMjExXDIxMlwyMTNcMjE0XDIxNVwyMTZcMjE3XDIyMFwyMjFcMjIyXDIyM1wyMjRcMjI1XDIyNlwyMjdcMjMwXDIzMVwyMzJcMjMzXDIzNFwyMzVcMjM2XDIzN1wyNDBcMjQxXDI0MlwyNDNcMjQ0XDI0NVwyNDZcMjQ3XDI1MFwyNTFcMjUyXDI1M1wyNTRcMjU1XDI1NlwyNTdcMjYwXDI2MVwyNjJcMjYzXDI2NFwyNjVcMjY2XDI2N1wyNzBcMjcxXDI3MlwyNzNcMjc0XDI3NVwyNzZcMjc3XDMwMFwzMDFcMzAyXDMwM1wzMDRcMzA1XDMwNlwzMDdcMzEwXDMxMVwzMTJcMzEzXDMxNFwzMTVcMzE2XDMxN1wzMjBcMzIxXDMyMlwzMjNcMzI0XDMyNVwzMjZcMzI3XDMzMFwzMzFcMzMyXDMzM1wzMzRcMzM1XDMzNlwzMzdcMzQwXDM0MVwzNDJcMzQzXDM0NFwzNDVcMzQ2XDM0N1wzNTBcMzUxXDM1MlwzNTNcMzU0XDM1NVwzNTZcMzU3XDM2MFwzNjFcMzYyXDM2M1wzNjRcMzY1XDM2NlwzNjdcMzcwXDM3MVwzNzJcMzczXDM3NFwzNzVcMzc2XDM3NycKKworICAgIHRlc3QoJ21ha2V0cmFucycsIHUnYWJjJywgdHJhbnN0YWJsZSwgdSd4eXonKQorICAgIHRlc3QoJ21ha2V0cmFucycsIHUnYWJjJywgVmFsdWVFcnJvciwgdSd4eXpxJykKKwordGVzdCgnc3BsaXQnLCB1J3RoaXMgaXMgdGhlIHNwbGl0IGZ1bmN0aW9uJywKKyAgICAgW3UndGhpcycsIHUnaXMnLCB1J3RoZScsIHUnc3BsaXQnLCB1J2Z1bmN0aW9uJ10pCit0ZXN0KCdzcGxpdCcsIHUnYXxifGN8ZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgdSd8JykKK3Rlc3QoJ3NwbGl0JywgdSdhfGJ8Y3xkJywgW3UnYScsIHUnYicsIHUnY3xkJ10sIHUnfCcsIDIpCit0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2IgYyBkJ10sIE5vbmUsIDEpCit0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MgZCddLCBOb25lLCAyKQordGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIE5vbmUsIDMpCit0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgTm9uZSwgNCkKK3Rlc3QoJ3NwbGl0JywgdSdhIGIgYyBkJywgW3UnYSBiIGMgZCddLCBOb25lLCAwKQordGVzdCgnc3BsaXQnLCB1J2EgIGIgIGMgIGQnLCBbdSdhJywgdSdiJywgdSdjICBkJ10sIE5vbmUsIDIpCit0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCAnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCisKKyMgam9pbiBub3cgd29ya3Mgd2l0aCBhbnkgc2VxdWVuY2UgdHlwZQorY2xhc3MgU2VxdWVuY2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9ICd3eHl6JworICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc2VxKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKTogcmV0dXJuIHNlbGYuc2VxW2ldCisKK3Rlc3QoJ2pvaW4nLCB1JyAnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCit0ZXN0KCdqb2luJywgdScnLCB1J2FiY2QnLCAodSdhJywgdSdiJywgdSdjJywgdSdkJykpCit0ZXN0KCdqb2luJywgdScgJywgdSd3IHggeSB6JywgU2VxdWVuY2UoKSkKK3Rlc3QoJ2pvaW4nLCB1JyAnLCBUeXBlRXJyb3IsIDcpCisKK2NsYXNzIEJhZFNlcShTZXF1ZW5jZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9IFs3LCB1J2hlbGxvJywgMTIzTF0KKwordGVzdCgnam9pbicsIHUnICcsIFR5cGVFcnJvciwgQmFkU2VxKCkpCisKK3Jlc3VsdCA9IHUnJworZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgIGlmIGkgPiAwOgorICAgICAgICByZXN1bHQgPSByZXN1bHQgKyB1JzonCisgICAgcmVzdWx0ID0gcmVzdWx0ICsgdSd4JyoxMAordGVzdCgnam9pbicsIHUnOicsIHJlc3VsdCwgW3UneCcgKiAxMF0gKiAxMCkKK3Rlc3QoJ2pvaW4nLCB1JzonLCByZXN1bHQsICh1J3gnICogMTAsKSAqIDEwKQorCit0ZXN0KCdzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1J2hlbGxvJykKK3Rlc3QoJ2xzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1J2hlbGxvICAgJykKK3Rlc3QoJ3JzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1JyAgIGhlbGxvJykKK3Rlc3QoJ3N0cmlwJywgdSdoZWxsbycsIHUnaGVsbG8nKQorCit0ZXN0KCdzd2FwY2FzZScsIHUnSGVMTG8gY09tcFV0ZVJzJywgdSdoRWxsTyBDb01QdVRFclMnKQorCitpZiAwOgorICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUneHl6YWJjZGVmJywgdSd4eXp4eXonLCB0cmFuc3RhYmxlLCB1J2RlZicpCisKKyAgICB0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoJ2EnLCB1J0EnKQorICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUnYWJjJywgdSdBYmMnLCB0YWJsZSkKKyAgICB0ZXN0KCd0cmFuc2xhdGUnLCB1J3h5eicsIHUneHl6JywgdGFibGUpCisKK3Rlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvIXRocmVlIScsIHUnIScsIHUnQCcsIDEpCit0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25ldHdvdGhyZWUnLCAnIScsICcnKQordGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZUB0d29AdGhyZWUhJywgdSchJywgdSdAJywgMikKK3Rlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcsIDMpCit0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lQHR3b0B0aHJlZUAnLCB1JyEnLCB1J0AnLCA0KQordGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSchJywgdSdAJywgMCkKK3Rlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcpCit0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lIXR3byF0aHJlZSEnLCB1J3gnLCB1J0AnKQordGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSd4JywgdSdAJywgMikKKwordGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1J2hlJykKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdSdoZWxsbycpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnaGVsbG8gd29ybGQnKQordGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1JycpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnZWxsbycpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnZWxsbycsIDEpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnbycsIDQpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnbycsIDUpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnJywgNSkKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMCwgdSdsbycsIDYpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSdsb3dvJywgMykKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAzLCA3KQordGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDAsIHUnbG93bycsIDMsIDYpCisKK3Rlc3QoJ2VuZHN3aXRoJywgdSdoZWxsbycsIDEsIHUnbG8nKQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvJywgMCwgdSdoZScpCit0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1JycpCit0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAwLCB1J2hlbGxvIHdvcmxkJykKK3Rlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMCwgdSd3b3JsJykKK3Rlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSd3b3JsJywgMywgOSkKK3Rlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSd3b3JsZCcsIDMsIDEyKQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAxLCA3KQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAyLCA3KQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAzLCA3KQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J2xvd28nLCA0LCA3KQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J2xvd28nLCAzLCA4KQordGVzdCgnZW5kc3dpdGgnLCB1J2FiJywgMCwgdSdhYicsIDAsIDEpCit0ZXN0KCdlbmRzd2l0aCcsIHUnYWInLCAwLCB1J2FiJywgMCwgMCkKKwordGVzdCgnZXhwYW5kdGFicycsIHUnYWJjXHJhYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScpCit0ZXN0KCdleHBhbmR0YWJzJywgdSdhYmNccmFiXHRkZWZcbmdcdGhpJywgdSdhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywgOCkKK3Rlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyYWJcdGRlZlxuZ1x0aGknLCB1J2FiY1xyYWIgIGRlZlxuZyAgIGhpJywgNCkKK3Rlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyXG5hYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJcbmFiICBkZWZcbmcgICBoaScsIDQpCisKK2lmIDA6CisgICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiYyBkZWYgZ2hpJywgdSdBYmMgRGVmIEdoaScpCisgICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiY1x0ZGVmXG5naGknLCB1J0FiYyBEZWYgR2hpJykKKyAgICB0ZXN0KCdjYXB3b3JkcycsIHUnYWJjXHQgICBkZWYgIFxuZ2hpJywgdSdBYmMgRGVmIEdoaScpCisKKyMgQ29tcGFyaXNvbnM6CitwcmludCAnVGVzdGluZyBVbmljb2RlIGNvbXBhcmlzb25zLi4uJywKK2Fzc2VydCB1J2FiYycgPT0gJ2FiYycKK2Fzc2VydCAnYWJjJyA9PSB1J2FiYycKK2Fzc2VydCB1J2FiYycgPT0gdSdhYmMnCithc3NlcnQgdSdhYmNkJyA+ICdhYmMnCithc3NlcnQgJ2FiY2QnID4gdSdhYmMnCithc3NlcnQgdSdhYmNkJyA+IHUnYWJjJworYXNzZXJ0IHUnYWJjJyA8ICdhYmNkJworYXNzZXJ0ICdhYmMnIDwgdSdhYmNkJworYXNzZXJ0IHUnYWJjJyA8IHUnYWJjZCcKK3ByaW50ICdkb25lLicKKwordGVzdCgnbGp1c3QnLCB1J2FiYycsICB1J2FiYyAgICAgICAnLCAxMCkKK3Rlc3QoJ3JqdXN0JywgdSdhYmMnLCAgdScgICAgICAgYWJjJywgMTApCit0ZXN0KCdjZW50ZXInLCB1J2FiYycsIHUnICAgYWJjICAgICcsIDEwKQordGVzdCgnbGp1c3QnLCB1J2FiYycsICB1J2FiYyAgICcsIDYpCit0ZXN0KCdyanVzdCcsIHUnYWJjJywgIHUnICAgYWJjJywgNikKK3Rlc3QoJ2NlbnRlcicsIHUnYWJjJywgdScgYWJjICAnLCA2KQordGVzdCgnbGp1c3QnLCB1J2FiYycsIHUnYWJjJywgMikKK3Rlc3QoJ3JqdXN0JywgdSdhYmMnLCB1J2FiYycsIDIpCit0ZXN0KCdjZW50ZXInLCB1J2FiYycsIHUnYWJjJywgMikKKwordGVzdCgnaXNsb3dlcicsIHUnYScsIDEpCit0ZXN0KCdpc2xvd2VyJywgdSdBJywgMCkKK3Rlc3QoJ2lzbG93ZXInLCB1J1xuJywgMCkKK3Rlc3QoJ2lzbG93ZXInLCB1J1x1MUZGYycsIDApCit0ZXN0KCdpc2xvd2VyJywgdSdhYmMnLCAxKQordGVzdCgnaXNsb3dlcicsIHUnYUJjJywgMCkKK3Rlc3QoJ2lzbG93ZXInLCB1J2FiY1xuJywgMSkKKwordGVzdCgnaXN1cHBlcicsIHUnYScsIDApCit0ZXN0KCdpc3VwcGVyJywgdSdBJywgMSkKK3Rlc3QoJ2lzdXBwZXInLCB1J1xuJywgMCkKK3Rlc3QoJ2lzdXBwZXInLCB1J1x1MUZGYycsIDApCit0ZXN0KCdpc3VwcGVyJywgdSdBQkMnLCAxKQordGVzdCgnaXN1cHBlcicsIHUnQWJDJywgMCkKK3Rlc3QoJ2lzdXBwZXInLCB1J0FCQ1xuJywgMSkKKwordGVzdCgnaXN0aXRsZScsIHUnYScsIDApCit0ZXN0KCdpc3RpdGxlJywgdSdBJywgMSkKK3Rlc3QoJ2lzdGl0bGUnLCB1J1xuJywgMCkKK3Rlc3QoJ2lzdGl0bGUnLCB1J1x1MUZGYycsIDEpCit0ZXN0KCdpc3RpdGxlJywgdSdBIFRpdGxlY2FzZWQgTGluZScsIDEpCit0ZXN0KCdpc3RpdGxlJywgdSdBXG5UaXRsZWNhc2VkIExpbmUnLCAxKQordGVzdCgnaXN0aXRsZScsIHUnQSBUaXRsZWNhc2VkLCBMaW5lJywgMSkKK3Rlc3QoJ2lzdGl0bGUnLCB1J0dyZWVrIFx1MUZGY2l0bGVjYXNlcyAuLi4nLCAxKQordGVzdCgnaXN0aXRsZScsIHUnTm90IGEgY2FwaXRhbGl6ZWQgU3RyaW5nJywgMCkKK3Rlc3QoJ2lzdGl0bGUnLCB1J05vdFx0YSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKK3Rlc3QoJ2lzdGl0bGUnLCB1J05vdC0tYSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKKwordGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcblxyZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1JycsIHUnZ2hpJ10pCit0ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxuXHJcbmdoaSIsIFt1J2FiYycsIHUnZGVmJywgdScnLCB1J2doaSddKQordGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcclxuZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1J2doaSddKQordGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcclxuZ2hpXG4iLCBbdSdhYmMnLCB1J2RlZicsIHUnZ2hpJ10pCit0ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnYWJjJywgdSdkZWYnLCB1J2doaScsIHUnJ10pCit0ZXN0KCdzcGxpdGxpbmVzJywgdSJcbmFiY1xuZGVmXHJcbmdoaVxuXHIiLCBbdScnLCB1J2FiYycsIHUnZGVmJywgdSdnaGknLCB1JyddKQordGVzdCgnc3BsaXRsaW5lcycsIHUiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnXG4nLCB1J2FiY1xuJywgdSdkZWZcclxuJywgdSdnaGlcbicsIHUnXHInXSwgMSkKKwordGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdiYmJjJywge29yZCgnYScpOk5vbmV9KQordGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdpaWljJywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOm9yZCgnaScpfSkKK3Rlc3QoJ3RyYW5zbGF0ZScsIHUiYWJhYmFiYyIsIHUnaWlpeCcsIHtvcmQoJ2EnKTpOb25lLCBvcmQoJ2InKTpvcmQoJ2knKSwgb3JkKCdjJyk6dSd4J30pCisKKyMgQ29udGFpbnM6CitwcmludCAnVGVzdGluZyBVbmljb2RlIGNvbnRhaW5zIG1ldGhvZC4uLicsCithc3NlcnQgKCdhJyBpbiB1J2FiZGInKSA9PSAxCithc3NlcnQgKCdhJyBpbiB1J2JkYWInKSA9PSAxCithc3NlcnQgKCdhJyBpbiB1J2JkYWJhJykgPT0gMQorYXNzZXJ0ICgnYScgaW4gdSdiZGJhJykgPT0gMQorYXNzZXJ0ICgnYScgaW4gdSdiZGJhJykgPT0gMQorYXNzZXJ0ICh1J2EnIGluIHUnYmRiYScpID09IDEKK2Fzc2VydCAodSdhJyBpbiB1J2JkYicpID09IDAKK2Fzc2VydCAodSdhJyBpbiAnYmRiJykgPT0gMAorYXNzZXJ0ICh1J2EnIGluICdiZGJhJykgPT0gMQorYXNzZXJ0ICh1J2EnIGluICgnYScsMSxOb25lKSkgPT0gMQorYXNzZXJ0ICh1J2EnIGluICgxLE5vbmUsJ2EnKSkgPT0gMQorYXNzZXJ0ICh1J2EnIGluICgxLE5vbmUsdSdhJykpID09IDEKK2Fzc2VydCAoJ2EnIGluICgnYScsMSxOb25lKSkgPT0gMQorYXNzZXJ0ICgnYScgaW4gKDEsTm9uZSwnYScpKSA9PSAxCithc3NlcnQgKCdhJyBpbiAoMSxOb25lLHUnYScpKSA9PSAxCithc3NlcnQgKCdhJyBpbiAoJ3gnLDEsdSd5JykpID09IDAKK2Fzc2VydCAoJ2EnIGluICgneCcsMSxOb25lKSkgPT0gMAorcHJpbnQgJ2RvbmUuJworCisjIEZvcm1hdHRpbmc6CitwcmludCAnVGVzdGluZyBVbmljb2RlIGZvcm1hdHRpbmcgc3RyaW5ncy4uLicsCithc3NlcnQgdSIlcywgJXMiICUgKHUiYWJjIiwgImFiYyIpID09IHUnYWJjLCBhYmMnCithc3NlcnQgdSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIDEsIDIsIDMpID09IHUnYWJjLCBhYmMsIDEsIDIuMDAwMDAwLCAgMy4wMCcKK2Fzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgMSwgLTIsIDMpID09IHUnYWJjLCBhYmMsIDEsIC0yLjAwMDAwMCwgIDMuMDAnCithc3NlcnQgdSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIC0xLCAtMiwgMy41KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41MCcKK2Fzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41NycKK2Fzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAxMDAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAxMDAzLjU3JworYXNzZXJ0IHUiJWMiICUgKHUiYWJjIiwpID09IHUnYScKK2Fzc2VydCB1IiVjIiAlICgiYWJjIiwpID09IHUnYScKK2Fzc2VydCB1IiVjIiAlICgzNCwpID09IHUnIicKK2Fzc2VydCB1IiVjIiAlICgzNiwpID09IHUnJCcKK2Fzc2VydCB1IiVyLCAlciIgJSAodSJhYmMiLCAiYWJjIikgPT0gdSJ1J2FiYycsICdhYmMnIgorYXNzZXJ0IHUiJSh4KXMsICUoeSlzIiAlIHsneCc6dSJhYmMiLCAneSc6ImRlZiJ9ID09IHUnYWJjLCBkZWYnCithc3NlcnQgdSIlKHgpcywgJSjkKXMiICUgeyd4Jzp1ImFiYyIsIHUn5CcuZW5jb2RlKCd1dGYtOCcpOiJkZWYifSA9PSB1J2FiYywgZGVmJworIyBmb3JtYXR0aW5nIGpvYnMgZGVsZWdhdGVkIGZyb20gdGhlIHN0cmluZyBpbXBsZW1lbnRhdGlvbjoKK2Fzc2VydCAnLi4uJShmb28pcy4uLicgJSB7J2Zvbyc6dSJhYmMifSA9PSB1Jy4uLmFiYy4uLicKK2Fzc2VydCAnLi4uJShmb28pcy4uLicgJSB7J2Zvbyc6ImFiYyJ9ID09ICcuLi5hYmMuLi4nCithc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzoiYWJjIn0gPT0gJy4uLmFiYy4uLicKK2Fzc2VydCAnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIn0gPT0gdScuLi5hYmMuLi4nCithc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyIsJ2RlZic6MTIzfSA9PSAgdScuLi5hYmMuLi4nCithc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyIsdSdkZWYnOjEyM30gPT0gdScuLi5hYmMuLi4nCithc3NlcnQgJy4uLiVzLi4uJXMuLi4lcy4uLiVzLi4uJyAlICgxLDIsMyx1ImFiYyIpID09IHUnLi4uMS4uLjIuLi4zLi4uYWJjLi4uJworYXNzZXJ0ICcuLi4lcy4uLicgJSB1ImFiYyIgPT0gdScuLi5hYmMuLi4nCitwcmludCAnZG9uZS4nCisKKyMgVGVzdCBidWlsdGluIGNvZGVjcworcHJpbnQgJ1Rlc3RpbmcgYnVpbHRpbiBjb2RlY3MuLi4nLAorCithc3NlcnQgdW5pY29kZSgnaGVsbG8nLCdhc2NpaScpID09IHUnaGVsbG8nCithc3NlcnQgdW5pY29kZSgnaGVsbG8nLCd1dGYtOCcpID09IHUnaGVsbG8nCithc3NlcnQgdW5pY29kZSgnaGVsbG8nLCd1dGY4JykgPT0gdSdoZWxsbycKK2Fzc2VydCB1bmljb2RlKCdoZWxsbycsJ2xhdGluLTEnKSA9PSB1J2hlbGxvJworCit0cnk6CisgICAgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJykKKyAgICB1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCdzdHJpY3QnKQorZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInUnQW5kclwyMDInLmVuY29kZSgnYXNjaWknKSBmYWlsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIgorYXNzZXJ0IHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsJ2lnbm9yZScpID09ICJBbmRyIHgiCithc3NlcnQgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywncmVwbGFjZScpID09ICJBbmRyPyB4IgorCit0cnk6CisgICAgdW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJykKKyAgICB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdzdHJpY3QnKQorZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInVuaWNvZGUoJ0FuZHJcMjAyJykgZmFpbGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiIKK2Fzc2VydCB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdpZ25vcmUnKSA9PSB1IkFuZHIgeCIKK2Fzc2VydCB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdyZXBsYWNlJykgPT0gdSdBbmRyXHVGRkZEIHgnCisKK2Fzc2VydCB1J2hlbGxvJy5lbmNvZGUoJ2FzY2lpJykgPT0gJ2hlbGxvJworYXNzZXJ0IHUnaGVsbG8nLmVuY29kZSgndXRmLTgnKSA9PSAnaGVsbG8nCithc3NlcnQgdSdoZWxsbycuZW5jb2RlKCd1dGY4JykgPT0gJ2hlbGxvJworYXNzZXJ0IHUnaGVsbG8nLmVuY29kZSgndXRmLTE2LWxlJykgPT0gJ2hcMDAwZVwwMDBsXDAwMGxcMDAwb1wwMDAnCithc3NlcnQgdSdoZWxsbycuZW5jb2RlKCd1dGYtMTYtYmUnKSA9PSAnXDAwMGhcMDAwZVwwMDBsXDAwMGxcMDAwbycKK2Fzc2VydCB1J2hlbGxvJy5lbmNvZGUoJ2xhdGluLTEnKSA9PSAnaGVsbG8nCisKK3UgPSB1Jycuam9pbihtYXAodW5pY2hyLCByYW5nZSgxMDI0KSkpCitmb3IgZW5jb2RpbmcgaW4gKCd1dGYtOCcsICd1dGYtMTYnLCAndXRmLTE2LWxlJywgJ3V0Zi0xNi1iZScsCisgICAgICAgICAgICAgICAgICdyYXdfdW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9pbnRlcm5hbCcpOgorICAgIGFzc2VydCB1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZykgPT0gdQorCit1ID0gdScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMjU2KSkpCitmb3IgZW5jb2RpbmcgaW4gKAorICAgICdsYXRpbi0xJywKKyAgICApOgorICAgIHRyeToKKyAgICAgICAgYXNzZXJ0IHVuaWNvZGUodS5lbmNvZGUoZW5jb2RpbmcpLGVuY29kaW5nKSA9PSB1CisgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgorICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKKyAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6CisgICAgICAgIHByaW50ICcqKiogY29kZWMgZm9yICIlcyIgZmFpbGVkOiAlcycgJSAoZW5jb2RpbmcsIHdoeSkKKwordSA9IHUnJy5qb2luKG1hcCh1bmljaHIsIHJhbmdlKDEyOCkpKQorZm9yIGVuY29kaW5nIGluICgKKyAgICAnYXNjaWknLAorICAgICk6CisgICAgdHJ5OgorICAgICAgICBhc3NlcnQgdW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpID09IHUKKyAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6CisgICAgICAgIHByaW50ICcqKiogY29kZWMgIiVzIiBmYWlsZWQgcm91bmQtdHJpcCcgJSBlbmNvZGluZworICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKKyAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyBmb3IgIiVzIiBmYWlsZWQ6ICVzJyAlIChlbmNvZGluZywgd2h5KQorCitwcmludCAnZG9uZS4nCisKK3ByaW50ICdUZXN0aW5nIHN0YW5kYXJkIG1hcHBpbmcgY29kZWNzLi4uJywKKworcHJpbnQgJzAtMTI3Li4uJywKK3MgPSAnJy5qb2luKG1hcChjaHIsIHJhbmdlKDEyOCkpKQorZm9yIGVuY29kaW5nIGluICgKKyAgICAnY3AwMzcnLCAnY3AxMDI2JywKKyAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAorICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCisgICAgJ2NwODYzJywgJ2NwODY1JywgJ2NwODY2JywgCisgICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAorICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKKyAgICAnaXNvODg1OV83JywgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCisgICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKKworICAgICdjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCisgICAgJ2NwMTI1NicsICdjcDEyNTcnLCAnY3AxMjU4JywKKyAgICAnY3A4NTYnLCAnY3A4NTcnLCAnY3A4NjQnLCAnY3A4NjknLCAnY3A4NzQnLAorCisgICAgJ21hY19ncmVlaycsICdtYWNfaWNlbGFuZCcsJ21hY19yb21hbicsICdtYWNfdHVya2lzaCcsCisgICAgJ2NwMTAwNicsICdjcDg3NScsICdpc284ODU5XzgnLAorICAgIAorICAgICMjIyBUaGVzZSBoYXZlIHVuZGVmaW5lZCBtYXBwaW5nczoKKyAgICAjJ2NwNDI0JywKKyAgICAKKyAgICApOgorICAgIHRyeToKKyAgICAgICAgYXNzZXJ0IHVuaWNvZGUocyxlbmNvZGluZykuZW5jb2RlKGVuY29kaW5nKSA9PSBzCisgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgorICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKKyAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6CisgICAgICAgIHByaW50ICcqKiogY29kZWMgZm9yICIlcyIgZmFpbGVkOiAlcycgJSAoZW5jb2RpbmcsIHdoeSkKKworcHJpbnQgJzEyOC0yNTUuLi4nLAorcyA9ICcnLmpvaW4obWFwKGNociwgcmFuZ2UoMTI4LDI1NikpKQorZm9yIGVuY29kaW5nIGluICgKKyAgICAnY3AwMzcnLCAnY3AxMDI2JywKKyAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAorICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCisgICAgJ2NwODYzJywgJ2NwODY1JywgJ2NwODY2JywgCisgICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAorICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKKyAgICAnaXNvODg1OV83JywgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCisgICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKKyAgICAKKyAgICAjIyMgVGhlc2UgaGF2ZSB1bmRlZmluZWQgbWFwcGluZ3M6CisgICAgIydjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCisgICAgIydjcDEyNTYnLCAnY3AxMjU3JywgJ2NwMTI1OCcsCisgICAgIydjcDQyNCcsICdjcDg1NicsICdjcDg1NycsICdjcDg2NCcsICdjcDg2OScsICdjcDg3NCcsCisgICAgIydtYWNfZ3JlZWsnLCAnbWFjX2ljZWxhbmQnLCdtYWNfcm9tYW4nLCAnbWFjX3R1cmtpc2gnLAorICAgIAorICAgICMjIyBUaGVzZSBmYWlsIHRoZSByb3VuZC10cmlwOgorICAgICMnY3AxMDA2JywgJ2NwODc1JywgJ2lzbzg4NTlfOCcsCisgICAgCisgICAgKToKKyAgICB0cnk6CisgICAgICAgIGFzc2VydCB1bmljb2RlKHMsZW5jb2RpbmcpLmVuY29kZShlbmNvZGluZykgPT0gcworICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvcjoKKyAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyAiJXMiIGZhaWxlZCByb3VuZC10cmlwJyAlIGVuY29kaW5nCisgICAgZXhjZXB0IFZhbHVlRXJyb3Isd2h5OgorICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCisKK3ByaW50ICdkb25lLicKKworcHJpbnQgJ1Rlc3RpbmcgVW5pY29kZSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4uLicsCithc3NlcnQgKHUiYWJjIiB1ImRlZiIpID09IHUiYWJjZGVmIgorYXNzZXJ0ICgiYWJjIiB1ImRlZiIpID09IHUiYWJjZGVmIgorYXNzZXJ0ICh1ImFiYyIgImRlZiIpID09IHUiYWJjZGVmIgorYXNzZXJ0ICh1ImFiYyIgdSJkZWYiICJnaGkiKSA9PSB1ImFiY2RlZmdoaSIKK2Fzc2VydCAoImFiYyIgImRlZiIgdSJnaGkiKSA9PSB1ImFiY2RlZmdoaSIKK3ByaW50ICdkb25lLicKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3Rfd2luLnB5IGIvTGliL2Rvcy04eDMvdGVzdF93aW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmMDk1YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9kb3MtOHgzL3Rlc3Rfd2luLnB5CkBAIC0wLDAgKzEsMTQ3IEBACisjIFRlc3QgdGhlIHdpbmRvd3Mgc3BlY2lmaWMgd2luMzJyZWcgbW9kdWxlLgorIyBPbmx5IHdpbjMycmVnIGZ1bmN0aW9ucyBub3QgaGl0IGhlcmU6IEZsdXNoS2V5LCBMb2FkS2V5IGFuZCBTYXZlS2V5CisKK2Zyb20gd2lucmVnIGltcG9ydCAqCitpbXBvcnQgb3MsIHN5cworCit0ZXN0X2tleV9uYW1lID0gIlNPRlRXQVJFXFxQeXRob24gUmVnaXN0cnkgVGVzdCBLZXkgLSBEZWxldGUgTWUiCisKK3Rlc3RfZGF0YSA9IFsKKyAgICAoIkludCBWYWx1ZSIsICAgICA0NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19EV09SRCksCisgICAgKCJTdHJpbmcgVmFsIiwgICAgIkEgc3RyaW5nIHZhbHVlIiwgICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1osKSwKKyAgICAodSJVbmljb2RlIFZhbCIsICB1IkEgVW5pY29kZSB2YWx1ZSIsICAgICAgICAgICAgICAgICAgICAgIFJFR19TWiwpLAorICAgICgiU3RyaW5nRXhwYW5kIiwgICJUaGUgcGF0aCBpcyAlcGF0aCUiLCAgICAgICAgICAgICAgICAgICAgUkVHX0VYUEFORF9TWiksCisgICAgKCJVbmljb2RlRXhwYW5kIiwgdSJUaGUgcGF0aCBpcyAlcGF0aCUiLCAgICAgICAgICAgICAgICAgICBSRUdfRVhQQU5EX1NaKSwKKyAgICAoIk11bHRpLXN0cmluZyIsICBbIkxvdHMiLCAib2YiLCAic3RyaW5nIiwgInZhbHVlcyJdLCAgICAgIFJFR19NVUxUSV9TWiksCisgICAgKCJNdWx0aS11bmljb2RlIiwgW3UiTG90cyIsIHUib2YiLCB1InVuaWNvZGUiLCB1InZhbHVlcyJdLCBSRUdfTVVMVElfU1opLAorICAgICgiTXVsdGktbWl4ZWQiLCAgIFt1IlVuaWNvZGUiLCB1ImFuZCIsICJzdHJpbmciLCAidmFsdWVzIl0sUkVHX01VTFRJX1NaKSwKKyAgICAoIlJhdyBEYXRhIiwgICAgICAoImJpbmFyeSIrY2hyKDApKyJkYXRhIiksICAgICAgICAgICAgICAgIFJFR19CSU5BUlkpLAorXQorCitkZWYgV3JpdGVUZXN0RGF0YShyb290X2tleSk6CisgICAgIyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMga2V5LgorICAgIFNldFZhbHVlKHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lLCBSRUdfU1osICJEZWZhdWx0IHZhbHVlIikKKyAgICBrZXkgPSBDcmVhdGVLZXkocm9vdF9rZXksIHRlc3Rfa2V5X25hbWUpCisgICAgIyBDcmVhdGUgYSBzdWIta2V5CisgICAgc3ViX2tleSA9IENyZWF0ZUtleShrZXksICJzdWJfa2V5IikKKyAgICAjIEdpdmUgdGhlIHN1Yi1rZXkgc29tZSBuYW1lZCB2YWx1ZXMKKworICAgIGZvciB2YWx1ZV9uYW1lLCB2YWx1ZV9kYXRhLCB2YWx1ZV90eXBlIGluIHRlc3RfZGF0YToKKyAgICAgICAgU2V0VmFsdWVFeChzdWJfa2V5LCB2YWx1ZV9uYW1lLCAwLCB2YWx1ZV90eXBlLCB2YWx1ZV9kYXRhKQorCisgICAgIyBDaGVjayB3ZSB3cm90ZSBhcyBtYW55IGl0ZW1zIGFzIHdlIHRob3VnaHQuCisgICAgbmtleXMsIG52YWx1ZXMsIHNpbmNlX21vZCA9IFF1ZXJ5SW5mb0tleShrZXkpCisgICAgYXNzZXJ0IG5rZXlzPT0xLCAiTm90IHRoZSBjb3JyZWN0IG51bWJlciBvZiBzdWIga2V5cyIKKyAgICBhc3NlcnQgbnZhbHVlcz09MSwgIk5vdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdmFsdWVzIgorICAgIG5rZXlzLCBudmFsdWVzLCBzaW5jZV9tb2QgPSBRdWVyeUluZm9LZXkoc3ViX2tleSkKKyAgICBhc3NlcnQgbmtleXM9PTAsICJOb3QgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHN1YiBrZXlzIgorICAgIGFzc2VydCBudmFsdWVzPT1sZW4odGVzdF9kYXRhKSwgIk5vdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdmFsdWVzIgorICAgICMgQ2xvc2UgdGhpcyBrZXkgdGhpcyB3YXkuLi4KKyAgICAjIChidXQgYmVmb3JlIHdlIGRvLCBjb3B5IHRoZSBrZXkgYXMgYW4gaW50ZWdlciAtIHRoaXMgYWxsb3dzCisgICAgIyB1cyB0byB0ZXN0IHRoYXQgdGhlIGtleSByZWFsbHkgZ2V0cyBjbG9zZWQpLgorICAgIGludF9zdWJfa2V5ID0gaW50KHN1Yl9rZXkpCisgICAgQ2xvc2VLZXkoc3ViX2tleSkKKyAgICB0cnk6CisgICAgCVF1ZXJ5SW5mb0tleShpbnRfc3ViX2tleSkKKyAgICAJcmFpc2UgUnVudGltZUVycm9yLCAiSXQgYXBwZWFycyB0aGUgQ2xvc2VLZXkoKSBmdW5jdGlvbiBkb2VzIG5vdCBjbG9zZSB0aGUgYWN0dWFsIGtleSEiCisgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CisgICAgCXBhc3MKKyAgICAjIC4uLiBhbmQgY2xvc2UgdGhhdCBrZXkgdGhhdCB3YXkgOi0pCisgICAgaW50X2tleSA9IGludChrZXkpCisgICAga2V5LkNsb3NlKCkKKyAgICB0cnk6CisgICAgCVF1ZXJ5SW5mb0tleShpbnRfa2V5KQorICAgIAlyYWlzZSBSdW50aW1lRXJyb3IsICJJdCBhcHBlYXJzIHRoZSBrZXkuQ2xvc2UoKSBmdW5jdGlvbiBkb2VzIG5vdCBjbG9zZSB0aGUgYWN0dWFsIGtleSEiCisgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CisgICAgCXBhc3MKKworZGVmIFJlYWRUZXN0RGF0YShyb290X2tleSk6CisgICAgIyBDaGVjayB3ZSBjYW4gZ2V0IGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMga2V5LgorICAgIHZhbCA9IFF1ZXJ5VmFsdWUocm9vdF9rZXksIHRlc3Rfa2V5X25hbWUpCisgICAgYXNzZXJ0IHZhbD09IkRlZmF1bHQgdmFsdWUiLCAiUmVnaXN0cnkgZGlkbnQgZ2l2ZSBiYWNrIHRoZSBjb3JyZWN0IHZhbHVlIgorCisgICAga2V5ID0gT3BlbktleShyb290X2tleSwgdGVzdF9rZXlfbmFtZSkKKyAgICAjIFJlYWQgdGhlIHN1Yi1rZXlzCisgICAgc3ViX2tleSA9IE9wZW5LZXkoa2V5LCAic3ViX2tleSIpCisgICAgIyBDaGVjayBJIGNhbiBlbnVtZXJhdGUgb3ZlciB0aGUgdmFsdWVzLgorICAgIGluZGV4ID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBFbnVtVmFsdWUoc3ViX2tleSwgaW5kZXgpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgYXNzZXJ0IGRhdGEgaW4gdGVzdF9kYXRhLCAiZGlkbnQgcmVhZCBiYWNrIHRoZSBjb3JyZWN0IHRlc3QgZGF0YS4iCisgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgYXNzZXJ0IGluZGV4PT1sZW4odGVzdF9kYXRhKSwgIkRpZG50IHJlYWQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIgorICAgICMgQ2hlY2sgSSBjYW4gZGlyZWN0bHkgYWNjZXNzIGVhY2ggaXRlbQorICAgIGZvciB2YWx1ZV9uYW1lLCB2YWx1ZV9kYXRhLCB2YWx1ZV90eXBlIGluIHRlc3RfZGF0YToKKyAgICAgICAgcmVhZF92YWwsIHJlYWRfdHlwID0gUXVlcnlWYWx1ZUV4KHN1Yl9rZXksIHZhbHVlX25hbWUpCisgICAgICAgIGFzc2VydCByZWFkX3ZhbD09dmFsdWVfZGF0YSBhbmQgcmVhZF90eXAgPT0gdmFsdWVfdHlwZSwgXAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkaXJlY3RseSByZWFkIHRoZSB2YWx1ZSIKKyAgICBzdWJfa2V5LkNsb3NlKCkKKyAgICAjIEVudW1lcmF0ZSBvdXIgbWFpbiBrZXkuCisgICAgcmVhZF92YWwgPSBFbnVtS2V5KGtleSwgMCkKKyAgICBhc3NlcnQgcmVhZF92YWwgPT0gInN1Yl9rZXkiLCAiUmVhZCBzdWJrZXkgdmFsdWUgd3JvbmciCisgICAgdHJ5OgorICAgICAgICBFbnVtS2V5KGtleSwgMSkKKyAgICAgICAgYXNzZXJ0IDAsICJXYXMgYWJsZSB0byBnZXQgYSBzZWNvbmQga2V5IHdoZW4gSSBvbmx5IGhhdmUgb25lISIKKyAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgcGFzcworCisgICAga2V5LkNsb3NlKCkKKworZGVmIERlbGV0ZVRlc3REYXRhKHJvb3Rfa2V5KToKKyAgICBrZXkgPSBPcGVuS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lLCAwLCBLRVlfQUxMX0FDQ0VTUykKKyAgICBzdWJfa2V5ID0gT3BlbktleShrZXksICJzdWJfa2V5IiwgMCwgS0VZX0FMTF9BQ0NFU1MpCisgICAgIyBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRlbGV0ZSB0aGUgdmFsdWVzIGJlZm9yZSBkZWxldGluZworICAgICMgdGhlIGtleSAoYWx0aG91Z2ggc3Via2V5cyBtdXN0IG5vdCBleGlzdCkuICBXZSBkZWxldGUgdGhlbQorICAgICMgbWFudWFsbHkganVzdCB0byBwcm92ZSB3ZSBjYW4gOi0pCisgICAgZm9yIHZhbHVlX25hbWUsIHZhbHVlX2RhdGEsIHZhbHVlX3R5cGUgaW4gdGVzdF9kYXRhOgorICAgICAgICBEZWxldGVWYWx1ZShzdWJfa2V5LCB2YWx1ZV9uYW1lKQorCisgICAgbmtleXMsIG52YWx1ZXMsIHNpbmNlX21vZCA9IFF1ZXJ5SW5mb0tleShzdWJfa2V5KQorICAgIGFzc2VydCBua2V5cz09MCBhbmQgbnZhbHVlcz09MCwgInN1YmtleSBub3QgZW1wdHkgYmVmb3JlIGRlbGV0ZSIKKyAgICBzdWJfa2V5LkNsb3NlKCkKKyAgICBEZWxldGVLZXkoa2V5LCAic3ViX2tleSIpCisKKyAgICB0cnk6CisgICAgICAgICMgU2hvdWxkbnQgYmUgYWJsZSB0byBkZWxldGUgaXQgdHdpY2UhCisgICAgICAgIERlbGV0ZUtleShrZXksICJzdWJfa2V5IikKKyAgICAgICAgYXNzZXJ0IDAsICJEZWxldGluZyB0aGUga2V5IHR3aWNlIHN1Y2NlZWRlZCIKKyAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGtleS5DbG9zZSgpCisgICAgRGVsZXRlS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lKQorICAgICMgT3BlbmluZyBzaG91bGQgbm93IGZhaWwhCisgICAgdHJ5OgorICAgICAgICBrZXkgPSBPcGVuS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lKQorICAgICAgICBhc3NlcnQgMCwgIkNvdWxkIG9wZW4gdGhlIG5vbi1leGlzdGFudCBrZXkiCisgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjogIyBVc2UgdGhpcyBlcnJvciBuYW1lIHRoaXMgdGltZQorICAgICAgICBwYXNzCisKK2RlZiBUZXN0QWxsKHJvb3Rfa2V5KToKKyAgICBXcml0ZVRlc3REYXRhKHJvb3Rfa2V5KQorICAgIFJlYWRUZXN0RGF0YShyb290X2tleSkKKyAgICBEZWxldGVUZXN0RGF0YShyb290X2tleSkKKworIyBUZXN0IG9uIG15IGxvY2FsIG1hY2hpbmUuCitUZXN0QWxsKEhLRVlfQ1VSUkVOVF9VU0VSKQorcHJpbnQgIkxvY2FsIHJlZ2lzdHJ5IHRlc3RzIHdvcmtlZCIKK3RyeToKKyAgICByZW1vdGVfbmFtZSA9IHN5cy5hcmd2W3N5cy5hcmd2LmluZGV4KCItLXJlbW90ZSIpKzFdCitleGNlcHQgKEluZGV4RXJyb3IsIFZhbHVlRXJyb3IpOgorICAgIHJlbW90ZV9uYW1lID0gTm9uZQorCitpZiByZW1vdGVfbmFtZSBpcyBub3QgTm9uZToKKyAgICB0cnk6CisgICAgICAgIHJlbW90ZV9rZXkgPSBDb25uZWN0UmVnaXN0cnkocmVtb3RlX25hbWUsIEhLRVlfQ1VSUkVOVF9VU0VSKQorICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBleGM6CisgICAgICAgIHByaW50ICJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgcmVtb3RlIG1hY2hpbmUgLSIsIGV4Yy5zdHJlcnJvcgorICAgICAgICByZW1vdGVfa2V5ID0gTm9uZQorICAgIGlmIHJlbW90ZV9rZXkgaXMgbm90IE5vbmU6CisgICAgICAgIFRlc3RBbGwocmVtb3RlX2tleSkKKyAgICAgICAgcHJpbnQgIlJlbW90ZSByZWdpc3RyeSB0ZXN0cyB3b3JrZWQiCitlbHNlOgorICAgIHByaW50ICJSZW1vdGUgcmVnaXN0cnkgY2FsbHMgY2FuIGJlIHRlc3RlZCB1c2luZyIsCisgICAgcHJpbnQgIid0ZXN0X3dpbnJlZy5weSAtLXJlbW90ZSBcXFxcbWFjaGluZV9uYW1lJyIKKwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF96aXAucHkgYi9MaWIvZG9zLTh4My90ZXN0X3ppcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmZkZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvdGVzdF96aXAucHkKQEAgLTAsMCArMSwyNiBAQAoraW1wb3J0IHppcGZpbGUsIG9zCisKK3NyY25hbWUgPSAianVuazk2MzAudG1wIgoremlwbmFtZSA9ICJqdW5rOTcwOC50bXAiCisKK3RyeToKKyAgZnAgPSBvcGVuKHNyY25hbWUsICJ3IikJCSMgTWFrZSBhIHNvdXJjZSBmaWxlIHdpdGggc29tZSBsaW5lcworICBmb3IgaSBpbiByYW5nZSgwLCAxMDAwKToKKyAgICBmcC53cml0ZSgiVGVzdCBvZiB6aXBmaWxlIGxpbmUgJWQuXG4iICUgaSkKKyAgZnAuY2xvc2UoKQorCisgIHppcCA9IHppcGZpbGUuWmlwRmlsZSh6aXBuYW1lLCAidyIpCSMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICB6aXAud3JpdGUoc3JjbmFtZSwgc3JjbmFtZSkKKyAgemlwLndyaXRlKHNyY25hbWUsICJhbm90aGVyLm5hbWUiKQorICB6aXAuY2xvc2UoKQorCisgIHppcCA9IHppcGZpbGUuWmlwRmlsZSh6aXBuYW1lLCAiciIpCSMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgemlwLnJlYWQoImFub3RoZXIubmFtZSIpCisgIHppcC5yZWFkKHNyY25hbWUpCisgIHppcC5jbG9zZSgpCitmaW5hbGx5OgorICBpZiBvcy5wYXRoLmlzZmlsZShzcmNuYW1lKToJCSMgUmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworICAgIG9zLnVubGluayhzcmNuYW1lKQorICBpZiBvcy5wYXRoLmlzZmlsZSh6aXBuYW1lKToKKyAgICBvcy51bmxpbmsoemlwbmFtZSkKKwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF96bGkucHkgYi9MaWIvZG9zLTh4My90ZXN0X3psaS5weQppbmRleCA3MTliMGU3Li5jY2ZiYzdkIDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3psaS5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3psaS5weQpAQCAtODAsMTQgKzgwLDE0IEBACiAjIGluIG9yZGVyIHRvIHByb3ZpZGUgbW9yZSB2YXJpYXRpb25zLgogZm9yIHN5bmMgaW4gW3psaWIuWl9OT19GTFVTSCwgemxpYi5aX1NZTkNfRkxVU0gsIHpsaWIuWl9GVUxMX0ZMVVNIXToKICAgICBmb3IgbGV2ZWwgaW4gcmFuZ2UoMTApOgotCW9iaiA9IHpsaWIuY29tcHJlc3NvYmooIGxldmVsICkKLSAgICAJZCA9IG9iai5jb21wcmVzcyggYnVmWzozMDAwXSApCi0JZCA9IGQgKyBvYmouZmx1c2goIHN5bmMgKQotCWQgPSBkICsgb2JqLmNvbXByZXNzKCBidWZbMzAwMDpdICkKLQlkID0gZCArIG9iai5mbHVzaCgpCi0JaWYgemxpYi5kZWNvbXByZXNzKGQpICE9IGJ1ZjoKLQkgICAgcHJpbnQgIkRlY29tcHJlc3MgZmFpbGVkOiBmbHVzaCBtb2RlPSVpLCBsZXZlbD0laSIgJSAoc3luYyxsZXZlbCkKLQlkZWwgb2JqCisgICAgICAgIG9iaiA9IHpsaWIuY29tcHJlc3NvYmooIGxldmVsICkKKyAgICAgICAgZCA9IG9iai5jb21wcmVzcyggYnVmWzozMDAwXSApCisgICAgICAgIGQgPSBkICsgb2JqLmZsdXNoKCBzeW5jICkKKyAgICAgICAgZCA9IGQgKyBvYmouY29tcHJlc3MoIGJ1ZlszMDAwOl0gKQorICAgICAgICBkID0gZCArIG9iai5mbHVzaCgpCisgICAgICAgIGlmIHpsaWIuZGVjb21wcmVzcyhkKSAhPSBidWY6CisgICAgICAgICAgICBwcmludCAiRGVjb21wcmVzcyBmYWlsZWQ6IGZsdXNoIG1vZGU9JWksIGxldmVsPSVpIiAlIChzeW5jLGxldmVsKQorICAgICAgICBkZWwgb2JqCiAKIGRlZiBpZ25vcmUoKToKICAgICAiIiJBbiBlbXB0eSBmdW5jdGlvbiB3aXRoIGEgYmlnIHN0cmluZy4KZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3RocmVhZGluLnB5IGIvTGliL2Rvcy04eDMvdGhyZWFkaW4ucHkKaW5kZXggNzY3ZGY0NS4uZGVkNTczYSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGhyZWFkaW4ucHkKKysrIGIvTGliL2Rvcy04eDMvdGhyZWFkaW4ucHkKQEAgLTEsNSArMSw0IEBACi0jIHRocmVhZGluZy5weToKLSMgUHJvcG9zZWQgbmV3IHRocmVhZGluZyBtb2R1bGUsIGVtdWxhdGluZyBhIHN1YnNldCBvZiBKYXZhJ3MgdGhyZWFkaW5nIG1vZGVsCisiIiJQcm9wb3NlZCBuZXcgdGhyZWFkaW5nIG1vZHVsZSwgZW11bGF0aW5nIGEgc3Vic2V0IG9mIEphdmEncyB0aHJlYWRpbmcgbW9kZWwuIiIiCiAKIGltcG9ydCBzeXMKIGltcG9ydCB0aW1lCkBAIC0yMzgsNyArMjM3LDcgQEAKIAogY2xhc3MgX1NlbWFwaG9yZShfVmVyYm9zZSk6CiAKLSAgICAjIEFmdGVyIFRpbSBQZXRlcnMnIHNlbWFwaG9yZSBjbGFzcywgYnV0IGJub3QgcXVpdGUgdGhlIHNhbWUgKG5vIG1heGltdW0pCisgICAgIyBBZnRlciBUaW0gUGV0ZXJzJyBzZW1hcGhvcmUgY2xhc3MsIGJ1dCBub3QgcXVpdGUgdGhlIHNhbWUgKG5vIG1heGltdW0pCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9MSwgdmVyYm9zZT1Ob25lKToKICAgICAgICAgYXNzZXJ0IHZhbHVlID49IDAsICJTZW1hcGhvcmUgaW5pdGlhbCB2YWx1ZSBtdXN0IGJlID49IDAiCkBAIC01MDYsNyArNTA1LDcgQEAKICAgICAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIFRocmVhZC5fX2luaXRfXyhzZWxmLCBuYW1lPV9uZXduYW1lKCJEdW1teS0lZCIpKQotICAgICAgICBzZWxmLl9fVGhyZWFkX3N0YXJ0ZWQgPSAxCisgICAgICAgIHNlbGYuX1RocmVhZF9fc3RhcnRlZCA9IDEKICAgICAgICAgX2FjdGl2ZV9saW1ib19sb2NrLmFjcXVpcmUoKQogICAgICAgICBfYWN0aXZlW19nZXRfaWRlbnQoKV0gPSBzZWxmCiAgICAgICAgIF9hY3RpdmVfbGltYm9fbG9jay5yZWxlYXNlKCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3RocmVhZHN0LnB5IGIvTGliL2Rvcy04eDMvdGhyZWFkc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiMDhmMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9kb3MtOHgzL3RocmVhZHN0LnB5CkBAIC0wLDAgKzEsOSBAQAoraW1wb3J0IHRocmVhZAorIyBTdGFydCBlbXB0eSB0aHJlYWQgdG8gaW5pdGlhbGlzZSB0aHJlYWQgbWVjaGFuaWNzIChhbmQgZ2xvYmFsIGxvY2shKQorIyBUaGlzIHRocmVhZCB3aWxsIGZpbmlzaCBpbW1lZGlhdGVseSB0aHVzIHdvbid0IG1ha2UgbXVjaCBpbmZsdWVuY2Ugb24KKyMgdGVzdCByZXN1bHRzIGJ5IGl0c2VsZiwgb25seSBieSB0aGF0IGZhY3QgdGhhdCBpdCBpbml0aWFsaXNlcyBnbG9iYWwgbG9jawordGhyZWFkLnN0YXJ0X25ld190aHJlYWQobGFtYmRhIDogMSwgKCkpCisKK2ltcG9ydCB0ZXN0LnB5c3RvbmUKK3Rlc3QucHlzdG9uZS5tYWluKCkKKwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdHJhY2ViYWMucHkgYi9MaWIvZG9zLTh4My90cmFjZWJhYy5weQppbmRleCA3MGQzMjMwLi40Njc1MDc3IDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My90cmFjZWJhYy5weQorKysgYi9MaWIvZG9zLTh4My90cmFjZWJhYy5weQpAQCAtMSw0ICsxLDQgQEAKLSMgRm9ybWF0IGFuZCBwcmludCBQeXRob24gc3RhY2sgdHJhY2VzCisiIiJFeHRyYWN0LCBmb3JtYXQgYW5kIHByaW50IGluZm9ybWF0aW9uIGFib3V0IFB5dGhvbiBzdGFjayB0cmFjZXMuIiIiCiAKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCBzdHJpbmcKQEAgLTEwLDYgKzEwLDggQEAKIAogCiBkZWYgcHJpbnRfbGlzdChleHRyYWN0ZWRfbGlzdCwgZmlsZT1Ob25lKToKKwkiIiJQcmludCB0aGUgbGlzdCBvZiB0dXBsZXMgYXMgcmV0dXJuZWQgYnkgZXh0cmFjdF90YigpIG9yCisJZXh0cmFjdF9zdGFjaygpIGFzIGEgZm9ybWF0dGVkIHN0YWNrIHRyYWNlIHRvIHRoZSBnaXZlbiBmaWxlLiIiIgogCWlmIG5vdCBmaWxlOgogCQlmaWxlID0gc3lzLnN0ZGVycgogCWZvciBmaWxlbmFtZSwgbGluZW5vLCBuYW1lLCBsaW5lIGluIGV4dHJhY3RlZF9saXN0OgpAQCAtMTksNiArMjEsMTIgQEAKIAkJCV9wcmludChmaWxlLCAnICAgICVzJyAlIHN0cmluZy5zdHJpcChsaW5lKSkKIAogZGVmIGZvcm1hdF9saXN0KGV4dHJhY3RlZF9saXN0KToKKwkiIiJHaXZlbiBhIGxpc3Qgb2YgdHVwbGVzIGFzIHJldHVybmVkIGJ5IGV4dHJhY3RfdGIoKSBvcgorCWV4dHJhY3Rfc3RhY2soKSwgcmV0dXJuIGEgbGlzdCBvZiBzdHJpbmdzIHJlYWR5IGZvciBwcmludGluZy4KKwlFYWNoIHN0cmluZyBpbiB0aGUgcmVzdWx0aW5nIGxpc3QgY29ycmVzcG9uZHMgdG8gdGhlIGl0ZW0gd2l0aAorCXRoZSBzYW1lIGluZGV4IGluIHRoZSBhcmd1bWVudCBsaXN0LiAgRWFjaCBzdHJpbmcgZW5kcyBpbiBhCisJbmV3bGluZTsgdGhlIHN0cmluZ3MgbWF5IGNvbnRhaW4gaW50ZXJuYWwgbmV3bGluZXMgYXMgd2VsbCwgZm9yCisJdGhvc2UgaXRlbXMgd2hvc2Ugc291cmNlIHRleHQgbGluZSBpcyBub3QgTm9uZS4iIiIKIAlsaXN0ID0gW10KIAlmb3IgZmlsZW5hbWUsIGxpbmVubywgbmFtZSwgbGluZSBpbiBleHRyYWN0ZWRfbGlzdDoKIAkJaXRlbSA9ICcgIEZpbGUgIiVzIiwgbGluZSAlZCwgaW4gJXNcbicgJSAoZmlsZW5hbWUsbGluZW5vLG5hbWUpCkBAIC0yOSw2ICszNywxMCBAQAogCQogCiBkZWYgcHJpbnRfdGIodGIsIGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CisJIiIiUHJpbnQgdXAgdG8gJ2xpbWl0JyBzdGFjayB0cmFjZSBlbnRyaWVzIGZyb20gdGhlIHRyYWNlYmFjayAndGInLgorCUlmICdsaW1pdCcgaXMgb21pdHRlZCBvciBOb25lLCBhbGwgZW50cmllcyBhcmUgcHJpbnRlZC4gIElmICdmaWxlJyBpcworCW9taXR0ZWQgb3IgTm9uZSwgdGhlIG91dHB1dCBnb2VzIHRvIHN5cy5zdGRlcnI7IG90aGVyd2lzZSAnZmlsZScKKwlzaG91bGQgYmUgYW4gb3BlbiBmaWxlIG9yIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBhIHdyaXRlKCkgbWV0aG9kLiIiIgogCWlmIG5vdCBmaWxlOgogCQlmaWxlID0gc3lzLnN0ZGVycgogCWlmIGxpbWl0IGlzIE5vbmU6CkBAIC00OSw5ICs2MSwxOCBAQAogCQluID0gbisxCiAKIGRlZiBmb3JtYXRfdGIodGIsIGxpbWl0ID0gTm9uZSk6CisJIiIiQSBzaG9ydGhhbmQgZm9yICdmb3JtYXRfbGlzdChleHRyYWN0X3N0YWNrKGYsIGxpbWl0KSkuIiIiCiAJcmV0dXJuIGZvcm1hdF9saXN0KGV4dHJhY3RfdGIodGIsIGxpbWl0KSkKIAogZGVmIGV4dHJhY3RfdGIodGIsIGxpbWl0ID0gTm9uZSk6CisJIiIiUmV0dXJuIGEgbGlzdCBvZiB1cCB0byAnbGltaXQnIHByZS1wcm9jZXNzZWQgc3RhY2sgdHJhY2UgZW50cmllcworCWV4dHJhY3RlZCBmcm9tIHRoZSB0cmFjZWJhY2sgb2JqZWN0ICd0cmFjZWJhY2snLiAgVGhpcyBpcyB1c2VmdWwgZm9yCisJYWx0ZXJuYXRlIGZvcm1hdHRpbmcgb2Ygc3RhY2sgdHJhY2VzLiAgSWYgJ2xpbWl0JyBpcyBvbWl0dGVkIG9yIE5vbmUsCisJYWxsIGVudHJpZXMgYXJlIGV4dHJhY3RlZC4gIEEgcHJlLXByb2Nlc3NlZCBzdGFjayB0cmFjZSBlbnRyeSBpcyBhCisJcXVhZHJ1cGxlIChmaWxlbmFtZSwgbGluZSBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIHRleHQpIHJlcHJlc2VudGluZworCXRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzdWFsbHkgcHJpbnRlZCBmb3IgYSBzdGFjayB0cmFjZS4gIFRoZSB0ZXh0CisJaXMgYSBzdHJpbmcgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHN0cmlwcGVkOyBpZiB0aGUKKwlzb3VyY2UgaXMgbm90IGF2YWlsYWJsZSBpdCBpcyBOb25lLiIiIgogCWlmIGxpbWl0IGlzIE5vbmU6CiAJCWlmIGhhc2F0dHIoc3lzLCAndHJhY2ViYWNrbGltaXQnKToKIAkJCWxpbWl0ID0gc3lzLnRyYWNlYmFja2xpbWl0CkBAIC03MywxMCArOTQsMTggQEAKIAogCiBkZWYgcHJpbnRfZXhjZXB0aW9uKGV0eXBlLCB2YWx1ZSwgdGIsIGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CisJIiIiUHJpbnQgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGFuZCB1cCB0byAnbGltaXQnIHN0YWNrIHRyYWNlIGVudHJpZXMKKwlmcm9tIHRoZSB0cmFjZWJhY2sgJ3RiJyB0byAnZmlsZScuICBUaGlzIGRpZmZlcnMgZnJvbSBwcmludF90YigpIGluCisJdGhlIGZvbGxvd2luZyB3YXlzOiAoMSkgaWYgdHJhY2ViYWNrIGlzIG5vdCBOb25lLCBpdCBwcmludHMgYSBoZWFkZXIKKwkiVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOiI7ICgyKSBpdCBwcmludHMgdGhlIGV4Y2VwdGlvbiB0eXBlIGFuZAorCXZhbHVlIGFmdGVyIHRoZSBzdGFjayB0cmFjZTsgKDMpIGlmIHR5cGUgaXMgU3ludGF4RXJyb3IgYW5kIHZhbHVlIGhhcworCXRoZSBhcHByb3ByaWF0ZSBmb3JtYXQsIGl0IHByaW50cyB0aGUgbGluZSB3aGVyZSB0aGUgc3ludGF4IGVycm9yCisJb2NjdXJyZWQgd2l0aCBhIGNhcmV0IG9uIHRoZSBuZXh0IGxpbmUgaW5kaWNhdGluZyB0aGUgYXBwcm94aW1hdGUKKwlwb3NpdGlvbiBvZiB0aGUgZXJyb3IuIiIiCiAJaWYgbm90IGZpbGU6CiAJCWZpbGUgPSBzeXMuc3RkZXJyCiAJaWYgdGI6Ci0JCV9wcmludChmaWxlLCAnVHJhY2ViYWNrIChpbm5lcm1vc3QgbGFzdCk6JykKKwkJX3ByaW50KGZpbGUsICdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6JykKIAkJcHJpbnRfdGIodGIsIGxpbWl0LCBmaWxlKQogCWxpbmVzID0gZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KGV0eXBlLCB2YWx1ZSkKIAlmb3IgbGluZSBpbiBsaW5lc1s6LTFdOgpAQCAtODQsOCArMTEzLDE0IEBACiAJX3ByaW50KGZpbGUsIGxpbmVzWy0xXSwgJycpCiAKIGRlZiBmb3JtYXRfZXhjZXB0aW9uKGV0eXBlLCB2YWx1ZSwgdGIsIGxpbWl0ID0gTm9uZSk6CisJIiIiRm9ybWF0IGEgc3RhY2sgdHJhY2UgYW5kIHRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24uICBUaGUgYXJndW1lbnRzCisJaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cyB0bworCXByaW50X2V4Y2VwdGlvbigpLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgb2Ygc3RyaW5ncywgZWFjaAorCWVuZGluZyBpbiBhIG5ld2xpbmUgYW5kIHNvbWUgY29udGFpbmluZyBpbnRlcm5hbCBuZXdsaW5lcy4gIFdoZW4gCisJdGhlc2UgbGluZXMgYXJlIGNvbnRhdGVuYXRlZCBhbmQgcHJpbnRlZCwgZXhhY3RseSB0aGUgc2FtZSB0ZXh0IGlzCisJcHJpbnRlZCBhcyBkb2VzIHByaW50X2V4Y2VwdGlvbigpLiIiIgogCWlmIHRiOgotCQlsaXN0ID0gWydUcmFjZWJhY2sgKGlubmVybW9zdCBsYXN0KTpcbiddCisJCWxpc3QgPSBbJ1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiddCiAJCWxpc3QgPSBsaXN0ICsgZm9ybWF0X3RiKHRiLCBsaW1pdCkKIAllbHNlOgogCQlsaXN0ID0gW10KQEAgLTkzLDYgKzEyOCwxNCBAQAogCXJldHVybiBsaXN0CiAKIGRlZiBmb3JtYXRfZXhjZXB0aW9uX29ubHkoZXR5cGUsIHZhbHVlKToKKwkiIiJGb3JtYXQgdGhlIGV4Y2VwdGlvbiBwYXJ0IG9mIGEgdHJhY2ViYWNrLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlCisJZXhjZXB0aW9uIHR5cGUgYW5kIHZhbHVlIHN1Y2ggYXMgZ2l2ZW4gYnkgc3lzLmxhc3RfdHlwZSBhbmQKKwlzeXMubGFzdF92YWx1ZS4gVGhlIHJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgb2Ygc3RyaW5ncywgZWFjaCBlbmRpbmcKKwlpbiBhIG5ld2xpbmUuICBOb3JtYWxseSwgdGhlIGxpc3QgY29udGFpbnMgYSBzaW5nbGUgc3RyaW5nOworCWhvd2V2ZXIsIGZvciBTeW50YXhFcnJvciBleGNlcHRpb25zLCBpdCBjb250YWlucyBzZXZlcmFsIGxpbmVzIHRoYXQKKwkod2hlbiBwcmludGVkKSBkaXNwbGF5IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBzeW50YXgKKwllcnJvciBvY2N1cnJlZC4gIFRoZSBtZXNzYWdlIGluZGljYXRpbmcgd2hpY2ggZXhjZXB0aW9uIG9jY3VycmVkIGlzCisJdGhlIGFsd2F5cyBsYXN0IHN0cmluZyBpbiB0aGUgbGlzdC4iIiIKIAlsaXN0ID0gW10KIAlpZiB0eXBlKGV0eXBlKSA9PSB0eXBlcy5DbGFzc1R5cGU6CiAJCXN0eXBlID0gZXR5cGUuX19uYW1lX18KQEAgLTEyOCw2ICsxNzEsMTAgQEAKIAogCiBkZWYgcHJpbnRfZXhjKGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CisJIiIiVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgJ3ByaW50X2V4Y2VwdGlvbihzeXMuZXhjX3R5cGUsCisJc3lzLmV4Y192YWx1ZSwgc3lzLmV4Y190cmFjZWJhY2ssIGxpbWl0LCBmaWxlKScuCisJKEluIGZhY3QsIGl0IHVzZXMgc3lzLmV4Y19pbmZvKCkgdG8gcmV0cmlldmUgdGhlIHNhbWUgaW5mb3JtYXRpb24KKwlpbiBhIHRocmVhZC1zYWZlIHdheS4pIiIiCiAJaWYgbm90IGZpbGU6CiAJCWZpbGUgPSBzeXMuc3RkZXJyCiAJdHJ5OgpAQCAtMTM3LDYgKzE4NCw4IEBACiAJICAgIGV0eXBlID0gdmFsdWUgPSB0YiA9IE5vbmUKIAogZGVmIHByaW50X2xhc3QobGltaXQ9Tm9uZSwgZmlsZT1Ob25lKToKKwkiIiJUaGlzIGlzIGEgc2hvcnRoYW5kIGZvciAncHJpbnRfZXhjZXB0aW9uKHN5cy5sYXN0X3R5cGUsCisJc3lzLmxhc3RfdmFsdWUsIHN5cy5sYXN0X3RyYWNlYmFjaywgbGltaXQsIGZpbGUpJy4iIiIKIAlpZiBub3QgZmlsZToKIAkJZmlsZSA9IHN5cy5zdGRlcnIKIAlwcmludF9leGNlcHRpb24oc3lzLmxhc3RfdHlwZSwgc3lzLmxhc3RfdmFsdWUsIHN5cy5sYXN0X3RyYWNlYmFjaywKQEAgLTE0NCw2ICsxOTMsMTAgQEAKIAogCiBkZWYgcHJpbnRfc3RhY2soZj1Ob25lLCBsaW1pdD1Ob25lLCBmaWxlPU5vbmUpOgorCSIiIlRoaXMgZnVuY3Rpb24gcHJpbnRzIGEgc3RhY2sgdHJhY2UgZnJvbSBpdHMgaW52b2NhdGlvbiBwb2ludC4KKwlUaGUgb3B0aW9uYWwgJ2YnIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIHN0YWNrCisJZnJhbWUgYXQgd2hpY2ggdG8gc3RhcnQuIFRoZSBvcHRpb25hbCAnbGltaXQnIGFuZCAnZmlsZScgYXJndW1lbnRzCisJaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvciBwcmludF9leGNlcHRpb24oKS4iIiIKIAlpZiBmIGlzIE5vbmU6CiAJCXRyeToKIAkJCXJhaXNlIFplcm9EaXZpc2lvbkVycm9yCkBAIC0xNTIsNiArMjA1LDcgQEAKIAlwcmludF9saXN0KGV4dHJhY3Rfc3RhY2soZiwgbGltaXQpLCBmaWxlKQogCiBkZWYgZm9ybWF0X3N0YWNrKGY9Tm9uZSwgbGltaXQ9Tm9uZSk6CisJIiIiQSBzaG9ydGhhbmQgZm9yICdmb3JtYXRfbGlzdChleHRyYWN0X3N0YWNrKGYsIGxpbWl0KSknLiIiIgogCWlmIGYgaXMgTm9uZToKIAkJdHJ5OgogCQkJcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKQEAgLTE2MCw2ICsyMTQsMTIgQEAKIAlyZXR1cm4gZm9ybWF0X2xpc3QoZXh0cmFjdF9zdGFjayhmLCBsaW1pdCkpCiAKIGRlZiBleHRyYWN0X3N0YWNrKGY9Tm9uZSwgbGltaXQgPSBOb25lKToKKwkiIiJFeHRyYWN0IHRoZSByYXcgdHJhY2ViYWNrIGZyb20gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUuICBUaGUKKwlyZXR1cm4gdmFsdWUgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyBmb3IgZXh0cmFjdF90YigpLiAgVGhlIG9wdGlvbmFsCisJJ2YnIGFuZCAnbGltaXQnIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yIHByaW50X3N0YWNrKCkuIAorCUVhY2ggaXRlbSBpbiB0aGUgbGlzdCBpcyBhIHF1YWRydXBsZSAoZmlsZW5hbWUsIGxpbmUgbnVtYmVyLAorCWZ1bmN0aW9uIG5hbWUsIHRleHQpLCBhbmQgdGhlIGVudHJpZXMgYXJlIGluIG9yZGVyIGZyb20gb2xkZXN0CisJdG8gbmV3ZXN0IHN0YWNrIGZyYW1lLiIiIgogCWlmIGYgaXMgTm9uZToKIAkJdHJ5OgogCQkJcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKQEAgLTE4NCwxMyArMjQ0LDE0IEBACiAJbGlzdC5yZXZlcnNlKCkKIAlyZXR1cm4gbGlzdAogCi0jIENhbGN1bGF0ZSB0aGUgY29ycmVjdCBsaW5lIG51bWJlciBvZiB0aGUgdHJhY2ViYWNrIGdpdmVuIGluIHRiIChldmVuCi0jIHdpdGggLU8gb24pLgotIyBDb2RlZCBieSBNYXJjLUFuZHJlIExlbWJ1cmcgZnJvbSB0aGUgZXhhbXBsZSBvZiBQeUNvZGVfQWRkcjJMaW5lKCkKLSMgaW4gY29tcGlsZS5jLgotIyBSZXZpc2VkIHZlcnNpb24gYnkgSmltIEh1Z3VuaW4gdG8gd29yayB3aXRoIEpQeXRob24gdG9vLgotCiBkZWYgdGJfbGluZW5vKHRiKToKKwkiIiJDYWxjdWxhdGUgdGhlIGNvcnJlY3QgbGluZSBudW1iZXIgb2YgdGhlIHRyYWNlYmFjayBnaXZlbiBpbiB0YgorCShldmVuIHdpdGggLU8gb24pLiIiIgorCisJIyBDb2RlZCBieSBNYXJjLUFuZHJlIExlbWJ1cmcgZnJvbSB0aGUgZXhhbXBsZSBvZiBQeUNvZGVfQWRkcjJMaW5lKCkKKwkjIGluIGNvbXBpbGUuYy4KKwkjIFJldmlzZWQgdmVyc2lvbiBieSBKaW0gSHVndW5pbiB0byB3b3JrIHdpdGggSlB5dGhvbiB0b28uCisKIAljID0gdGIudGJfZnJhbWUuZl9jb2RlCiAJaWYgbm90IGhhc2F0dHIoYywgJ2NvX2xub3RhYicpOgogCQlyZXR1cm4gdGIudGJfbGluZW5vCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My91c2VyZGljdC5weSBiL0xpYi9kb3MtOHgzL3VzZXJkaWN0LnB5CmluZGV4IDUwZmVlODkuLjNjNDg0MTUgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3VzZXJkaWN0LnB5CisrKyBiL0xpYi9kb3MtOHgzL3VzZXJkaWN0LnB5CkBAIC0xLDQgKzEsNCBAQAotIyBBIG1vcmUgb3IgbGVzcyBjb21wbGV0ZSB1c2VyLWRlZmluZWQgd3JhcHBlciBhcm91bmQgZGljdGlvbmFyeSBvYmplY3RzCisiIiJBIG1vcmUgb3IgbGVzcyBjb21wbGV0ZSB1c2VyLWRlZmluZWQgd3JhcHBlciBhcm91bmQgZGljdGlvbmFyeSBvYmplY3RzLiIiIgogCiBjbGFzcyBVc2VyRGljdDoKICAgICBkZWYgX19pbml0X18oc2VsZiwgZGljdD1Ob25lKToKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3VzZXJsaXN0LnB5IGIvTGliL2Rvcy04eDMvdXNlcmxpc3QucHkKaW5kZXggYTYwZDhjZS4uN2JkMDI5OCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvdXNlcmxpc3QucHkKKysrIGIvTGliL2Rvcy04eDMvdXNlcmxpc3QucHkKQEAgLTEsMTMgKzEsMTYgQEAKLSMgQSBtb3JlIG9yIGxlc3MgY29tcGxldGUgdXNlci1kZWZpbmVkIHdyYXBwZXIgYXJvdW5kIGxpc3Qgb2JqZWN0cworIiIiQSBtb3JlIG9yIGxlc3MgY29tcGxldGUgdXNlci1kZWZpbmVkIHdyYXBwZXIgYXJvdW5kIGxpc3Qgb2JqZWN0cy4iIiIKIAogY2xhc3MgVXNlckxpc3Q6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpc3Q9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluaXRsaXN0PU5vbmUpOgogICAgICAgICBzZWxmLmRhdGEgPSBbXQotICAgICAgICBpZiBsaXN0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgaWYgdHlwZShsaXN0KSA9PSB0eXBlKHNlbGYuZGF0YSk6Ci0gICAgICAgICAgICAgICAgc2VsZi5kYXRhWzpdID0gbGlzdAorICAgICAgICBpZiBpbml0bGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgWFhYIHNob3VsZCB0aGlzIGFjY2VwdCBhbiBhcmJpdGFyeSBzZXF1ZW5jZT8KKyAgICAgICAgICAgIGlmIHR5cGUoaW5pdGxpc3QpID09IHR5cGUoc2VsZi5kYXRhKToKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGFbOl0gPSBpbml0bGlzdAorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluaXRsaXN0LCBVc2VyTGlzdCk6CisgICAgICAgICAgICAgICAgc2VsZi5kYXRhWzpdID0gaW5pdGxpc3QuZGF0YVs6XQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmRhdGFbOl0gPSBsaXN0LmRhdGFbOl0KKyAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBsaXN0KGluaXRsaXN0KQogICAgIGRlZiBfX3JlcHJfXyhzZWxmKTogcmV0dXJuIHJlcHIoc2VsZi5kYXRhKQogICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlckxpc3QpOgpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdXNlcnN0cmkucHkgYi9MaWIvZG9zLTh4My91c2Vyc3RyaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjgwNjVlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rvcy04eDMvdXNlcnN0cmkucHkKQEAgLTAsMCArMSwxNTggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyMgdmltOnRzPTQ6ZXQ6bm93cmFwCisiIiJBIHVzZXItZGVmaW5lZCB3cmFwcGVyIGFyb3VuZCBzdHJpbmcgb2JqZWN0cworCitOb3RlOiBzdHJpbmcgb2JqZWN0cyBoYXZlIGdyb3duIG1ldGhvZHMgaW4gUHl0aG9uIDEuNiAKK1RoaXMgbW9kdWxlIHJlcXVpcmVzIFB5dGhvbiAxLjYgb3IgbGF0ZXIuCisiIiIKK2Zyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGUsIFVuaWNvZGVUeXBlCitpbXBvcnQgc3lzCisKK2NsYXNzIFVzZXJTdHJpbmc6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VxLCBTdHJpbmdUeXBlKSBvciBpc2luc3RhbmNlKHNlcSwgVW5pY29kZVR5cGUpOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VxCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZXEsIFVzZXJTdHJpbmcpOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VxLmRhdGFbOl0KKyAgICAgICAgZWxzZTogCisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzdHIoc2VxKQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOiByZXR1cm4gc3RyKHNlbGYuZGF0YSkKKyAgICBkZWYgX19yZXByX18oc2VsZik6IHJldHVybiByZXByKHNlbGYuZGF0YSkKKyAgICBkZWYgX19pbnRfXyhzZWxmKTogcmV0dXJuIGludChzZWxmLmRhdGEpCisgICAgZGVmIF9fbG9uZ19fKHNlbGYpOiByZXR1cm4gbG9uZyhzZWxmLmRhdGEpCisgICAgZGVmIF9fZmxvYXRfXyhzZWxmKTogcmV0dXJuIGZsb2F0KHNlbGYuZGF0YSkKKyAgICBkZWYgX19jb21wbGV4X18oc2VsZik6IHJldHVybiBjb21wbGV4KHNlbGYuZGF0YSkKKyAgICBkZWYgX19oYXNoX18oc2VsZik6IHJldHVybiBoYXNoKHNlbGYuZGF0YSkKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIHN0cmluZyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RyaW5nLCBVc2VyU3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBzdHJpbmcuZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBzdHJpbmcpCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBjaGFyKToKKyAgICAgICAgcmV0dXJuIGNoYXIgaW4gc2VsZi5kYXRhCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLmRhdGEpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YVtpbmRleF0pCisgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBzdGFydCwgZW5kKToKKyAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDApOyBlbmQgPSBtYXgoZW5kLCAwKQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhW3N0YXJ0OmVuZF0pCisKKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJTdHJpbmcpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSArIG90aGVyLmRhdGEpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgU3RyaW5nVHlwZSkgb3IgaXNpbnN0YW5jZShvdGhlciwgVW5pY29kZVR5cGUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSArIG90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSArIHN0cihvdGhlcikpCisgICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgU3RyaW5nVHlwZSkgb3IgaXNpbnN0YW5jZShvdGhlciwgVW5pY29kZVR5cGUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKG90aGVyICsgc2VsZi5kYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHN0cihvdGhlcikgKyBzZWxmLmRhdGEpCisgICAgZGVmIF9fbXVsX18oc2VsZiwgbik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEqbikKKyAgICBfX3JtdWxfXyA9IF9fbXVsX18KKworICAgICMgdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIGFscGhhYmV0aWNhbCBvcmRlcjoKKyAgICBkZWYgY2FwaXRhbGl6ZShzZWxmKTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5jYXBpdGFsaXplKCkpCisgICAgZGVmIGNlbnRlcihzZWxmLCB3aWR0aCk6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuY2VudGVyKHdpZHRoKSkKKyAgICBkZWYgY291bnQoc2VsZiwgc3ViLCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuY291bnQoc3ViLCBzdGFydCwgZW5kKQorICAgIGRlZiBlbmNvZGUoc2VsZiwgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPU5vbmUpOiAjIFhYWCBpbXByb3ZlIHRoaXM/CisgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgaWYgZXJyb3JzOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmVuY29kZShlbmNvZGluZykpCisgICAgICAgIGVsc2U6IAorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5lbmNvZGUoKSkKKyAgICBkZWYgZW5kc3dpdGgoc2VsZiwgc3VmZml4LCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuZW5kc3dpdGgoc3VmZml4LCBzdGFydCwgZW5kKQorICAgIGRlZiBleHBhbmR0YWJzKHNlbGYsIHRhYnNpemU9OCk6IAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmV4cGFuZHRhYnModGFic2l6ZSkpCisgICAgZGVmIGZpbmQoc2VsZiwgc3ViLCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6IAorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmZpbmQoc3ViLCBzdGFydCwgZW5kKQorICAgIGRlZiBpbmRleChzZWxmLCBzdWIsIHN0YXJ0PTAsIGVuZD1zeXMubWF4aW50KTogCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaW5kZXgoc3ViLCBzdGFydCwgZW5kKQorICAgIGRlZiBpc2RlY2ltYWwoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXNkZWNpbWFsKCkKKyAgICBkZWYgaXNkaWdpdChzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pc2RpZ2l0KCkKKyAgICBkZWYgaXNsb3dlcihzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pc2xvd2VyKCkKKyAgICBkZWYgaXNudW1lcmljKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzbnVtZXJpYygpCisgICAgZGVmIGlzc3BhY2Uoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXNzcGFjZSgpCisgICAgZGVmIGlzdGl0bGUoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXN0aXRsZSgpCisgICAgZGVmIGlzdXBwZXIoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXN1cHBlcigpCisgICAgZGVmIGpvaW4oc2VsZiwgc2VxKTogcmV0dXJuIHNlbGYuZGF0YS5qb2luKHNlcSkKKyAgICBkZWYgbGp1c3Qoc2VsZiwgd2lkdGgpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmxqdXN0KHdpZHRoKSkKKyAgICBkZWYgbG93ZXIoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEubG93ZXIoKSkKKyAgICBkZWYgbHN0cmlwKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmxzdHJpcCgpKQorICAgIGRlZiByZXBsYWNlKHNlbGYsIG9sZCwgbmV3LCBtYXhzcGxpdD0tMSk6IAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnJlcGxhY2Uob2xkLCBuZXcsIG1heHNwbGl0KSkKKyAgICBkZWYgcmZpbmQoc2VsZiwgc3ViLCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6IAorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnJmaW5kKHN1Yiwgc3RhcnQsIGVuZCkKKyAgICBkZWYgcmluZGV4KHNlbGYsIHN1Yiwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOiAKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5yaW5kZXgoc3ViLCBzdGFydCwgZW5kKQorICAgIGRlZiByanVzdChzZWxmLCB3aWR0aCk6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEucmp1c3Qod2lkdGgpKQorICAgIGRlZiByc3RyaXAoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEucnN0cmlwKCkpCisgICAgZGVmIHNwbGl0KHNlbGYsIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSk6IAorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnNwbGl0KHNlcCwgbWF4c3BsaXQpCisgICAgZGVmIHNwbGl0bGluZXMoc2VsZiwga2VlcGVuZHM9MCk6IHJldHVybiBzZWxmLmRhdGEuc3BsaXRsaW5lcyhrZWVwZW5kcykKKyAgICBkZWYgc3RhcnRzd2l0aChzZWxmLCBwcmVmaXgsIHN0YXJ0PTAsIGVuZD1zeXMubWF4aW50KTogCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuc3RhcnRzd2l0aChwcmVmaXgsIHN0YXJ0LCBlbmQpCisgICAgZGVmIHN0cmlwKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnN0cmlwKCkpCisgICAgZGVmIHN3YXBjYXNlKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnN3YXBjYXNlKCkpCisgICAgZGVmIHRpdGxlKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnRpdGxlKCkpCisgICAgZGVmIHRyYW5zbGF0ZShzZWxmLCB0YWJsZSwgZGVsZXRlY2hhcnM9IiIpOiAKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS50cmFuc2xhdGUodGFibGUsIGRlbGV0ZWNoYXJzKSkKKyAgICBkZWYgdXBwZXIoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEudXBwZXIoKSkKKworY2xhc3MgTXV0YWJsZVN0cmluZyhVc2VyU3RyaW5nKToKKyAgICAiIiJtdXRhYmxlIHN0cmluZyBvYmplY3RzCisKKyAgICBQeXRob24gc3RyaW5ncyBhcmUgaW1tdXRhYmxlIG9iamVjdHMuICBUaGlzIGhhcyB0aGUgYWR2YW50YWdlLCB0aGF0CisgICAgc3RyaW5ncyBtYXkgYmUgdXNlZCBhcyBkaWN0aW9uYXJ5IGtleXMuICBJZiB0aGlzIHByb3BlcnR5IGlzbid0IG5lZWRlZAorICAgIGFuZCB5b3UgaW5zaXN0IG9uIGNoYW5naW5nIHN0cmluZyB2YWx1ZXMgaW4gcGxhY2UgaW5zdGVhZCwgeW91IG1heSBjaGVhdAorICAgIGFuZCB1c2UgTXV0YWJsZVN0cmluZy4KKworICAgIEJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIGFuIGVkdWNhdGlvbmFsIG9uZTogdG8gcHJldmVudAorICAgIHBlb3BsZSBmcm9tIGludmVudGluZyB0aGVpciBvd24gbXV0YWJsZSBzdHJpbmcgY2xhc3MgZGVyaXZlZAorICAgIGZyb20gVXNlclN0cmluZyBhbmQgdGhhbiBmb3JnZXQgdGhlcmVieSB0byByZW1vdmUgKG92ZXJyaWRlKSB0aGUKKyAgICBfX2hhc2hfXyBtZXRob2QgaW5oZXJpdGVkIGZyb20gXlVzZXJTdHJpbmcuICBUaGlzIHdvdWxkIGxlYWQgdG8KKyAgICBlcnJvcnMgdGhhdCB3b3VsZCBiZSB2ZXJ5IGhhcmQgdG8gdHJhY2sgZG93bi4KKworICAgIEEgZmFzdGVyIGFuZCBiZXR0ZXIgc29sdXRpb24gaXMgdG8gcmV3cml0ZSB5b3VyIHByb2dyYW0gdXNpbmcgbGlzdHMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmluZz0iIik6CisgICAgICAgIHNlbGYuZGF0YSA9IHN0cmluZworICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZSAoaXQgaXMgbXV0YWJsZSkiCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBzdWIpOgorICAgICAgICBpZiBpbmRleCA8IDAgb3IgaW5kZXggPj0gbGVuKHNlbGYuZGF0YSk6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhWzppbmRleF0gKyBzdWIgKyBzZWxmLmRhdGFbaW5kZXgrMTpdCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgaWYgaW5kZXggPCAwIG9yIGluZGV4ID49IGxlbihzZWxmLmRhdGEpOiByYWlzZSBJbmRleEVycm9yCisgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6aW5kZXhdICsgc2VsZi5kYXRhW2luZGV4KzE6XQorICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgc3RhcnQsIGVuZCwgc3ViKToKKyAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDApOyBlbmQgPSBtYXgoZW5kLCAwKQorICAgICAgICBpZiBpc2luc3RhbmNlKHN1YiwgVXNlclN0cmluZyk6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOnN0YXJ0XStzdWIuZGF0YStzZWxmLmRhdGFbZW5kOl0KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN1YiwgU3RyaW5nVHlwZSkgb3IgaXNpbnN0YW5jZShzdWIsIFVuaWNvZGVUeXBlKToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdK3N1YitzZWxmLmRhdGFbZW5kOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9ICBzZWxmLmRhdGFbOnN0YXJ0XStzdHIoc3ViKStzZWxmLmRhdGFbZW5kOl0KKyAgICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIHN0YXJ0LCBlbmQpOgorICAgICAgICBzdGFydCA9IG1heChzdGFydCwgMCk7IGVuZCA9IG1heChlbmQsIDApCisgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdICsgc2VsZi5kYXRhW2VuZDpdCisgICAgZGVmIGltbXV0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFVzZXJTdHJpbmcoc2VsZi5kYXRhKQorICAgIAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAjIGV4ZWN1dGUgdGhlIHJlZ3Jlc3Npb24gdGVzdCB0byBzdGRvdXQsIGlmIGNhbGxlZCBhcyBhIHNjcmlwdDoKKyAgICBpbXBvcnQgb3MKKyAgICBjYWxsZWRfaW5fZGlyLCBjYWxsZWRfYXMgPSBvcy5wYXRoLnNwbGl0KHN5cy5hcmd2WzBdKQorICAgIGNhbGxlZF9pbl9kaXIgPSBvcy5wYXRoLmFic3BhdGgoY2FsbGVkX2luX2RpcikKKyAgICBjYWxsZWRfYXMsIHB5ID0gb3MucGF0aC5zcGxpdGV4dChjYWxsZWRfYXMpCisgICAgc3lzLnBhdGguYXBwZW5kKG9zLnBhdGguam9pbihjYWxsZWRfaW5fZGlyLCAndGVzdCcpKQorICAgIGlmICctcScgaW4gc3lzLmFyZ3Y6CisgICAgICAgIGltcG9ydCB0ZXN0X3N1cHBvcnQKKyAgICAgICAgdGVzdF9zdXBwb3J0LnZlcmJvc2UgPSAwCisgICAgX19pbXBvcnRfXygndGVzdF8nICsgY2FsbGVkX2FzLmxvd2VyKCkpCg==