IyEgL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KCiIiIkdlbmVyYXRlIGJpbmFyeSBtZXNzYWdlIGNhdGFsb2cgZnJvbSB0ZXh0dWFsIHRyYW5zbGF0aW9uIGRlc2NyaXB0aW9uLgoKVGhpcyBwcm9ncmFtIGNvbnZlcnRzIGEgdGV4dHVhbCBVbmlmb3J1bS1zdHlsZSBtZXNzYWdlIGNhdGFsb2cgKC5wbyBmaWxlKSBpbnRvCmEgYmluYXJ5IEdOVSBjYXRhbG9nICgubW8gZmlsZSkuICBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZQpHTlUgbXNnZm10IHByb2dyYW0sIGhvd2V2ZXIsIGl0IGlzIGEgc2ltcGxlciBpbXBsZW1lbnRhdGlvbi4KClVzYWdlOiBtc2dmbXQucHkgW09QVElPTlNdIGZpbGVuYW1lLnBvCgpPcHRpb25zOgogICAgLW8gZmlsZQogICAgLS1vdXRwdXQtZmlsZT1maWxlCiAgICAgICAgU3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgdG8gd3JpdGUgdG8uICBJZiBvbWl0dGVkLCBvdXRwdXQgd2lsbCBnbyB0byBhCiAgICAgICAgZmlsZSBuYW1lZCBmaWxlbmFtZS5tbyAoYmFzZWQgb2ZmIHRoZSBpbnB1dCBmaWxlIG5hbWUpLgoKICAgIC1oCiAgICAtLWhlbHAKICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuCgogICAgLVYKICAgIC0tdmVyc2lvbgogICAgICAgIERpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdC4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgYXN0CmltcG9ydCBnZXRvcHQKaW1wb3J0IHN0cnVjdAppbXBvcnQgYXJyYXkKCl9fdmVyc2lvbl9fID0gIjEuMSIKCk1FU1NBR0VTID0ge30KCgoMCmRlZiB1c2FnZShjb2RlLCBtc2c9JycpOgogICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXwogICAgaWYgbXNnOgogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZwogICAgc3lzLmV4aXQoY29kZSkKCgoMCmRlZiBhZGQoaWQsIHN0ciwgZnV6enkpOgogICAgIkFkZCBhIG5vbi1mdXp6eSB0cmFuc2xhdGlvbiB0byB0aGUgZGljdGlvbmFyeS4iCiAgICBnbG9iYWwgTUVTU0FHRVMKICAgIGlmIG5vdCBmdXp6eSBhbmQgc3RyOgogICAgICAgIE1FU1NBR0VTW2lkXSA9IHN0cgoKCgwKZGVmIGdlbmVyYXRlKCk6CiAgICAiUmV0dXJuIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiIKICAgIGdsb2JhbCBNRVNTQUdFUwogICAga2V5cyA9IE1FU1NBR0VTLmtleXMoKQogICAgIyB0aGUga2V5cyBhcmUgc29ydGVkIGluIHRoZSAubW8gZmlsZQogICAga2V5cy5zb3J0KCkKICAgIG9mZnNldHMgPSBbXQogICAgaWRzID0gc3RycyA9ICcnCiAgICBmb3IgaWQgaW4ga2V5czoKICAgICAgICAjIEZvciBlYWNoIHN0cmluZywgd2UgbmVlZCBzaXplIGFuZCBmaWxlIG9mZnNldC4gIEVhY2ggc3RyaW5nIGlzIE5VTAogICAgICAgICMgdGVybWluYXRlZDsgdGhlIE5VTCBkb2VzIG5vdCBjb3VudCBpbnRvIHRoZSBzaXplLgogICAgICAgIG9mZnNldHMuYXBwZW5kKChsZW4oaWRzKSwgbGVuKGlkKSwgbGVuKHN0cnMpLCBsZW4oTUVTU0FHRVNbaWRdKSkpCiAgICAgICAgaWRzICs9IGlkICsgJ1wwJwogICAgICAgIHN0cnMgKz0gTUVTU0FHRVNbaWRdICsgJ1wwJwogICAgb3V0cHV0ID0gJycKICAgICMgVGhlIGhlYWRlciBpcyA3IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4gIFdlIGRvbid0IHVzZSBoYXNoIHRhYmxlcywgc28KICAgICMgdGhlIGtleXMgc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIGluZGV4IHRhYmxlcy4KICAgICMgdHJhbnNsYXRlZCBzdHJpbmcuCiAgICBrZXlzdGFydCA9IDcqNCsxNipsZW4oa2V5cykKICAgICMgYW5kIHRoZSB2YWx1ZXMgc3RhcnQgYWZ0ZXIgdGhlIGtleXMKICAgIHZhbHVlc3RhcnQgPSBrZXlzdGFydCArIGxlbihpZHMpCiAgICBrb2Zmc2V0cyA9IFtdCiAgICB2b2Zmc2V0cyA9IFtdCiAgICAjIFRoZSBzdHJpbmcgdGFibGUgZmlyc3QgaGFzIHRoZSBsaXN0IG9mIGtleXMsIHRoZW4gdGhlIGxpc3Qgb2YgdmFsdWVzLgogICAgIyBFYWNoIGVudHJ5IGhhcyBmaXJzdCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nLCB0aGVuIHRoZSBmaWxlIG9mZnNldC4KICAgIGZvciBvMSwgbDEsIG8yLCBsMiBpbiBvZmZzZXRzOgogICAgICAgIGtvZmZzZXRzICs9IFtsMSwgbzEra2V5c3RhcnRdCiAgICAgICAgdm9mZnNldHMgKz0gW2wyLCBvMit2YWx1ZXN0YXJ0XQogICAgb2Zmc2V0cyA9IGtvZmZzZXRzICsgdm9mZnNldHMKICAgIG91dHB1dCA9IHN0cnVjdC5wYWNrKCJJaWlpaWlpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTUwNDEyZGVMLCAgICAgICAjIE1hZ2ljCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIyBWZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oa2V5cyksICAgICAgICAgIyAjIG9mIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICAgICAgIDcqNCwgICAgICAgICAgICAgICAjIHN0YXJ0IG9mIGtleSBpbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgNyo0K2xlbihrZXlzKSo4LCAgICMgc3RhcnQgb2YgdmFsdWUgaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApICAgICAgICAgICAgICAjIHNpemUgYW5kIG9mZnNldCBvZiBoYXNoIHRhYmxlCiAgICBvdXRwdXQgKz0gYXJyYXkuYXJyYXkoImkiLCBvZmZzZXRzKS50b3N0cmluZygpCiAgICBvdXRwdXQgKz0gaWRzCiAgICBvdXRwdXQgKz0gc3RycwogICAgcmV0dXJuIG91dHB1dAoKCgwKZGVmIG1ha2UoZmlsZW5hbWUsIG91dGZpbGUpOgogICAgSUQgPSAxCiAgICBTVFIgPSAyCgogICAgIyBDb21wdXRlIC5tbyBuYW1lIGZyb20gLnBvIG5hbWUgYW5kIGFyZ3VtZW50cwogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5wbycpOgogICAgICAgIGluZmlsZSA9IGZpbGVuYW1lCiAgICBlbHNlOgogICAgICAgIGluZmlsZSA9IGZpbGVuYW1lICsgJy5wbycKICAgIGlmIG91dGZpbGUgaXMgTm9uZToKICAgICAgICBvdXRmaWxlID0gb3MucGF0aC5zcGxpdGV4dChpbmZpbGUpWzBdICsgJy5tbycKCiAgICB0cnk6CiAgICAgICAgbGluZXMgPSBvcGVuKGluZmlsZSkucmVhZGxpbmVzKCkKICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCiAgICAgICAgc3lzLmV4aXQoMSkKCiAgICBzZWN0aW9uID0gTm9uZQogICAgZnV6enkgPSAwCgogICAgIyBQYXJzZSB0aGUgY2F0YWxvZwogICAgbG5vID0gMAogICAgZm9yIGwgaW4gbGluZXM6CiAgICAgICAgbG5vICs9IDEKICAgICAgICAjIElmIHdlIGdldCBhIGNvbW1lbnQgbGluZSBhZnRlciBhIG1zZ3N0ciwgdGhpcyBpcyBhIG5ldyBlbnRyeQogICAgICAgIGlmIGxbMF0gPT0gJyMnIGFuZCBzZWN0aW9uID09IFNUUjoKICAgICAgICAgICAgYWRkKG1zZ2lkLCBtc2dzdHIsIGZ1enp5KQogICAgICAgICAgICBzZWN0aW9uID0gTm9uZQogICAgICAgICAgICBmdXp6eSA9IDAKICAgICAgICAjIFJlY29yZCBhIGZ1enp5IG1hcmsKICAgICAgICBpZiBsWzoyXSA9PSAnIywnIGFuZCAnZnV6enknIGluIGw6CiAgICAgICAgICAgIGZ1enp5ID0gMQogICAgICAgICMgU2tpcCBjb21tZW50cwogICAgICAgIGlmIGxbMF0gPT0gJyMnOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgICMgTm93IHdlIGFyZSBpbiBhIG1zZ2lkIHNlY3Rpb24sIG91dHB1dCBwcmV2aW91cyBzZWN0aW9uCiAgICAgICAgaWYgbC5zdGFydHN3aXRoKCdtc2dpZCcpIGFuZCBub3QgbC5zdGFydHN3aXRoKCdtc2dpZF9wbHVyYWwnKToKICAgICAgICAgICAgaWYgc2VjdGlvbiA9PSBTVFI6CiAgICAgICAgICAgICAgICBhZGQobXNnaWQsIG1zZ3N0ciwgZnV6enkpCiAgICAgICAgICAgIHNlY3Rpb24gPSBJRAogICAgICAgICAgICBsID0gbFs1Ol0KICAgICAgICAgICAgbXNnaWQgPSBtc2dzdHIgPSAnJwogICAgICAgICAgICBpc19wbHVyYWwgPSBGYWxzZQogICAgICAgICMgVGhpcyBpcyBhIG1lc3NhZ2Ugd2l0aCBwbHVyYWwgZm9ybXMKICAgICAgICBlbGlmIGwuc3RhcnRzd2l0aCgnbXNnaWRfcGx1cmFsJyk6CiAgICAgICAgICAgIGlmIHNlY3Rpb24gIT0gSUQ6CiAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnbXNnaWRfcGx1cmFsIG5vdCBwcmVjZWVkZWQgYnkgbXNnaWQgb24gJXM6JWQnICVcCiAgICAgICAgICAgICAgICAgICAgKGluZmlsZSwgbG5vKQogICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKICAgICAgICAgICAgbCA9IGxbMTI6XQogICAgICAgICAgICBtc2dpZCArPSAnXDAnICMgc2VwYXJhdG9yIG9mIHNpbmd1bGFyIGFuZCBwbHVyYWwKICAgICAgICAgICAgaXNfcGx1cmFsID0gVHJ1ZQogICAgICAgICMgTm93IHdlIGFyZSBpbiBhIG1zZ3N0ciBzZWN0aW9uCiAgICAgICAgZWxpZiBsLnN0YXJ0c3dpdGgoJ21zZ3N0cicpOgogICAgICAgICAgICBzZWN0aW9uID0gU1RSCiAgICAgICAgICAgIGlmIGwuc3RhcnRzd2l0aCgnbXNnc3RyWycpOgogICAgICAgICAgICAgICAgaWYgbm90IGlzX3BsdXJhbDoKICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAncGx1cmFsIHdpdGhvdXQgbXNnaWRfcGx1cmFsIG9uICVzOiVkJyAlXAogICAgICAgICAgICAgICAgICAgICAgICAoaW5maWxlLCBsbm8pCiAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKICAgICAgICAgICAgICAgIGwgPSBsLnNwbGl0KCddJywgMSlbMV0KICAgICAgICAgICAgICAgIGlmIG1zZ3N0cjoKICAgICAgICAgICAgICAgICAgICBtc2dzdHIgKz0gJ1wwJyAjIFNlcGFyYXRvciBvZiB0aGUgdmFyaW91cyBwbHVyYWwgZm9ybXMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGlzX3BsdXJhbDoKICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnaW5kZXhlZCBtc2dzdHIgcmVxdWlyZWQgZm9yIHBsdXJhbCBvbiAgJXM6JWQnICVcCiAgICAgICAgICAgICAgICAgICAgICAgIChpbmZpbGUsIGxubykKICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQogICAgICAgICAgICAgICAgbCA9IGxbNjpdCiAgICAgICAgIyBTa2lwIGVtcHR5IGxpbmVzCiAgICAgICAgbCA9IGwuc3RyaXAoKQogICAgICAgIGlmIG5vdCBsOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGwgPSBhc3QubGl0ZXJhbF9ldmFsKGwpCiAgICAgICAgaWYgc2VjdGlvbiA9PSBJRDoKICAgICAgICAgICAgbXNnaWQgKz0gbAogICAgICAgIGVsaWYgc2VjdGlvbiA9PSBTVFI6CiAgICAgICAgICAgIG1zZ3N0ciArPSBsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgJ1N5bnRheCBlcnJvciBvbiAlczolZCcgJSAoaW5maWxlLCBsbm8pLCBcCiAgICAgICAgICAgICAgICAgICdiZWZvcmU6JwogICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBsCiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAjIEFkZCBsYXN0IGVudHJ5CiAgICBpZiBzZWN0aW9uID09IFNUUjoKICAgICAgICBhZGQobXNnaWQsIG1zZ3N0ciwgZnV6enkpCgogICAgIyBDb21wdXRlIG91dHB1dAogICAgb3V0cHV0ID0gZ2VuZXJhdGUoKQoKICAgIHRyeToKICAgICAgICBvcGVuKG91dGZpbGUsIndiIikud3JpdGUob3V0cHV0KQogICAgZXhjZXB0IElPRXJyb3IsbXNnOgogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZwoKCgwKZGVmIG1haW4oKToKICAgIHRyeToKICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdoVm86JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2hlbHAnLCAndmVyc2lvbicsICdvdXRwdXQtZmlsZT0nXSkKICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKICAgICAgICB1c2FnZSgxLCBtc2cpCgogICAgb3V0ZmlsZSA9IE5vbmUKICAgICMgcGFyc2Ugb3B0aW9ucwogICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CiAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6CiAgICAgICAgICAgIHVzYWdlKDApCiAgICAgICAgZWxpZiBvcHQgaW4gKCctVicsICctLXZlcnNpb24nKToKICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIm1zZ2ZtdC5weSIsIF9fdmVyc2lvbl9fCiAgICAgICAgICAgIHN5cy5leGl0KDApCiAgICAgICAgZWxpZiBvcHQgaW4gKCctbycsICctLW91dHB1dC1maWxlJyk6CiAgICAgICAgICAgIG91dGZpbGUgPSBhcmcKICAgICMgZG8gaXQKICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdObyBpbnB1dCBmaWxlIGdpdmVuJwogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJUcnkgYG1zZ2ZtdCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKICAgICAgICByZXR1cm4KCiAgICBmb3IgZmlsZW5hbWUgaW4gYXJnczoKICAgICAgICBtYWtlKGZpbGVuYW1lLCBvdXRmaWxlKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkK