Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvZGJhcGkucHk6IHRlc3RzIGZvciBEQi1BUEkgY29tcGxpYW5jZQojCiMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCnRyeToKICAgIGltcG9ydCB0aHJlYWRpbmcKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdGhyZWFkaW5nID0gTm9uZQoKY2xhc3MgTW9kdWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrQVBJTGV2ZWwoc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUuYXBpbGV2ZWwsICIyLjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgImFwaWxldmVsIGlzICVzLCBzaG91bGQgYmUgMi4wIiAlIHNxbGl0ZS5hcGlsZXZlbCkKCiAgICBkZWYgQ2hlY2tUaHJlYWRTYWZldHkoc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUudGhyZWFkc2FmZXR5LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZHNhZmV0eSBpcyAlZCwgc2hvdWxkIGJlIDEiICUgc3FsaXRlLnRocmVhZHNhZmV0eSkKCiAgICBkZWYgQ2hlY2tQYXJhbVN0eWxlKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3FsaXRlLnBhcmFtc3R5bGUsICJxbWFyayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1zdHlsZSBpcyAnJXMnLCBzaG91bGQgYmUgJ3FtYXJrJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLnBhcmFtc3R5bGUpCgogICAgZGVmIENoZWNrV2FybmluZyhzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuV2FybmluZywgRXhjZXB0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXhjZXB0aW9uIikKCiAgICBkZWYgQ2hlY2tFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuRXJyb3IsIEV4Y2VwdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFeGNlcHRpb24iKQoKICAgIGRlZiBDaGVja0ludGVyZmFjZUVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkludGVyZmFjZUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIEVycm9yIikKCiAgICBkZWYgQ2hlY2tEYXRhYmFzZUVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiRGF0YWJhc2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCgogICAgZGVmIENoZWNrRGF0YUVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGFFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKCiAgICBkZWYgQ2hlY2tPcGVyYXRpb25hbEVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpb25hbEVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQoKICAgIGRlZiBDaGVja0ludGVncml0eUVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlZ3JpdHlFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiSW50ZWdyaXR5RXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCgogICAgZGVmIENoZWNrSW50ZXJuYWxFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJuYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKCiAgICBkZWYgQ2hlY2tQcm9ncmFtbWluZ0Vycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ncmFtbWluZ0Vycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQoKICAgIGRlZiBDaGVja05vdFN1cHBvcnRlZEVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5Ob3RTdXBwb3J0ZWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICJOb3RTdXBwb3J0ZWRFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKCmNsYXNzIENvbm5lY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ID0gc2VsZi5jeC5jdXJzb3IoKQogICAgICAgIGN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCkiKQogICAgICAgIGN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmN4LmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tDb21taXQoc2VsZik6CiAgICAgICAgc2VsZi5jeC5jb21taXQoKQoKICAgIGRlZiBDaGVja0NvbW1pdEFmdGVyTm9DaGFuZ2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgY29tbWl0IHNob3VsZCBhbHNvIHdvcmsgd2hlbiBubyBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgZGF0YWJhc2UuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jeC5jb21taXQoKQogICAgICAgIHNlbGYuY3guY29tbWl0KCkKCiAgICBkZWYgQ2hlY2tSb2xsYmFjayhzZWxmKToKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKCiAgICBkZWYgQ2hlY2tSb2xsYmFja0FmdGVyTm9DaGFuZ2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgcm9sbGJhY2sgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKCiAgICBkZWYgQ2hlY2tDdXJzb3Ioc2VsZik6CiAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCgogICAgZGVmIENoZWNrRmFpbGVkT3BlbihzZWxmKToKICAgICAgICBZT1VfQ0FOTk9UX09QRU5fVEhJUyA9ICIvZm9vL2Jhci9ibGEvMjM1MzQvbXlkYi5kYiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KFlPVV9DQU5OT1RfT1BFTl9USElTKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCgogICAgZGVmIENoZWNrQ2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5jeC5jbG9zZSgpCgogICAgZGVmIENoZWNrRXhjZXB0aW9ucyhzZWxmKToKICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4Lldhcm5pbmcsIHNxbGl0ZS5XYXJuaW5nKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5FcnJvciwgc3FsaXRlLkVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkludGVyZmFjZUVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guRGF0YUVycm9yLCBzcWxpdGUuRGF0YUVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZXJuYWxFcnJvciwgc3FsaXRlLkludGVybmFsRXJyb3IpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LlByb2dyYW1taW5nRXJyb3IsIHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5Ob3RTdXBwb3J0ZWRFcnJvciwgc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yKQoKICAgIGRlZiBDaGVja0luVHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIyBDYW4ndCB1c2UgZGIgZnJvbSBzZXRVcCBiZWNhdXNlIHdlIHdhbnQgdG8gdGVzdCBpbml0aWFsIHN0YXRlLgogICAgICAgIGN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdSA9IGN4LmN1cnNvcigpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjeC5pbl90cmFuc2FjdGlvbiwgRmFsc2UpCiAgICAgICAgY3UuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRyYW5zYWN0aW9udGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQpIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN4LmluX3RyYW5zYWN0aW9uLCBGYWxzZSkKICAgICAgICBjdS5leGVjdXRlKCJpbnNlcnQgaW50byB0cmFuc2FjdGlvbnRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3guaW5fdHJhbnNhY3Rpb24sIFRydWUpCiAgICAgICAgY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0cmFuc2FjdGlvbnRlc3Qgd2hlcmUgbmFtZT0/IiwgWyJmb28iXSkKICAgICAgICByb3cgPSBjdS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjeC5pbl90cmFuc2FjdGlvbiwgVHJ1ZSkKICAgICAgICBjeC5jb21taXQoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3guaW5fdHJhbnNhY3Rpb24sIEZhbHNlKQogICAgICAgIGN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdHJhbnNhY3Rpb250ZXN0IHdoZXJlIG5hbWU9PyIsIFsiZm9vIl0pCiAgICAgICAgcm93ID0gY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3guaW5fdHJhbnNhY3Rpb24sIEZhbHNlKQoKICAgIGRlZiBDaGVja0luVHJhbnNhY3Rpb25STyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAgICAgc2VsZi5jeC5pbl90cmFuc2FjdGlvbiA9IFRydWUKCmNsYXNzIEN1cnNvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBzZWxmLmN1ID0gc2VsZi5jeC5jdXJzb3IoKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0LCBpbmNvbWUgbnVtYmVyKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jdS5jbG9zZSgpCiAgICAgICAgc2VsZi5jeC5jbG9zZSgpCgogICAgZGVmIENoZWNrRXhlY3V0ZU5vQXJncyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVJbGxlZ2FsU3FsKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgYXNkZiIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgNSs0OyBzZWxlY3QgNCs1IikKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBXYXJuaW5nIikKICAgICAgICBleGNlcHQgc3FsaXRlLldhcm5pbmc6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbDIoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgNSs0OyAtLSBmb28gYmFyIikKCiAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbDMoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCIiIgogICAgICAgICAgICBzZWxlY3QgNSs0OwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgZm9vCiAgICAgICAgICAgICovCiAgICAgICAgICAgICIiIikKCiAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdTcWxBcmcoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoNDIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCgogICAgZGVmIENoZWNrRXhlY3V0ZUFyZ0ludChzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoNDIsKSkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnRmxvYXQoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsICgyNTAwLjMyLCkpCgogICAgZGVmIENoZWNrRXhlY3V0ZUFyZ1N0cmluZyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiSHVnbyIsKSkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdOb09mQXJnczEoc2VsZik6CiAgICAgICAgIyB0b28gbWFueSBwYXJhbWV0ZXJzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoMTcsICJFZ29uIikpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMihzZWxmKToKICAgICAgICAjIHRvbyBsaXR0bGUgcGFyYW1ldGVycwogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIikKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MzKHNlbGYpOgogICAgICAgICMgbm8gcGFyYW1ldGVycywgcGFyYW1ldGVycyBhcmUgbmVlZGVkCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tFeGVjdXRlUGFyYW1MaXN0KHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgWyJmb28iXSkKICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCgogICAgZGVmIENoZWNrRXhlY3V0ZVBhcmFtU2VxdWVuY2Uoc2VsZik6CiAgICAgICAgY2xhc3MgTChvYmplY3QpOgogICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCB4KToKICAgICAgICAgICAgICAgIGFzc2VydCB4ID09IDAKICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgoKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIEwoKSkKICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCgogICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIsIHsibmFtZSI6ICJmb28ifSkKICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCgogICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nX01hcHBpbmcoc2VsZik6CiAgICAgICAgY2xhc3MgRChkaWN0KToKICAgICAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CiAgICAgICAgICAgICAgICByZXR1cm4gImZvbyIKCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIiwgRCgpKQogICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKCiAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdUb29MaXR0bGVBcmdzKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIGFuZCBpZD06aWQiLCB7Im5hbWUiOiAiZm9vIn0pCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ05vQXJncyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1VubmFtZWQoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIHsibmFtZSI6ICJmb28ifSkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQ2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5jdS5jbG9zZSgpCgogICAgZGVmIENoZWNrUm93Y291bnRFeGVjdXRlKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgidXBkYXRlIHRlc3Qgc2V0IG5hbWU9J2JhciciKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5yb3djb3VudCwgMikKCiAgICBkZWYgQ2hlY2tSb3djb3VudFNlbGVjdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBweXNxbGl0ZSBkb2VzIG5vdCBrbm93IHRoZSByb3djb3VudCBvZiBTRUxFQ1Qgc3RhdGVtZW50cywgYmVjYXVzZSB3ZQogICAgICAgIGRvbid0IGZldGNoIGFsbCByb3dzIGFmdGVyIGV4ZWN1dGluZyB0aGUgc2VsZWN0IHN0YXRlbWVudC4gVGhlIHJvd2NvdW50CiAgICAgICAgaGFzIHRodXMgdG8gYmUgLTEuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgNSB1bmlvbiBzZWxlY3QgNiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAtMSkKCiAgICBkZWYgQ2hlY2tSb3djb3VudEV4ZWN1dGVtYW55KHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgWygxLCksICgyLCksICgzLCldKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5yb3djb3VudCwgMykKCiAgICBkZWYgQ2hlY2tUb3RhbENoYW5nZXMoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIGlmIHNlbGYuY3gudG90YWxfY2hhbmdlcyA8IDI6CiAgICAgICAgICAgIHNlbGYuZmFpbCgidG90YWwgY2hhbmdlcyByZXBvcnRlZCB3cm9uZyB2YWx1ZSIpCgogICAgIyBDaGVja3MgZm9yIGV4ZWN1dGVtYW55OgogICAgIyBTZXF1ZW5jZXMgYXJlIHJlcXVpcmVkIGJ5IHRoZSBEQi1BUEksIGl0ZXJhdG9ycwogICAgIyBlbmhhbmNlbWVudHMgaW4gcHlzcWxpdGUuCgogICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlTZXF1ZW5jZShzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIFsoeCwpIGZvciB4IGluIHJhbmdlKDEwMCwgMTEwKV0pCgogICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlJdGVyYXRvcihzZWxmKToKICAgICAgICBjbGFzcyBNeUl0ZXI6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSA1CgogICAgICAgICAgICBkZWYgX19uZXh0X18oc2VsZik6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnZhbHVlID09IDEwOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSArPSAxCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZhbHVlLCkKCiAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBNeUl0ZXIoKSkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueUdlbmVyYXRvcihzZWxmKToKICAgICAgICBkZWYgbXlnZW4oKToKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CiAgICAgICAgICAgICAgICB5aWVsZCAoaSwpCgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgbXlnZW4oKSkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVdyb25nU3FsQXJnKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSg0MiwgWygzLCldKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFZhbHVlRXJyb3IiKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbi4iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55U2VsZWN0KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgic2VsZWN0ID8iLCBbKDMsKV0pCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbi4iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55Tm90SXRlcmFibGUoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIDQyKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludCgicmFpc2VkIiwgZS5fX2NsYXNzX18pCiAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbi4iKQoKICAgIGRlZiBDaGVja0ZldGNoSXRlcihzZWxmKToKICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoNSwpKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg2LCkpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgaWQgZnJvbSB0ZXN0IG9yZGVyIGJ5IGlkIikKICAgICAgICBsc3QgPSBbXQogICAgICAgIGZvciByb3cgaW4gc2VsZi5jdToKICAgICAgICAgICAgbHN0LmFwcGVuZChyb3dbMF0pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3RbMF0sIDUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3RbMV0sIDYpCgogICAgZGVmIENoZWNrRmV0Y2hvbmUoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgTm9uZSkKCiAgICBkZWYgQ2hlY2tGZXRjaG9uZU5vU3RhdGVtZW50KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY3guY3Vyc29yKCkKICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93LCBOb25lKQoKICAgIGRlZiBDaGVja0FycmF5U2l6ZShzZWxmKToKICAgICAgICAjIG11c3QgZGVmYXVsdCBvdCAxCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmFycmF5c2l6ZSwgMSkKCiAgICAgICAgIyBub3cgc2V0IHRvIDIKICAgICAgICBzZWxmLmN1LmFycmF5c2l6ZSA9IDIKCiAgICAgICAgIyBub3cgbWFrZSB0aGUgcXVlcnkgcmV0dXJuIDMgcm93cwogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0EnKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0InKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0MnKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KCkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMikKCiAgICBkZWYgQ2hlY2tGZXRjaG1hbnkoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgW10pCgogICAgZGVmIENoZWNrRmV0Y2htYW55S3dBcmcoc2VsZik6CiAgICAgICAgIiIiQ2hlY2tzIGlmIGZldGNobWFueSB3b3JrcyB3aXRoIGtleXdvcmQgYXJndW1lbnRzIiIiCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KHNpemU9MTAwKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCgogICAgZGVmIENoZWNrRmV0Y2hhbGwoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaGFsbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQoKICAgIGRlZiBDaGVja1NldGlucHV0c2l6ZXMoc2VsZik6CiAgICAgICAgc2VsZi5jdS5zZXRpbnB1dHNpemVzKFszLCA0LCA1XSkKCiAgICBkZWYgQ2hlY2tTZXRvdXRwdXRzaXplKHNlbGYpOgogICAgICAgIHNlbGYuY3Uuc2V0b3V0cHV0c2l6ZSg1LCAwKQoKICAgIGRlZiBDaGVja1NldG91dHB1dHNpemVOb0NvbHVtbihzZWxmKToKICAgICAgICBzZWxmLmN1LnNldG91dHB1dHNpemUoNDIpCgogICAgZGVmIENoZWNrQ3Vyc29yQ29ubmVjdGlvbihzZWxmKToKICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmNvbm5lY3Rpb24sIHNlbGYuY3gpCgogICAgZGVmIENoZWNrV3JvbmdDdXJzb3JDYWxsYWJsZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlZiBmKCk6IHBhc3MKICAgICAgICAgICAgY3VyID0gc2VsZi5jeC5jdXJzb3IoZikKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBUeXBlRXJyb3IiKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCgogICAgZGVmIENoZWNrQ3Vyc29yV3JvbmdDbGFzcyhzZWxmKToKICAgICAgICBjbGFzcyBGb286IHBhc3MKICAgICAgICBmb28gPSBGb28oKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyID0gc3FsaXRlLkN1cnNvcihmb28pCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhpcyB0ZXN0IHJlcXVpcmVzIHRocmVhZGluZy4nKQpjbGFzcyBUaHJlYWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGJpbiBiaW5hcnksIHJhdGlvIG51bWJlciwgdHMgdGltZXN0YW1wKSIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrQ29uQ3Vyc29yKHNlbGYpOgogICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0NvbkNvbW1pdChzZWxmKToKICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29uLmNvbW1pdCgpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCiAgICAgICAgdC5zdGFydCgpCiAgICAgICAgdC5qb2luKCkKICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKCiAgICBkZWYgQ2hlY2tDb25Sb2xsYmFjayhzZWxmKToKICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29uLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0NvbkNsb3NlKHNlbGYpOgogICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb24uY2xvc2UoKQogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCgogICAgICAgIGVycm9ycyA9IFtdCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQogICAgICAgIHQuc3RhcnQoKQogICAgICAgIHQuam9pbigpCiAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCgogICAgZGVmIENoZWNrQ3VySW1wbGljaXRCZWdpbihzZWxmKToKICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnYScpIikKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0N1ckNsb3NlKHNlbGYpOgogICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjdXIuY2xvc2UoKQogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCgogICAgICAgIGVycm9ycyA9IFtdCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQogICAgICAgIHQuc3RhcnQoKQogICAgICAgIHQuam9pbigpCiAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCgogICAgZGVmIENoZWNrQ3VyRXhlY3V0ZShzZWxmKToKICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQogICAgICAgIHQuc3RhcnQoKQogICAgICAgIHQuam9pbigpCiAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCgogICAgZGVmIENoZWNrQ3VySXRlck5leHQoc2VsZik6CiAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjdXIiOiBzZWxmLmN1ciwgImVycm9ycyI6IGVycm9yc30pCiAgICAgICAgdC5zdGFydCgpCiAgICAgICAgdC5qb2luKCkKICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKCmNsYXNzIENvbnN0cnVjdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrRGF0ZShzZWxmKToKICAgICAgICBkID0gc3FsaXRlLkRhdGUoMjAwNCwgMTAsIDI4KQoKICAgIGRlZiBDaGVja1RpbWUoc2VsZik6CiAgICAgICAgdCA9IHNxbGl0ZS5UaW1lKDEyLCAzOSwgMzUpCgogICAgZGVmIENoZWNrVGltZXN0YW1wKHNlbGYpOgogICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAxMCwgMjgsIDEyLCAzOSwgMzUpCgogICAgZGVmIENoZWNrRGF0ZUZyb21UaWNrcyhzZWxmKToKICAgICAgICBkID0gc3FsaXRlLkRhdGVGcm9tVGlja3MoNDIpCgogICAgZGVmIENoZWNrVGltZUZyb21UaWNrcyhzZWxmKToKICAgICAgICB0ID0gc3FsaXRlLlRpbWVGcm9tVGlja3MoNDIpCgogICAgZGVmIENoZWNrVGltZXN0YW1wRnJvbVRpY2tzKHNlbGYpOgogICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcEZyb21UaWNrcyg0MikKCiAgICBkZWYgQ2hlY2tCaW5hcnkoc2VsZik6CiAgICAgICAgYiA9IHNxbGl0ZS5CaW5hcnkoYiJcMCciKQoKY2xhc3MgRXh0ZW5zaW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrU2NyaXB0U3RyaW5nU3FsKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoIiIiCiAgICAgICAgICAgIC0tIGJsYSBibGEKICAgICAgICAgICAgLyogYSBzdHVwaWQgY29tbWVudCAqLwogICAgICAgICAgICBjcmVhdGUgdGFibGUgYShpKTsKICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDUpOwogICAgICAgICAgICAiIiIpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gYSIpCiAgICAgICAgcmVzID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgNSkKCiAgICBkZWYgQ2hlY2tTY3JpcHRTeW50YXhFcnJvcihzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQogICAgICAgIHJhaXNlZCA9IEZhbHNlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3QoeCk7IGFzZGY7IGNyZWF0ZSB0YWJsZSB0ZXN0Mih4KSIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICByYWlzZWQgPSBUcnVlCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYWlzZWQsIFRydWUsICJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIikKCiAgICBkZWYgQ2hlY2tTY3JpcHRFcnJvck5vcm1hbChzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQogICAgICAgIHJhaXNlZCA9IEZhbHNlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3Qoc2FkZnNhZGZkc2EpOyBzZWxlY3QgZm9vIGZyb20gaHVyejsiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcmFpc2VkID0gVHJ1ZQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCgogICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGUoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IDUiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZSIpCgogICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVtYW55KHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGZvbykiKQogICAgICAgIGNvbi5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoPykiLCBbKDMsKSwgKDQsKV0pCiAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IG9yZGVyIGJ5IGZvbyIpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXVswXSwgMywgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlbWFueSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMV1bMF0sIDQsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZW1hbnkiKQoKICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlc2NyaXB0KHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KGZvbyk7IGluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKDUpOyIpCiAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCA1LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVzY3JpcHQiKQoKY2xhc3MgQ2xvc2VkQ29uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0Nsb3NlZENvbkN1cnNvcihzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCgogICAgZGVmIENoZWNrQ2xvc2VkQ29uQ29tbWl0KHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbi5jb21taXQoKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCiAgICBkZWYgQ2hlY2tDbG9zZWRDb25Sb2xsYmFjayhzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24ucm9sbGJhY2soKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCiAgICBkZWYgQ2hlY2tDbG9zZWRDdXJFeGVjdXRlKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQoKICAgIGRlZiBDaGVja0Nsb3NlZENyZWF0ZUZ1bmN0aW9uKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICBkZWYgZih4KTogcmV0dXJuIDE3CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24uY3JlYXRlX2Z1bmN0aW9uKCJmb28iLCAxLCBmKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCiAgICBkZWYgQ2hlY2tDbG9zZWRDcmVhdGVBZ2dyZWdhdGUoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIGNsYXNzIEFnZzoKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDE3CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZm9vIiwgMSwgQWdnKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCiAgICBkZWYgQ2hlY2tDbG9zZWRTZXRBdXRob3JpemVyKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICBkZWYgYXV0aG9yaXplcigqYXJncyk6CiAgICAgICAgICAgIHJldHVybiBzcWxpdGUuREVOWQogICAgICAgIHRyeToKICAgICAgICAgICAgY29uLnNldF9hdXRob3JpemVyKGF1dGhvcml6ZXIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQoKICAgIGRlZiBDaGVja0Nsb3NlZFNldFByb2dyZXNzQ2FsbGJhY2soc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIGRlZiBwcm9ncmVzcygpOiBwYXNzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEwMCkKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCgogICAgZGVmIENoZWNrQ2xvc2VkQ2FsbChzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24oKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCmNsYXNzIENsb3NlZEN1clRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tDbG9zZWQoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICBjdXIuY2xvc2UoKQoKICAgICAgICBmb3IgbWV0aG9kX25hbWUgaW4gKCJleGVjdXRlIiwgImV4ZWN1dGVtYW55IiwgImV4ZWN1dGVzY3JpcHQiLCAiZmV0Y2hhbGwiLCAiZmV0Y2htYW55IiwgImZldGNob25lIik6CiAgICAgICAgICAgIGlmIG1ldGhvZF9uYW1lIGluICgiZXhlY3V0ZSIsICJleGVjdXRlc2NyaXB0Iik6CiAgICAgICAgICAgICAgICBwYXJhbXMgPSAoInNlbGVjdCA0IHVuaW9uIHNlbGVjdCA1IiwpCiAgICAgICAgICAgIGVsaWYgbWV0aG9kX25hbWUgPT0gImV4ZWN1dGVtYW55IjoKICAgICAgICAgICAgICAgIHBhcmFtcyA9ICgiaW5zZXJ0IGludG8gZm9vKGJhcikgdmFsdWVzICg/KSIsIFsoMywpLCAoNCwpXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhcmFtcyA9IFtdCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKGN1ciwgbWV0aG9kX25hbWUpCgogICAgICAgICAgICAgICAgbWV0aG9kKCpwYXJhbXMpCiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3I6IG1ldGhvZCAiICsgbWV0aG9kX25hbWUpCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yOiAiICsgbWV0aG9kX25hbWUpCgpkZWYgc3VpdGUoKToKICAgIG1vZHVsZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShNb2R1bGVUZXN0cywgIkNoZWNrIikKICAgIGNvbm5lY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29ubmVjdGlvblRlc3RzLCAiQ2hlY2siKQogICAgY3Vyc29yX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEN1cnNvclRlc3RzLCAiQ2hlY2siKQogICAgdGhyZWFkX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRocmVhZFRlc3RzLCAiQ2hlY2siKQogICAgY29uc3RydWN0b3Jfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29uc3RydWN0b3JUZXN0cywgIkNoZWNrIikKICAgIGV4dF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShFeHRlbnNpb25UZXN0cywgIkNoZWNrIikKICAgIGNsb3NlZF9jb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ2xvc2VkQ29uVGVzdHMsICJDaGVjayIpCiAgICBjbG9zZWRfY3VyX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENsb3NlZEN1clRlc3RzLCAiQ2hlY2siKQogICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgobW9kdWxlX3N1aXRlLCBjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHRocmVhZF9zdWl0ZSwgY29uc3RydWN0b3Jfc3VpdGUsIGV4dF9zdWl0ZSwgY2xvc2VkX2Nvbl9zdWl0ZSwgY2xvc2VkX2N1cl9zdWl0ZSkpCgpkZWYgdGVzdCgpOgogICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQogICAgcnVubmVyLnJ1bihzdWl0ZSgpKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRlc3QoKQo=