IyEgL3Vzci9iaW4vZW52IHB5dGhvbgoKIyBXcml0dGVuIGJ5IE1hcnRpbiB2LiBM9ndpcyA8bG9ld2lzQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPgoKIiIiR2VuZXJhdGUgYmluYXJ5IG1lc3NhZ2UgY2F0YWxvZyBmcm9tIHRleHR1YWwgdHJhbnNsYXRpb24gZGVzY3JpcHRpb24uCgpUaGlzIHByb2dyYW0gY29udmVydHMgYSB0ZXh0dWFsIFVuaWZvcnVtLXN0eWxlIG1lc3NhZ2UgY2F0YWxvZyAoLnBvIGZpbGUpIGludG8KYSBiaW5hcnkgR05VIGNhdGFsb2cgKC5tbyBmaWxlKS4gIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlCkdOVSBtc2dmbXQgcHJvZ3JhbSwgaG93ZXZlciwgaXQgaXMgYSBzaW1wbGVyIGltcGxlbWVudGF0aW9uLgoKVXNhZ2U6IG1zZ2ZtdC5weSBbT1BUSU9OU10gZmlsZW5hbWUucG8KCk9wdGlvbnM6CiAgICAtbyBmaWxlCiAgICAtLW91dHB1dC1maWxlPWZpbGUKICAgICAgICBTcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSB0byB3cml0ZSB0by4gIElmIG9taXR0ZWQsIG91dHB1dCB3aWxsIGdvIHRvIGEKICAgICAgICBmaWxlIG5hbWVkIGZpbGVuYW1lLm1vIChiYXNlZCBvZmYgdGhlIGlucHV0IGZpbGUgbmFtZSkuCgogICAgLWgKICAgIC0taGVscAogICAgICAgIFByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdC4KCiAgICAtVgogICAgLS12ZXJzaW9uCiAgICAgICAgRGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0LgoiIiIKCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBnZXRvcHQKaW1wb3J0IHN0cnVjdAppbXBvcnQgYXJyYXkKCl9fdmVyc2lvbl9fID0gIjEuMSIKCk1FU1NBR0VTID0ge30KCgoMCmRlZiB1c2FnZShjb2RlLCBtc2c9JycpOgogICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXwogICAgaWYgbXNnOgogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZwogICAgc3lzLmV4aXQoY29kZSkKCgoMCmRlZiBhZGQoaWQsIHN0ciwgZnV6enkpOgogICAgIkFkZCBhIG5vbi1mdXp6eSB0cmFuc2xhdGlvbiB0byB0aGUgZGljdGlvbmFyeS4iCiAgICBnbG9iYWwgTUVTU0FHRVMKICAgIGlmIG5vdCBmdXp6eSBhbmQgc3RyOgogICAgICAgIE1FU1NBR0VTW2lkXSA9IHN0cgoKCgwKZGVmIGdlbmVyYXRlKCk6CiAgICAiUmV0dXJuIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiIKICAgIGdsb2JhbCBNRVNTQUdFUwogICAga2V5cyA9IE1FU1NBR0VTLmtleXMoKQogICAgIyB0aGUga2V5cyBhcmUgc29ydGVkIGluIHRoZSAubW8gZmlsZQogICAga2V5cy5zb3J0KCkKICAgIG9mZnNldHMgPSBbXQogICAgaWRzID0gc3RycyA9ICcnCiAgICBmb3IgaWQgaW4ga2V5czoKICAgICAgICAjIEZvciBlYWNoIHN0cmluZywgd2UgbmVlZCBzaXplIGFuZCBmaWxlIG9mZnNldC4gIEVhY2ggc3RyaW5nIGlzIE5VTAogICAgICAgICMgdGVybWluYXRlZDsgdGhlIE5VTCBkb2VzIG5vdCBjb3VudCBpbnRvIHRoZSBzaXplLgogICAgICAgIG9mZnNldHMuYXBwZW5kKChsZW4oaWRzKSwgbGVuKGlkKSwgbGVuKHN0cnMpLCBsZW4oTUVTU0FHRVNbaWRdKSkpCiAgICAgICAgaWRzICs9IGlkICsgJ1wwJwogICAgICAgIHN0cnMgKz0gTUVTU0FHRVNbaWRdICsgJ1wwJwogICAgb3V0cHV0ID0gJycKICAgICMgVGhlIGhlYWRlciBpcyA3IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4gIFdlIGRvbid0IHVzZSBoYXNoIHRhYmxlcywgc28KICAgICMgdGhlIGtleXMgc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIGluZGV4IHRhYmxlcy4KICAgICMgdHJhbnNsYXRlZCBzdHJpbmcuCiAgICBrZXlzdGFydCA9IDcqNCsxNipsZW4oa2V5cykKICAgICMgYW5kIHRoZSB2YWx1ZXMgc3RhcnQgYWZ0ZXIgdGhlIGtleXMKICAgIHZhbHVlc3RhcnQgPSBrZXlzdGFydCArIGxlbihpZHMpCiAgICBrb2Zmc2V0cyA9IFtdCiAgICB2b2Zmc2V0cyA9IFtdCiAgICAjIFRoZSBzdHJpbmcgdGFibGUgZmlyc3QgaGFzIHRoZSBsaXN0IG9mIGtleXMsIHRoZW4gdGhlIGxpc3Qgb2YgdmFsdWVzLgogICAgIyBFYWNoIGVudHJ5IGhhcyBmaXJzdCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nLCB0aGVuIHRoZSBmaWxlIG9mZnNldC4KICAgIGZvciBvMSwgbDEsIG8yLCBsMiBpbiBvZmZzZXRzOgogICAgICAgIGtvZmZzZXRzICs9IFtsMSwgbzEra2V5c3RhcnRdCiAgICAgICAgdm9mZnNldHMgKz0gW2wyLCBvMit2YWx1ZXN0YXJ0XQogICAgb2Zmc2V0cyA9IGtvZmZzZXRzICsgdm9mZnNldHMKICAgIG91dHB1dCA9IHN0cnVjdC5wYWNrKCJpaWlpaWlpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTUwNDEyZGUsICAgICAgICAjIE1hZ2ljCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIyBWZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oa2V5cyksICAgICAgICAgIyAjIG9mIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICAgICAgIDcqNCwgICAgICAgICAgICAgICAjIHN0YXJ0IG9mIGtleSBpbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgNyo0K2xlbihrZXlzKSo4LCAgICMgc3RhcnQgb2YgdmFsdWUgaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApICAgICAgICAgICAgICAjIHNpemUgYW5kIG9mZnNldCBvZiBoYXNoIHRhYmxlCiAgICBvdXRwdXQgKz0gYXJyYXkuYXJyYXkoImkiLCBvZmZzZXRzKS50b3N0cmluZygpCiAgICBvdXRwdXQgKz0gaWRzCiAgICBvdXRwdXQgKz0gc3RycwogICAgcmV0dXJuIG91dHB1dAoKCgwKZGVmIG1ha2UoZmlsZW5hbWUsIG91dGZpbGUpOgogICAgSUQgPSAxCiAgICBTVFIgPSAyCgogICAgIyBDb21wdXRlIC5tbyBuYW1lIGZyb20gLnBvIG5hbWUgYW5kIGFyZ3VtZW50cwogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5wbycpOgogICAgICAgIGluZmlsZSA9IGZpbGVuYW1lCiAgICBlbHNlOgogICAgICAgIGluZmlsZSA9IGZpbGVuYW1lICsgJy5wbycKICAgIGlmIG91dGZpbGUgaXMgTm9uZToKICAgICAgICBvdXRmaWxlID0gb3MucGF0aC5zcGxpdGV4dChpbmZpbGUpWzBdICsgJy5tbycKCiAgICB0cnk6CiAgICAgICAgbGluZXMgPSBvcGVuKGluZmlsZSkucmVhZGxpbmVzKCkKICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCiAgICAgICAgc3lzLmV4aXQoMSkKICAgIAogICAgc2VjdGlvbiA9IE5vbmUKICAgIGZ1enp5ID0gMAoKICAgICMgUGFyc2UgdGhlIGNhdGFsb2cKICAgIGxubyA9IDAKICAgIGZvciBsIGluIGxpbmVzOgogICAgICAgIGxubyArPSAxCiAgICAgICAgIyBJZiB3ZSBnZXQgYSBjb21tZW50IGxpbmUgYWZ0ZXIgYSBtc2dzdHIsIHRoaXMgaXMgYSBuZXcgZW50cnkKICAgICAgICBpZiBsWzBdID09ICcjJyBhbmQgc2VjdGlvbiA9PSBTVFI6CiAgICAgICAgICAgIGFkZChtc2dpZCwgbXNnc3RyLCBmdXp6eSkKICAgICAgICAgICAgc2VjdGlvbiA9IE5vbmUKICAgICAgICAgICAgZnV6enkgPSAwCiAgICAgICAgIyBSZWNvcmQgYSBmdXp6eSBtYXJrCiAgICAgICAgaWYgbFs6Ml0gPT0gJyMsJyBhbmQgbC5maW5kKCdmdXp6eScpOgogICAgICAgICAgICBmdXp6eSA9IDEKICAgICAgICAjIFNraXAgY29tbWVudHMKICAgICAgICBpZiBsWzBdID09ICcjJzoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAjIE5vdyB3ZSBhcmUgaW4gYSBtc2dpZCBzZWN0aW9uLCBvdXRwdXQgcHJldmlvdXMgc2VjdGlvbgogICAgICAgIGlmIGwuc3RhcnRzd2l0aCgnbXNnaWQnKToKICAgICAgICAgICAgaWYgc2VjdGlvbiA9PSBTVFI6CiAgICAgICAgICAgICAgICBhZGQobXNnaWQsIG1zZ3N0ciwgZnV6enkpCiAgICAgICAgICAgIHNlY3Rpb24gPSBJRAogICAgICAgICAgICBsID0gbFs1Ol0KICAgICAgICAgICAgbXNnaWQgPSBtc2dzdHIgPSAnJwogICAgICAgICMgTm93IHdlIGFyZSBpbiBhIG1zZ3N0ciBzZWN0aW9uCiAgICAgICAgZWxpZiBsLnN0YXJ0c3dpdGgoJ21zZ3N0cicpOgogICAgICAgICAgICBzZWN0aW9uID0gU1RSCiAgICAgICAgICAgIGwgPSBsWzY6XQogICAgICAgICMgU2tpcCBlbXB0eSBsaW5lcwogICAgICAgIGwgPSBsLnN0cmlwKCkKICAgICAgICBpZiBub3QgbDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAjIFhYWDogRG9lcyB0aGlzIGFsd2F5cyBmb2xsb3cgUHl0aG9uIGVzY2FwZSBzZW1hbnRpY3M/CiAgICAgICAgbCA9IGV2YWwobCkKICAgICAgICBpZiBzZWN0aW9uID09IElEOgogICAgICAgICAgICBtc2dpZCArPSBsCiAgICAgICAgZWxpZiBzZWN0aW9uID09IFNUUjoKICAgICAgICAgICAgbXNnc3RyICs9IGwKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnU3ludGF4IGVycm9yIG9uICVzOiVkJyAlIChpbmZpbGUsIGxubyksIFwKICAgICAgICAgICAgICAgICAgJ2JlZm9yZTonCiAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIGwKICAgICAgICAgICAgc3lzLmV4aXQoMSkKICAgICMgQWRkIGxhc3QgZW50cnkKICAgIGlmIHNlY3Rpb24gPT0gU1RSOgogICAgICAgIGFkZChtc2dpZCwgbXNnc3RyLCBmdXp6eSkKCiAgICAjIENvbXB1dGUgb3V0cHV0CiAgICBvdXRwdXQgPSBnZW5lcmF0ZSgpCgogICAgdHJ5OgogICAgICAgIG9wZW4ob3V0ZmlsZSwid2IiKS53cml0ZShvdXRwdXQpCiAgICBleGNlcHQgSU9FcnJvcixtc2c6CiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCiAgICAgICAgICAgICAgICAgICAgICAKCgwKZGVmIG1haW4oKToKICAgIHRyeToKICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdoVm86JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2hlbHAnLCAndmVyc2lvbicsICdvdXRwdXQtZmlsZT0nXSkKICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKICAgICAgICB1c2FnZSgxLCBtc2cpCgogICAgb3V0ZmlsZSA9IE5vbmUKICAgICMgcGFyc2Ugb3B0aW9ucwogICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CiAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6CiAgICAgICAgICAgIHVzYWdlKDApCiAgICAgICAgZWxpZiBvcHQgaW4gKCctVicsICctLXZlcnNpb24nKToKICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIm1zZ2ZtdC5weSIsIF9fdmVyc2lvbl9fCiAgICAgICAgICAgIHN5cy5leGl0KDApCiAgICAgICAgZWxpZiBvcHQgaW4gKCctbycsICctLW91dHB1dC1maWxlJyk6CiAgICAgICAgICAgIG91dGZpbGUgPSBhcmcKICAgICMgZG8gaXQKICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdObyBpbnB1dCBmaWxlIGdpdmVuJwogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJUcnkgYG1zZ2ZtdCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKICAgICAgICByZXR1cm4KCiAgICBmb3IgZmlsZW5hbWUgaW4gYXJnczoKICAgICAgICBtYWtlKGZpbGVuYW1lLCBvdXRmaWxlKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkK