IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQoiIiJBIGxleGljYWwgYW5hbHl6ZXIgY2xhc3MgZm9yIHNpbXBsZSBzaGVsbC1saWtlIHN5bnRheGVzLiIiIgoKIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OAojIElucHV0IHN0YWNraW5nIGFuZCBlcnJvciBtZXNzYWdlIGNsZWFudXAgYWRkZWQgYnkgRVNSLCBNYXJjaCAyMDAwCiMgcHVzaF9zb3VyY2UoKSBhbmQgcG9wX3NvdXJjZSgpIG1hZGUgZXhwbGljaXQgYnkgRVNSLCBKYW51YXJ5IDIwMDEuCiMgUG9zaXggY29tcGxpYW5jZSwgc3BsaXQoKSwgc3RyaW5nIGFyZ3VtZW50cywgYW5kCiMgaXRlcmF0b3IgaW50ZXJmYWNlIGJ5IEd1c3Rhdm8gTmllbWV5ZXIsIEFwcmlsIDIwMDMuCgppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgpmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwoKX19hbGxfXyA9IFsic2hsZXgiLCAic3BsaXQiXQoKY2xhc3Mgc2hsZXg6CiAgICAiQSBsZXhpY2FsIGFuYWx5emVyIGNsYXNzIGZvciBzaW1wbGUgc2hlbGwtbGlrZSBzeW50YXhlcy4iCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW5zdHJlYW09Tm9uZSwgaW5maWxlPU5vbmUsIHBvc2l4PUZhbHNlKToKICAgICAgICBpZiBpc2luc3RhbmNlKGluc3RyZWFtLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgaW5zdHJlYW0gPSBTdHJpbmdJTyhpbnN0cmVhbSkKICAgICAgICBpZiBpbnN0cmVhbSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5pbnN0cmVhbSA9IGluc3RyZWFtCiAgICAgICAgICAgIHNlbGYuaW5maWxlID0gaW5maWxlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnN0cmVhbSA9IHN5cy5zdGRpbgogICAgICAgICAgICBzZWxmLmluZmlsZSA9IE5vbmUKICAgICAgICBzZWxmLnBvc2l4ID0gcG9zaXgKICAgICAgICBpZiBwb3NpeDoKICAgICAgICAgICAgc2VsZi5lb2YgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5lb2YgPSAnJwogICAgICAgIHNlbGYuY29tbWVudGVycyA9ICcjJwogICAgICAgIHNlbGYud29yZGNoYXJzID0gKCdhYmNkZmVnaGlqa2xtbm9wcXJzdHV2d3h5eicKICAgICAgICAgICAgICAgICAgICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XycpCiAgICAgICAgaWYgc2VsZi5wb3NpeDoKICAgICAgICAgICAgc2VsZi53b3JkY2hhcnMgKz0gKCff4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb4+fr7/P3+/ycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICfAwcLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tvc3d4nKQogICAgICAgIHNlbGYud2hpdGVzcGFjZSA9ICcgXHRcclxuJwogICAgICAgIHNlbGYud2hpdGVzcGFjZV9zcGxpdCA9IEZhbHNlCiAgICAgICAgc2VsZi5xdW90ZXMgPSAnXCciJwogICAgICAgIHNlbGYuZXNjYXBlID0gJ1xcJwogICAgICAgIHNlbGYuZXNjYXBlZHF1b3RlcyA9ICciJwogICAgICAgIHNlbGYuc3RhdGUgPSAnICcKICAgICAgICBzZWxmLnB1c2hiYWNrID0gZGVxdWUoKQogICAgICAgIHNlbGYubGluZW5vID0gMQogICAgICAgIHNlbGYuZGVidWcgPSAwCiAgICAgICAgc2VsZi50b2tlbiA9ICcnCiAgICAgICAgc2VsZi5maWxlc3RhY2sgPSBkZXF1ZSgpCiAgICAgICAgc2VsZi5zb3VyY2UgPSBOb25lCiAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgcHJpbnQoJ3NobGV4OiByZWFkaW5nIGZyb20gJXMsIGxpbmUgJWQnIFwKICAgICAgICAgICAgICAgICAgJSAoc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pKQoKICAgIGRlZiBwdXNoX3Rva2VuKHNlbGYsIHRvayk6CiAgICAgICAgIlB1c2ggYSB0b2tlbiBvbnRvIHRoZSBzdGFjayBwb3BwZWQgYnkgdGhlIGdldF90b2tlbiBtZXRob2QiCiAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgogICAgICAgICAgICBwcmludCgic2hsZXg6IHB1c2hpbmcgdG9rZW4gIiArIHJlcHIodG9rKSkKICAgICAgICBzZWxmLnB1c2hiYWNrLmFwcGVuZGxlZnQodG9rKQoKICAgIGRlZiBwdXNoX3NvdXJjZShzZWxmLCBuZXdzdHJlYW0sIG5ld2ZpbGU9Tm9uZSk6CiAgICAgICAgIlB1c2ggYW4gaW5wdXQgc291cmNlIG9udG8gdGhlIGxleGVyJ3MgaW5wdXQgc291cmNlIHN0YWNrLiIKICAgICAgICBpZiBpc2luc3RhbmNlKG5ld3N0cmVhbSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIG5ld3N0cmVhbSA9IFN0cmluZ0lPKG5ld3N0cmVhbSkKICAgICAgICBzZWxmLmZpbGVzdGFjay5hcHBlbmRsZWZ0KChzZWxmLmluZmlsZSwgc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pKQogICAgICAgIHNlbGYuaW5maWxlID0gbmV3ZmlsZQogICAgICAgIHNlbGYuaW5zdHJlYW0gPSBuZXdzdHJlYW0KICAgICAgICBzZWxmLmxpbmVubyA9IDEKICAgICAgICBpZiBzZWxmLmRlYnVnOgogICAgICAgICAgICBpZiBuZXdmaWxlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcHJpbnQoJ3NobGV4OiBwdXNoaW5nIHRvIGZpbGUgJXMnICUgKHNlbGYuaW5maWxlLCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgnc2hsZXg6IHB1c2hpbmcgdG8gc3RyZWFtICVzJyAlIChzZWxmLmluc3RyZWFtLCkpCgogICAgZGVmIHBvcF9zb3VyY2Uoc2VsZik6CiAgICAgICAgIlBvcCB0aGUgaW5wdXQgc291cmNlIHN0YWNrLiIKICAgICAgICBzZWxmLmluc3RyZWFtLmNsb3NlKCkKICAgICAgICAoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSA9IHNlbGYuZmlsZXN0YWNrLnBvcGxlZnQoKQogICAgICAgIGlmIHNlbGYuZGVidWc6CiAgICAgICAgICAgIHByaW50KCdzaGxleDogcG9wcGluZyB0byAlcywgbGluZSAlZCcgXAogICAgICAgICAgICAgICAgICAlIChzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykpCiAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwoKICAgIGRlZiBnZXRfdG9rZW4oc2VsZik6CiAgICAgICAgIkdldCBhIHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSAob3IgZnJvbSBzdGFjayBpZiBpdCdzIG5vbmVtcHR5KSIKICAgICAgICBpZiBzZWxmLnB1c2hiYWNrOgogICAgICAgICAgICB0b2sgPSBzZWxmLnB1c2hiYWNrLnBvcGxlZnQoKQogICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDE6CiAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IHBvcHBpbmcgdG9rZW4gIiArIHJlcHIodG9rKSkKICAgICAgICAgICAgcmV0dXJuIHRvawogICAgICAgICMgTm8gcHVzaGJhY2suICBHZXQgYSB0b2tlbi4KICAgICAgICByYXcgPSBzZWxmLnJlYWRfdG9rZW4oKQogICAgICAgICMgSGFuZGxlIGluY2x1c2lvbnMKICAgICAgICBpZiBzZWxmLnNvdXJjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgd2hpbGUgcmF3ID09IHNlbGYuc291cmNlOgogICAgICAgICAgICAgICAgc3BlYyA9IHNlbGYuc291cmNlaG9vayhzZWxmLnJlYWRfdG9rZW4oKSkKICAgICAgICAgICAgICAgIGlmIHNwZWM6CiAgICAgICAgICAgICAgICAgICAgKG5ld2ZpbGUsIG5ld3N0cmVhbSkgPSBzcGVjCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXNoX3NvdXJjZShuZXdzdHJlYW0sIG5ld2ZpbGUpCiAgICAgICAgICAgICAgICByYXcgPSBzZWxmLmdldF90b2tlbigpCiAgICAgICAgIyBNYXliZSB3ZSBnb3QgRU9GIGluc3RlYWQ/CiAgICAgICAgd2hpbGUgcmF3ID09IHNlbGYuZW9mOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5maWxlc3RhY2s6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lb2YKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucG9wX3NvdXJjZSgpCiAgICAgICAgICAgICAgICByYXcgPSBzZWxmLmdldF90b2tlbigpCiAgICAgICAgIyBOZWl0aGVyIGluY2x1c2lvbiBub3IgRU9GCiAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgogICAgICAgICAgICBpZiByYXcgIT0gc2VsZi5lb2Y6CiAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IHRva2VuPSIgKyByZXByKHJhdykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IHRva2VuPUVPRiIpCiAgICAgICAgcmV0dXJuIHJhdwoKICAgIGRlZiByZWFkX3Rva2VuKHNlbGYpOgogICAgICAgIHF1b3RlZCA9IEZhbHNlCiAgICAgICAgZXNjYXBlZHN0YXRlID0gJyAnCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbmV4dGNoYXIgPSBzZWxmLmluc3RyZWFtLnJlYWQoMSkKICAgICAgICAgICAgaWYgbmV4dGNoYXIgPT0gJ1xuJzoKICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxCiAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMzoKICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogaW4gc3RhdGUiLCByZXByKHNlbGYuc3RhdGUpLCBcCiAgICAgICAgICAgICAgICAgICAgICAiSSBzZWUgY2hhcmFjdGVyOiIsIHJlcHIobmV4dGNoYXIpKQogICAgICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gJycgICAgICAgICMgcGFzdCBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09ICcgJzoKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gTm9uZSAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud2hpdGVzcGFjZToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogSSBzZWUgd2hpdGVzcGFjZSBpbiB3aGl0ZXNwYWNlIHN0YXRlIikKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuIG9yIChzZWxmLnBvc2l4IGFuZCBxdW90ZWQpOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5jb21tZW50ZXJzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0ucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlOgogICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9ICdhJwogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndvcmRjaGFyczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYucXVvdGVzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi53aGl0ZXNwYWNlX3NwbGl0OgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSBpbiBzZWxmLnF1b3RlczoKICAgICAgICAgICAgICAgIHF1b3RlZCA9IFRydWUKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjogICAgICAjIGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IEkgc2VlIEVPRiBpbiBxdW90ZXMgc3RhdGUiKQogICAgICAgICAgICAgICAgICAgICMgWFhYIHdoYXQgZXJyb3Igc2hvdWxkIGJlIHJhaXNlZCBoZXJlPwogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIGNsb3NpbmcgcXVvdGF0aW9uIikKICAgICAgICAgICAgICAgIGlmIG5leHRjaGFyID09IHNlbGYuc3RhdGU6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucG9zaXg6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGUgYW5kIFwKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSBpbiBzZWxmLmVzY2FwZWRxdW90ZXM6CiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gc2VsZi5zdGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjogICAgICAjIGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IEkgc2VlIEVPRiBpbiBlc2NhcGUgc3RhdGUiKQogICAgICAgICAgICAgICAgICAgICMgWFhYIHdoYXQgZXJyb3Igc2hvdWxkIGJlIHJhaXNlZCBoZXJlPwogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIGVzY2FwZWQgY2hhcmFjdGVyIikKICAgICAgICAgICAgICAgICMgSW4gcG9zaXggc2hlbGxzLCBvbmx5IHRoZSBxdW90ZSBpdHNlbGYgb3IgdGhlIGVzY2FwZQogICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIgbWF5IGJlIGVzY2FwZWQgd2l0aGluIHF1b3Rlcy4KICAgICAgICAgICAgICAgIGlmIGVzY2FwZWRzdGF0ZSBpbiBzZWxmLnF1b3RlcyBhbmQgXAogICAgICAgICAgICAgICAgICAgbmV4dGNoYXIgIT0gc2VsZi5zdGF0ZSBhbmQgbmV4dGNoYXIgIT0gZXNjYXBlZHN0YXRlOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgc2VsZi5zdGF0ZQogICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IGVzY2FwZWRzdGF0ZQogICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gJ2EnOgogICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lICAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud2hpdGVzcGFjZToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogSSBzZWUgd2hpdGVzcGFjZSBpbiB3b3JkIHN0YXRlIikKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYuY29tbWVudGVyczoKICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucG9zaXg6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYucXVvdGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53b3JkY2hhcnMgb3IgbmV4dGNoYXIgaW4gc2VsZi5xdW90ZXMgXAogICAgICAgICAgICAgICAgICAgIG9yIHNlbGYud2hpdGVzcGFjZV9zcGxpdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdChuZXh0Y2hhcikKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogSSBzZWUgcHVuY3R1YXRpb24gaW4gd29yZCBzdGF0ZSIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgIHJlc3VsdCA9IHNlbGYudG9rZW4KICAgICAgICBzZWxmLnRva2VuID0gJycKICAgICAgICBpZiBzZWxmLnBvc2l4IGFuZCBub3QgcXVvdGVkIGFuZCByZXN1bHQgPT0gJyc6CiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBpZiBzZWxmLmRlYnVnID4gMToKICAgICAgICAgICAgaWYgcmVzdWx0OgogICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiByYXcgdG9rZW49IiArIHJlcHIocmVzdWx0KSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogcmF3IHRva2VuPUVPRiIpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBzb3VyY2Vob29rKHNlbGYsIG5ld2ZpbGUpOgogICAgICAgICJIb29rIGNhbGxlZCBvbiBhIGZpbGVuYW1lIHRvIGJlIHNvdXJjZWQuIgogICAgICAgIGlmIG5ld2ZpbGVbMF0gPT0gJyInOgogICAgICAgICAgICBuZXdmaWxlID0gbmV3ZmlsZVsxOi0xXQogICAgICAgICMgVGhpcyBpbXBsZW1lbnRzIGNwcC1saWtlIHNlbWFudGljcyBmb3IgcmVsYXRpdmUtcGF0aCBpbmNsdXNpb24uCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmluZmlsZSwgYmFzZXN0cmluZykgYW5kIG5vdCBvcy5wYXRoLmlzYWJzKG5ld2ZpbGUpOgogICAgICAgICAgICBuZXdmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzZWxmLmluZmlsZSksIG5ld2ZpbGUpCiAgICAgICAgcmV0dXJuIChuZXdmaWxlLCBvcGVuKG5ld2ZpbGUsICJyIikpCgogICAgZGVmIGVycm9yX2xlYWRlcihzZWxmLCBpbmZpbGU9Tm9uZSwgbGluZW5vPU5vbmUpOgogICAgICAgICJFbWl0IGEgQy1jb21waWxlci1saWtlLCBFbWFjcy1mcmllbmRseSBlcnJvci1tZXNzYWdlIGxlYWRlci4iCiAgICAgICAgaWYgaW5maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIGluZmlsZSA9IHNlbGYuaW5maWxlCiAgICAgICAgaWYgbGluZW5vIGlzIE5vbmU6CiAgICAgICAgICAgIGxpbmVubyA9IHNlbGYubGluZW5vCiAgICAgICAgcmV0dXJuICJcIiVzXCIsIGxpbmUgJWQ6ICIgJSAoaW5maWxlLCBsaW5lbm8pCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fbmV4dF9fKHNlbGYpOgogICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQogICAgICAgIGlmIHRva2VuID09IHNlbGYuZW9mOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgcmV0dXJuIHRva2VuCgpkZWYgc3BsaXQocywgY29tbWVudHM9RmFsc2UsIHBvc2l4PVRydWUpOgogICAgbGV4ID0gc2hsZXgocywgcG9zaXg9cG9zaXgpCiAgICBsZXgud2hpdGVzcGFjZV9zcGxpdCA9IFRydWUKICAgIGlmIG5vdCBjb21tZW50czoKICAgICAgICBsZXguY29tbWVudGVycyA9ICcnCiAgICByZXR1cm4gbGlzdChsZXgpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaWYgbGVuKHN5cy5hcmd2KSA9PSAxOgogICAgICAgIGxleGVyID0gc2hsZXgoKQogICAgZWxzZToKICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMV0KICAgICAgICBsZXhlciA9IHNobGV4KG9wZW4oZmlsZSksIGZpbGUpCiAgICB3aGlsZSAxOgogICAgICAgIHR0ID0gbGV4ZXIuZ2V0X3Rva2VuKCkKICAgICAgICBpZiB0dDoKICAgICAgICAgICAgcHJpbnQoIlRva2VuOiAiICsgcmVwcih0dCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnJlYWsK