ZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbAppbmRleCAwZTJlZTQyLi43MDhkYjQxIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0Lmh0bWwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC5odG1sCkBAIC0xLDk1ICsxLDE0MiBAQAotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxodG1sPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgogPGhlYWQ+Ci0gIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5ncyAtIEV4YW1wbGU8L3RpdGxlPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgogCi0gIDxzY3JpcHQgc3JjPSIvdGhyaWZ0LmpzIiAgICAgICAgICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSIvdGhyaWZ0LmpzIiAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogCi0gIDwhLS0gZm9yIGFzeW5jIGV4YW1wbGUgLS0+Ci0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS4zLjIvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CisgIDwhLS0galF1ZXJ5IC0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuNC4yL2pxdWVyeS5taW4uanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9xdW5pdC9yYXcvbWFzdGVyL3F1bml0L3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vanF1ZXJ5L3F1bml0L3Jhdy9tYXN0ZXIvcXVuaXQvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorICAvLzwhW0NEQVRBWworICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeworICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiL3NlcnZpY2UiKQorICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCkKKyAgICB2YXIgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCkKKworCisgICAgbW9kdWxlKCJCYXNlIFR5cGVzIik7CisKKyAgICB0ZXN0KCJTdHJpbmciLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFscyhjbGllbnQudGVzdFN0cmluZygid29ya3MiKSwgIndvcmtzIik7CisgICAgfSk7CisgICAgdGVzdCgiU3RyaW5nIFVURi04IiwgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbGFuZ3VhZ2VzVXRmOCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKyAgICAgIGVxdWFscyhjbGllbnQudGVzdFN0cmluZyhsYW5ndWFnZXNVdGY4KSwgbGFuZ3VhZ2VzVXRmOCk7CisgICAgfSk7CisgICAgdGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbHMoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICAgIH0pOworICAgIHRlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFscyhjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOworICAgIH0pOworICAgIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWxzKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsMzApKSwgTWF0aC5wb3coMiwzMCkpOworICAgIH0pOworICAgIHRlc3QoIkk2NCIsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWxzKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsNjApKSwgTWF0aC5wb3coMiw2MCkpOworICAgIH0pOworCisKKyAgICBtb2R1bGUoIlN0cnVjdHVyZWQgVHlwZXMiKTsKKworICAgIHZhciBpbnNhbml0eSAgPSBuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpCisgICAgaW5zYW5pdHkudXNlck1hcFtUaHJpZnRUZXN0Lk51bWJlcnouT05FXSA9IDEKKyAgICBpbnNhbml0eS51c2VyTWFwW1RocmlmdFRlc3QuTnVtYmVyei5UV09dID0gMgorCisgICAgdmFyIHh0ciA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpCisgICAgeHRyLnN0cmluZ190aGluZyA9ICd3b3JrZWQnCisgICAgaW5zYW5pdHkueHRydWN0cy5wdXNoKHh0cikKKworICAgIHZhciB4dHIyPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCkKKyAgICB4dHIyLnN0cnVjdF90aGluZyA9IHh0cgorCisgICAgdmFyIGxpc3QgPSBbMSwyLDNdCisKKyAgICB0ZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFscyhjbGllbnQudGVzdFN0cnVjdCh4dHIpLnN0cmluZ190aGluZywgIndvcmtlZCIpOworICAgIH0pOworICAgIHRlc3QoIk5lc3QiLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFscyhjbGllbnQudGVzdE5lc3QoeHRyMikuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgIndvcmtlZCIpOworICAgIH0pOworICAgIHRlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWxzKGNsaWVudC50ZXN0TWFwKGluc2FuaXR5LnVzZXJNYXApW1RocmlmdFRlc3QuTnVtYmVyei5PTkVdLCAxKTsKKyAgICB9KTsKKyAgICB0ZXN0KCJMaXN0IiwgZnVuY3Rpb24oKSB7CisgICAgICBzYW1lKGNsaWVudC50ZXN0TGlzdChsaXN0KSwgbGlzdCk7CisgICAgfSk7CisgICAgdGVzdCgiU2V0IiwgZnVuY3Rpb24oKSB7CisgICAgICBzYW1lKGNsaWVudC50ZXN0U2V0KGxpc3QpLCBsaXN0KTsKKyAgICB9KTsKKyAgICB0ZXN0KCJFbnVtIiwgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbHMoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgICB9KTsKKworCisgICAgbW9kdWxlKCJFeGNlcHRpb24iKTsKKworICAgIHRlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7CisgICAgICBleHBlY3QoMik7CisgICAgICB0cnl7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgfWNhdGNoKGUpeworICAgICAgICBlcXVhbHMoZS5lcnJvckNvZGUsIDEpOworICAgICAgICBlcXVhbHMoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoIkFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7CisgICAgICBleHBlY3QoMSk7CisgICAgICB0cnl7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfWNhdGNoKGUpeworICAgICAgICBlcXVhbHMoZS5tZXNzYWdlLCAiQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoIm5vIEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKCkgeworICAgICAgZXhwZWN0KDEpOworICAgICAgdHJ5eworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIik7CisgICAgICB9Y2F0Y2goZSl7CisgICAgICAgIGVxdWFscyhlLm1lc3NhZ2UsICJubyBFeGNlcHRpb24iKTsKKyAgICAgIH0KKyAgICB9KTsKKworCisgICAgbW9kdWxlKCJJbnNhbml0eSIpOworCisgICAgdGVzdCgidGVzdEluc2FuaXR5IiwgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbml0eSk7CisgICAgICBlcXVhbHMocmVzWyIxIl1bIjEiXS54dHJ1Y3RzWzBdLnN0cmluZ190aGluZywgIndvcmtlZCIpOworICAgIH0pOworCisgIH0pOworICAvL11dPgorICA8L3NjcmlwdD4KIAogPC9oZWFkPgotPGJvZHkgaWQ9ImJvZHkiPgorPGJvZHk+CiAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotCi0gIC8vY3JlYXRlIGNsaWVudAotICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoIi9zZXJ2aWNlIikKLSAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KQotICB2YXIgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCkKLQotICAvL2NyZWF0ZSBpbnNhbml0eSBvYmoKLSAgdmFyIGluc2FuaXR5ICA9IG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkKLSAgaW5zYW5pdHkudXNlck1hcFtUaHJpZnRUZXN0Lk51bWJlcnouT05FXSA9IDEKLSAgaW5zYW5pdHkudXNlck1hcFtUaHJpZnRUZXN0Lk51bWJlcnouVFdPXSA9IDIKLQotICB2YXIgeHRyID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCkKLSAgeHRyLnN0cmluZ190aGluZyA9ICd3b3JrZWQnCi0gIGluc2FuaXR5Lnh0cnVjdHMucHVzaCh4dHIpCi0KLSAgdmFyIHh0cjI9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKQotICB4dHIyLnN0cnVjdF90aGluZyA9IHh0cgotCi0gIHZhciBsaXN0ID0gWzEsMiwzXQotCi0gIC8vcnVuIHRlc3RzIHN5bmNocm9ub3VzbHkKLQotICBkb2N1bWVudC53cml0ZSgiPGgyPjx1PlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzPC91PjwvaDI+IikKLSAgZG9jdW1lbnQud3JpdGUoIjxoMj5TeW5jaHJvbm91cyBFeGFtcGxlPC9oMj4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RTdHJpbmcoKSA9PiAiKyhjbGllbnQudGVzdFN0cmluZygid29ya3MiKSAgICAgPT0gIndvcmtzIikrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0U3RyaW5nKHV0Zi04KSA9PiAiKyhjbGllbnQudGVzdFN0cmluZygiYYeOkpecZSIpICAgPT0gImGHjpKXnGUiKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3REb3VibGUoKSA9PiAiKyhjbGllbnQudGVzdERvdWJsZSgzLjE0KSAgICAgICAgPT0gMy4xNCkrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0Qnl0ZSgpICAgPT4gIisoY2xpZW50LnRlc3RCeXRlKDB4MDEpICAgICAgICAgID09IDB4MDEpKyI8YnIvPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdEkzMigpICAgID0+ICIrKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsMzApKSA9PSBNYXRoLnBvdygyLDMwKSkrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0STY0KCkgICAgPT4gIisoY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw2MCkpID09IE1hdGgucG93KDIsNjApKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RTdHJ1Y3QoKSA9PiAiKyhjbGllbnQudGVzdFN0cnVjdCh4dHIpLnN0cmluZ190aGluZyA9PSAid29ya2VkIikrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0TmVzdCgpICAgPT4gIisoY2xpZW50LnRlc3ROZXN0KHh0cjIpLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPT0gIndvcmtlZCIpKyI8YnIvPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdE1hcCgpICAgID0+ICIrKGNsaWVudC50ZXN0TWFwKGluc2FuaXR5LnVzZXJNYXApW1RocmlmdFRlc3QuTnVtYmVyei5PTkVdID09IDEpKyI8YnIvPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdExpc3QoKSAgID0+ICIrKGNsaWVudC50ZXN0TGlzdChsaXN0KS5sZW5ndGggPT0gMyAmJiBjbGllbnQudGVzdExpc3QobGlzdClbMV0gPT0gMikrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0U2V0KCkgICAgPT4gIisoY2xpZW50LnRlc3RTZXQobGlzdCkubGVuZ3RoID09IDMpKyI8YnIvPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdEVudW0oKSAgID0+ICIrKGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKSA9PSBUaHJpZnRUZXN0Lk51bWJlcnouT05FKSsiPGJyLz4iKQotCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdEV4Y2VwdGlvbigpID0+ICIpCi0gIHRyeXsKLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiZ28iKQotICAgIGRvY3VtZW50LndyaXRlKCJmYWxzZTxici8+IikKLSAgfWNhdGNoKGUpewotICAgIGRvY3VtZW50LndyaXRlKCJ0cnVlPGJyLz4iKQotICB9Ci0KLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0SW5zYW5pdHkoKSA9PiAiKQotICB2YXIgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbml0eSkKLQotICBkb2N1bWVudC53cml0ZSgocmVzWyIxIl1bIjEiXS54dHJ1Y3RzWzBdLnN0cmluZ190aGluZyA9PSAid29ya2VkIikrIjxici8+IikKKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKyAgLy88IVtDREFUQVsKIAogICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgIC8vUnVuIHNhbWUgdGVzdHMgYXN5bmNocm9ub3VzbHkKLQorLyoKICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCkKICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KQogICB2YXIgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCkKIAotICBkb2N1bWVudC53cml0ZSgiPGgyPkFzeW5jaHJvbm91cyBFeGFtcGxlPC9oMj4iKQorICBkb2N1bWVudC53cml0ZSgiPGgyPkFzeW5jaHJvbm91cyBFeGFtcGxlPFwvaDI+IikKICAgalF1ZXJ5LmFqYXgoewogICAgICB1cmw6ICIvc2VydmljZSIsCiAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJMzIoTWF0aC5wb3coMiwzMCkpLApAQCAtMTI1LDEwICsxNzIsMTggQEAKIAogICAgICB9CiAgIH0pCisqLwogCi0KLQotPC9zY3JpcHQ+Ci0KKyAgLy9dXT4KKyAgPC9zY3JpcHQ+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9pbmN1YmF0b3IvdGhyaWZ0L3RydW5rL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KIDwvYm9keT4KIDwvaHRtbD4K