Files
commander-ai-lab/lab_api.py
T

1 line
445 KiB
Python

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKQ29tbWFuZGVyIEFJIExhYiDigJQgRmFzdEFQSSBCYWNrZW5kIHYzCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKdjMgYWRkczoKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC91cmwgICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gQXJjaGlkZWt0L0VESFJFQyBVUkwKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC90ZXh0ICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gY2FyZCBsaXN0IHRleHQKICBHRVQgIC9hcGkvbGFiL21ldGEvY29tbWFuZGVycyAg4oCUIExpc3QgYXZhaWxhYmxlIGNvbW1hbmRlcnMgaW4gbWV0YSBtYXBwaW5nCiAgR0VUICAvYXBpL2xhYi9tZXRhL3NlYXJjaCAgICAgIOKAlCBTZWFyY2ggY29tbWFuZGVycyBieSBuYW1lCiAgUE9TVCAvYXBpL2xhYi9tZXRhL2ZldGNoICAgICAgIOKAlCBGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIGZvciBhIGNvbW1hbmRlcgogIFBPU1QgL2FwaS9sYWIvc3RhcnQgICAgICAgICAgICDigJQgRXh0ZW5kZWQ6IGFjY2VwdHMgaW1wb3J0ZWQgZGVjayBwcm9maWxlcwoKUnVucyBvbiBwb3J0IDgwODAgYnkgZGVmYXVsdC4gU2VydmVzIHRoZSB3ZWIgVUkgc3RhdGljIGZpbGVzIGF0IC8uCiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBhc3luY2lvCmltcG9ydCBjc3YKaW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBsb2dnaW5nLmhhbmRsZXJzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNxbGl0ZTMKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB0aW1lCmltcG9ydCB1dWlkCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwKZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbiwgUmVxdWVzdApmcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgVVJMRXJyb3IKCnRyeToKICAgIGZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbiwgQmFja2dyb3VuZFRhc2tzLCBSZXF1ZXN0IGFzIEZhc3RBUElSZXF1ZXN0CiAgICBmcm9tIGZhc3RhcGkubWlkZGxld2FyZS5jb3JzIGltcG9ydCBDT1JTTWlkZGxld2FyZQogICAgZnJvbSBmYXN0YXBpLnJlc3BvbnNlcyBpbXBvcnQgRmlsZVJlc3BvbnNlLCBKU09OUmVzcG9uc2UsIFN0cmVhbWluZ1Jlc3BvbnNlCiAgICBmcm9tIGZhc3RhcGkuc3RhdGljZmlsZXMgaW1wb3J0IFN0YXRpY0ZpbGVzCiAgICBmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcHJpbnQoIkVSUk9SOiBGYXN0QVBJIG5vdCBpbnN0YWxsZWQuIFJ1bjogcGlwIGluc3RhbGwgZmFzdGFwaSB1dmljb3JuIikKICAgIHN5cy5leGl0KDEpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb25maWd1cmF0aW9uCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBDb25maWc6CiAgICAiIiJSdW50aW1lIGNvbmZpZ3VyYXRpb24g4oCUIHNldCB2aWEgQ0xJIGFyZ3Mgb3IgZW52IHZhcnMuIiIiCiAgICBmb3JnZV9qYXI6IHN0ciA9ICIiCiAgICBmb3JnZV9kaXI6IHN0ciA9ICIiCiAgICBmb3JnZV9kZWNrc19kaXI6IHN0ciA9ICIiCiAgICBsYWJfamFyOiBzdHIgPSAiIgogICAgcmVzdWx0c19kaXI6IHN0ciA9ICJyZXN1bHRzIgogICAgcG9ydDogaW50ID0gODA4MAogICAgeGltaWxhcl9hcGlfa2V5OiBzdHIgPSAiIgogICAgcHBseF9hcGlfa2V5OiBzdHIgPSAiIiAgIyBQZXJwbGV4aXR5IEFQSSBrZXkgZm9yIGRlY2sgcmVzZWFyY2gvZ2VuZXJhdGlvbgoKQ0ZHID0gQ29uZmlnKCkKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIExvZ2dpbmcgU2V0dXAKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCl9MT0dfRk9STUFUID0gIiUoYXNjdGltZSlzICUobGV2ZWxuYW1lKS01cyBbJShuYW1lKXNdICUobWVzc2FnZSlzIgpfTE9HX0RBVEVfRk1UID0gIiVZLSVtLSVkICVIOiVNOiVTIgpfTE9HX0RJUiA9IFBhdGgob3MuZW52aXJvbi5nZXQoIkNBTF9MT0dfRElSIiwgImxvZ3MiKSkKX0xPR19NQVhfQllURVMgPSBpbnQob3MuZW52aXJvbi5nZXQoIkNBTF9MT0dfTUFYX01CIiwgIjI1IikpICogMTAyNCAqIDEwMjQKX0xPR19CQUNLVVBfQ09VTlQgPSBpbnQob3MuZW52aXJvbi5nZXQoIkNBTF9MT0dfQkFDS1VQX0NPVU5UIiwgIjUiKSkKCgpkZWYgc2V0dXBfbG9nZ2luZyhsZXZlbDogaW50ID0gbG9nZ2luZy5JTkZPKSAtPiBOb25lOgogICAgIiIiQ29uZmlndXJlIHRoZSByb290ICdjb21tYW5kZXJfYWlfbGFiJyBsb2dnZXIgd2l0aCBjb25zb2xlICsgcm90YXRpbmcgZmlsZS4iIiIKICAgIF9MT0dfRElSLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICByb290X2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21tYW5kZXJfYWlfbGFiIikKICAgIHJvb3RfbG9nZ2VyLnNldExldmVsKGxldmVsKQoKICAgICMgQXZvaWQgZHVwbGljYXRlIGhhbmRsZXJzIGlmIGNhbGxlZCBhZ2FpbgogICAgaWYgcm9vdF9sb2dnZXIuaGFuZGxlcnM6CiAgICAgICAgcmV0dXJuCgogICAgZm9ybWF0dGVyID0gbG9nZ2luZy5Gb3JtYXR0ZXIoX0xPR19GT1JNQVQsIGRhdGVmbXQ9X0xPR19EQVRFX0ZNVCkKCiAgICAjIENvbnNvbGUgaGFuZGxlciDigJQgbWF0Y2hlcyBwcmV2aW91cyBwcmludCgpIGJlaGF2aW91cgogICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQogICAgY29uc29sZS5zZXRMZXZlbChsZXZlbCkKICAgIGNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcikKICAgIHJvb3RfbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZSkKCiAgICAjIFJvdGF0aW5nIGZpbGUgaGFuZGxlciDigJQgMjUgTUIgw5cgNSBiYWNrdXBzID0gMTI1IE1CIG1heAogICAgZmlsZV9oYW5kbGVyID0gbG9nZ2luZy5oYW5kbGVycy5Sb3RhdGluZ0ZpbGVIYW5kbGVyKAogICAgICAgIF9MT0dfRElSIC8gImNvbW1hbmRlci1haS1sYWIubG9nIiwKICAgICAgICBtYXhCeXRlcz1fTE9HX01BWF9CWVRFUywKICAgICAgICBiYWNrdXBDb3VudD1fTE9HX0JBQ0tVUF9DT1VOVCwKICAgICAgICBlbmNvZGluZz0idXRmLTgiLAogICAgKQogICAgZmlsZV9oYW5kbGVyLnNldExldmVsKGxldmVsKQogICAgZmlsZV9oYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCiAgICByb290X2xvZ2dlci5hZGRIYW5kbGVyKGZpbGVfaGFuZGxlcikKCgojIE5hbWVkIGxvZ2dlcnMg4oCUIGltcG9ydCB0aGVzZSB3aGVyZSBuZWVkZWQKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbW1hbmRlcl9haV9sYWIuYXBpIikgICAgICAgICAgIyBBUEkgZW5kcG9pbnRzLCBzZXJ2ZXIgbGlmZWN5Y2xlCmxvZ19iYXRjaCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21tYW5kZXJfYWlfbGFiLmJhdGNoIikgICAjIEJhdGNoIHNpbSAoSmF2YSArIERlZXBTZWVrKQpsb2dfc2ltID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbW1hbmRlcl9haV9sYWIuc2ltIikgICAgICAgIyBEZWVwU2VlayBnYW1lIHNpbXVsYXRpb24KbG9nX2NvYWNoID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbW1hbmRlcl9haV9sYWIuY29hY2giKSAgICMgQ29hY2ggKyByZXBvcnQgZ2VuZXJhdGlvbgpsb2dfZGVja2dlbiA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21tYW5kZXJfYWlfbGFiLmRlY2tnZW4iKSAgIyBEZWNrIGdlbmVyYXRpb24gKGFsbCB2ZXJzaW9ucykKbG9nX2NvbGxlY3QgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tbWFuZGVyX2FpX2xhYi5jb2xsZWN0aW9uIikgICMgQ29sbGVjdGlvbiBtYW5hZ2VtZW50CmxvZ19zY2FuID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbW1hbmRlcl9haV9sYWIuc2Nhbm5lciIpICAjIENhcmQgc2Nhbm5lcgpsb2dfbWwgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tbWFuZGVyX2FpX2xhYi5tbCIpICAgICAgICAgIyBNTCB0cmFpbmluZyArIGluZmVyZW5jZQpsb2dfY2FjaGUgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tbWFuZGVyX2FpX2xhYi5jYWNoZSIpICAgIyBTY3J5ZmFsbCBjYWNoZQpsb2dfcHBseCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21tYW5kZXJfYWlfbGFiLnBwbHgiKSAgICAgIyBQZXJwbGV4aXR5IEFQSQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQXBwIFNldHVwCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgphcHAgPSBGYXN0QVBJKHRpdGxlPSJDb21tYW5kZXIgQUkgTGFiIEFQSSIsIHZlcnNpb249IjMuMC4wIikKCmFwcC5hZGRfbWlkZGxld2FyZSgKICAgIENPUlNNaWRkbGV3YXJlLAogICAgYWxsb3dfb3JpZ2lucz1bIioiXSwKICAgIGFsbG93X21ldGhvZHM9WyIqIl0sCiAgICBhbGxvd19oZWFkZXJzPVsiKiJdLAopCgpmcm9tIHJvdXRlcyBpbXBvcnQgX2F1dG9sb2FkIGFzIF9yb3V0ZXNfYXV0b2xvYWQKX3JvdXRlc19hdXRvbG9hZC5yZWdpc3Rlcl9zdGFydHVwKGFwcCkKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEluLU1lbW9yeSBTdGF0ZQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKY2xhc3MgQmF0Y2hTdGF0ZToKICAgICIiIlRyYWNrcyBhIHJ1bm5pbmcgb3IgY29tcGxldGVkIGJhdGNoLiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhdGNoX2lkOiBzdHIsIHRvdGFsX2dhbWVzOiBpbnQsIHRocmVhZHM6IGludCk6CiAgICAgICAgc2VsZi5iYXRjaF9pZCA9IGJhdGNoX2lkCiAgICAgICAgc2VsZi50b3RhbF9nYW1lcyA9IHRvdGFsX2dhbWVzCiAgICAgICAgc2VsZi50aHJlYWRzID0gdGhyZWFkcwogICAgICAgIHNlbGYuY29tcGxldGVkX2dhbWVzID0gMAogICAgICAgIHNlbGYucnVubmluZyA9IFRydWUKICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBkYXRldGltZS5ub3coKQogICAgICAgIHNlbGYuZWxhcHNlZF9tcyA9IDAKICAgICAgICBzZWxmLnJlc3VsdF9wYXRoOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgICAgIHNlbGYuZXJyb3I6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICAgICAgc2VsZi5wcm9jZXNzOiBPcHRpb25hbFtzdWJwcm9jZXNzLlBvcGVuXSA9IE5vbmUKICAgICAgICBzZWxmLmxvZ19saW5lczogbGlzdCA9IFtdCiAgICAgICAgIyB2MjQgKElzc3VlICM1KTogUmVhbC10aW1lIHRocm91Z2hwdXQgdHJhY2tpbmcKICAgICAgICBzZWxmLnNpbXNfcGVyX3NlYzogZmxvYXQgPSAwLjAKCmFjdGl2ZV9iYXRjaGVzOiBkaWN0W3N0ciwgQmF0Y2hTdGF0ZV0gPSB7fQoKIyBDb21tYW5kZXIgbWV0YSBtYXBwaW5nIChsb2FkZWQgYXQgc3RhcnR1cCkKQ09NTUFOREVSX01FVEE6IGRpY3QgPSB7fQoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBSZXF1ZXN0IC8gUmVzcG9uc2UgTW9kZWxzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBTdGFydFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGRlY2tzOiBsaXN0W3N0cl0gICAgICAgICAgICMgRXhhY3RseSAzIGRlY2sgbmFtZXMKICAgIG51bUdhbWVzOiBpbnQgPSAxMDAKICAgIHRocmVhZHM6IGludCA9IDQKICAgIHNlZWQ6IE9wdGlvbmFsW2ludF0gPSBOb25lCiAgICBjbG9jazogaW50ID0gMTIwCiAgICAjIHYzOiBPcHRpb25hbCBzb3VyY2UgbWV0YWRhdGEgcGVyIGRlY2sKICAgIGRlY2tTb3VyY2VzOiBPcHRpb25hbFtsaXN0W09wdGlvbmFsW2RpY3RdXV0gPSBOb25lICAjIFt7c291cmNlLCBzb3VyY2VVcmwsIGNvbW1hbmRlciwgYXJjaGV0eXBlfV0KICAgICMgdjg6IExlYXJuZWQgcG9saWN5IHN1cHBvcnQKICAgIHVzZUxlYXJuZWRQb2xpY3k6IGJvb2wgPSBGYWxzZQogICAgcG9saWN5U3R5bGU6IHN0ciA9ICJtaWRyYW5nZSIKICAgIHBvbGljeUdyZWVkeTogYm9vbCA9IEZhbHNlCiAgICAjIHYyNCAoSXNzdWVzICM0LyM1KTogUGVyZm9ybWFuY2Ugc2V0dGluZ3MKICAgIGFpU2ltcGxpZmllZDogYm9vbCA9IEZhbHNlICAgICAgICAgIyBVc2UgZmFzdGVyIEFJIHByb2ZpbGUKICAgIGFpVGhpbmtUaW1lTXM6IGludCA9IC0xICAgICAgICAgICAgIyBDYXAgQUkgdGhpbmsgdGltZSAoLTEgdW5saW1pdGVkKQogICAgbWF4UXVldWVEZXB0aDogaW50ID0gLTEgICAgICAgICAgICAjIEJhY2twcmVzc3VyZSBsaW1pdCAoLTEgdW5saW1pdGVkKQoKY2xhc3MgU3RhcnRSZXNwb25zZShCYXNlTW9kZWwpOgogICAgYmF0Y2hJZDogc3RyCiAgICBzdGF0dXM6IHN0ciA9ICJzdGFydGVkIgogICAgbWVzc2FnZTogc3RyID0gIiIKCmNsYXNzIFN0YXR1c1Jlc3BvbnNlKEJhc2VNb2RlbCk6CiAgICBiYXRjaElkOiBzdHIgPSAiIgogICAgcnVubmluZzogYm9vbCA9IEZhbHNlCiAgICBjb21wbGV0ZWQ6IGludCA9IDAKICAgIHRvdGFsOiBpbnQgPSAwCiAgICB0aHJlYWRzOiBpbnQgPSAwCiAgICBlbGFwc2VkTXM6IGludCA9IDAKICAgIGVycm9yOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgc2ltc1BlclNlYzogZmxvYXQgPSAwLjAKICAgICMgUmVhY3QgU1BBIGFsaWFzZXMgKHNhbWUgZGF0YSwgZXhwZWN0ZWQgZmllbGQgbmFtZXMpCiAgICBydW5faWQ6IHN0ciA9ICIiCiAgICBnYW1lc19jb21wbGV0ZWQ6IGludCA9IDAKICAgIHRvdGFsX2dhbWVzOiBpbnQgPSAwCiAgICBjdXJyZW50X2RlY2tzOiBsaXN0ID0gW10KCmNsYXNzIERlY2tJbmZvKEJhc2VNb2RlbCk6CiAgICBuYW1lOiBzdHIKICAgIGZpbGVuYW1lOiBzdHIKCmNsYXNzIEltcG9ydFVybFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIHVybDogc3RyCgpjbGFzcyBJbXBvcnRUZXh0UmVxdWVzdChCYXNlTW9kZWwpOgogICAgdGV4dDogc3RyCiAgICBjb21tYW5kZXI6IE9wdGlvbmFsW3N0cl0gPSBOb25lCgpjbGFzcyBNZXRhRmV0Y2hSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBjb21tYW5kZXI6IHN0cgoKCiMg4pSA4pSAIERlY2sgQnVpbGRlciBNb2RlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpjbGFzcyBDcmVhdGVEZWNrUmVxdWVzdChCYXNlTW9kZWwpOgogICAgbmFtZTogc3RyCiAgICBjb21tYW5kZXJfc2NyeWZhbGxfaWQ6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgY29tbWFuZGVyX25hbWU6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgY29sb3JfaWRlbnRpdHk6IE9wdGlvbmFsW2xpc3RdID0gW10KICAgIHN0cmF0ZWd5X3RhZzogT3B0aW9uYWxbc3RyXSA9ICIiCgoKY2xhc3MgVXBkYXRlRGVja1JlcXVlc3QoQmFzZU1vZGVsKToKICAgIG5hbWU6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICBjb21tYW5kZXJfc2NyeWZhbGxfaWQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICBjb21tYW5kZXJfbmFtZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUKICAgIGNvbG9yX2lkZW50aXR5OiBPcHRpb25hbFtsaXN0XSA9IE5vbmUKICAgIHN0cmF0ZWd5X3RhZzogT3B0aW9uYWxbc3RyXSA9IE5vbmUKCgpjbGFzcyBBZGREZWNrQ2FyZFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIHNjcnlmYWxsX2lkOiBzdHIKICAgIGNhcmRfbmFtZTogT3B0aW9uYWxbc3RyXSA9ICIiCiAgICBxdWFudGl0eTogT3B0aW9uYWxbaW50XSA9IDEKICAgIGlzX2NvbW1hbmRlcjogT3B0aW9uYWxbaW50XSA9IDAKICAgIHJvbGVfdGFnOiBPcHRpb25hbFtzdHJdID0gIiIKCgpjbGFzcyBQYXRjaERlY2tDYXJkUmVxdWVzdChCYXNlTW9kZWwpOgogICAgcXVhbnRpdHk6IE9wdGlvbmFsW2ludF0gPSBOb25lCiAgICByb2xlX3RhZzogT3B0aW9uYWxbc3RyXSA9IE5vbmUKCgpjbGFzcyBCdWxrQWRkUmVxdWVzdChCYXNlTW9kZWwpOgogICAgY2FyZHM6IGxpc3RbZGljdF0gICMgW3tzY3J5ZmFsbF9pZCwgcXVhbnRpdHl9XQogICAgcmVzcGVjdF9yYXRpb3M6IE9wdGlvbmFsW2Jvb2xdID0gRmFsc2UKCgpjbGFzcyBCdWxrQWRkUmVjb21tZW5kZWRSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBzb3VyY2U6IHN0ciA9ICJjb2xsZWN0aW9uIiAgIyAiY29sbGVjdGlvbiIgfCAiZWRocmVjIgogICAgb25seV9vd25lZDogT3B0aW9uYWxbYm9vbF0gPSBUcnVlCiAgICByZXNwZWN0X3JhdGlvczogT3B0aW9uYWxbYm9vbF0gPSBGYWxzZQogICAgdHlwZXM6IE9wdGlvbmFsW2xpc3Rbc3RyXV0gPSBOb25lCiAgICByb2xlczogT3B0aW9uYWxbbGlzdFtzdHJdXSA9IE5vbmUKCgojIOKUgOKUgCBBdXRvIERlY2sgR2VuZXJhdG9yIE1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmNsYXNzIERlY2tHZW5lcmF0aW9uU291cmNlQ29uZmlnKEJhc2VNb2RlbCk6CiAgICB1c2VfYXJjaGlkZWt0OiBib29sID0gVHJ1ZQogICAgdXNlX2VkaHJlYzogYm9vbCA9IFRydWUKICAgIHVzZV9tb3hmaWVsZDogYm9vbCA9IEZhbHNlCiAgICB1c2VfbXRnZ29sZGZpc2g6IGJvb2wgPSBGYWxzZQogICAgYXJjaGlkZWt0X3VybDogT3B0aW9uYWxbc3RyXSA9ICIiCiAgICBtb3hmaWVsZF91cmw6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgbXRnZ29sZGZpc2hfdXJsOiBPcHRpb25hbFtzdHJdID0gIiIKCgpjbGFzcyBEZWNrR2VuZXJhdGlvblJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGNvbW1hbmRlcl9uYW1lOiBPcHRpb25hbFtzdHJdID0gIiIKICAgIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZDogT3B0aW9uYWxbc3RyXSA9ICIiCiAgICBjb2xvcl9pZGVudGl0eTogT3B0aW9uYWxbbGlzdFtzdHJdXSA9IE5vbmUKICAgIHNvdXJjZXM6IE9wdGlvbmFsW0RlY2tHZW5lcmF0aW9uU291cmNlQ29uZmlnXSA9IE5vbmUKICAgIHRhcmdldF9sYW5kX2NvdW50OiBpbnQgPSAzNwogICAgdGFyZ2V0X2luc3RhbnRfY291bnQ6IGludCA9IDEwCiAgICB0YXJnZXRfc29yY2VyeV9jb3VudDogaW50ID0gOAogICAgdGFyZ2V0X2FydGlmYWN0X2NvdW50OiBpbnQgPSAxMAogICAgdGFyZ2V0X2VuY2hhbnRtZW50X2NvdW50OiBpbnQgPSA4CiAgICB0YXJnZXRfY3JlYXR1cmVfY291bnQ6IGludCA9IDI1CiAgICB0YXJnZXRfcGxhbmVzd2Fsa2VyX2NvdW50OiBpbnQgPSAyCiAgICBvbmx5X2NhcmRzX2luX2NvbGxlY3Rpb246IGJvb2wgPSBGYWxzZQogICAgYWxsb3dfcHJveGllczogYm9vbCA9IFRydWUKICAgIGRlY2tfbmFtZTogT3B0aW9uYWxbc3RyXSA9ICIiCgoKY2xhc3MgR2VuZXJhdGVkRGVja0NhcmQoQmFzZU1vZGVsKToKICAgIHNjcnlmYWxsX2lkOiBzdHIgPSAiIgogICAgbmFtZTogc3RyID0gIiIKICAgIHR5cGVfbGluZTogc3RyID0gIiIKICAgIG1hbmFfY29zdDogc3RyID0gIiIKICAgIGNtYzogZmxvYXQgPSAwCiAgICBjYXJkX3R5cGU6IHN0ciA9ICIiICAgICAgICAjIExhbmQgLyBDcmVhdHVyZSAvIEluc3RhbnQgLyBldGMuCiAgICByb2xlczogbGlzdFtzdHJdID0gW10KICAgIHNvdXJjZTogc3RyID0gImNvbGxlY3Rpb24iICAjIGNvbGxlY3Rpb24gLyBlZGhyZWMgLyBhcmNoaWRla3QgLyB0ZW1wbGF0ZQogICAgcXVhbnRpdHk6IGludCA9IDEKICAgIGltYWdlX3VybDogc3RyID0gIiIKICAgIG93bmVkX3F0eTogaW50ID0gMAogICAgaXNfcHJveHk6IGJvb2wgPSBGYWxzZQoKCiMg4pSA4pSAIFYzIERlY2sgR2VuZXJhdGlvbiAoUGVycGxleGl0eSBTdHJ1Y3R1cmVkIE91dHB1dCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNsYXNzIERlY2tHZW5WM1JlcXVlc3QoQmFzZU1vZGVsKToKICAgIGNvbW1hbmRlcl9uYW1lOiBzdHIgPSAiIgogICAgc3RyYXRlZ3k6IHN0ciA9ICIiICAgICAgICAgICAgICAgICAgICAgICAgICAjIGUuZy4gInpvbWJpZSB0b2tlbnMiLCAidm9sdHJvbiIKICAgIHRhcmdldF9icmFja2V0OiBpbnQgPSAzICAgICAgICAgICAgICAgICAgICAgIyAxLTQgcGVyIENvbW1hbmRlciBSdWxlcyBDb21taXR0ZWUKICAgIGJ1ZGdldF91c2Q6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUgICAgICAgICAgIyBOb25lID0gbm8gYnVkZ2V0CiAgICBidWRnZXRfbW9kZTogc3RyID0gInRvdGFsIiAgICAgICAgICAgICAgICAgICMgInRvdGFsIiBvciAicGVyX2NhcmQiCiAgICBvbWl0X2NhcmRzOiBsaXN0W3N0cl0gPSBbXSAgICAgICAgICAgICAgICAgICMgQ2FyZHMgdG8gZXhjbHVkZQogICAgdXNlX2NvbGxlY3Rpb246IGJvb2wgPSBUcnVlICAgICAgICAgICAgICAgICAjIENyb3NzLXJlZiB3aXRoIGNvbGxlY3Rpb24gREIKICAgIHJ1bl9zdWJzdGl0dXRpb246IGJvb2wgPSBUcnVlICAgICAgICAgICAgICAgIyBFbmFibGUgU21hcnQgU3Vic3RpdHV0aW9uIEVuZ2luZQogICAgbW9kZWw6IE9wdGlvbmFsW3N0cl0gPSBOb25lICAgICAgICAgICAgICAgICAjIE92ZXJyaWRlOiBzb25hciwgc29uYXItcHJvCiAgICBkZWNrX25hbWU6IE9wdGlvbmFsW3N0cl0gPSAiIiAgICAgICAgICAgICAgICMgQ3VzdG9tIGRlY2sgbmFtZSBmb3IgY29tbWl0CgoKY2xhc3MgRGVja0dlblYzU3Vic3RpdHV0ZVJlcXVlc3QoQmFzZU1vZGVsKToKICAgICIiIlJlcXVlc3QgdG8gbWFudWFsbHkgcGljayBhIHN1YnN0aXR1dGUgZm9yIGEgY2FyZC4iIiIKICAgIGNhcmRfbmFtZTogc3RyCiAgICBzdWJzdGl0dXRlX25hbWU6IHN0cgoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgdjM6IERlY2sgSW1wb3J0ICYgTWV0YSBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBhcHAucG9zdCgiL2FwaS9sYWIvaW1wb3J0L3VybCIpCmFzeW5jIGRlZiBpbXBvcnRfZnJvbV91cmwocmVxOiBJbXBvcnRVcmxSZXF1ZXN0KToKICAgICIiIkltcG9ydCBhIGRlY2sgZnJvbSBBcmNoaWRla3Qgb3IgRURIUkVDIFVSTC4gUmV0dXJucyBwYXJzZWQgRGVja1Byb2ZpbGUgKyBzYXZlcyAuZGNrIGZpbGUuIiIiCiAgICB1cmwgPSByZXEudXJsLnN0cmlwKCkKICAgIHRyeToKICAgICAgICBwcm9maWxlID0gX2ltcG9ydF9mcm9tX3VybCh1cmwpCiAgICAgICAgZGNrX3BhdGggPSBfc2F2ZV9wcm9maWxlX3RvX2Rjayhwcm9maWxlKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzdWNjZXNzIjogVHJ1ZSwKICAgICAgICAgICAgImRlY2tOYW1lIjogcHJvZmlsZVsibmFtZSJdLAogICAgICAgICAgICAiY29tbWFuZGVyIjogcHJvZmlsZVsiY29tbWFuZGVyIl0sCiAgICAgICAgICAgICJzb3VyY2UiOiBwcm9maWxlWyJzb3VyY2UiXSwKICAgICAgICAgICAgInNvdXJjZVVybCI6IHByb2ZpbGVbInNvdXJjZVVybCJdLAogICAgICAgICAgICAidG90YWxDYXJkcyI6IHByb2ZpbGVbInRvdGFsQ2FyZHMiXSwKICAgICAgICAgICAgImRja0ZpbGUiOiBkY2tfcGF0aC5zdGVtLAogICAgICAgICAgICAiY29sb3JJZGVudGl0eSI6IHByb2ZpbGUuZ2V0KCJjb2xvcklkZW50aXR5IiwgW10pLAogICAgICAgICAgICAiYXJjaGV0eXBlIjogcHJvZmlsZS5nZXQoImFyY2hldHlwZSIpLAogICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgc3RyKGUpKQoKCkBhcHAucG9zdCgiL2FwaS9sYWIvaW1wb3J0L3RleHQiKQphc3luYyBkZWYgaW1wb3J0X2Zyb21fdGV4dChyZXE6IEltcG9ydFRleHRSZXF1ZXN0KToKICAgICIiIkltcG9ydCBhIGRlY2sgZnJvbSBwbGFpbiB0ZXh0IGNhcmQgbGlzdC4iIiIKICAgIHRyeToKICAgICAgICBwcm9maWxlID0gX3BhcnNlX3RleHRfZGVja2xpc3QocmVxLnRleHQsIHJlcS5jb21tYW5kZXIpCiAgICAgICAgZGNrX3BhdGggPSBfc2F2ZV9wcm9maWxlX3RvX2Rjayhwcm9maWxlKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzdWNjZXNzIjogVHJ1ZSwKICAgICAgICAgICAgImRlY2tOYW1lIjogcHJvZmlsZVsibmFtZSJdLAogICAgICAgICAgICAiY29tbWFuZGVyIjogcHJvZmlsZVsiY29tbWFuZGVyIl0sCiAgICAgICAgICAgICJzb3VyY2UiOiAiVGV4dCBJbXBvcnQiLAogICAgICAgICAgICAidG90YWxDYXJkcyI6IHByb2ZpbGVbInRvdGFsQ2FyZHMiXSwKICAgICAgICAgICAgImRja0ZpbGUiOiBkY2tfcGF0aC5zdGVtLAogICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgc3RyKGUpKQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9tZXRhL2NvbW1hbmRlcnMiKQphc3luYyBkZWYgbGlzdF9tZXRhX2NvbW1hbmRlcnMoKToKICAgICIiIkxpc3QgYXZhaWxhYmxlIGNvbW1hbmRlcnMgaW4gdGhlIG1ldGEgbWFwcGluZy4iIiIKICAgIGNvbW1hbmRlcnMgPSBbXQogICAgZm9yIG5hbWUsIGVudHJpZXMgaW4gQ09NTUFOREVSX01FVEEuaXRlbXMoKToKICAgICAgICBlbnRyeSA9IGVudHJpZXNbMF0gaWYgZW50cmllcyBlbHNlIHt9CiAgICAgICAgY29tbWFuZGVycy5hcHBlbmQoewogICAgICAgICAgICAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICJhcmNoZXR5cGUiOiBlbnRyeS5nZXQoImFyY2hldHlwZSIsICIiKSwKICAgICAgICAgICAgImNvbG9ySWRlbnRpdHkiOiBlbnRyeS5nZXQoImNvbG9ySWRlbnRpdHkiLCBbXSksCiAgICAgICAgICAgICJzb3VyY2UiOiBlbnRyeS5nZXQoInNvdXJjZSIsICJlZGhyZWMiKSwKICAgICAgICB9KQogICAgcmV0dXJuIHsiY29tbWFuZGVycyI6IGNvbW1hbmRlcnN9CgoKQGFwcC5nZXQoIi9hcGkvbGFiL21ldGEvc2VhcmNoIikKYXN5bmMgZGVmIHNlYXJjaF9tZXRhX2NvbW1hbmRlcnMocTogc3RyID0gIiIpOgogICAgIiIiU2VhcmNoIGNvbW1hbmRlcnMgYnkgcGFydGlhbCBuYW1lIG1hdGNoLiIiIgogICAgcXVlcnkgPSBxLmxvd2VyKCkKICAgIG1hdGNoZXMgPSBbXQogICAgZm9yIG5hbWUsIGVudHJpZXMgaW4gQ09NTUFOREVSX01FVEEuaXRlbXMoKToKICAgICAgICBpZiBxdWVyeSBpbiBuYW1lLmxvd2VyKCk6CiAgICAgICAgICAgIGVudHJ5ID0gZW50cmllc1swXSBpZiBlbnRyaWVzIGVsc2Uge30KICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoewogICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAgICAgImFyY2hldHlwZSI6IGVudHJ5LmdldCgiYXJjaGV0eXBlIiwgIiIpLAogICAgICAgICAgICAgICAgImNvbG9ySWRlbnRpdHkiOiBlbnRyeS5nZXQoImNvbG9ySWRlbnRpdHkiLCBbXSksCiAgICAgICAgICAgIH0pCiAgICByZXR1cm4geyJyZXN1bHRzIjogbWF0Y2hlc30KCgpAYXBwLnBvc3QoIi9hcGkvbGFiL21ldGEvZmV0Y2giKQphc3luYyBkZWYgZmV0Y2hfbWV0YV9kZWNrKHJlcTogTWV0YUZldGNoUmVxdWVzdCk6CiAgICAiIiJGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIGZvciBhIGNvbW1hbmRlciBhbmQgc2F2ZSBhcyAuZGNrIGZpbGUuIiIiCiAgICB0cnk6CiAgICAgICAgcHJvZmlsZSA9IF9mZXRjaF9lZGhyZWNfYXZlcmFnZShyZXEuY29tbWFuZGVyKQogICAgICAgIGRja19wYXRoID0gX3NhdmVfcHJvZmlsZV90b19kY2socHJvZmlsZSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IFRydWUsCiAgICAgICAgICAgICJkZWNrTmFtZSI6IHByb2ZpbGVbIm5hbWUiXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IHByb2ZpbGVbImNvbW1hbmRlciJdLAogICAgICAgICAgICAic291cmNlIjogIkVESFJFQyBBdmVyYWdlIiwKICAgICAgICAgICAgInNvdXJjZVVybCI6IHByb2ZpbGUuZ2V0KCJzb3VyY2VVcmwiLCAiIiksCiAgICAgICAgICAgICJ0b3RhbENhcmRzIjogcHJvZmlsZVsidG90YWxDYXJkcyJdLAogICAgICAgICAgICAiZGNrRmlsZSI6IGRja19wYXRoLnN0ZW0sCiAgICAgICAgICAgICJjb2xvcklkZW50aXR5IjogcHJvZmlsZS5nZXQoImNvbG9ySWRlbnRpdHkiLCBbXSksCiAgICAgICAgICAgICJzYW1wbGVTaXplIjogcHJvZmlsZS5nZXQoInNhbXBsZVNpemUiKSwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIGYiRmFpbGVkIHRvIGZldGNoIG1ldGEgZGVjayBmb3IgJ3tyZXEuY29tbWFuZGVyfSc6IHtzdHIoZSl9IikKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEV4aXN0aW5nIEVuZHBvaW50cyAodjEvdjIpCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpAYXBwLnBvc3QoIi9hcGkvbGFiL3N0YXJ0IiwgcmVzcG9uc2VfbW9kZWw9U3RhcnRSZXNwb25zZSkKYXN5bmMgZGVmIHN0YXJ0X2JhdGNoKHJlcTogU3RhcnRSZXF1ZXN0LCBiYWNrZ3JvdW5kX3Rhc2tzOiBCYWNrZ3JvdW5kVGFza3MpOgogICAgIiIiU3RhcnQgYSBuZXcgYmF0Y2ggc2ltdWxhdGlvbiBydW4uIiIiCiAgICBpZiBsZW4ocmVxLmRlY2tzKSA8IDIgb3IgbGVuKHJlcS5kZWNrcykgPiA0OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiMi00IGRlY2tzIHJlcXVpcmVkIikKICAgIGlmIG5vdCBhbGwocmVxLmRlY2tzKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgZiJBbGwge2xlbihyZXEuZGVja3MpfSBkZWNrIHNsb3RzIG11c3QgYmUgZmlsbGVkIikKICAgIGlmIHJlcS5udW1HYW1lcyA8IDEgb3IgcmVxLm51bUdhbWVzID4gMTAwMDA6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJudW1HYW1lcyBtdXN0IGJlIDEtMTAwMDAiKQogICAgaWYgcmVxLnRocmVhZHMgPCAxIG9yIHJlcS50aHJlYWRzID4gMTY6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJ0aHJlYWRzIG11c3QgYmUgMS0xNiIpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKENGRy5mb3JnZV9qYXIpOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkZvcmdlIEpBUiBub3QgZm91bmQ6IHtDRkcuZm9yZ2VfamFyfSIpCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihDRkcuZm9yZ2VfZGlyKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGb3JnZSBkaXIgbm90IGZvdW5kOiB7Q0ZHLmZvcmdlX2Rpcn0iKQoKICAgIGJhdGNoX2lkID0gc3RyKHV1aWQudXVpZDQoKSlbOjEyXQogICAgc3RhdGUgPSBCYXRjaFN0YXRlKGJhdGNoX2lkLCByZXEubnVtR2FtZXMsIHJlcS50aHJlYWRzKQogICAgYWN0aXZlX2JhdGNoZXNbYmF0Y2hfaWRdID0gc3RhdGUKCiAgICBvcy5tYWtlZGlycyhDRkcucmVzdWx0c19kaXIsIGV4aXN0X29rPVRydWUpCiAgICBvdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbihDRkcucmVzdWx0c19kaXIsIGYiYmF0Y2gte2JhdGNoX2lkfS5qc29uIikKICAgIHN0YXRlLnJlc3VsdF9wYXRoID0gb3V0cHV0X3BhdGgKCiAgICBiYWNrZ3JvdW5kX3Rhc2tzLmFkZF90YXNrKAogICAgICAgIHJ1bl9iYXRjaF9zdWJwcm9jZXNzLAogICAgICAgIHN0YXRlLAogICAgICAgIHJlcS5kZWNrcywKICAgICAgICByZXEubnVtR2FtZXMsCiAgICAgICAgcmVxLnRocmVhZHMsCiAgICAgICAgcmVxLnNlZWQsCiAgICAgICAgcmVxLmNsb2NrLAogICAgICAgIG91dHB1dF9wYXRoLAogICAgICAgIHJlcS51c2VMZWFybmVkUG9saWN5LAogICAgICAgIHJlcS5wb2xpY3lTdHlsZSwKICAgICAgICByZXEucG9saWN5R3JlZWR5LAogICAgICAgIHJlcS5haVNpbXBsaWZpZWQsCiAgICAgICAgcmVxLmFpVGhpbmtUaW1lTXMsCiAgICAgICAgcmVxLm1heFF1ZXVlRGVwdGgsCiAgICApCgogICAgcG9saWN5X21zZyA9ICIiCiAgICBpZiByZXEudXNlTGVhcm5lZFBvbGljeToKICAgICAgICBwb2xpY3lfbXNnID0gZiIgW0xlYXJuZWQgUG9saWN5OiB7cmVxLnBvbGljeVN0eWxlfV0iCiAgICByZXR1cm4gU3RhcnRSZXNwb25zZSgKICAgICAgICBiYXRjaElkPWJhdGNoX2lkLAogICAgICAgIHN0YXR1cz0ic3RhcnRlZCIsCiAgICAgICAgbWVzc2FnZT1mIlJ1bm5pbmcge3JlcS5udW1HYW1lc30gZ2FtZXMgd2l0aCB7cmVxLnRocmVhZHN9IHRocmVhZHN7cG9saWN5X21zZ30iLAogICAgKQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9zdGF0dXMiLCByZXNwb25zZV9tb2RlbD1TdGF0dXNSZXNwb25zZSkKYXN5bmMgZGVmIGdldF9zdGF0dXMoYmF0Y2hJZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUpOgogICAgIyBJZiBubyBiYXRjaElkIGdpdmVuLCBmaW5kIHRoZSBtb3N0IHJlY2VudCBhY3RpdmUgKG9yIGxhc3QpIGJhdGNoCiAgICBzdGF0ZSA9IE5vbmUKICAgIGlmIGJhdGNoSWQ6CiAgICAgICAgc3RhdGUgPSBhY3RpdmVfYmF0Y2hlcy5nZXQoYmF0Y2hJZCkKICAgIGVsc2U6CiAgICAgICAgIyBSZXR1cm4gdGhlIG1vc3QgcmVjZW50bHkgYWN0aXZlIGJhdGNoLCBvciBhbnkgYmF0Y2gKICAgICAgICBmb3IgcyBpbiBhY3RpdmVfYmF0Y2hlcy52YWx1ZXMoKToKICAgICAgICAgICAgaWYgcy5ydW5uaW5nOgogICAgICAgICAgICAgICAgc3RhdGUgPSBzCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHN0YXRlIGlzIE5vbmUgYW5kIGFjdGl2ZV9iYXRjaGVzOgogICAgICAgICAgICBzdGF0ZSA9IGxpc3QoYWN0aXZlX2JhdGNoZXMudmFsdWVzKCkpWy0xXQogICAgaWYgbm90IHN0YXRlOgogICAgICAgIHJldHVybiBTdGF0dXNSZXNwb25zZSgKICAgICAgICAgICAgYmF0Y2hJZD0iIiwgcnVubmluZz1GYWxzZSwgY29tcGxldGVkPTAsIHRvdGFsPTAsCiAgICAgICAgICAgIHRocmVhZHM9MCwgZWxhcHNlZE1zPTAsIGVycm9yPU5vbmUsIHNpbXNQZXJTZWM9MC4wLAogICAgICAgICAgICBydW5faWQ9IiIsIGdhbWVzX2NvbXBsZXRlZD0wLCB0b3RhbF9nYW1lcz0wLCBjdXJyZW50X2RlY2tzPVtdLAogICAgICAgICkKICAgIGVsYXBzZWQgPSBpbnQoKGRhdGV0aW1lLm5vdygpIC0gc3RhdGUuc3RhcnRfdGltZSkudG90YWxfc2Vjb25kcygpICogMTAwMCkKICAgIGRlY2tfbmFtZXMgPSBnZXRhdHRyKHN0YXRlLCAnZGVja19uYW1lcycsIFtdKSBpZiBoYXNhdHRyKHN0YXRlLCAnZGVja19uYW1lcycpIGVsc2UgW10KICAgIHJldHVybiBTdGF0dXNSZXNwb25zZSgKICAgICAgICBiYXRjaElkPXN0YXRlLmJhdGNoX2lkLAogICAgICAgIHJ1bm5pbmc9c3RhdGUucnVubmluZywKICAgICAgICBjb21wbGV0ZWQ9c3RhdGUuY29tcGxldGVkX2dhbWVzLAogICAgICAgIHRvdGFsPXN0YXRlLnRvdGFsX2dhbWVzLAogICAgICAgIHRocmVhZHM9c3RhdGUudGhyZWFkcywKICAgICAgICBlbGFwc2VkTXM9ZWxhcHNlZCBpZiBzdGF0ZS5ydW5uaW5nIGVsc2Ugc3RhdGUuZWxhcHNlZF9tcywKICAgICAgICBlcnJvcj1zdGF0ZS5lcnJvciwKICAgICAgICBzaW1zUGVyU2VjPXN0YXRlLnNpbXNfcGVyX3NlYywKICAgICAgICAjIFJlYWN0IFNQQSBmaWVsZHMKICAgICAgICBydW5faWQ9c3RhdGUuYmF0Y2hfaWQsCiAgICAgICAgZ2FtZXNfY29tcGxldGVkPXN0YXRlLmNvbXBsZXRlZF9nYW1lcywKICAgICAgICB0b3RhbF9nYW1lcz1zdGF0ZS50b3RhbF9nYW1lcywKICAgICAgICBjdXJyZW50X2RlY2tzPWRlY2tfbmFtZXMsCiAgICApCgoKQGFwcC5nZXQoIi9hcGkvbGFiL3Jlc3VsdCIpCmFzeW5jIGRlZiBnZXRfcmVzdWx0KGJhdGNoSWQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lKToKICAgIHN0YXRlID0gTm9uZQogICAgaWYgYmF0Y2hJZDoKICAgICAgICBzdGF0ZSA9IGFjdGl2ZV9iYXRjaGVzLmdldChiYXRjaElkKQogICAgZWxzZToKICAgICAgICAjIEZpbmQgbW9zdCByZWNlbnQgY29tcGxldGVkIGJhdGNoCiAgICAgICAgZm9yIHMgaW4gcmV2ZXJzZWQobGlzdChhY3RpdmVfYmF0Y2hlcy52YWx1ZXMoKSkpOgogICAgICAgICAgICBpZiBub3Qgcy5ydW5uaW5nIGFuZCBzLnJlc3VsdF9wYXRoOgogICAgICAgICAgICAgICAgc3RhdGUgPSBzCiAgICAgICAgICAgICAgICBicmVhawogICAgaWYgbm90IHN0YXRlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCAiTm8gYmF0Y2ggcmVzdWx0IGF2YWlsYWJsZSIpCiAgICBpZiBzdGF0ZS5ydW5uaW5nOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiQmF0Y2ggc3RpbGwgcnVubmluZyIpCiAgICBpZiBzdGF0ZS5lcnJvcjoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgc3RhdGUuZXJyb3IpCiAgICBpZiBub3Qgc3RhdGUucmVzdWx0X3BhdGggb3Igbm90IG9zLnBhdGguZXhpc3RzKHN0YXRlLnJlc3VsdF9wYXRoKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIlJlc3VsdCBmaWxlIG5vdCBmb3VuZCIpCiAgICB3aXRoIG9wZW4oc3RhdGUucmVzdWx0X3BhdGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICBkYXRhID0ganNvbi5sb2FkKGYpCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKGNvbnRlbnQ9ZGF0YSkKCgpAYXBwLmdldCgiL2FwaS9sYWIvZGVja3MiKQphc3luYyBkZWYgbGlzdF9kZWNrcygpOgogICAgZGVja3MgPSBbXQogICAgc2Vlbl9uYW1lcyA9IHNldCgpCgogICAgIyAxLiBGb3JnZSAuZGNrIGZpbGVzIGZyb20gZGVja3MgZGlyZWN0b3J5CiAgICBkZWNrc19kaXIgPSBDRkcuZm9yZ2VfZGVja3NfZGlyCiAgICBpZiBkZWNrc19kaXIgYW5kIG9zLnBhdGguaXNkaXIoZGVja3NfZGlyKToKICAgICAgICBmb3IgZiBpbiBzb3J0ZWQoUGF0aChkZWNrc19kaXIpLmdsb2IoIiouZGNrIikpOgogICAgICAgICAgICBkZWNrX25hbWUgPSBmLnN0ZW0KICAgICAgICAgICAgZGVja3MuYXBwZW5kKHsibmFtZSI6IGRlY2tfbmFtZSwgImZpbGVuYW1lIjogZi5uYW1lLCAic291cmNlIjogImZvcmdlIn0pCiAgICAgICAgICAgIHNlZW5fbmFtZXMuYWRkKGRlY2tfbmFtZS5sb3dlcigpKQoKICAgICMgMi4gRGVja3MgZnJvbSB0aGUgRGVjayBCdWlsZGVyIGRhdGFiYXNlCiAgICB0cnk6CiAgICAgICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICAgICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBpZCwgbmFtZSwgY29tbWFuZGVyX25hbWUgRlJPTSBkZWNrcyBPUkRFUiBCWSBpZCBERVNDIgogICAgICAgICkuZmV0Y2hhbGwoKQogICAgICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICAgICAgZGJfbmFtZSA9IHJvd1sibmFtZSJdCiAgICAgICAgICAgIGlmIGRiX25hbWUubG93ZXIoKSBub3QgaW4gc2Vlbl9uYW1lczoKICAgICAgICAgICAgICAgIGRlY2tzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBkYl9uYW1lLAogICAgICAgICAgICAgICAgICAgICJmaWxlbmFtZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiZGVja2J1aWxkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZWNrX2lkIjogcm93WyJpZCJdLAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kZXIiOiByb3dbImNvbW1hbmRlcl9uYW1lIl0gb3IgIiIsCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgc2Vlbl9uYW1lcy5hZGQoZGJfbmFtZS5sb3dlcigpKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZy53YXJuaW5nKGYiICBXQVJOSU5HOiBGYWlsZWQgdG8gbG9hZCBEQiBkZWNrcyBmb3IgL2FwaS9sYWIvZGVja3M6IHtlfSIpCgogICAgcmV0dXJuIHsiZGVja3MiOiBkZWNrc30KCgpAYXBwLmdldCgiL2FwaS9sYWIvaGlzdG9yeSIpCmFzeW5jIGRlZiBsaXN0X2hpc3RvcnkoKToKICAgIHJlc3VsdHNfZGlyID0gUGF0aChDRkcucmVzdWx0c19kaXIpCiAgICBpZiBub3QgcmVzdWx0c19kaXIuZXhpc3RzKCk6CiAgICAgICAgcmV0dXJuIHsicmVzdWx0cyI6IFtdfQogICAgcmVzdWx0cyA9IFtdCiAgICBmb3IgZiBpbiBzb3J0ZWQocmVzdWx0c19kaXIuZ2xvYigiYmF0Y2gtKi5qc29uIiksIHJldmVyc2U9VHJ1ZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZiwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaDoKICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWQoZmgpCiAgICAgICAgICAgIG1ldGEgPSBkYXRhLmdldCgibWV0YWRhdGEiLCB7fSkKICAgICAgICAgICAgZGVja3MgPSBkYXRhLmdldCgiZGVja3MiLCBbXSkKICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoewogICAgICAgICAgICAgICAgImZpbGVuYW1lIjogZi5uYW1lLAogICAgICAgICAgICAgICAgImJhdGNoSWQiOiBtZXRhLmdldCgiYmF0Y2hJZCIsICIiKSwKICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiOiBtZXRhLmdldCgidGltZXN0YW1wIiwgIiIpLAogICAgICAgICAgICAgICAgInRvdGFsR2FtZXMiOiBtZXRhLmdldCgiY29tcGxldGVkR2FtZXMiLCAwKSwKICAgICAgICAgICAgICAgICJ0aHJlYWRzIjogbWV0YS5nZXQoInRocmVhZHMiLCAxKSwKICAgICAgICAgICAgICAgICJlbGFwc2VkTXMiOiBtZXRhLmdldCgiZWxhcHNlZE1zIiwgMCksCiAgICAgICAgICAgICAgICAiZGVja3MiOiBbeyJuYW1lIjogZC5nZXQoImRlY2tOYW1lIiwgIiIpLCAic291cmNlIjogZC5nZXQoInNvdXJjZSIsICIiKX0gZm9yIGQgaW4gZGVja3NdLAogICAgICAgICAgICB9KQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICByZXR1cm4geyJyZXN1bHRzIjogcmVzdWx0c1s6NTBdfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQUkgUHJvZmlsZXMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkFJX1BST0ZJTEVTID0gewogICAgImRlZmF1bHQiOiB7CiAgICAgICAgIm5hbWUiOiAiZGVmYXVsdCIsCiAgICAgICAgImRlc2NyaXB0aW9uIjogIkJhbGFuY2VkIFx1MjAxNCBGb3JnZSdzIGRlZmF1bHQgQUkgYmVoYXZpb3IiLAogICAgICAgICJhZ2dyZXNzaW9uIjogMC41LCAiY2FyZEFkdmFudGFnZSI6IDAuNSwgInJlbW92YWxQcmlvcml0eSI6IDAuNSwKICAgICAgICAiYm9hcmRQcmVzZW5jZSI6IDAuNSwgImNvbWJvUHJpb3JpdHkiOiAwLjMsICJwYXRpZW5jZSI6IDAuNSwKICAgIH0sCiAgICAiYWdncm8iOiB7CiAgICAgICAgIm5hbWUiOiAiYWdncm8iLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJBZ2dyZXNzaXZlIFx1MjAxNCBhdHRhY2tzIGVhcmx5LCBwcmlvcml0aXplcyBkYW1hZ2UiLAogICAgICAgICJhZ2dyZXNzaW9uIjogMC45LCAiY2FyZEFkdmFudGFnZSI6IDAuMywgInJlbW92YWxQcmlvcml0eSI6IDAuMywKICAgICAgICAiYm9hcmRQcmVzZW5jZSI6IDAuOCwgImNvbWJvUHJpb3JpdHkiOiAwLjEsICJwYXRpZW5jZSI6IDAuMSwKICAgIH0sCiAgICAiY29udHJvbCI6IHsKICAgICAgICAibmFtZSI6ICJjb250cm9sIiwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29udHJvbCBcdTIwMTQgZGVmZW5zaXZlLCByZW1vdmFsLWhlYXZ5LCBjYXJkIGFkdmFudGFnZSIsCiAgICAgICAgImFnZ3Jlc3Npb24iOiAwLjIsICJjYXJkQWR2YW50YWdlIjogMC45LCAicmVtb3ZhbFByaW9yaXR5IjogMC45LAogICAgICAgICJib2FyZFByZXNlbmNlIjogMC4zLCAiY29tYm9Qcmlvcml0eSI6IDAuNCwgInBhdGllbmNlIjogMC45LAogICAgfSwKICAgICJjb21ibyI6IHsKICAgICAgICAibmFtZSI6ICJjb21ibyIsCiAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbWJvIFx1MjAxNCByYW1wcywgZGlncyBmb3IgcGllY2VzLCBhc3NlbWJsZXMgY29tYm9zIiwKICAgICAgICAiYWdncmVzc2lvbiI6IDAuMiwgImNhcmRBZHZhbnRhZ2UiOiAwLjgsICJyZW1vdmFsUHJpb3JpdHkiOiAwLjQsCiAgICAgICAgImJvYXJkUHJlc2VuY2UiOiAwLjMsICJjb21ib1ByaW9yaXR5IjogMC45NSwgInBhdGllbmNlIjogMC43LAogICAgfSwKICAgICJtaWRyYW5nZSI6IHsKICAgICAgICAibmFtZSI6ICJtaWRyYW5nZSIsCiAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pZHJhbmdlIFx1MjAxNCBmbGV4aWJsZSwgc3Ryb25nIGJvYXJkIHByZXNlbmNlLCB2YWx1ZS1vcmllbnRlZCIsCiAgICAgICAgImFnZ3Jlc3Npb24iOiAwLjUsICJjYXJkQWR2YW50YWdlIjogMC42LCAicmVtb3ZhbFByaW9yaXR5IjogMC42LAogICAgICAgICJib2FyZFByZXNlbmNlIjogMC43LCAiY29tYm9Qcmlvcml0eSI6IDAuMywgInBhdGllbmNlIjogMC41LAogICAgfSwKfQoKQGFwcC5nZXQoIi9hcGkvbGFiL3Byb2ZpbGVzIikKYXN5bmMgZGVmIGxpc3RfcHJvZmlsZXMoKToKICAgIHJldHVybiB7InByb2ZpbGVzIjogbGlzdChBSV9QUk9GSUxFUy52YWx1ZXMoKSl9CgpAYXBwLmdldCgiL2FwaS9sYWIvcHJvZmlsZXMve25hbWV9IikKYXN5bmMgZGVmIGdldF9wcm9maWxlKG5hbWU6IHN0cik6CiAgICBwcm9maWxlID0gQUlfUFJPRklMRVMuZ2V0KG5hbWUubG93ZXIoKSkKICAgIGlmIG5vdCBwcm9maWxlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIlByb2ZpbGUgJ3tuYW1lfScgbm90IGZvdW5kLiBBdmFpbGFibGU6IHtsaXN0KEFJX1BST0ZJTEVTLmtleXMoKSl9IikKICAgIHJldHVybiBwcm9maWxlCgoKQGFwcC5nZXQoIi9hcGkvbGFiL2FuYWx5dGljcy97ZGVja19uYW1lfSIpCmFzeW5jIGRlZiBhbmFseXplX2RlY2soZGVja19uYW1lOiBzdHIpOgogICAgZGVja3NfZGlyID0gQ0ZHLmZvcmdlX2RlY2tzX2RpcgogICAgaWYgbm90IGRlY2tzX2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihkZWNrc19kaXIpOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkRlY2tzIGRpcmVjdG9yeSBub3QgZm91bmQ6IHtkZWNrc19kaXJ9IikKICAgIGRlY2tfcGF0aCA9IG9zLnBhdGguam9pbihkZWNrc19kaXIsIGRlY2tfbmFtZSArICIuZGNrIikKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZWNrX3BhdGgpOgogICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIoZGVja3NfZGlyKToKICAgICAgICAgICAgaWYgZi5sb3dlcigpID09IGRlY2tfbmFtZS5sb3dlcigpICsgIi5kY2siOgogICAgICAgICAgICAgICAgZGVja19wYXRoID0gb3MucGF0aC5qb2luKGRlY2tzX2RpciwgZikKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiRGVjayBub3QgZm91bmQ6IHtkZWNrX25hbWV9IikKICAgIHRyeToKICAgICAgICBhbmFseXNpcyA9IHBhcnNlX2Rja19maWxlKGRlY2tfcGF0aCkKICAgICAgICByZXR1cm4gYW5hbHlzaXMKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJBbmFseXNpcyBmYWlsZWQ6IHtzdHIoZSl9IikKCgpkZWYgcGFyc2VfZGNrX2ZpbGUoZGVja19wYXRoOiBzdHIpIC0+IGRpY3Q6CiAgICBjYXJkcyA9IFtdCiAgICBjb21tYW5kZXIgPSBOb25lCiAgICBzZWN0aW9uID0gIk1haW4iCiAgICBkZWNrX25hbWUgPSBQYXRoKGRlY2tfcGF0aCkuc3RlbQogICAgd2l0aCBvcGVuKGRlY2tfcGF0aCwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCIvLyIpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbIikgYW5kIGxpbmUuZW5kc3dpdGgoIl0iKToKICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBsaW5lWzE6LTFdCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIk5hbWU9Iik6CiAgICAgICAgICAgICAgICBkZWNrX25hbWUgPSBsaW5lWzU6XS5zdHJpcCgpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBtID0gcmUubWF0Y2gociJeKFxkKylccysoLis/KSg/Olx8KC4rKSk/JCIsIGxpbmUpCiAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICBxdHkgPSBpbnQobS5ncm91cCgxKSkKICAgICAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDIpLnN0cmlwKCkKICAgICAgICAgICAgICAgIHNldF9jb2RlID0gbS5ncm91cCgzKS5zdHJpcCgpIGlmIG0uZ3JvdXAoMykgZWxzZSAiIgogICAgICAgICAgICAgICAgY2FyZHMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAicXVhbnRpdHkiOiBxdHksICJuYW1lIjogbmFtZSwgInNldCI6IHNldF9jb2RlLAogICAgICAgICAgICAgICAgICAgICJzZWN0aW9uIjogc2VjdGlvbiwKICAgICAgICAgICAgICAgICAgICAiaXNfY29tbWFuZGVyIjogMSBpZiBzZWN0aW9uID09ICJDb21tYW5kZXIiIGVsc2UgMCwKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICBpZiBzZWN0aW9uID09ICJDb21tYW5kZXIiOgogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlciA9IG5hbWUKICAgIHRvdGFsID0gc3VtKGNbInF1YW50aXR5Il0gZm9yIGMgaW4gY2FyZHMpCiAgICByZXR1cm4gewogICAgICAgICJkZWNrTmFtZSI6IGRlY2tfbmFtZSwKICAgICAgICAiY29tbWFuZGVyTmFtZSI6IGNvbW1hbmRlciwKICAgICAgICAidG90YWxDYXJkcyI6IHRvdGFsLAogICAgICAgICJjYXJkQ291bnQiOiBsZW4oY2FyZHMpLAogICAgICAgICJjYXJkcyI6IGNhcmRzWzoyMDBdLAogICAgfQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi90cmVuZHMve2RlY2tfbmFtZX0iKQphc3luYyBkZWYgZ2V0X2RlY2tfdHJlbmRzKGRlY2tfbmFtZTogc3RyKToKICAgIHJlc3VsdHNfZGlyID0gUGF0aChDRkcucmVzdWx0c19kaXIpCiAgICBpZiBub3QgcmVzdWx0c19kaXIuZXhpc3RzKCk6CiAgICAgICAgcmV0dXJuIHsiZGVja05hbWUiOiBkZWNrX25hbWUsICJoaXN0b3J5IjogW119CiAgICBoaXN0b3J5ID0gW10KICAgIGZvciBmIGluIHNvcnRlZChyZXN1bHRzX2Rpci5nbG9iKCJiYXRjaC0qLmpzb24iKSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZiwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaDoKICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWQoZmgpCiAgICAgICAgICAgIHN1bW1hcnkgPSBkYXRhLmdldCgic3VtbWFyeSIsIHt9KQogICAgICAgICAgICBtZXRhID0gZGF0YS5nZXQoIm1ldGFkYXRhIiwge30pCiAgICAgICAgICAgIHBlcl9kZWNrID0gc3VtbWFyeS5nZXQoInBlckRlY2siLCBbXSkKICAgICAgICAgICAgZm9yIGRzIGluIHBlcl9kZWNrOgogICAgICAgICAgICAgICAgaWYgZHMuZ2V0KCJkZWNrTmFtZSIsICIiKS5sb3dlcigpID09IGRlY2tfbmFtZS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAgICAgImJhdGNoSWQiOiBtZXRhLmdldCgiYmF0Y2hJZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIjogbWV0YS5nZXQoInRpbWVzdGFtcCIpLAogICAgICAgICAgICAgICAgICAgICAgICAid2luUmF0ZSI6IGRzLmdldCgid2luUmF0ZSIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAid2lucyI6IGRzLmdldCgid2lucyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAibG9zc2VzIjogZHMuZ2V0KCJsb3NzZXMiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgImRyYXdzIjogZHMuZ2V0KCJkcmF3cyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAidG90YWxHYW1lcyI6IG1ldGEuZ2V0KCJjb21wbGV0ZWRHYW1lcyIsIDApLAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjb250aW51ZQogICAgcmV0dXJuIHsiZGVja05hbWUiOiBkZWNrX25hbWUsICJoaXN0b3J5IjogaGlzdG9yeX0KCgpAYXBwLmdldCgiL2FwaS9sYWIvbG9nIikKYXN5bmMgZGVmIGdldF9sb2coYmF0Y2hJZDogc3RyKToKICAgIHN0YXRlID0gYWN0aXZlX2JhdGNoZXMuZ2V0KGJhdGNoSWQpCiAgICBpZiBub3Qgc3RhdGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiQmF0Y2gge2JhdGNoSWR9IG5vdCBmb3VuZCIpCiAgICByZXR1cm4geyJsaW5lcyI6IHN0YXRlLmxvZ19saW5lc1stMjAwOl19CgoKQGFwcC5nZXQoIi9hcGkvbGFiL2RlYnVnLWxvZyIpCmFzeW5jIGRlZiBnZXRfZGVidWdfbG9nKCk6CiAgICAiIiJSZXR1cm4gdGhlIHJhdyBGb3JnZSBzdWJwcm9jZXNzIGRlYnVnIGxvZyBmb3IgZGlhZ25vc2luZyBzaW11bGF0aW9uIGlzc3Vlcy4iIiIKICAgICMgQ2hlY2sgbXVsdGlwbGUgcG9zc2libGUgbG9jYXRpb25zIGZvciB0aGUgZGVidWcgbG9nCiAgICBjYW5kaWRhdGVzID0gW10KICAgIGlmIENGRy5mb3JnZV9kaXI6CiAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoUGF0aChDRkcuZm9yZ2VfZGlyKS5wYXJlbnQgLyAiZm9yZ2Utc2ltLWRlYnVnLmxvZyIpCiAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoUGF0aChDRkcuZm9yZ2VfZGlyKSAvICJmb3JnZS1zaW0tZGVidWcubG9nIikKICAgIGNhbmRpZGF0ZXMuYXBwZW5kKFBhdGgoImZvcmdlLXNpbS1kZWJ1Zy5sb2ciKSkKCiAgICBmb3IgbG9nX3BhdGggaW4gY2FuZGlkYXRlczoKICAgICAgICBpZiBsb2dfcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgdGV4dCA9IGxvZ19wYXRoLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKQogICAgICAgICAgICAjIFJldHVybiBsYXN0IDUwS0IgdG8gYXZvaWQgaHVnZSByZXNwb25zZXMKICAgICAgICAgICAgaWYgbGVuKHRleHQpID4gNTAwMDA6CiAgICAgICAgICAgICAgICB0ZXh0ID0gIi4uLiAodHJ1bmNhdGVkKSAuLi5cbiIgKyB0ZXh0Wy01MDAwMDpdCiAgICAgICAgICAgIHJldHVybiB7InBhdGgiOiBzdHIobG9nX3BhdGgpLCAiY29udGVudCI6IHRleHR9CgogICAgcmV0dXJuIHsicGF0aCI6IE5vbmUsICJjb250ZW50IjogIk5vIGRlYnVnIGxvZyBmb3VuZC4gUnVuIGEgc2ltdWxhdGlvbiBmaXJzdC4ifQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUHJlY29uIERlY2tzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpQUkVDT05fRElSID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gInByZWNvbi1kZWNrcyIKUFJFQ09OX0lOREVYOiBsaXN0W2RpY3RdID0gW10KCgpkZWYgbG9hZF9wcmVjb25faW5kZXgoKToKICAgIGdsb2JhbCBQUkVDT05fSU5ERVgKICAgIGlkeF9wYXRoID0gUFJFQ09OX0RJUiAvICJwcmVjb24taW5kZXguanNvbiIKICAgIGlmIGlkeF9wYXRoLmV4aXN0cygpOgogICAgICAgIHdpdGggb3BlbihpZHhfcGF0aCwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICBQUkVDT05fSU5ERVggPSBqc29uLmxvYWQoZikKICAgICAgICBsb2cuaW5mbyhmIiAgUHJlY29uczogICAgICB7bGVuKFBSRUNPTl9JTkRFWCl9IHByZWNvbiBkZWNrcyBsb2FkZWQiKQogICAgZWxzZToKICAgICAgICBQUkVDT05fSU5ERVggPSBbXQogICAgICAgIGxvZy5pbmZvKGYiICBQcmVjb25zOiAgICAgIGluZGV4IG5vdCBmb3VuZCBhdCB7aWR4X3BhdGh9IikKCgpAYXBwLmdldCgiL2FwaS9sYWIvcHJlY29ucyIpCmFzeW5jIGRlZiBsaXN0X3ByZWNvbnMoKToKICAgICIiIkxpc3QgYWxsIGF2YWlsYWJsZSBwcmVjb24gZGVja3MuIiIiCiAgICByZXR1cm4geyJwcmVjb25zIjogUFJFQ09OX0lOREVYfQoKCkBhcHAucG9zdCgiL2FwaS9sYWIvcHJlY29ucy9pbnN0YWxsIikKYXN5bmMgZGVmIGluc3RhbGxfcHJlY29uKHJlcTogZGljdCk6CiAgICAiIiJJbnN0YWxsIGEgcHJlY29uIGRlY2sgdG8gdGhlIEZvcmdlIGRlY2tzIGRpcmVjdG9yeS4KICAgIEJvZHk6IHsiZmlsZU5hbWUiOiAiRWx2ZW5fRW1waXJlLmRjayJ9CiAgICAiIiIKICAgIGZpbGVfbmFtZSA9IHJlcS5nZXQoImZpbGVOYW1lIiwgIiIpCiAgICBpZiBub3QgZmlsZV9uYW1lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiZmlsZU5hbWUgaXMgcmVxdWlyZWQiKQoKICAgIHNyYyA9IFBSRUNPTl9ESVIgLyBmaWxlX25hbWUKICAgIGlmIG5vdCBzcmMuZXhpc3RzKCk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiUHJlY29uIG5vdCBmb3VuZDoge2ZpbGVfbmFtZX0iKQoKICAgIGRlY2tzX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgIGlmIG5vdCBkZWNrc19kaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoZGVja3NfZGlyKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGb3JnZSBkZWNrcyBkaXJlY3Rvcnkgbm90IGZvdW5kOiB7ZGVja3NfZGlyfSIpCgogICAgaW1wb3J0IHNodXRpbAogICAgZHN0ID0gUGF0aChkZWNrc19kaXIpIC8gZmlsZV9uYW1lCiAgICBzaHV0aWwuY29weTIoc3RyKHNyYyksIHN0cihkc3QpKQoKICAgIGRlY2tfbmFtZSA9IGZpbGVfbmFtZS5yZXBsYWNlKCIuZGNrIiwgIiIpCiAgICByZXR1cm4gewogICAgICAgICJpbnN0YWxsZWQiOiBUcnVlLAogICAgICAgICJkZWNrTmFtZSI6IGRlY2tfbmFtZSwKICAgICAgICAiZGVzdGluYXRpb24iOiBzdHIoZHN0KSwKICAgICAgICAibWVzc2FnZSI6IGYiSW5zdGFsbGVkIHtkZWNrX25hbWV9IHRvIEZvcmdlIGRlY2tzIiwKICAgIH0KCgpAYXBwLnBvc3QoIi9hcGkvbGFiL3ByZWNvbnMvaW5zdGFsbC1iYXRjaCIpCmFzeW5jIGRlZiBpbnN0YWxsX3ByZWNvbnNfYmF0Y2gocmVxOiBkaWN0KToKICAgICIiIkluc3RhbGwgbXVsdGlwbGUgcHJlY29uIGRlY2tzIGF0IG9uY2UuCiAgICBCb2R5OiB7ImZpbGVOYW1lcyI6IFsiRWx2ZW5fRW1waXJlLmRjayIsICJOZWNyb25fRHluYXN0aWVzLmRjayJdfQogICAgIiIiCiAgICBmaWxlX25hbWVzID0gcmVxLmdldCgiZmlsZU5hbWVzIiwgW10pCiAgICBpZiBub3QgZmlsZV9uYW1lczoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgImZpbGVOYW1lcyBsaXN0IGlzIHJlcXVpcmVkIikKCiAgICBkZWNrc19kaXIgPSBDRkcuZm9yZ2VfZGVja3NfZGlyCiAgICBpZiBub3QgZGVja3NfZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKGRlY2tzX2Rpcik6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiRm9yZ2UgZGVja3MgZGlyZWN0b3J5IG5vdCBmb3VuZDoge2RlY2tzX2Rpcn0iKQoKICAgIGltcG9ydCBzaHV0aWwKICAgIHJlc3VsdHMgPSBbXQogICAgZm9yIGZpbGVfbmFtZSBpbiBmaWxlX25hbWVzOgogICAgICAgIHNyYyA9IFBSRUNPTl9ESVIgLyBmaWxlX25hbWUKICAgICAgICBpZiBub3Qgc3JjLmV4aXN0cygpOgogICAgICAgICAgICByZXN1bHRzLmFwcGVuZCh7ImZpbGVOYW1lIjogZmlsZV9uYW1lLCAiaW5zdGFsbGVkIjogRmFsc2UsICJlcnJvciI6ICJub3QgZm91bmQifSkKICAgICAgICAgICAgY29udGludWUKICAgICAgICBkc3QgPSBQYXRoKGRlY2tzX2RpcikgLyBmaWxlX25hbWUKICAgICAgICBzaHV0aWwuY29weTIoc3RyKHNyYyksIHN0cihkc3QpKQogICAgICAgIGRlY2tfbmFtZSA9IGZpbGVfbmFtZS5yZXBsYWNlKCIuZGNrIiwgIiIpCiAgICAgICAgcmVzdWx0cy5hcHBlbmQoeyJmaWxlTmFtZSI6IGZpbGVfbmFtZSwgImluc3RhbGxlZCI6IFRydWUsICJkZWNrTmFtZSI6IGRlY2tfbmFtZX0pCgogICAgcmV0dXJuIHsicmVzdWx0cyI6IHJlc3VsdHN9CgoKIyDilIDilIAgUHJlY29uIEF1dG8tRG93bmxvYWQgZnJvbSBHaXRIdWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpHSVRIVUJfUFJFQ09OX1VSTCA9ICgKICAgICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vdGF3L21hZ2ljLXByZWNvbnN0cnVjdGVkLWRlY2tzLWRhdGEvIgogICAgIm1hc3Rlci9kZWNrc192Mi5qc29uIgopClBSRUNPTl9DQUNIRV9IT1VSUyA9IDE2OCAgIyByZS1kb3dubG9hZCB3ZWVrbHkKCgpkZWYgX2NvbG9yX2lkZW50aXR5X2Zyb21fY2FyZHMoZGVja19kYXRhOiBkaWN0KSAtPiBsaXN0W3N0cl06CiAgICAiIiJFeHRyYWN0IGFwcHJveGltYXRlIGNvbG9yIGlkZW50aXR5IGZyb20gY29tbWFuZGVyIHNlY3Rpb24uIiIiCiAgICAjIFRoZSBkYXRhIGRvZXNuJ3QgaW5jbHVkZSBjb2xvciBpbmZvIGRpcmVjdGx5LCBzbyB3ZSB0cmFjayB3aGF0IHdlIGNhbgogICAgIyBmcm9tIGNvbW1hbmRlciBuYW1lcyDigJQgYnV0IHdlIGp1c3QgbGVhdmUgaXQgYXMgYSBzZWFyY2hhYmxlIGZpZWxkLgogICAgcmV0dXJuIFtdCgoKZGVmIF9zYW5pdGl6ZV9maWxlbmFtZShuYW1lOiBzdHIpIC0+IHN0cjoKICAgICIiIlR1cm4gYSBkZWNrIG5hbWUgaW50byBhIHNhZmUgZmlsZW5hbWUuIiIiCiAgICBzYWZlID0gcmUuc3ViKHInWzw+OiIvXFx8PypdJywgJycsIG5hbWUpCiAgICBzYWZlID0gc2FmZS5yZXBsYWNlKCcgJywgJ18nKS5yZXBsYWNlKCInIiwgJycpLnJlcGxhY2UoJyEnLCAnJykKICAgIHNhZmUgPSByZS5zdWIocidfKycsICdfJywgc2FmZSkuc3RyaXAoJ18nKQogICAgcmV0dXJuIHNhZmUKCgpkZWYgX2RlY2tfdG9fZGNrKGRlY2tfZGF0YTogZGljdCkgLT4gc3RyOgogICAgIiIiQ29udmVydCBhIGRlY2sgZW50cnkgZnJvbSBkZWNrc192Mi5qc29uIGludG8gLmRjayBmb3JtYXQuIiIiCiAgICBsaW5lcyA9IFtdCiAgICBsaW5lcy5hcHBlbmQoIlttZXRhZGF0YV0iKQogICAgbGluZXMuYXBwZW5kKGYiTmFtZT17ZGVja19kYXRhWyduYW1lJ119IikKCiAgICAjIENvbW1hbmRlciBzZWN0aW9uCiAgICBjb21tYW5kZXJzID0gZGVja19kYXRhLmdldCgnY29tbWFuZGVyJywgW10pCiAgICBpZiBjb21tYW5kZXJzOgogICAgICAgIGxpbmVzLmFwcGVuZCgiW0NvbW1hbmRlcl0iKQogICAgICAgIGZvciBjYXJkIGluIGNvbW1hbmRlcnM6CiAgICAgICAgICAgIGNvdW50ID0gY2FyZC5nZXQoJ2NvdW50JywgMSkKICAgICAgICAgICAgbGluZXMuYXBwZW5kKGYie2NvdW50fSB7Y2FyZFsnbmFtZSddfSIpCgogICAgIyBNYWluIGRlY2sKICAgIGNhcmRzID0gZGVja19kYXRhLmdldCgnY2FyZHMnLCBbXSkKICAgIGlmIGNhcmRzOgogICAgICAgIGxpbmVzLmFwcGVuZCgiW01haW5dIikKICAgICAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICAgICAgY291bnQgPSBjYXJkLmdldCgnY291bnQnLCAxKQogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7Y291bnR9IHtjYXJkWyduYW1lJ119IikKCiAgICAjIFNpZGVib2FyZCAocmFyZSBpbiBDb21tYW5kZXIgYnV0IGluY2x1ZGUgaWYgcHJlc2VudCkKICAgIHNpZGVib2FyZCA9IGRlY2tfZGF0YS5nZXQoJ3NpZGVib2FyZCcsIFtdKQogICAgaWYgc2lkZWJvYXJkOgogICAgICAgIGxpbmVzLmFwcGVuZCgiW1NpZGVib2FyZF0iKQogICAgICAgIGZvciBjYXJkIGluIHNpZGVib2FyZDoKICAgICAgICAgICAgY291bnQgPSBjYXJkLmdldCgnY291bnQnLCAxKQogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7Y291bnR9IHtjYXJkWyduYW1lJ119IikKCiAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKSArICJcbiIKCgpkZWYgZG93bmxvYWRfcHJlY29uX2RhdGFiYXNlKGZvcmNlOiBib29sID0gRmFsc2UpIC0+IGRpY3Q6CiAgICAiIiIKICAgIERvd25sb2FkIGFsbCBDb21tYW5kZXIgcHJlY29uIGRlY2tzIGZyb20gR2l0SHViLCBjb252ZXJ0IHRvIC5kY2ssCiAgICBhbmQgcmVidWlsZCBwcmVjb24taW5kZXguanNvbi4gIFNraXBzIGlmIGluZGV4IGlzIGZyZXNoICg8IFBSRUNPTl9DQUNIRV9IT1VSUyBvbGQpCiAgICB1bmxlc3MgZm9yY2U9VHJ1ZS4KCiAgICBSZXR1cm5zIHsiZG93bmxvYWRlZCI6IGludCwgInNraXBwZWQiOiBib29sLCAiZXJyb3IiOiBzdHJ8Tm9uZX0KICAgICIiIgogICAgZ2xvYmFsIFBSRUNPTl9JTkRFWAogICAgaWR4X3BhdGggPSBQUkVDT05fRElSIC8gInByZWNvbi1pbmRleC5qc29uIgoKICAgICMg4pSA4pSAIENhY2hlIGNoZWNrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgbm90IGZvcmNlIGFuZCBpZHhfcGF0aC5leGlzdHMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihpZHhfcGF0aCwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBqc29uLmxvYWQoZikKICAgICAgICAgICAgIyBJZiB3ZSBoYXZlIGEgc3Vic3RhbnRpYWwgbnVtYmVyIG9mIGRlY2tzIGFuZCBmaWxlIGlzIHJlY2VudCwgc2tpcAogICAgICAgICAgICBpZiBsZW4oZXhpc3RpbmcpID4gNTA6CiAgICAgICAgICAgICAgICBhZ2VfaG91cnMgPSAodGltZS50aW1lKCkgLSBpZHhfcGF0aC5zdGF0KCkuc3RfbXRpbWUpIC8gMzYwMAogICAgICAgICAgICAgICAgaWYgYWdlX2hvdXJzIDwgUFJFQ09OX0NBQ0hFX0hPVVJTOgogICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGYiICBQcmVjb25zOiAgICAgIHtsZW4oZXhpc3RpbmcpfSBkZWNrcyBjYWNoZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgIGYiKHthZ2VfaG91cnM6LjBmfWggb2xkLCByZWZyZXNoIGFmdGVyIHtQUkVDT05fQ0FDSEVfSE9VUlN9aCkiKQogICAgICAgICAgICAgICAgICAgIFBSRUNPTl9JTkRFWCA9IGV4aXN0aW5nCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsiZG93bmxvYWRlZCI6IDAsICJza2lwcGVkIjogVHJ1ZSwgInRvdGFsIjogbGVuKGV4aXN0aW5nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IE5vbmV9CiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcyAgIyBGYWxsIHRocm91Z2ggdG8gZG93bmxvYWQKCiAgICAjIOKUgOKUgCBEb3dubG9hZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGxvZy5pbmZvKCIgIFByZWNvbnM6ICAgICAgRG93bmxvYWRpbmcgZnVsbCBwcmVjb24gZGF0YWJhc2UgZnJvbSBHaXRIdWIuLi4iKQogICAgdHJ5OgogICAgICAgIHJlcSA9IFJlcXVlc3QoR0lUSFVCX1BSRUNPTl9VUkwsIGhlYWRlcnM9eyJVc2VyLUFnZW50IjogIkNvbW1hbmRlckFJTGFiLzMuMCJ9KQogICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9MTIwKSBhcyByZXNwOgogICAgICAgICAgICByYXcgPSByZXNwLnJlYWQoKQogICAgICAgIGFsbF9kZWNrcyA9IGpzb24ubG9hZHMocmF3KQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIG1zZyA9IGYiRmFpbGVkIHRvIGRvd25sb2FkIHByZWNvbiBkYXRhYmFzZToge2V9IgogICAgICAgIGxvZy5lcnJvcihmIiAgUHJlY29uczogICAgICBFUlJPUiDigJQge21zZ30iKQogICAgICAgICMgRmFsbCBiYWNrIHRvIHdoYXRldmVyIHdlIGhhdmUgbG9jYWxseQogICAgICAgIGlmIGlkeF9wYXRoLmV4aXN0cygpOgogICAgICAgICAgICBsb2FkX3ByZWNvbl9pbmRleCgpCiAgICAgICAgcmV0dXJuIHsiZG93bmxvYWRlZCI6IDAsICJza2lwcGVkIjogRmFsc2UsICJlcnJvciI6IG1zZ30KCiAgICAjIOKUgOKUgCBGaWx0ZXIgdG8gQ29tbWFuZGVyIHByZWNvbiBkZWNrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGNvbW1hbmRlcl9kZWNrcyA9IFsKICAgICAgICBkIGZvciBkIGluIGFsbF9kZWNrcwogICAgICAgIGlmIGQuZ2V0KCd0eXBlJykgPT0gJ0NvbW1hbmRlciBEZWNrJwogICAgICAgIGFuZCAoZC5nZXQoJ2Zvcm1hdCcpIG9yICcnKS5sb3dlcigpID09ICdjb21tYW5kZXInCiAgICBdCiAgICBsb2cuaW5mbyhmIiAgUHJlY29uczogICAgICBGb3VuZCB7bGVuKGNvbW1hbmRlcl9kZWNrcyl9IENvbW1hbmRlciBwcmVjb24gZGVja3MiKQoKICAgICMg4pSA4pSAIEVuc3VyZSBwcmVjb24tZGVja3MgZGlyIGV4aXN0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIFBSRUNPTl9ESVIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQoKICAgICMg4pSA4pSAIERldGVjdCBkdXBsaWNhdGUgbmFtZXMgYW5kIGFwcGVuZCBzZXQgY29kZSBmb3IgdW5pcXVlbmVzcyDilIAKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IENvdW50ZXIKICAgIG5hbWVfY291bnRzID0gQ291bnRlcihfc2FuaXRpemVfZmlsZW5hbWUoZFsnbmFtZSddKSBmb3IgZCBpbiBjb21tYW5kZXJfZGVja3MpCiAgICBkdXBfbmFtZXMgPSB7biBmb3IgbiwgYyBpbiBuYW1lX2NvdW50cy5pdGVtcygpIGlmIGMgPiAxfQoKICAgICMg4pSA4pSAIENvbnZlcnQgYW5kIHdyaXRlIC5kY2sgZmlsZXMgKyBidWlsZCBpbmRleCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGluZGV4ID0gW10KICAgIHdyaXR0ZW4gPSAwCiAgICBmb3IgZGVjayBpbiBzb3J0ZWQoY29tbWFuZGVyX2RlY2tzLCBrZXk9bGFtYmRhIGQ6IChkLmdldCgncmVsZWFzZV9kYXRlJywgJycpLCBkLmdldCgnbmFtZScsICcnKSkpOgogICAgICAgIHNhZmVfbmFtZSA9IF9zYW5pdGl6ZV9maWxlbmFtZShkZWNrWyduYW1lJ10pCiAgICAgICAgIyBBcHBlbmQgc2V0IGNvZGUgZm9yIGR1cGxpY2F0ZSBuYW1lcyAoZS5nLiBBbnRob2xvZ3kgcmVwcmludHMpCiAgICAgICAgaWYgc2FmZV9uYW1lIGluIGR1cF9uYW1lczoKICAgICAgICAgICAgc2MgPSAoZGVjay5nZXQoJ3NldF9jb2RlJykgb3IgJ3VuaycpLnVwcGVyKCkKICAgICAgICAgICAgc2FmZV9uYW1lID0gZiJ7c2FmZV9uYW1lfV97c2N9IgogICAgICAgIGZpbGVfbmFtZSA9IGYie3NhZmVfbmFtZX0uZGNrIgogICAgICAgIGRja19wYXRoID0gUFJFQ09OX0RJUiAvIGZpbGVfbmFtZQoKICAgICAgICAjIEV4dHJhY3QgY29tbWFuZGVyIG5hbWVzCiAgICAgICAgY29tbWFuZGVycyA9IGRlY2suZ2V0KCdjb21tYW5kZXInLCBbXSkKICAgICAgICBjbWRyX25hbWVzID0gW2NbJ25hbWUnXSBmb3IgYyBpbiBjb21tYW5kZXJzXSBpZiBjb21tYW5kZXJzIGVsc2UgW10KCiAgICAgICAgIyBDYXJkIGNvdW50CiAgICAgICAgdG90YWxfY2FyZHMgPSBzdW0oYy5nZXQoJ2NvdW50JywgMSkgZm9yIGMgaW4gZGVjay5nZXQoJ2NhcmRzJywgW10pKQogICAgICAgIHRvdGFsX2NhcmRzICs9IHN1bShjLmdldCgnY291bnQnLCAxKSBmb3IgYyBpbiBjb21tYW5kZXJzKQoKICAgICAgICAjIFdyaXRlIC5kY2sgZmlsZQogICAgICAgIGRja19jb250ZW50ID0gX2RlY2tfdG9fZGNrKGRlY2spCiAgICAgICAgd2l0aCBvcGVuKGRja19wYXRoLCAidyIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoZGNrX2NvbnRlbnQpCiAgICAgICAgd3JpdHRlbiArPSAxCgogICAgICAgICMgQnVpbGQgaW5kZXggZW50cnkKICAgICAgICByZWxlYXNlID0gZGVjay5nZXQoJ3JlbGVhc2VfZGF0ZScsICcnKQogICAgICAgIHllYXIgPSBpbnQocmVsZWFzZVs6NF0pIGlmIHJlbGVhc2UgYW5kIGxlbihyZWxlYXNlKSA+PSA0IGVsc2UgMAogICAgICAgIGluZGV4LmFwcGVuZCh7CiAgICAgICAgICAgICJuYW1lIjogZGVja1snbmFtZSddLAogICAgICAgICAgICAiY29tbWFuZGVyIjogY21kcl9uYW1lc1swXSBpZiBjbWRyX25hbWVzIGVsc2UgIlVua25vd24iLAogICAgICAgICAgICAiY29tbWFuZGVycyI6IGNtZHJfbmFtZXMsCiAgICAgICAgICAgICJjb2xvcnMiOiBbXSwgICMgQ29sb3IgZGF0YSBub3QgaW4gc291cmNlOyBVSSBjYW4gaW5mZXIgZnJvbSBjYXJkcwogICAgICAgICAgICAic2V0IjogZGVjay5nZXQoJ3NldF9uYW1lJywgJycpLAogICAgICAgICAgICAic2V0Q29kZSI6IGRlY2suZ2V0KCdzZXRfY29kZScsICcnKSwKICAgICAgICAgICAgInllYXIiOiB5ZWFyLAogICAgICAgICAgICAicmVsZWFzZURhdGUiOiByZWxlYXNlLAogICAgICAgICAgICAidGhlbWUiOiAiIiwKICAgICAgICAgICAgImZpbGVOYW1lIjogZmlsZV9uYW1lLAogICAgICAgICAgICAiY2FyZENvdW50IjogdG90YWxfY2FyZHMsCiAgICAgICAgfSkKCiAgICAjIOKUgOKUgCBXcml0ZSBpbmRleCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHdpdGggb3BlbihpZHhfcGF0aCwgInciLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgIGpzb24uZHVtcChpbmRleCwgZiwgaW5kZW50PTIsIGVuc3VyZV9hc2NpaT1GYWxzZSkKCiAgICBQUkVDT05fSU5ERVggPSBpbmRleAogICAgbG9nLmluZm8oZiIgIFByZWNvbnM6ICAgICAge3dyaXR0ZW59IC5kY2sgZmlsZXMgd3JpdHRlbiwgaW5kZXggc2F2ZWQiKQogICAgcmV0dXJuIHsiZG93bmxvYWRlZCI6IHdyaXR0ZW4sICJza2lwcGVkIjogRmFsc2UsICJ0b3RhbCI6IHdyaXR0ZW4sICJlcnJvciI6IE5vbmV9CgoKQGFwcC5wb3N0KCIvYXBpL2xhYi9wcmVjb25zL3JlZnJlc2giKQphc3luYyBkZWYgcmVmcmVzaF9wcmVjb25zKCk6CiAgICAiIiJGb3JjZSByZS1kb3dubG9hZCBvZiBhbGwgQ29tbWFuZGVyIHByZWNvbiBkZWNrcyBmcm9tIEdpdEh1Yi4iIiIKICAgIHJlc3VsdCA9IGRvd25sb2FkX3ByZWNvbl9kYXRhYmFzZShmb3JjZT1UcnVlKQogICAgaWYgcmVzdWx0LmdldCgiZXJyb3IiKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMiwgcmVzdWx0WyJlcnJvciJdKQogICAgcmV0dXJuIHsKICAgICAgICAibWVzc2FnZSI6IGYiRG93bmxvYWRlZCB7cmVzdWx0Wydkb3dubG9hZGVkJ119IENvbW1hbmRlciBwcmVjb24gZGVja3MiLAogICAgICAgICJ0b3RhbCI6IHJlc3VsdC5nZXQoInRvdGFsIiwgMCksCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEZWNrIEltcG9ydCBIZWxwZXJzIChQeXRob24tc2lkZSkKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCl9BUElfSEVBREVSUyA9IHsiVXNlci1BZ2VudCI6ICJDb21tYW5kZXJBSUxhYi8zLjAiLCAiQWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24ifQoKCmRlZiBfaHR0cF9nZXQodXJsOiBzdHIpIC0+IHN0cjoKICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPV9BUElfSEVBREVSUykKICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9MzApIGFzIHJlc3A6CiAgICAgICAgcmV0dXJuIHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKQoKCmRlZiBfaW1wb3J0X2Zyb21fdXJsKHVybDogc3RyKSAtPiBkaWN0OgogICAgIiIiSW1wb3J0IGRlY2sgZnJvbSBVUkwgKEFyY2hpZGVrdCBvciBFREhSRUMpLiIiIgogICAgdXJsID0gdXJsLnN0cmlwKCkKCiAgICAjIEFyY2hpZGVrdAogICAgaWYgImFyY2hpZGVrdC5jb20vZGVja3MvIiBpbiB1cmw6CiAgICAgICAgbSA9IHJlLnNlYXJjaChyIi9kZWNrcy8oXGQrKSIsIHVybCkKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ291bGQgbm90IHBhcnNlIEFyY2hpZGVrdCBkZWNrIElEIGZyb20gVVJMIikKICAgICAgICByZXR1cm4gX2ZldGNoX2FyY2hpZGVrdF9kZWNrKG0uZ3JvdXAoMSkpCgogICAgIyBFREhSRUMgYXZlcmFnZSBkZWNrCiAgICBpZiAiZWRocmVjLmNvbS9hdmVyYWdlLWRlY2tzLyIgaW4gdXJsOgogICAgICAgIHNsdWcgPSByZS5zZWFyY2gociIvYXZlcmFnZS1kZWNrcy8oW14vPyNdKykiLCB1cmwpLmdyb3VwKDEpCiAgICAgICAgY29tbWFuZGVyX25hbWUgPSBzbHVnLnJlcGxhY2UoIi0iLCAiICIpCiAgICAgICAgcmV0dXJuIF9mZXRjaF9lZGhyZWNfYXZlcmFnZShjb21tYW5kZXJfbmFtZSkKCiAgICAjIEVESFJFQyBjb21tYW5kZXIgcGFnZQogICAgaWYgImVkaHJlYy5jb20vY29tbWFuZGVycy8iIGluIHVybDoKICAgICAgICBzbHVnID0gcmUuc2VhcmNoKHIiL2NvbW1hbmRlcnMvKFteLz8jXSspIiwgdXJsKS5ncm91cCgxKQogICAgICAgIGNvbW1hbmRlcl9uYW1lID0gc2x1Zy5yZXBsYWNlKCItIiwgIiAiKQogICAgICAgIHJldHVybiBfZmV0Y2hfZWRocmVjX2F2ZXJhZ2UoY29tbWFuZGVyX25hbWUpCgogICAgcmFpc2UgVmFsdWVFcnJvcihmIlVuc3VwcG9ydGVkIFVSTDoge3VybH0uIFN1cHBvcnRlZDogYXJjaGlkZWt0LmNvbS9kZWNrcy8uLi4sIGVkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy8uLi4sIGVkaHJlYy5jb20vY29tbWFuZGVycy8uLi4iKQoKCmRlZiBfZmV0Y2hfYXJjaGlkZWt0X2RlY2soZGVja19pZDogc3RyKSAtPiBkaWN0OgogICAgIiIiRmV0Y2ggZGVjayBmcm9tIEFyY2hpZGVrdCBBUEkuIiIiCiAgICB1cmwgPSBmImh0dHBzOi8vYXJjaGlkZWt0LmNvbS9hcGkvZGVja3Mve2RlY2tfaWR9LyIKICAgIGRhdGEgPSBqc29uLmxvYWRzKF9odHRwX2dldCh1cmwpKQoKICAgIHByb2ZpbGUgPSB7CiAgICAgICAgIm5hbWUiOiBkYXRhLmdldCgibmFtZSIsIGYiQXJjaGlkZWt0IHtkZWNrX2lkfSIpLAogICAgICAgICJjb21tYW5kZXIiOiBOb25lLAogICAgICAgICJzb3VyY2UiOiAiQXJjaGlkZWt0IiwKICAgICAgICAic291cmNlVXJsIjogZiJodHRwczovL2FyY2hpZGVrdC5jb20vZGVja3Mve2RlY2tfaWR9IiwKICAgICAgICAiY29tbWFuZGVycyI6IHt9LAogICAgICAgICJtYWluYm9hcmQiOiB7fSwKICAgICAgICAiY29sb3JJZGVudGl0eSI6IFtdLAogICAgICAgICJ0b3RhbENhcmRzIjogMCwKICAgIH0KCiAgICBmb3IgY2FyZF9lbnRyeSBpbiBkYXRhLmdldCgiY2FyZHMiLCBbXSk6CiAgICAgICAgcXR5ID0gY2FyZF9lbnRyeS5nZXQoInF1YW50aXR5IiwgMSkKICAgICAgICBjYXJkID0gY2FyZF9lbnRyeS5nZXQoImNhcmQiLCB7fSkKICAgICAgICBvcmFjbGUgPSBjYXJkLmdldCgib3JhY2xlQ2FyZCIsIHt9KQogICAgICAgIGNhcmRfbmFtZSA9IG9yYWNsZS5nZXQoIm5hbWUiLCAiVW5rbm93biIpCgogICAgICAgIGNhdGVnb3JpZXMgPSBbYyBmb3IgYyBpbiBjYXJkX2VudHJ5LmdldCgiY2F0ZWdvcmllcyIsIFtdKV0KICAgICAgICBpc19jb21tYW5kZXIgPSBhbnkoYy5sb3dlcigpID09ICJjb21tYW5kZXIiIGZvciBjIGluIGNhdGVnb3JpZXMpCgogICAgICAgIGlmIGlzX2NvbW1hbmRlcjoKICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVycyJdW2NhcmRfbmFtZV0gPSBxdHkKICAgICAgICAgICAgaWYgbm90IHByb2ZpbGVbImNvbW1hbmRlciJdOgogICAgICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVyIl0gPSBjYXJkX25hbWUKICAgICAgICAgICAgICAgIGlmIG9yYWNsZS5nZXQoImNvbG9ySWRlbnRpdHkiKToKICAgICAgICAgICAgICAgICAgICBwcm9maWxlWyJjb2xvcklkZW50aXR5Il0gPSBvcmFjbGVbImNvbG9ySWRlbnRpdHkiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByb2ZpbGVbIm1haW5ib2FyZCJdW2NhcmRfbmFtZV0gPSBxdHkKCiAgICBwcm9maWxlWyJ0b3RhbENhcmRzIl0gPSBzdW0ocHJvZmlsZVsiY29tbWFuZGVycyJdLnZhbHVlcygpKSArIHN1bShwcm9maWxlWyJtYWluYm9hcmQiXS52YWx1ZXMoKSkKICAgIGlmIG5vdCBwcm9maWxlWyJuYW1lIl0gb3IgcHJvZmlsZVsibmFtZSJdID09IGYiQXJjaGlkZWt0IHtkZWNrX2lkfSI6CiAgICAgICAgcHJvZmlsZVsibmFtZSJdID0gZiJ7cHJvZmlsZVsnY29tbWFuZGVyJ119IOKAlCBBcmNoaWRla3QiCgogICAgcmV0dXJuIHByb2ZpbGUKCgpkZWYgX2ZldGNoX2VkaHJlY19hdmVyYWdlKGNvbW1hbmRlcl9uYW1lOiBzdHIpIC0+IGRpY3Q6CiAgICAiIiJGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIGZvciBhIGNvbW1hbmRlci4iIiIKICAgIHNsdWcgPSBfdG9fZWRocmVjX3NsdWcoY29tbWFuZGVyX25hbWUpCiAgICB1cmwgPSBmImh0dHBzOi8vanNvbi5lZGhyZWMuY29tL3BhZ2VzL2F2ZXJhZ2UtZGVja3Mve3NsdWd9Lmpzb24iCiAgICBkYXRhID0ganNvbi5sb2FkcyhfaHR0cF9nZXQodXJsKSkKCiAgICBjb250YWluZXIgPSBkYXRhLmdldCgiY29udGFpbmVyIiwge30pCiAgICBqc29uX2RpY3QgPSBjb250YWluZXIuZ2V0KCJqc29uX2RpY3QiLCB7fSkKICAgIGNhcmRfaW5mbyA9IGpzb25fZGljdC5nZXQoImNhcmQiLCB7fSkKICAgIHJlYWxfbmFtZSA9IGNhcmRfaW5mby5nZXQoIm5hbWUiLCBjb21tYW5kZXJfbmFtZS50aXRsZSgpKQoKICAgIHByb2ZpbGUgPSB7CiAgICAgICAgIm5hbWUiOiBmIntyZWFsX25hbWV9IOKAlCBFREhSRUMgQXZlcmFnZSIsCiAgICAgICAgImNvbW1hbmRlciI6IHJlYWxfbmFtZSwKICAgICAgICAic291cmNlIjogIkVESFJFQyBBdmVyYWdlIiwKICAgICAgICAic291cmNlVXJsIjogZiJodHRwczovL2VkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy97c2x1Z30iLAogICAgICAgICJjb21tYW5kZXJzIjoge3JlYWxfbmFtZTogMX0sCiAgICAgICAgIm1haW5ib2FyZCI6IHt9LAogICAgICAgICJjb2xvcklkZW50aXR5IjogY2FyZF9pbmZvLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSksCiAgICAgICAgInNhbXBsZVNpemUiOiBkYXRhLmdldCgibnVtX2RlY2tzX2F2ZyIpLAogICAgICAgICJ0b3RhbENhcmRzIjogMCwKICAgIH0KCiAgICAjIFBhcnNlIGNhcmQgbGlzdHMKICAgIGZvciBjbCBpbiBqc29uX2RpY3QuZ2V0KCJjYXJkbGlzdHMiLCBbXSk6CiAgICAgICAgZm9yIGN2IGluIGNsLmdldCgiY2FyZHZpZXdzIiwgW10pOgogICAgICAgICAgICBjYXJkX25hbWUgPSBjdi5nZXQoIm5hbWUiLCAiIikKICAgICAgICAgICAgaWYgY2FyZF9uYW1lOgogICAgICAgICAgICAgICAgcHJvZmlsZVsibWFpbmJvYXJkIl1bY2FyZF9uYW1lXSA9IDEKCiAgICAjIEZpeCBiYXNpYyBsYW5kIHF1YW50aXRpZXMgZnJvbSBhcmNoaWRla3QgZXhwb3J0IGRhdGEKICAgIGFyY2hpZGVrdF9kYXRhID0gZGF0YS5nZXQoImFyY2hpZGVrdCIsIFtdKQogICAgaWYgYXJjaGlkZWt0X2RhdGE6CiAgICAgICAgYmFzaWNfbmFtZXMgPSBbXQogICAgICAgIGZvciBjbCBpbiBqc29uX2RpY3QuZ2V0KCJjYXJkbGlzdHMiLCBbXSk6CiAgICAgICAgICAgIGlmIGNsLmdldCgidGFnIikgPT0gImJhc2ljcyI6CiAgICAgICAgICAgICAgICBmb3IgY3YgaW4gY2wuZ2V0KCJjYXJkdmlld3MiLCBbXSk6CiAgICAgICAgICAgICAgICAgICAgYmFzaWNfbmFtZXMuYXBwZW5kKGN2LmdldCgibmFtZSIsICIiKSkKCiAgICAgICAgIyBGaW5kIGhpZ2gtcXVhbnRpdHkgZW50cmllcyAoYmFzaWNzKQogICAgICAgIGJhc2ljX3F1YW50aXRpZXMgPSBbXQogICAgICAgIGZvciBlbnRyeSBpbiBhcmNoaWRla3RfZGF0YToKICAgICAgICAgICAgaWYgZW50cnkuZ2V0KCJxIiwgMSkgPiAxOgogICAgICAgICAgICAgICAgYmFzaWNfcXVhbnRpdGllcy5hcHBlbmQoZW50cnlbInEiXSkKCiAgICAgICAgZm9yIGksIG5hbWUgaW4gZW51bWVyYXRlKGJhc2ljX25hbWVzKToKICAgICAgICAgICAgaWYgaSA8IGxlbihiYXNpY19xdWFudGl0aWVzKToKICAgICAgICAgICAgICAgIHByb2ZpbGVbIm1haW5ib2FyZCJdW25hbWVdID0gYmFzaWNfcXVhbnRpdGllc1tpXQoKICAgIHByb2ZpbGVbInRvdGFsQ2FyZHMiXSA9IHN1bShwcm9maWxlWyJjb21tYW5kZXJzIl0udmFsdWVzKCkpICsgc3VtKHByb2ZpbGVbIm1haW5ib2FyZCJdLnZhbHVlcygpKQogICAgcmV0dXJuIHByb2ZpbGUKCgpkZWYgX3BhcnNlX3RleHRfZGVja2xpc3QodGV4dDogc3RyLCBjb21tYW5kZXJfb3ZlcnJpZGU6IHN0ciA9IE5vbmUpIC0+IGRpY3Q6CiAgICAiIiJQYXJzZSBhIHBsYWluIHRleHQgY2FyZCBsaXN0IGludG8gYSBwcm9maWxlLiIiIgogICAgcHJvZmlsZSA9IHsKICAgICAgICAibmFtZSI6ICJUZXh0IEltcG9ydCIsCiAgICAgICAgImNvbW1hbmRlciI6IE5vbmUsCiAgICAgICAgInNvdXJjZSI6ICJUZXh0IEltcG9ydCIsCiAgICAgICAgInNvdXJjZVVybCI6IE5vbmUsCiAgICAgICAgImNvbW1hbmRlcnMiOiB7fSwKICAgICAgICAibWFpbmJvYXJkIjoge30sCiAgICAgICAgInRvdGFsQ2FyZHMiOiAwLAogICAgfQoKICAgIHNlY3Rpb24gPSAibWFpbiIKICAgIGZvciBsaW5lIGluIHRleHQuc3RyaXAoKS5zcGxpdCgiXG4iKToKICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCIvLyIpIG9yIGxpbmUuc3RhcnRzd2l0aCgiIyIpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgiY29tbWFuZGVyIikgb3IgbGluZSA9PSAiW0NvbW1hbmRlcl0iOgogICAgICAgICAgICBzZWN0aW9uID0gImNvbW1hbmRlciIKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgibWFpbiIpIG9yIGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCJkZWNrIikgb3IgbGluZSA9PSAiW01haW5dIjoKICAgICAgICAgICAgc2VjdGlvbiA9ICJtYWluIgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCJzaWRlYm9hcmQiKSBvciBsaW5lID09ICJbU2lkZWJvYXJkXSI6CiAgICAgICAgICAgIHNlY3Rpb24gPSAic2lkZWJvYXJkIgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIENsZWFuIGxpbmUKICAgICAgICBjbGVhbiA9IHJlLnN1YihyIlwoXHcrXClccypcZCokIiwgIiIsIGxpbmUpLnN0cmlwKCkKICAgICAgICBjbGVhbiA9IHJlLnN1YihyIlxzKlwqLiokIiwgIiIsIGNsZWFuKS5zdHJpcCgpCgogICAgICAgIG0gPSByZS5tYXRjaChyIl4oXGQrKXg/XHMrKC4rKSQiLCBjbGVhbikKICAgICAgICBpZiBtOgogICAgICAgICAgICBxdHkgPSBpbnQobS5ncm91cCgxKSkKICAgICAgICAgICAgY2FyZF9uYW1lID0gbS5ncm91cCgyKS5zdHJpcCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcXR5ID0gMQogICAgICAgICAgICBjYXJkX25hbWUgPSBjbGVhbgoKICAgICAgICBpZiBub3QgY2FyZF9uYW1lOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBzZWN0aW9uID09ICJjb21tYW5kZXIiOgogICAgICAgICAgICBwcm9maWxlWyJjb21tYW5kZXJzIl1bY2FyZF9uYW1lXSA9IHF0eQogICAgICAgICAgICBpZiBub3QgcHJvZmlsZVsiY29tbWFuZGVyIl06CiAgICAgICAgICAgICAgICBwcm9maWxlWyJjb21tYW5kZXIiXSA9IGNhcmRfbmFtZQogICAgICAgIGVsaWYgc2VjdGlvbiAhPSAic2lkZWJvYXJkIjoKICAgICAgICAgICAgcHJvZmlsZVsibWFpbmJvYXJkIl1bY2FyZF9uYW1lXSA9IHF0eQoKICAgIGlmIGNvbW1hbmRlcl9vdmVycmlkZToKICAgICAgICBwcm9maWxlWyJjb21tYW5kZXIiXSA9IGNvbW1hbmRlcl9vdmVycmlkZQogICAgICAgIGlmIG5vdCBwcm9maWxlWyJjb21tYW5kZXJzIl06CiAgICAgICAgICAgIGlmIGNvbW1hbmRlcl9vdmVycmlkZSBpbiBwcm9maWxlWyJtYWluYm9hcmQiXToKICAgICAgICAgICAgICAgIHF0eSA9IHByb2ZpbGVbIm1haW5ib2FyZCJdLnBvcChjb21tYW5kZXJfb3ZlcnJpZGUpCiAgICAgICAgICAgICAgICBwcm9maWxlWyJjb21tYW5kZXJzIl1bY29tbWFuZGVyX292ZXJyaWRlXSA9IHF0eQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVycyJdW2NvbW1hbmRlcl9vdmVycmlkZV0gPSAxCgogICAgaWYgcHJvZmlsZVsiY29tbWFuZGVyIl06CiAgICAgICAgcHJvZmlsZVsibmFtZSJdID0gZiJ7cHJvZmlsZVsnY29tbWFuZGVyJ119IOKAlCBUZXh0IEltcG9ydCIKCiAgICBwcm9maWxlWyJ0b3RhbENhcmRzIl0gPSBzdW0ocHJvZmlsZVsiY29tbWFuZGVycyJdLnZhbHVlcygpKSArIHN1bShwcm9maWxlWyJtYWluYm9hcmQiXS52YWx1ZXMoKSkKICAgIHJldHVybiBwcm9maWxlCgoKZGVmIF9zYXZlX3Byb2ZpbGVfdG9fZGNrKHByb2ZpbGU6IGRpY3QpIC0+IFBhdGg6CiAgICAiIiJDb252ZXJ0IGEgcHJvZmlsZSBkaWN0IHRvIC5kY2sgYW5kIHNhdmUgdG8gRm9yZ2UgZGVja3MgZGlyLiIiIgogICAgbGluZXMgPSBbIlttZXRhZGF0YV0iXQogICAgbGluZXMuYXBwZW5kKGYiTmFtZT17cHJvZmlsZS5nZXQoJ25hbWUnLCAnSW1wb3J0ZWQgRGVjaycpfSIpCiAgICBsaW5lcy5hcHBlbmQoIiIpCiAgICBsaW5lcy5hcHBlbmQoIltDb21tYW5kZXJdIikKICAgIGZvciBuYW1lLCBxdHkgaW4gcHJvZmlsZS5nZXQoImNvbW1hbmRlcnMiLCB7fSkuaXRlbXMoKToKICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0iKQogICAgbGluZXMuYXBwZW5kKCIiKQogICAgbGluZXMuYXBwZW5kKCJbTWFpbl0iKQogICAgZm9yIG5hbWUsIHF0eSBpbiBwcm9maWxlLmdldCgibWFpbmJvYXJkIiwge30pLml0ZW1zKCk6CiAgICAgICAgbGluZXMuYXBwZW5kKGYie3F0eX0ge25hbWV9IikKCiAgICBjb250ZW50ID0gIlxuIi5qb2luKGxpbmVzKQoKICAgICMgU2F2ZSB0byBGb3JnZSBkZWNrcyBkaXIKICAgIHNhZmVfbmFtZSA9IHJlLnN1YihyIlteYS16QS1aMC05IF8tXSIsICIiLCBwcm9maWxlLmdldCgibmFtZSIsICJpbXBvcnRlZCIpKS5yZXBsYWNlKCIgIiwgIl8iKS5zdHJpcCgpCiAgICBpZiBub3Qgc2FmZV9uYW1lOgogICAgICAgIHNhZmVfbmFtZSA9ICJpbXBvcnRlZF9kZWNrIgoKICAgIHNhdmVfZGlyID0gQ0ZHLmZvcmdlX2RlY2tzX2RpcgogICAgaWYgbm90IHNhdmVfZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHNhdmVfZGlyKToKICAgICAgICBzYXZlX2RpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiaW1wb3J0ZWQtZGVja3MiKQogICAgICAgIG9zLm1ha2VkaXJzKHNhdmVfZGlyLCBleGlzdF9vaz1UcnVlKQoKICAgIG91dF9wYXRoID0gUGF0aChzYXZlX2RpcikgLyBmIntzYWZlX25hbWV9LmRjayIKICAgIG91dF9wYXRoLndyaXRlX3RleHQoY29udGVudCwgZW5jb2Rpbmc9InV0Zi04IikKICAgIGxvZ19jb2xsZWN0LmluZm8oZiIgIFNhdmVkIC5kY2s6IHtvdXRfcGF0aH0iKQogICAgcmV0dXJuIG91dF9wYXRoCgoKZGVmIF90b19lZGhyZWNfc2x1ZyhuYW1lOiBzdHIpIC0+IHN0cjoKICAgIHNsdWcgPSBuYW1lLmxvd2VyKCkKICAgIHNsdWcgPSByZS5zdWIociJbJywuXSIsICIiLCBzbHVnKQogICAgc2x1ZyA9IHJlLnN1YihyIlteYS16MC05XSsiLCAiLSIsIHNsdWcpCiAgICBzbHVnID0gc2x1Zy5zdHJpcCgiLSIpCiAgICByZXR1cm4gc2x1ZwoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQmFja2dyb3VuZCBUYXNrIOKAlCBSdW4gdGhlIEphdmEgQ0xJIHN1YnByb2Nlc3MKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmFzeW5jIGRlZiBydW5fYmF0Y2hfc3VicHJvY2VzcygKICAgIHN0YXRlOiBCYXRjaFN0YXRlLAogICAgZGVja3M6IGxpc3Rbc3RyXSwKICAgIG51bV9nYW1lczogaW50LAogICAgdGhyZWFkczogaW50LAogICAgc2VlZDogT3B0aW9uYWxbaW50XSwKICAgIGNsb2NrOiBpbnQsCiAgICBvdXRwdXRfcGF0aDogc3RyLAogICAgdXNlX2xlYXJuZWRfcG9saWN5OiBib29sID0gRmFsc2UsCiAgICBwb2xpY3lfc3R5bGU6IHN0ciA9ICJtaWRyYW5nZSIsCiAgICBwb2xpY3lfZ3JlZWR5OiBib29sID0gRmFsc2UsCiAgICBhaV9zaW1wbGlmaWVkOiBib29sID0gRmFsc2UsCiAgICBhaV90aGlua190aW1lX21zOiBpbnQgPSAtMSwKICAgIG1heF9xdWV1ZV9kZXB0aDogaW50ID0gLTEsCik6CiAgICB0cnk6CiAgICAgICAgIyBDb21wdXRlIHBvbGljeSBzZXJ2ZXIgVVJMIGZyb20gb3VyIG93biBwb3J0CiAgICAgICAgcG9saWN5X3NlcnZlciA9IGYiaHR0cDovL2xvY2FsaG9zdDp7Q0ZHLnBvcnR9IgogICAgICAgIGNtZCA9IGJ1aWxkX2phdmFfY29tbWFuZCgKICAgICAgICAgICAgZGVja3MsIG51bV9nYW1lcywgdGhyZWFkcywgc2VlZCwgY2xvY2ssIG91dHB1dF9wYXRoLAogICAgICAgICAgICB1c2VfbGVhcm5lZF9wb2xpY3k9dXNlX2xlYXJuZWRfcG9saWN5LAogICAgICAgICAgICBwb2xpY3lfc2VydmVyPXBvbGljeV9zZXJ2ZXIsCiAgICAgICAgICAgIHBvbGljeV9zdHlsZT1wb2xpY3lfc3R5bGUsCiAgICAgICAgICAgIHBvbGljeV9ncmVlZHk9cG9saWN5X2dyZWVkeSwKICAgICAgICAgICAgYWlfc2ltcGxpZmllZD1haV9zaW1wbGlmaWVkLAogICAgICAgICAgICBhaV90aGlua190aW1lX21zPWFpX3RoaW5rX3RpbWVfbXMsCiAgICAgICAgICAgIG1heF9xdWV1ZV9kZXB0aD1tYXhfcXVldWVfZGVwdGgsCiAgICAgICAgKQogICAgICAgIGxvZ19iYXRjaC5pbmZvKGYiU3RhcnRpbmcgYmF0Y2gge3N0YXRlLmJhdGNoX2lkfTogeycgJy5qb2luKGNtZFs6Nl0pfS4uLiIpCiAgICAgICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKQogICAgICAgIGF3YWl0IGxvb3AucnVuX2luX2V4ZWN1dG9yKAogICAgICAgICAgICBOb25lLAogICAgICAgICAgICBsYW1iZGE6IF9ydW5fcHJvY2Vzc19ibG9ja2luZyhzdGF0ZSwgY21kKSwKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgc3RhdGUuZXJyb3IgPSBzdHIoZSkKICAgICAgICBzdGF0ZS5ydW5uaW5nID0gRmFsc2UKICAgICAgICBsb2dfYmF0Y2guZXJyb3IoZiJCYXRjaCB7c3RhdGUuYmF0Y2hfaWR9IEVSUk9SOiB7ZX0iKQoKCmRlZiBfcnVuX3Byb2Nlc3NfYmxvY2tpbmcoc3RhdGU6IEJhdGNoU3RhdGUsIGNtZDogbGlzdFtzdHJdKToKICAgICMgV3JpdGUgZGVidWcgbG9nIGZyb20gUHl0aG9uIHNpZGUgKGRvZXNuJ3QgZGVwZW5kIG9uIEphdmEgcmVidWlsZCkKICAgIGRlYnVnX2xvZ19wYXRoID0gUGF0aChDRkcuZm9yZ2VfZGlyKS5wYXJlbnQgLyAiZm9yZ2Utc2ltLWRlYnVnLmxvZyIgaWYgQ0ZHLmZvcmdlX2RpciBlbHNlIFBhdGgoImZvcmdlLXNpbS1kZWJ1Zy5sb2ciKQogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihkZWJ1Z19sb2dfcGF0aCwgImEiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBkYmc6CiAgICAgICAgICAgIGRiZy53cml0ZShmIlxueyc9Jyo2MH1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmIkJhdGNoIHtzdGF0ZS5iYXRjaF9pZH0gQCB7ZGF0ZXRpbWUubm93KCkuaXNvZm9ybWF0KCl9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJDb21tYW5kOiB7JyAnLmpvaW4oY21kKX1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmIkxhYiBKQVI6IHtDRkcubGFiX2phcn1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmIkZvcmdlIEpBUjoge0NGRy5mb3JnZV9qYXJ9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJGb3JnZSBEaXI6IHtDRkcuZm9yZ2VfZGlyfVxuIikKICAgICAgICAgICAgZGJnLndyaXRlKGYiTGFiIEpBUiBleGlzdHM6IHtvcy5wYXRoLmV4aXN0cyhDRkcubGFiX2phcil9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJGb3JnZSBKQVIgZXhpc3RzOiB7b3MucGF0aC5leGlzdHMoQ0ZHLmZvcmdlX2phcil9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJGb3JnZSBEaXIgZXhpc3RzOiB7b3MucGF0aC5pc2RpcihDRkcuZm9yZ2VfZGlyKX1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmInsnLScqNjB9XG4iKQogICAgICAgIGxvZ19iYXRjaC53YXJuaW5nKGYiRGVidWcgbG9nOiB7ZGVidWdfbG9nX3BhdGh9IikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfYmF0Y2gud2FybmluZyhmIkNvdWxkIG5vdCB3cml0ZSBkZWJ1ZyBsb2cgaGVhZGVyOiB7ZX0iKQoKICAgICMgRW5zdXJlIEZvcmdlIHN1YnByb2Nlc3NlcyB1c2UgSmF2YSAxNyAoRm9yZ2UgY3Jhc2hlcyBvbiBKYXZhIDI1KykKICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCiAgICBqYXZhMTcgPSBnZXRfamF2YTE3KCkKICAgIGlmIGphdmExNyAhPSAnamF2YSc6CiAgICAgICAgamF2YTE3X2JpbiA9IG9zLnBhdGguZGlybmFtZShqYXZhMTcpCiAgICAgICAgamF2YTE3X2hvbWUgPSBvcy5wYXRoLmRpcm5hbWUoamF2YTE3X2JpbikKICAgICAgICBlbnZbJ0pBVkFfSE9NRSddID0gamF2YTE3X2hvbWUKICAgICAgICBlbnZbJ1BBVEgnXSA9IGphdmExN19iaW4gKyBvcy5wYXRoc2VwICsgZW52LmdldCgnUEFUSCcsICcnKQogICAgICAgIGxvZ19iYXRjaC5pbmZvKGYnVXNpbmcgSmF2YSAxNzoge2phdmExN30nKQoKICAgICMgTk9URTogRG8gTk9UIHNldCBfSkFWQV9PUFRJT05TPS1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSBoZXJlLgogICAgIyBGb3JnZSBzaW0gbW9kZSBuZWVkcyBBV1QgY2xhc3NlcyBmb3IgY2FyZCBkYXRhIGluaXRpYWxpemF0aW9uOwogICAgIyBoZWFkbGVzcz10cnVlIGNhdXNlcyBzaWxlbnQgZXhpdCBjb2RlIDEgY3Jhc2guCgogICAgIyBQZXItZ2FtZSB0aW1lb3V0OiBjbG9jayArIDE4MHMgYnVmZmVyIGZvciBjYXJkIERCIGluaXQKICAgIHBlcl9nYW1lX3RpbWVvdXQgPSBzdGF0ZS50b3RhbF9nYW1lcyAqIDI0MCArIDMwMCAgIyBnZW5lcm91czogNG1pbi9nYW1lICsgNW1pbiBzdGFydHVwCgogICAgdHJ5OgogICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKICAgICAgICAgICAgdGV4dD1UcnVlLAogICAgICAgICAgICBjd2Q9Tm9uZSwKICAgICAgICAgICAgYnVmc2l6ZT0xLAogICAgICAgICAgICBlbnY9ZW52LAogICAgICAgICkKICAgICAgICBzdGF0ZS5wcm9jZXNzID0gcHJvYwoKICAgICAgICAjIFB5dGhvbi1zaWRlIHdhdGNoZG9nOiBraWxsIGlmIG5vIHByb2dyZXNzIGZvciB0b28gbG9uZwogICAgICAgIGltcG9ydCB0aHJlYWRpbmcKICAgICAgICBsYXN0X2FjdGl2aXR5ID0gW3RpbWUudGltZSgpXQogICAgICAgIHN0YWxsX2xpbWl0ID0gMzAwICAjIDUgbWludXRlcyB3aXRoIG5vIG91dHB1dCA9IHN0YWxsZWQKCiAgICAgICAgZGVmIF93YXRjaGRvZygpOgogICAgICAgICAgICB3aGlsZSBwcm9jLnBvbGwoKSBpcyBOb25lOgogICAgICAgICAgICAgICAgdGltZS5zbGVlcCgzMCkKICAgICAgICAgICAgICAgIGVsYXBzZWRfc2luY2VfYWN0aXZpdHkgPSB0aW1lLnRpbWUoKSAtIGxhc3RfYWN0aXZpdHlbMF0KICAgICAgICAgICAgICAgIGlmIGVsYXBzZWRfc2luY2VfYWN0aXZpdHkgPiBzdGFsbF9saW1pdDoKICAgICAgICAgICAgICAgICAgICBsb2dfYmF0Y2gud2FybmluZyhmJ1dBVENIRE9HOiBObyBvdXRwdXQgZm9yIHtpbnQoZWxhcHNlZF9zaW5jZV9hY3Rpdml0eSl9cy4gS2lsbGluZyBwcm9jZXNzLicpCiAgICAgICAgICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tXQVRDSERPR10gUHJvY2VzcyBzdGFsbGVkICh7aW50KGVsYXBzZWRfc2luY2VfYWN0aXZpdHkpfXMgd2l0aCBubyBvdXRwdXQpLiBLaWxsZWQuJykKICAgICAgICAgICAgICAgICAgICBwcm9jLmtpbGwoKQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICB3ZF90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1fd2F0Y2hkb2csIGRhZW1vbj1UcnVlKQogICAgICAgIHdkX3RocmVhZC5zdGFydCgpCgogICAgICAgIGdhbWVfY291bnQgPSAwCiAgICAgICAgYWxsX291dHB1dF9saW5lcyA9IFtdCiAgICAgICAgZm9yIGxpbmUgaW4gcHJvYy5zdGRvdXQ6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCiAgICAgICAgICAgIGxhc3RfYWN0aXZpdHlbMF0gPSB0aW1lLnRpbWUoKQogICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGxpbmUpCiAgICAgICAgICAgIGFsbF9vdXRwdXRfbGluZXMuYXBwZW5kKGxpbmUpCgogICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIltHYW1lICIpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgiXSIpWzBdCiAgICAgICAgICAgICAgICAgICAgbnVtcyA9IHBhcnRzLnJlcGxhY2UoIltHYW1lICIsICIiKS5zcGxpdCgiLyIpCiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGludChudW1zWzBdKQogICAgICAgICAgICAgICAgICAgIGdhbWVfY291bnQgPSBjdXJyZW50CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY29tcGxldGVkX2dhbWVzID0gY3VycmVudAogICAgICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICAgICAjIHYyNCAoSXNzdWUgIzUpOiBQYXJzZSByZWFsLXRpbWUgc2ltcy9zZWMgZnJvbSBKYXZhIG91dHB1dAogICAgICAgICAgICBpZiAnW1BST0dSRVNTXScgaW4gbGluZSBvciAnW0JBVENIXScgaW4gbGluZToKICAgICAgICAgICAgICAgIGltcG9ydCByZQogICAgICAgICAgICAgICAgc3BzX21hdGNoID0gcmUuc2VhcmNoKHInKFtcZC5dKylccytzaW1zL3NlYycsIGxpbmUpCiAgICAgICAgICAgICAgICBpZiBzcHNfbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zaW1zX3Blcl9zZWMgPSBmbG9hdChzcHNfbWF0Y2guZ3JvdXAoMSkpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICAgIGxvZ19iYXRjaC5pbmZvKGYiICBbe3N0YXRlLmJhdGNoX2lkfV0ge2xpbmV9IikKCiAgICAgICAgcHJvYy53YWl0KCkKCiAgICAgICAgZWxhcHNlZCA9IGludCgoZGF0ZXRpbWUubm93KCkgLSBzdGF0ZS5zdGFydF90aW1lKS50b3RhbF9zZWNvbmRzKCkgKiAxMDAwKQogICAgICAgIHN0YXRlLmVsYXBzZWRfbXMgPSBlbGFwc2VkCiAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCgogICAgICAgICMgV3JpdGUgYWxsIGNhcHR1cmVkIG91dHB1dCB0byBkZWJ1ZyBsb2cKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihkZWJ1Z19sb2dfcGF0aCwgImEiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBkYmc6CiAgICAgICAgICAgICAgICBkYmcud3JpdGUoZiJFeGl0IGNvZGU6IHtwcm9jLnJldHVybmNvZGV9XG4iKQogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiVG90YWwgbGluZXM6IHtsZW4oYWxsX291dHB1dF9saW5lcyl9XG4iKQogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiRWxhcHNlZDoge2VsYXBzZWR9bXNcbiIpCiAgICAgICAgICAgICAgICBkYmcud3JpdGUoZiItLSBGVUxMIFNVQlBST0NFU1MgT1VUUFVUIC0tXG4iKQogICAgICAgICAgICAgICAgaWYgYWxsX291dHB1dF9saW5lczoKICAgICAgICAgICAgICAgICAgICBmb3Igb2wgaW4gYWxsX291dHB1dF9saW5lczoKICAgICAgICAgICAgICAgICAgICAgICAgZGJnLndyaXRlKG9sICsgIlxuIikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZGJnLndyaXRlKCI8PCBOTyBPVVRQVVQgPj5cbiIpCiAgICAgICAgICAgICAgICBkYmcud3JpdGUoZiItLSBFTkQgT1VUUFVUIC0tXG5cbiIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2dfYmF0Y2gud2FybmluZyhmIkNvdWxkIG5vdCB3cml0ZSBkZWJ1ZyBsb2cgb3V0cHV0OiB7ZX0iKQoKICAgICAgICBpZiBwcm9jLnJldHVybmNvZGUgIT0gMDoKICAgICAgICAgICAgaWYgcHJvYy5yZXR1cm5jb2RlID09IC05IG9yIHByb2MucmV0dXJuY29kZSA9PSAxMzc6CiAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvciA9ICdGb3JnZSBwcm9jZXNzIGtpbGxlZCBieSB3YXRjaGRvZyAoc3RhbGxlZCB3aXRoIG5vIG91dHB1dCkuIENoZWNrIGZvcmdlLXNpbS1kZWJ1Zy5sb2cgZm9yIGRldGFpbHMuJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSBmJ0phdmEgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlIHtwcm9jLnJldHVybmNvZGV9LiBDaGVjayBmb3JnZS1zaW0tZGVidWcubG9nIGZvciBkZXRhaWxzLicKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGF0ZS5jb21wbGV0ZWRfZ2FtZXMgPSBzdGF0ZS50b3RhbF9nYW1lcwogICAgICAgICAgICBsb2dfYmF0Y2guaW5mbyhmIkJhdGNoIHtzdGF0ZS5iYXRjaF9pZH0gY29tcGxldGVkIGluIHtlbGFwc2VkfW1zIikKCiAgICAgICAgICAgICMgQXV0by1nZW5lcmF0ZSBkZWNrIHJlcG9ydHMgZm9yIHRoZSBjb2FjaAogICAgICAgICAgICBpZiBzdGF0ZS5yZXN1bHRfcGF0aCBhbmQgb3MucGF0aC5leGlzdHMoc3RhdGUucmVzdWx0X3BhdGgpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZyb20gY29hY2gucmVwb3J0X2dlbmVyYXRvciBpbXBvcnQgZ2VuZXJhdGVfc2luZ2xlX2RlY2tfcmVwb3J0CiAgICAgICAgICAgICAgICAgICAgbGFiX3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgICAgICAgICAgICAgICAgICByZXBvcnRzX2RpciA9IHN0cihsYWJfcm9vdCAvICJkZWNrLXJlcG9ydHMiKQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBnZW5lcmF0ZV9zaW5nbGVfZGVja19yZXBvcnQoc3RhdGUucmVzdWx0X3BhdGgsIHJlcG9ydHNfZGlyKQogICAgICAgICAgICAgICAgICAgIGlmIHVwZGF0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19iYXRjaC5pbmZvKGYiRGVjayByZXBvcnRzIHVwZGF0ZWQ6IHsnLCAnLmpvaW4odXBkYXRlZCl9IikKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgcnB0X2VycjoKICAgICAgICAgICAgICAgICAgICBsb2dfYmF0Y2guaW5mbyhmIkRlY2sgcmVwb3J0IGdlbmVyYXRpb24gZmFpbGVkIChub24tZmF0YWwpOiB7cnB0X2Vycn0iKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBzdGF0ZS5lcnJvciA9IHN0cihlKQogICAgICAgIHN0YXRlLnJ1bm5pbmcgPSBGYWxzZQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKGRlYnVnX2xvZ19wYXRoLCAiYSIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGRiZzoKICAgICAgICAgICAgICAgIGRiZy53cml0ZShmIkVYQ0VQVElPTjoge2V9XG4iKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIERlZXBTZWVrIEJhdGNoIFNpbSAoUHl0aG9uIGVuZ2luZSArIExMTSBvcHBvbmVudCkKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmRlZiBfbG9hZF9kZWNrX2NhcmRzX2J5X25hbWUoZGVja19uYW1lOiBzdHIpIC0+IGxpc3RbZGljdF06CiAgICAiIiJMb2FkIGNhcmQgZGF0YSBmb3IgYSBkZWNrIGJ5IG5hbWUuIENoZWNrcyBEQiBmaXJzdCwgdGhlbiAuZGNrIGZpbGVzLgogICAgRWFjaCBjYXJkIGRpY3QgaW5jbHVkZXMgJ2lzX2NvbW1hbmRlcicgZmxhZyAoMCBvciAxKSB3aGVuIGF2YWlsYWJsZS4iIiIKICAgICMgMS4gVHJ5IGRlY2sgYnVpbGRlciBEQgogICAgdHJ5OgogICAgICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBpZCwgY29tbWFuZGVyX25hbWUgRlJPTSBkZWNrcyBXSEVSRSBuYW1lID0gPyBDT0xMQVRFIE5PQ0FTRSIsIChkZWNrX25hbWUsKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGlmIHJvdzoKICAgICAgICAgICAgZGVja19pZCA9IHJvd1siaWQiXQogICAgICAgICAgICBkYl9jb21tYW5kZXJfbmFtZSA9IHJvd1siY29tbWFuZGVyX25hbWUiXSBvciAiIgogICAgICAgICAgICBjYXJkcyA9IGNvbm4uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgICAgIFNFTEVDVCBkYy5jYXJkX25hbWUsIGRjLnF1YW50aXR5LCBkYy5pc19jb21tYW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5jbWMsIGNlLnBvd2VyLCBjZS50b3VnaG5lc3MsCiAgICAgICAgICAgICAgICAgICAgICAgY2Uub3JhY2xlX3RleHQsIGNlLmtleXdvcmRzLCBjZS5tYW5hX2Nvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgY2UuY29sb3JfaWRlbnRpdHkKICAgICAgICAgICAgICAgIEZST00gZGVja19jYXJkcyBkYwogICAgICAgICAgICAgICAgTEVGVCBKT0lOICgKICAgICAgICAgICAgICAgICAgICBTRUxFQ1Qgc2NyeWZhbGxfaWQsIHR5cGVfbGluZSwgY21jLCBwb3dlciwgdG91Z2huZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcmFjbGVfdGV4dCwga2V5d29yZHMsIG1hbmFfY29zdCwgY29sb3JfaWRlbnRpdHkKICAgICAgICAgICAgICAgICAgICBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBHUk9VUCBCWSBzY3J5ZmFsbF9pZAogICAgICAgICAgICAgICAgKSBjZSBPTiBjZS5zY3J5ZmFsbF9pZCA9IGRjLnNjcnlmYWxsX2lkCiAgICAgICAgICAgICAgICBXSEVSRSBkYy5kZWNrX2lkID0gPwogICAgICAgICAgICAiIiIsIChkZWNrX2lkLCkpLmZldGNoYWxsKCkKICAgICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAgICAgZm9yIHIgaW4gY2FyZHM6CiAgICAgICAgICAgICAgICBpc19jbWRyID0gclsiaXNfY29tbWFuZGVyIl0gb3IgMAogICAgICAgICAgICAgICAgIyBBbHNvIGRldGVjdCBieSBkZWNrLWxldmVsIGNvbW1hbmRlcl9uYW1lIG1hdGNoCiAgICAgICAgICAgICAgICBpZiBub3QgaXNfY21kciBhbmQgZGJfY29tbWFuZGVyX25hbWUgYW5kIHJbImNhcmRfbmFtZSJdLmxvd2VyKCkgPT0gZGJfY29tbWFuZGVyX25hbWUubG93ZXIoKToKICAgICAgICAgICAgICAgICAgICBpc19jbWRyID0gMQogICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoclsicXVhbnRpdHkiXSBvciAxKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiByWyJjYXJkX25hbWUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGVfbGluZSc6IHJbInR5cGVfbGluZSJdIG9yICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnY21jJzogclsiY21jIl0gb3IgMCwKICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvd2VyJzogclsicG93ZXIiXSBvciAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdWdobmVzcyc6IHJbInRvdWdobmVzcyJdIG9yICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnb3JhY2xlX3RleHQnOiByWyJvcmFjbGVfdGV4dCJdIG9yICcnLAogICAgICAgICAgICAgICAgICAgICAgICAna2V5d29yZHMnOiByWyJrZXl3b3JkcyJdIG9yICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbWFuYV9jb3N0JzogclsibWFuYV9jb3N0Il0gb3IgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdpc19jb21tYW5kZXInOiBpc19jbWRyLAogICAgICAgICAgICAgICAgICAgICAgICAnY29sb3JfaWRlbnRpdHknOiByWyJjb2xvcl9pZGVudGl0eSJdIG9yICcnLAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIGlmIHJlc3VsdDoKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfc2ltLmVycm9yKGYiREIgbG9va3VwIGZhaWxlZCBmb3IgJ3tkZWNrX25hbWV9Jzoge2V9IikKCiAgICAjIDIuIFRyeSAuZGNrIGZpbGUKICAgIGlmIENGRy5mb3JnZV9kZWNrc19kaXIgYW5kIG9zLnBhdGguaXNkaXIoQ0ZHLmZvcmdlX2RlY2tzX2Rpcik6CiAgICAgICAgZGNrX3BhdGggPSBQYXRoKENGRy5mb3JnZV9kZWNrc19kaXIpIC8gZiJ7ZGVja19uYW1lfS5kY2siCiAgICAgICAgaWYgZGNrX3BhdGguZXhpc3RzKCk6CiAgICAgICAgICAgIGNhcmRzID0gW10KICAgICAgICAgICAgY3VycmVudF9zZWN0aW9uID0gTm9uZQogICAgICAgICAgICB3aXRoIG9wZW4oZGNrX3BhdGgsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGxvdyA9IGxpbmUubG93ZXIoKQogICAgICAgICAgICAgICAgICAgIGlmIGxvdyA9PSAnW2NvbW1hbmRlcl0nOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NlY3Rpb24gPSAnY29tbWFuZGVyJwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGVsaWYgbG93IGluICgnW21haW5dJywgJ1tkZWNrXScpOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NlY3Rpb24gPSAnbWFpbicKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBlbGlmIGxpbmUuc3RhcnRzd2l0aCgnWycpOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NlY3Rpb24gPSBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgaWYgY3VycmVudF9zZWN0aW9uIGFuZCBsaW5lOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoJyAnLCAxKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXR5ID0gaW50KHBhcnRzWzBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJ0c1sxXS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY21kciA9IDEgaWYgY3VycmVudF9zZWN0aW9uID09ICdjb21tYW5kZXInIGVsc2UgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKHF0eSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZV9saW5lJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY21jJzogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc19jb21tYW5kZXInOiBpc19jbWRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBpZiBjYXJkczoKICAgICAgICAgICAgICAgIHJldHVybiBjYXJkcwoKICAgIHJldHVybiBbXQoKCmRlZiBfcnVuX2RlZXBzZWVrX2JhdGNoX3RocmVhZCgKICAgIHN0YXRlOiBCYXRjaFN0YXRlLAogICAgZGVja19uYW1lczogbGlzdFtzdHJdLAogICAgbnVtX2dhbWVzOiBpbnQsCiAgICBvdXRwdXRfcGF0aDogc3RyLAopOgogICAgIiIiUnVuIGJhdGNoIHNpbXVsYXRpb24gdXNpbmcgUHl0aG9uIHNpbSBlbmdpbmUgKyBEZWVwU2VlayBBSSBvcHBvbmVudC4iIiIKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzIGFzIF9zLCBvcyBhcyBfbywgdGltZSBhcyBfdAogICAgICAgIHNyY19kaXIgPSBfby5wYXRoLmpvaW4oX28ucGF0aC5kaXJuYW1lKF9vLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCAnc3JjJykKICAgICAgICBpZiBzcmNfZGlyIG5vdCBpbiBfcy5wYXRoOgogICAgICAgICAgICBfcy5wYXRoLmluc2VydCgwLCBzcmNfZGlyKQoKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLm1vZGVscyBpbXBvcnQgQ2FyZAogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0uZGVlcHNlZWtfZW5naW5lIGltcG9ydCBEZWVwU2Vla0dhbWVFbmdpbmUKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLnJ1bGVzIGltcG9ydCBlbnJpY2hfY2FyZAoKICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKCdbRGVlcFNlZWsgQmF0Y2hdIEluaXRpYWxpemluZyBEZWVwU2VlayBicmFpbi4uLicpCiAgICAgICAgYnJhaW4gPSBfZ2V0X2RlZXBzZWVrX2JyYWluKCkKICAgICAgICBpZiBicmFpbiBhbmQgbm90IGJyYWluLl9jb25uZWN0ZWQ6CiAgICAgICAgICAgIGJyYWluLmNoZWNrX2Nvbm5lY3Rpb24oKQogICAgICAgIGlmIG5vdCBicmFpbiBvciBub3QgYnJhaW4uX2Nvbm5lY3RlZDoKICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSAnRGVlcFNlZWsgTExNIG5vdCBjb25uZWN0ZWQuIEdvIHRvIFNpbXVsYXRvciA+IERlZXBTZWVrIGFuZCBjb25uZWN0IGZpcnN0LicKICAgICAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0RlZXBTZWVrIEJhdGNoXSBDb25uZWN0ZWQgdG8ge2JyYWluLmNvbmZpZy5tb2RlbH0nKQoKICAgICAgICAjIExvYWQgYWxsIGRlY2tzCiAgICAgICAgIyDilIDilIAgTG9vayB1cCBoaXN0b3JpY2FsIHdpbiByYXRlcyBmcm9tIHBhc3QgYmF0Y2ggcmVzdWx0cyDilIDilIAKICAgICAgICBkZWNrX3dpbl9yYXRlcyA9IHt9ICAjIGRlY2tfbmFtZSAtPiBmbG9hdCAoMC0xMDApCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHRzX2RpciA9IENGRy5yZXN1bHRzX2RpcgogICAgICAgICAgICBpZiBfby5wYXRoLmlzZGlyKHJlc3VsdHNfZGlyKToKICAgICAgICAgICAgICAgIGZvciBmbmFtZSBpbiBzb3J0ZWQoX28ubGlzdGRpcihyZXN1bHRzX2RpciksIHJldmVyc2U9VHJ1ZSk6CiAgICAgICAgICAgICAgICAgICAgaWYgZm5hbWUuc3RhcnRzd2l0aCgnYmF0Y2gtJykgYW5kIGZuYW1lLmVuZHN3aXRoKCcuanNvbicpOgogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oX28ucGF0aC5qb2luKHJlc3VsdHNfZGlyLCBmbmFtZSksICdyJykgYXMgcmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdCA9IGpzb24ubG9hZHMocmYucmVhZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRkIGluIHBhc3QuZ2V0KCdkZWNrcycsIFtdKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmFtZSA9IGRkLmdldCgnZGVja05hbWUnLCAnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ciA9IGRkLmdldCgnd2luUmF0ZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG5hbWUgYW5kIHdyIGlzIG5vdCBOb25lIGFuZCBkbmFtZSBub3QgaW4gZGVja193aW5fcmF0ZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tfd2luX3JhdGVzW2RuYW1lXSA9IGZsb2F0KHdyKQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgbG9hZGVkX2RlY2tzID0ge30KICAgICAgICBkZWNrX21ldGEgPSB7fSAgIyBkZWNrX25hbWUgLT4ge2NvbW1hbmRlcl9uYW1lLCBjb2xvcl9pZGVudGl0eSwgYXJjaGV0eXBlfQogICAgICAgIGZvciBkbiBpbiBkZWNrX25hbWVzOgogICAgICAgICAgICByYXdfY2FyZHMgPSBfbG9hZF9kZWNrX2NhcmRzX2J5X25hbWUoZG4pCiAgICAgICAgICAgIGlmIG5vdCByYXdfY2FyZHM6CiAgICAgICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0RlZXBTZWVrIEJhdGNoXSBXQVJOSU5HOiBDb3VsZCBub3QgbG9hZCBkZWNrICJ7ZG59Iiwgc2tpcHBpbmcuJykKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIERldGVjdCBjb21tYW5kZXIgYW5kIGNvbG9yIGlkZW50aXR5IGZyb20gY2FyZCBkYXRhCiAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lID0gJycKICAgICAgICAgICAgY29sb3JfaWRlbnRpdHlfc2V0ID0gc2V0KCkKICAgICAgICAgICAgZGVja19vYmpzID0gW10KICAgICAgICAgICAgZm9yIGNkIGluIHJhd19jYXJkczoKICAgICAgICAgICAgICAgIGMgPSBDYXJkKG5hbWU9Y2RbJ25hbWUnXSkKICAgICAgICAgICAgICAgIGlmIGNkLmdldCgndHlwZV9saW5lJyk6IGMudHlwZV9saW5lID0gY2RbJ3R5cGVfbGluZSddCiAgICAgICAgICAgICAgICBpZiBjZC5nZXQoJ2NtYycpOiBjLmNtYyA9IGZsb2F0KGNkWydjbWMnXSkKICAgICAgICAgICAgICAgIGlmIGNkLmdldCgncG93ZXInKSBhbmQgY2QuZ2V0KCd0b3VnaG5lc3MnKToKICAgICAgICAgICAgICAgICAgICBjLnBvd2VyID0gc3RyKGNkWydwb3dlciddKQogICAgICAgICAgICAgICAgICAgIGMudG91Z2huZXNzID0gc3RyKGNkWyd0b3VnaG5lc3MnXSkKICAgICAgICAgICAgICAgICAgICBjLnB0ID0gYy5wb3dlciArICcvJyArIGMudG91Z2huZXNzCiAgICAgICAgICAgICAgICBpZiBjZC5nZXQoJ29yYWNsZV90ZXh0Jyk6IGMub3JhY2xlX3RleHQgPSBjZFsnb3JhY2xlX3RleHQnXQogICAgICAgICAgICAgICAgaWYgY2QuZ2V0KCdtYW5hX2Nvc3QnKTogYy5tYW5hX2Nvc3QgPSBjZFsnbWFuYV9jb3N0J10KICAgICAgICAgICAgICAgIGlmIGNkLmdldCgna2V5d29yZHMnKToKICAgICAgICAgICAgICAgICAgICBrdyA9IGNkWydrZXl3b3JkcyddCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrdywgc3RyKToKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OiBrdyA9IGpzb24ubG9hZHMoa3cpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246IGt3ID0gW10KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3LCBsaXN0KTogYy5rZXl3b3JkcyA9IGt3CiAgICAgICAgICAgICAgICAjIFNldCBpc19jb21tYW5kZXIgZmxhZyBmcm9tIERCIGRhdGEKICAgICAgICAgICAgICAgIGlmIGNkLmdldCgnaXNfY29tbWFuZGVyJyk6CiAgICAgICAgICAgICAgICAgICAgYy5pc19jb21tYW5kZXIgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyX25hbWUgPSBjZFsnbmFtZSddCiAgICAgICAgICAgICAgICAjIENvbGxlY3QgY29sb3IgaWRlbnRpdHkKICAgICAgICAgICAgICAgIGNpX3N0ciA9IGNkLmdldCgnY29sb3JfaWRlbnRpdHknLCAnJykKICAgICAgICAgICAgICAgIGlmIGNpX3N0cjoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNpX3BhcnNlZCA9IGpzb24ubG9hZHMoY2lfc3RyKSBpZiBpc2luc3RhbmNlKGNpX3N0ciwgc3RyKSBlbHNlIGNpX3N0cgogICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNpX3BhcnNlZCwgbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29sb3IgaW4gY2lfcGFyc2VkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5X3NldC5hZGQoY29sb3IpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgZW5yaWNoX2NhcmQoYykKICAgICAgICAgICAgICAgIGRlY2tfb2Jqcy5hcHBlbmQoYykKCiAgICAgICAgICAgICMgSW5mZXIgYXJjaGV0eXBlIGZyb20gZGVjayBjb21wb3NpdGlvbgogICAgICAgICAgICBjcmVhdHVyZV9jb3VudCA9IHN1bSgxIGZvciBjIGluIGRlY2tfb2JqcyBpZiBjLmlzX2NyZWF0dXJlKCkpCiAgICAgICAgICAgIHJlbW92YWxfY291bnQgPSBzdW0oMSBmb3IgYyBpbiBkZWNrX29ianMgaWYgYy5pc19yZW1vdmFsKQogICAgICAgICAgICByYW1wX2NvdW50ID0gc3VtKDEgZm9yIGMgaW4gZGVja19vYmpzIGlmIGMuaXNfcmFtcCkKICAgICAgICAgICAgYXZnX2NtYyA9IHN1bShjLmNtYyBvciAwIGZvciBjIGluIGRlY2tfb2JqcyBpZiBub3QgYy5pc19sYW5kKCkpIC8gbWF4KHN1bSgxIGZvciBjIGluIGRlY2tfb2JqcyBpZiBub3QgYy5pc19sYW5kKCkpLCAxKQogICAgICAgICAgICBvcmFjbGVfYWxsID0gJyAnLmpvaW4oKGMub3JhY2xlX3RleHQgb3IgJycpLmxvd2VyKCkgZm9yIGMgaW4gZGVja19vYmpzKQogICAgICAgICAgICBoYXNfY29tYm9fdGV4dCA9IGFueShrdyBpbiBvcmFjbGVfYWxsIGZvciBrdyBpbiBbJ3lvdSB3aW4gdGhlIGdhbWUnLCAnaW5maW5pdGUnLCAnZXh0cmEgdHVybiddKQoKICAgICAgICAgICAgaWYgaGFzX2NvbWJvX3RleHQ6CiAgICAgICAgICAgICAgICBhcmNoZXR5cGUgPSAnY29tYm8nCiAgICAgICAgICAgIGVsaWYgY3JlYXR1cmVfY291bnQgPj0gMzAgYW5kIGF2Z19jbWMgPD0gMi44OgogICAgICAgICAgICAgICAgYXJjaGV0eXBlID0gJ2FnZ3JvJwogICAgICAgICAgICBlbGlmIHJlbW92YWxfY291bnQgPj0gMTAgb3IgKGNyZWF0dXJlX2NvdW50IDw9IDE4IGFuZCBhdmdfY21jID49IDMuMik6CiAgICAgICAgICAgICAgICBhcmNoZXR5cGUgPSAnY29udHJvbCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyY2hldHlwZSA9ICdtaWRyYW5nZScKCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5X2xpc3QgPSBzb3J0ZWQobGlzdChjb2xvcl9pZGVudGl0eV9zZXQpKQogICAgICAgICAgICBkZWNrX21ldGFbZG5dID0gewogICAgICAgICAgICAgICAgJ2NvbW1hbmRlcl9uYW1lJzogY29tbWFuZGVyX25hbWUsCiAgICAgICAgICAgICAgICAnY29sb3JfaWRlbnRpdHknOiBjb2xvcl9pZGVudGl0eV9saXN0LAogICAgICAgICAgICAgICAgJ2FyY2hldHlwZSc6IGFyY2hldHlwZSwKICAgICAgICAgICAgICAgICd3aW5fcmF0ZSc6IGRlY2tfd2luX3JhdGVzLmdldChkbiksCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxvYWRlZF9kZWNrc1tkbl0gPSBkZWNrX29ianMKICAgICAgICAgICAgY21kcl9pbmZvID0gZicgKENvbW1hbmRlcjoge2NvbW1hbmRlcl9uYW1lfSknIGlmIGNvbW1hbmRlcl9uYW1lIGVsc2UgJycKICAgICAgICAgICAgd3JfaW5mbyA9IGYnIFtIaXN0b3J5OiB7ZGVja193aW5fcmF0ZXNbZG5dOi4wZn0lIFdSXScgaWYgZG4gaW4gZGVja193aW5fcmF0ZXMgZWxzZSAnJwogICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0RlZXBTZWVrIEJhdGNoXSBMb2FkZWQgZGVjayAie2RufSIgKHtsZW4oZGVja19vYmpzKX0gY2FyZHMsIHthcmNoZXR5cGV9KXtjbWRyX2luZm99e3dyX2luZm99JykKCiAgICAgICAgaWYgbm90IGxvYWRlZF9kZWNrczoKICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSAnTm8gZGVja3MgY291bGQgYmUgbG9hZGVkLicKICAgICAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEJ1aWxkIG1hdGNodXAgc2NoZWR1bGU6IGVhY2ggZGVjayBwbGF5cyBudW1fZ2FtZXMgdnMgRGVlcFNlZWsgQUkKICAgICAgICBkZWNrX2xpc3QgPSBsaXN0KGxvYWRlZF9kZWNrcy5rZXlzKCkpCiAgICAgICAgZ2FtZXNfcGVyX2RlY2sgPSBtYXgoMSwgbnVtX2dhbWVzIC8vIGxlbihkZWNrX2xpc3QpKQogICAgICAgIHRvdGFsX2dhbWVzID0gZ2FtZXNfcGVyX2RlY2sgKiBsZW4oZGVja19saXN0KQogICAgICAgIHN0YXRlLnRvdGFsX2dhbWVzID0gdG90YWxfZ2FtZXMKCiAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gUnVubmluZyB7Z2FtZXNfcGVyX2RlY2t9IGdhbWVzIHBlciBkZWNrIMOXIHtsZW4oZGVja19saXN0KX0gZGVja3MgPSB7dG90YWxfZ2FtZXN9IHRvdGFsJykKCiAgICAgICAgZW5naW5lID0gRGVlcFNlZWtHYW1lRW5naW5lKAogICAgICAgICAgICBicmFpbj1icmFpbiwKICAgICAgICAgICAgYWlfcGxheWVyX2luZGV4PTAsICAjIEFJIHBpbG90cyBkZWNrX2EgKHVzZXIncyBkZWNrKSB3aXRoIGZ1bGwgaW50ZWxsaWdlbmNlCiAgICAgICAgICAgIG1heF90dXJucz0yNSwKICAgICAgICAgICAgcmVjb3JkX2xvZz1UcnVlLAogICAgICAgICAgICBtbF9sb2c9VHJ1ZSwKICAgICAgICApCgogICAgICAgIHN0YXJ0X3RpbWUgPSBfdC50aW1lKCkKICAgICAgICBhbGxfZGVja19yZXN1bHRzID0gW10KICAgICAgICBjb21wbGV0ZWQgPSAwCgogICAgICAgIGZvciBkZWNrX25hbWUgaW4gZGVja19saXN0OgogICAgICAgICAgICBkZWNrX2EgPSBsb2FkZWRfZGVja3NbZGVja19uYW1lXQogICAgICAgICAgICAjIEdlbmVyYXRlIGEgdHJhaW5pbmcgb3Bwb25lbnQgZm9yIGVhY2ggZ2FtZQogICAgICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIubGFiLmV4cGVyaW1lbnRzIGltcG9ydCBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjawoKICAgICAgICAgICAgZGVja19zdGF0cyA9IHsKICAgICAgICAgICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAgICAgICAgICd3aW5zJzogMCwgJ2xvc3Nlcyc6IDAsICd0b3RhbEdhbWVzJzogZ2FtZXNfcGVyX2RlY2ssCiAgICAgICAgICAgICAgICAndG90YWxUdXJucyc6IDAsICd0b3RhbERhbWFnZURlYWx0JzogMCwgJ3RvdGFsRGFtYWdlUmVjZWl2ZWQnOiAwLAogICAgICAgICAgICAgICAgJ3RvdGFsU3BlbGxzQ2FzdCc6IDAsICd0b3RhbENyZWF0dXJlc1BsYXllZCc6IDAsCiAgICAgICAgICAgICAgICAnZ2FtZXMnOiBbXSwKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWV0YSA9IGRlY2tfbWV0YS5nZXQoZGVja19uYW1lLCB7fSkKICAgICAgICAgICAgZGtfYXJjaGV0eXBlID0gbWV0YS5nZXQoJ2FyY2hldHlwZScsICdtaWRyYW5nZScpCiAgICAgICAgICAgIGRrX2NvbW1hbmRlciA9IG1ldGEuZ2V0KCdjb21tYW5kZXJfbmFtZScsICcnKQogICAgICAgICAgICBka19jb2xvcnMgPSBtZXRhLmdldCgnY29sb3JfaWRlbnRpdHknLCBbXSkKICAgICAgICAgICAgZGtfd2luX3JhdGUgPSBtZXRhLmdldCgnd2luX3JhdGUnKQoKICAgICAgICAgICAgZm9yIGcgaW4gcmFuZ2UoZ2FtZXNfcGVyX2RlY2spOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRlY2tfYiA9IF9nZW5lcmF0ZV90cmFpbmluZ19kZWNrKCkKICAgICAgICAgICAgICAgICAgICBnYW1lX2lkID0gZidkcy17c3RhdGUuYmF0Y2hfaWR9LXtkZWNrX25hbWVbOjEyXX0tZ3tnKzF9JwogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVuZ2luZS5ydW4oCiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tfYSwgZGVja19iLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2E9ZGVja19uYW1lICsgJyAoQUkpJywKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9iPSdUcmFpbmluZyBPcHBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVfaWQ9Z2FtZV9pZCwgYXJjaGV0eXBlPWRrX2FyY2hldHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyX25hbWU9ZGtfY29tbWFuZGVyLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9pZGVudGl0eT1ka19jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbl9yYXRlPWRrX3dpbl9yYXRlLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBnZCA9IHJlc3VsdC50b19kaWN0KCkKICAgICAgICAgICAgICAgICAgICBnZFsnZ2FtZU51bWJlciddID0gZyArIDEKICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWydnYW1lcyddLmFwcGVuZChnZCkKCiAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0Lndpbm5lciA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd3aW5zJ10gKz0gMQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tfc3RhdHNbJ2xvc3NlcyddICs9IDEKICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd0b3RhbFR1cm5zJ10gKz0gcmVzdWx0LnR1cm5zCiAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0LnBsYXllcl9hX3N0YXRzOgogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd0b3RhbERhbWFnZURlYWx0J10gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9kZWFsdAogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd0b3RhbERhbWFnZVJlY2VpdmVkJ10gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9yZWNlaXZlZAogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd0b3RhbFNwZWxsc0Nhc3QnXSArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuc3BlbGxzX2Nhc3QKICAgICAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1sndG90YWxDcmVhdHVyZXNQbGF5ZWQnXSArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY3JlYXR1cmVzX3BsYXllZAoKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICBmJ1tHYW1lIHtjb21wbGV0ZWQgKyAxfS97dG90YWxfZ2FtZXN9XSB7ZGVja19uYW1lfSAoQUktcGlsb3RlZCkg4oaSICcKICAgICAgICAgICAgICAgICAgICAgICAgZid7IldJTiIgaWYgcmVzdWx0Lndpbm5lciA9PSAwIGVsc2UgIkxPU1MifSAodHVybiB7cmVzdWx0LnR1cm5zfSknCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBnZToKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0dhbWUge2NvbXBsZXRlZCArIDF9L3t0b3RhbF9nYW1lc31dIEVSUk9SOiB7Z2V9JykKICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWydnYW1lcyddLmFwcGVuZCh7J2Vycm9yJzogc3RyKGdlKSwgJ2dhbWVOdW1iZXInOiBnICsgMX0pCgogICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDEKICAgICAgICAgICAgICAgIHN0YXRlLmNvbXBsZXRlZF9nYW1lcyA9IGNvbXBsZXRlZAoKICAgICAgICAgICAgbiA9IGRlY2tfc3RhdHNbJ3RvdGFsR2FtZXMnXQogICAgICAgICAgICBkZWNrX3N0YXRzWyd3aW5SYXRlJ10gPSByb3VuZChkZWNrX3N0YXRzWyd3aW5zJ10gLyBuICogMTAwLCAxKSBpZiBuID4gMCBlbHNlIDAuMAogICAgICAgICAgICBkZWNrX3N0YXRzWydhdmdUdXJucyddID0gcm91bmQoZGVja19zdGF0c1sndG90YWxUdXJucyddIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAKICAgICAgICAgICAgZGVja19zdGF0c1snYXZnRGFtYWdlRGVhbHQnXSA9IHJvdW5kKGRlY2tfc3RhdHNbJ3RvdGFsRGFtYWdlRGVhbHQnXSAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wCiAgICAgICAgICAgIGRlY2tfc3RhdHNbJ2F2Z0RhbWFnZVJlY2VpdmVkJ10gPSByb3VuZChkZWNrX3N0YXRzWyd0b3RhbERhbWFnZVJlY2VpdmVkJ10gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMAogICAgICAgICAgICBkZWNrX3N0YXRzWydhdmdTcGVsbHNDYXN0J10gPSByb3VuZChkZWNrX3N0YXRzWyd0b3RhbFNwZWxsc0Nhc3QnXSAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wCiAgICAgICAgICAgIGRlY2tfc3RhdHNbJ2F2Z0NyZWF0dXJlc1BsYXllZCddID0gcm91bmQoZGVja19zdGF0c1sndG90YWxDcmVhdHVyZXNQbGF5ZWQnXSAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wCiAgICAgICAgICAgICMgSW5jbHVkZSBkZWNrIGludGVsbGlnZW5jZSBtZXRhZGF0YQogICAgICAgICAgICBkZWNrX3N0YXRzWydhcmNoZXR5cGUnXSA9IGRrX2FyY2hldHlwZQogICAgICAgICAgICBkZWNrX3N0YXRzWydjb21tYW5kZXInXSA9IGRrX2NvbW1hbmRlcgogICAgICAgICAgICBkZWNrX3N0YXRzWydjb2xvcklkZW50aXR5J10gPSBka19jb2xvcnMKICAgICAgICAgICAgaWYgZGtfd2luX3JhdGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWydwcmlvcldpblJhdGUnXSA9IGRrX3dpbl9yYXRlCiAgICAgICAgICAgIGFsbF9kZWNrX3Jlc3VsdHMuYXBwZW5kKGRlY2tfc3RhdHMpCgogICAgICAgIGVsYXBzZWQgPSBfdC50aW1lKCkgLSBzdGFydF90aW1lCiAgICAgICAgZHNfc3RhdHMgPSBicmFpbi5nZXRfc3RhdHMoKSBpZiBicmFpbiBlbHNlIHt9CgogICAgICAgICMgQnVpbGQgcmVzdWx0IGluIGNvbXBhdGlibGUgZm9ybWF0CiAgICAgICAgYmF0Y2hfcmVzdWx0ID0gewogICAgICAgICAgICAnbWV0YWRhdGEnOiB7CiAgICAgICAgICAgICAgICAnYmF0Y2hJZCc6IHN0YXRlLmJhdGNoX2lkLAogICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCc6IGRhdGV0aW1lLm5vdygpLmlzb2Zvcm1hdCgpLAogICAgICAgICAgICAgICAgJ2NvbXBsZXRlZEdhbWVzJzogY29tcGxldGVkLAogICAgICAgICAgICAgICAgJ3RocmVhZHMnOiAxLAogICAgICAgICAgICAgICAgJ2VsYXBzZWRNcyc6IGludChlbGFwc2VkICogMTAwMCksCiAgICAgICAgICAgICAgICAnZW5naW5lJzogJ2RlZXBzZWVrJywKICAgICAgICAgICAgICAgICdtb2RlbCc6IGJyYWluLmNvbmZpZy5tb2RlbCBpZiBicmFpbiBlbHNlICd1bmtub3duJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2RlY2tzJzogYWxsX2RlY2tfcmVzdWx0cywKICAgICAgICAgICAgJ2RlZXBzZWVrU3RhdHMnOiBkc19zdGF0cywKICAgICAgICB9CgogICAgICAgICMgV3JpdGUgTUwgZGVjaXNpb24gSlNPTkwgZm9yIHRoZSB0cmFpbmluZyBwaXBlbGluZQogICAgICAgIG1sX2RlY2lzaW9ucyA9IGVuZ2luZS5mbHVzaF9tbF9kZWNpc2lvbnMoKQogICAgICAgIGlmIG1sX2RlY2lzaW9uczoKICAgICAgICAgICAgbWxfanNvbmxfcGF0aCA9IG9zLnBhdGguam9pbihDRkcucmVzdWx0c19kaXIsIGYnbWwtZGVjaXNpb25zLWRzLXtzdGF0ZS5iYXRjaF9pZH0uanNvbmwnKQogICAgICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUobWxfanNvbmxfcGF0aCkgb3IgJy4nLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICB3aXRoIG9wZW4obWxfanNvbmxfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBtZjoKICAgICAgICAgICAgICAgIGZvciBkZWMgaW4gbWxfZGVjaXNpb25zOgogICAgICAgICAgICAgICAgICAgIG1mLndyaXRlKGpzb24uZHVtcHMoZGVjKSArICdcbicpCiAgICAgICAgICAgIHN0YXRlLmxvZ19saW5lcy5hcHBlbmQoZidbTUwgRGF0YV0gV3JvdGUge2xlbihtbF9kZWNpc2lvbnMpfSBkZWNpc2lvbiBzbmFwc2hvdHMgdG8ge29zLnBhdGguYmFzZW5hbWUobWxfanNvbmxfcGF0aCl9JykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKCdbTUwgRGF0YV0gTm8gZGVjaXNpb24gc25hcHNob3RzIGNhcHR1cmVkICgwIGRlY2lzaW9ucyknKQoKICAgICAgICAjIFNhdmUgdG8gcmVzdWx0cyBkaXIKICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUob3V0cHV0X3BhdGgpLCBleGlzdF9vaz1UcnVlKQogICAgICAgIHdpdGggb3BlbihvdXRwdXRfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICBqc29uLmR1bXAoYmF0Y2hfcmVzdWx0LCBmLCBpbmRlbnQ9MiwgZGVmYXVsdD1zdHIpCgogICAgICAgIHN0YXRlLnJlc3VsdF9wYXRoID0gb3V0cHV0X3BhdGgKICAgICAgICBlbGFwc2VkX21zID0gaW50KGVsYXBzZWQgKiAxMDAwKQogICAgICAgIHN0YXRlLmVsYXBzZWRfbXMgPSBlbGFwc2VkX21zCiAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgc3RhdGUuY29tcGxldGVkX2dhbWVzID0gdG90YWxfZ2FtZXMKCiAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gQ29tcGxldGU6IHtjb21wbGV0ZWR9IGdhbWVzIGluIHtlbGFwc2VkOi4xZn1zJykKICAgICAgICBmb3IgZHMgaW4gYWxsX2RlY2tfcmVzdWx0czoKICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJyAge2RzWyJkZWNrTmFtZSJdfToge2RzWyJ3aW5zIl19Vy17ZHNbImxvc3NlcyJdfUwgKHtkc1sid2luUmF0ZSJdfSUgV1IpJykKCiAgICAgICAgbG9nX3NpbS5pbmZvKGYnQmF0Y2gge3N0YXRlLmJhdGNoX2lkfSBjb21wbGV0ZToge2NvbXBsZXRlZH0gZ2FtZXMgaW4ge2VsYXBzZWQ6LjFmfXMnKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgc3RhdGUuZXJyb3IgPSBzdHIoZSkKICAgICAgICBzdGF0ZS5ydW5uaW5nID0gRmFsc2UKICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0RlZXBTZWVrIEJhdGNoXSBGQVRBTDoge2V9JykKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpAYXBwLnBvc3QoJy9hcGkvbGFiL3N0YXJ0LWRlZXBzZWVrJykKYXN5bmMgZGVmIHN0YXJ0X2JhdGNoX2RlZXBzZWVrKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0LCBiYWNrZ3JvdW5kX3Rhc2tzOiBCYWNrZ3JvdW5kVGFza3MpOgogICAgIiIiU3RhcnQgYSBiYXRjaCBzaW11bGF0aW9uIHVzaW5nIHRoZSBQeXRob24gc2ltIGVuZ2luZSArIERlZXBTZWVrIExMTSBvcHBvbmVudC4iIiIKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgZGVja3MgPSBib2R5LmdldCgnZGVja3MnLCBbXSkKICAgIG51bV9nYW1lcyA9IGJvZHkuZ2V0KCdudW1HYW1lcycsIDMwKQogICAgIyBOb3RlOiB0aHJlYWRzIG5vdCBhcHBsaWNhYmxlIGZvciBQeXRob24gc2ltIChzaW5nbGUtdGhyZWFkZWQgTExNIGNhbGxzKQoKICAgIGlmIG5vdCBkZWNrcyBvciBsZW4oZGVja3MpIDwgMToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgJ0F0IGxlYXN0IDEgZGVjayByZXF1aXJlZCcpCiAgICBpZiBudW1fZ2FtZXMgPCAxIG9yIG51bV9nYW1lcyA+IDUwMDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgJ251bUdhbWVzIG11c3QgYmUgMS01MDAnKQoKICAgICMgRmlsdGVyIGVtcHR5IGRlY2sgc2xvdHMKICAgIGRlY2tzID0gW2QgZm9yIGQgaW4gZGVja3MgaWYgZF0KICAgIGlmIG5vdCBkZWNrczoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgJ05vIHZhbGlkIGRlY2tzIHByb3ZpZGVkJykKCiAgICBiYXRjaF9pZCA9IHN0cih1dWlkLnV1aWQ0KCkpWzoxMl0KICAgIHN0YXRlID0gQmF0Y2hTdGF0ZShiYXRjaF9pZCwgbnVtX2dhbWVzLCAxKQogICAgYWN0aXZlX2JhdGNoZXNbYmF0Y2hfaWRdID0gc3RhdGUKCiAgICBvcy5tYWtlZGlycyhDRkcucmVzdWx0c19kaXIsIGV4aXN0X29rPVRydWUpCiAgICBvdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbihDRkcucmVzdWx0c19kaXIsIGYnYmF0Y2gte2JhdGNoX2lkfS5qc29uJykKICAgIHN0YXRlLnJlc3VsdF9wYXRoID0gb3V0cHV0X3BhdGgKCiAgICAjIFVzZSB0aHJlYWRpbmcgaW5zdGVhZCBvZiBCYWNrZ3JvdW5kVGFza3MgdG8gYXZvaWQgYXN5bmMgaXNzdWVzIHdpdGggREIKICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKAogICAgICAgIHRhcmdldD1fcnVuX2RlZXBzZWVrX2JhdGNoX3RocmVhZCwKICAgICAgICBhcmdzPShzdGF0ZSwgZGVja3MsIG51bV9nYW1lcywgb3V0cHV0X3BhdGgpLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdC5zdGFydCgpCgogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7CiAgICAgICAgJ2JhdGNoSWQnOiBiYXRjaF9pZCwKICAgICAgICAnc3RhdHVzJzogJ3N0YXJ0ZWQnLAogICAgICAgICdtZXNzYWdlJzogZidSdW5uaW5nIHtudW1fZ2FtZXN9IGdhbWVzIGFjcm9zcyB7bGVuKGRlY2tzKX0gZGVja3Mgd2l0aCBEZWVwU2VlayBBSScsCiAgICAgICAgJ2VuZ2luZSc6ICdkZWVwc2VlaycsCiAgICB9KQoKCiMgR2xvYmFsIE1MIGxvZ2dpbmcgdG9nZ2xlIChjYW4gYmUgZW5hYmxlZCB2aWEgQVBJKQpfbWxfbG9nZ2luZ19lbmFibGVkID0gRmFsc2UKCgpkZWYgX2ZpbmRfamF2YTE3KCkgLT4gc3RyOgogICAgIiIiQXV0by1kZXRlY3QgSmF2YSAxNyBmb3IgRm9yZ2Ugc3VicHJvY2Vzc2VzLiBGb3JnZSBjcmFzaGVzIG9uIEphdmEgMjUrLiIiIgogICAgaW1wb3J0IGdsb2IgYXMgX2dsb2IKICAgICMgQ2hlY2sgY29tbW9uIEFkb3B0aXVtL09yYWNsZSBsb2NhdGlvbnMgb24gV2luZG93cwogICAgc2VhcmNoX2RpcnMgPSBbCiAgICAgICAgcidDOlxQcm9ncmFtIEZpbGVzXEVjbGlwc2UgQWRvcHRpdW0nLAogICAgICAgIHInQzpcUHJvZ3JhbSBGaWxlc1xKYXZhJywKICAgIF0KICAgIGZvciBkIGluIHNlYXJjaF9kaXJzOgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZCk6CiAgICAgICAgICAgIGZvciBjaGlsZCBpbiBvcy5saXN0ZGlyKGQpOgogICAgICAgICAgICAgICAgaWYgY2hpbGQuc3RhcnRzd2l0aCgnamRrLTE3Jyk6CiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gb3MucGF0aC5qb2luKGQsIGNoaWxkLCAnYmluJywgJ2phdmEuZXhlJykKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjYW5kaWRhdGUpOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlCiAgICByZXR1cm4gJ2phdmEnICAjIGZhbGxiYWNrIHRvIHN5c3RlbSBqYXZhCgpfSkFWQTE3X1BBVEggPSBOb25lICAjIGNhY2hlZCByZXN1bHQKCmRlZiBnZXRfamF2YTE3KCkgLT4gc3RyOgogICAgZ2xvYmFsIF9KQVZBMTdfUEFUSAogICAgaWYgX0pBVkExN19QQVRIIGlzIE5vbmU6CiAgICAgICAgX0pBVkExN19QQVRIID0gX2ZpbmRfamF2YTE3KCkKICAgIHJldHVybiBfSkFWQTE3X1BBVEgKCgpkZWYgYnVpbGRfamF2YV9jb21tYW5kKAogICAgZGVja3M6IGxpc3Rbc3RyXSwKICAgIG51bV9nYW1lczogaW50LAogICAgdGhyZWFkczogaW50LAogICAgc2VlZDogT3B0aW9uYWxbaW50XSwKICAgIGNsb2NrOiBpbnQsCiAgICBvdXRwdXRfcGF0aDogc3RyLAogICAgdXNlX2xlYXJuZWRfcG9saWN5OiBib29sID0gRmFsc2UsCiAgICBwb2xpY3lfc2VydmVyOiBzdHIgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwIiwKICAgIHBvbGljeV9zdHlsZTogc3RyID0gIm1pZHJhbmdlIiwKICAgIHBvbGljeV9ncmVlZHk6IGJvb2wgPSBGYWxzZSwKICAgICMgdjI0IChJc3N1ZXMgIzQvIzUpOiBQZXJmb3JtYW5jZSBmbGFncwogICAgYWlfc2ltcGxpZmllZDogYm9vbCA9IEZhbHNlLAogICAgYWlfdGhpbmtfdGltZV9tczogaW50ID0gLTEsCiAgICBtYXhfcXVldWVfZGVwdGg6IGludCA9IC0xLAopIC0+IGxpc3Rbc3RyXToKICAgIGphdmExNyA9IGdldF9qYXZhMTcoKQogICAgY21kID0gWwogICAgICAgIGphdmExNywgIi1qYXIiLCBDRkcubGFiX2phciwKICAgICAgICAiLS1mb3JnZS1qYXIiLCBDRkcuZm9yZ2VfamFyLAogICAgICAgICItLWZvcmdlLWRpciIsIENGRy5mb3JnZV9kaXIsCiAgICBdCiAgICAjIEFkZCBkZWNrIGFyZ3MgZHluYW1pY2FsbHkgKDItNCBkZWNrcykKICAgIGZvciBpLCBkZWNrIGluIGVudW1lcmF0ZShkZWNrcyk6CiAgICAgICAgY21kLmV4dGVuZChbZiItLWRlY2t7aSsxfSIsIGRlY2tdKQogICAgY21kICs9IFsKICAgICAgICAiLS1nYW1lcyIsIHN0cihudW1fZ2FtZXMpLAogICAgICAgICItLXRocmVhZHMiLCBzdHIodGhyZWFkcyksCiAgICAgICAgIi0tY2xvY2siLCBzdHIoY2xvY2spLAogICAgICAgICItLW91dHB1dCIsIG91dHB1dF9wYXRoLAogICAgXQogICAgaWYgc2VlZCBpcyBub3QgTm9uZToKICAgICAgICBjbWQuZXh0ZW5kKFsiLS1zZWVkIiwgc3RyKHNlZWQpXSkKICAgIGlmIF9tbF9sb2dnaW5nX2VuYWJsZWQ6CiAgICAgICAgY21kLmFwcGVuZCgiLS1tbC1sb2ciKQogICAgaWYgdXNlX2xlYXJuZWRfcG9saWN5OgogICAgICAgIGNtZC5hcHBlbmQoIi0tbGVhcm5lZC1wb2xpY3kiKQogICAgICAgIGNtZC5leHRlbmQoWyItLXBvbGljeS1zZXJ2ZXIiLCBwb2xpY3lfc2VydmVyXSkKICAgICAgICBjbWQuZXh0ZW5kKFsiLS1wb2xpY3ktc3R5bGUiLCBwb2xpY3lfc3R5bGVdKQogICAgICAgIGlmIHBvbGljeV9ncmVlZHk6CiAgICAgICAgICAgIGNtZC5hcHBlbmQoIi0tcG9saWN5LWdyZWVkeSIpCiAgICAjIHYyNCAoSXNzdWVzICM0LyM1KTogUGVyZm9ybWFuY2UgZmxhZ3MKICAgIGlmIGFpX3NpbXBsaWZpZWQ6CiAgICAgICAgY21kLmFwcGVuZCgiLS1haS1zaW1wbGlmaWVkIikKICAgIGlmIGFpX3RoaW5rX3RpbWVfbXMgPiAwOgogICAgICAgIGNtZC5leHRlbmQoWyItLWFpLXRoaW5rLXRpbWUiLCBzdHIoYWlfdGhpbmtfdGltZV9tcyldKQogICAgaWYgbWF4X3F1ZXVlX2RlcHRoID4gMDoKICAgICAgICBjbWQuZXh0ZW5kKFsiLS1tYXgtcXVldWUiLCBzdHIobWF4X3F1ZXVlX2RlcHRoKV0pCiAgICByZXR1cm4gY21kCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb2xsZWN0aW9uIERhdGFiYXNlIFNldHVwCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpDT0xMRUNUSU9OX0RCX1BBVEggPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAiY29sbGVjdGlvbi5kYiIKX2RiX2xvY2FsID0gdGhyZWFkaW5nLmxvY2FsKCkKCgpkZWYgX2dldF9kYl9jb25uKCkgLT4gc3FsaXRlMy5Db25uZWN0aW9uOgogICAgIiIiR2V0IGEgdGhyZWFkLWxvY2FsIFNRTGl0ZSBjb25uZWN0aW9uLiIiIgogICAgaWYgbm90IGhhc2F0dHIoX2RiX2xvY2FsLCAiY29ubiIpIG9yIF9kYl9sb2NhbC5jb25uIGlzIE5vbmU6CiAgICAgICAgY29ubiA9IHNxbGl0ZTMuY29ubmVjdChzdHIoQ09MTEVDVElPTl9EQl9QQVRIKSwgY2hlY2tfc2FtZV90aHJlYWQ9RmFsc2UpCiAgICAgICAgY29ubi5yb3dfZmFjdG9yeSA9IHNxbGl0ZTMuUm93CiAgICAgICAgX2RiX2xvY2FsLmNvbm4gPSBjb25uCiAgICByZXR1cm4gX2RiX2xvY2FsLmNvbm4KCgpkZWYgaW5pdF9jb2xsZWN0aW9uX2RiKCk6CiAgICAiIiJJbml0aWFsaXplIHRoZSBjb2xsZWN0aW9uIFNRTGl0ZSBkYXRhYmFzZSB3aXRoIHRhYmxlcyBhbmQgaW5kZXhlcy4iIiIKICAgIGNvbm4gPSBzcWxpdGUzLmNvbm5lY3Qoc3RyKENPTExFQ1RJT05fREJfUEFUSCksIGNoZWNrX3NhbWVfdGhyZWFkPUZhbHNlKQogICAgY29ubi5yb3dfZmFjdG9yeSA9IHNxbGl0ZTMuUm93CiAgICBjdXIgPSBjb25uLmN1cnNvcigpCgogICAgY3VyLmV4ZWN1dGVzY3JpcHQoIiIiCiAgICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgY2FyZF9yZWNvcmRzICgKICAgICAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogICAgICAgICAgICBuYW1lIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgIHR5cGVfbGluZSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHN1YnR5cGVzIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgaXNfbGVnZW5kYXJ5IElOVEVHRVIgREVGQVVMVCAwLAogICAgICAgICAgICBpc19iYXNpYyBJTlRFR0VSIERFRkFVTFQgMCwKICAgICAgICAgICAgY29sb3JfaWRlbnRpdHkgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBjbWMgUkVBTCBERUZBVUxUIDAsCiAgICAgICAgICAgIG9yYWNsZV90ZXh0IFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAga2V5d29yZHMgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICB0Y2dfcHJpY2UgUkVBTCBERUZBVUxUIDAsCiAgICAgICAgICAgIHNhbHRfc2NvcmUgUkVBTCBERUZBVUxUIDAsCiAgICAgICAgICAgIGlzX2dhbWVfY2hhbmdlciBJTlRFR0VSIERFRkFVTFQgMCwKICAgICAgICAgICAgY2F0ZWdvcnkgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBzY3J5ZmFsbF9pZCBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHRjZ3BsYXllcl9pZCBURVhUIERFRkFVTFQgJycKICAgICAgICApOwoKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBjb2xsZWN0aW9uX2VudHJpZXMgKAogICAgICAgICAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgIG5hbWUgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgdHlwZV9saW5lIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgc3VidHlwZXMgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBpc19sZWdlbmRhcnkgSU5URUdFUiBERUZBVUxUIDAsCiAgICAgICAgICAgIGlzX2Jhc2ljIElOVEVHRVIgREVGQVVMVCAwLAogICAgICAgICAgICBjb2xvcl9pZGVudGl0eSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGNtYyBSRUFMIERFRkFVTFQgMCwKICAgICAgICAgICAgbWFuYV9jb3N0IFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgb3JhY2xlX3RleHQgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBrZXl3b3JkcyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHBvd2VyIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgdG91Z2huZXNzIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgcmFyaXR5IFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgc2V0X25hbWUgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBlZGhyZWNfcmFuayBJTlRFR0VSIERFRkFVTFQgMCwKICAgICAgICAgICAgdGNnX3ByaWNlIFJFQUwgREVGQVVMVCAwLAogICAgICAgICAgICBzYWx0X3Njb3JlIFJFQUwgREVGQVVMVCAwLAogICAgICAgICAgICBpc19nYW1lX2NoYW5nZXIgSU5URUdFUiBERUZBVUxUIDAsCiAgICAgICAgICAgIGNhdGVnb3J5IFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgc2NyeWZhbGxfaWQgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICB0Y2dwbGF5ZXJfaWQgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBxdWFudGl0eSBJTlRFR0VSIERFRkFVTFQgMSwKICAgICAgICAgICAgZmluaXNoIFRFWFQgREVGQVVMVCAnTk9STUFMJywKICAgICAgICAgICAgY29uZGl0aW9uIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgbGFuZ3VhZ2UgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBub3RlcyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHRhZ3MgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBzZXRfY29kZSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGNvbGxlY3Rvcl9udW1iZXIgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBjcmVhdGVkX2F0IFRFWFQgREVGQVVMVCAoZGF0ZXRpbWUoJ25vdycpKSwKICAgICAgICAgICAgdXBkYXRlZF9hdCBURVhUIERFRkFVTFQgKGRhdGV0aW1lKCdub3cnKSkKICAgICAgICApOwoKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2VfbmFtZSBPTiBjb2xsZWN0aW9uX2VudHJpZXMobmFtZSk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX2NvbG9yX2lkZW50aXR5IE9OIGNvbGxlY3Rpb25fZW50cmllcyhjb2xvcl9pZGVudGl0eSk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX3R5cGVfbGluZSBPTiBjb2xsZWN0aW9uX2VudHJpZXModHlwZV9saW5lKTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2VfaXNfbGVnZW5kYXJ5IE9OIGNvbGxlY3Rpb25fZW50cmllcyhpc19sZWdlbmRhcnkpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV9jbWMgT04gY29sbGVjdGlvbl9lbnRyaWVzKGNtYyk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX2NhdGVnb3J5IE9OIGNvbGxlY3Rpb25fZW50cmllcyhjYXRlZ29yeSk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX3NldF9jb2RlIE9OIGNvbGxlY3Rpb25fZW50cmllcyhzZXRfY29kZSk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX2NvbGxlY3Rvcl9udW1iZXIgT04gY29sbGVjdGlvbl9lbnRyaWVzKGNvbGxlY3Rvcl9udW1iZXIpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV9maW5pc2ggT04gY29sbGVjdGlvbl9lbnRyaWVzKGZpbmlzaCk7CgogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jcl9uYW1lIE9OIGNhcmRfcmVjb3JkcyhuYW1lKTsKCiAgICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZGVja3MgKAogICAgICAgICAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgIG5hbWUgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgY29tbWFuZGVyX3NjcnlmYWxsX2lkIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgY29tbWFuZGVyX25hbWUgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBjb2xvcl9pZGVudGl0eSBURVhUIERFRkFVTFQgJ1tdJywKICAgICAgICAgICAgc3RyYXRlZ3lfdGFnIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgY3JlYXRlZF9hdCBURVhUIERFRkFVTFQgKGRhdGV0aW1lKCdub3cnKSksCiAgICAgICAgICAgIHVwZGF0ZWRfYXQgVEVYVCBERUZBVUxUIChkYXRldGltZSgnbm93JykpCiAgICAgICAgKTsKCiAgICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZGVja19jYXJkcyAoCiAgICAgICAgICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgICAgICAgICAgZGVja19pZCBJTlRFR0VSIE5PVCBOVUxMLAogICAgICAgICAgICBzY3J5ZmFsbF9pZCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICBjYXJkX25hbWUgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBxdWFudGl0eSBJTlRFR0VSIERFRkFVTFQgMSwKICAgICAgICAgICAgaXNfY29tbWFuZGVyIElOVEVHRVIgREVGQVVMVCAwLAogICAgICAgICAgICByb2xlX3RhZyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIEZPUkVJR04gS0VZIChkZWNrX2lkKSBSRUZFUkVOQ0VTIGRlY2tzKGlkKSBPTiBERUxFVEUgQ0FTQ0FERQogICAgICAgICk7CgogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9kY19kZWNrX2lkIE9OIGRlY2tfY2FyZHMoZGVja19pZCk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2RjX3NjcnlmYWxsX2lkIE9OIGRlY2tfY2FyZHMoc2NyeWZhbGxfaWQpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9ka19jb21tYW5kZXIgT04gZGVja3MoY29tbWFuZGVyX3NjcnlmYWxsX2lkKTsKICAgICIiIikKCiAgICBjb25uLmNvbW1pdCgpCgogICAgIyDilIDilIAgTWlncmF0aW9uOiBhZGQgY29sdW1ucyB0byBleGlzdGluZyBEQnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBfbWlncmF0ZV9jb2x1bW5zID0gWwogICAgICAgICgibWFuYV9jb3N0IiwgIlRFWFQgREVGQVVMVCAnJyIpLAogICAgICAgICgicG93ZXIiLCAiVEVYVCBERUZBVUxUICcnIiksCiAgICAgICAgKCJ0b3VnaG5lc3MiLCAiVEVYVCBERUZBVUxUICcnIiksCiAgICAgICAgKCJyYXJpdHkiLCAiVEVYVCBERUZBVUxUICcnIiksCiAgICAgICAgKCJzZXRfbmFtZSIsICJURVhUIERFRkFVTFQgJyciKSwKICAgICAgICAoImVkaHJlY19yYW5rIiwgIklOVEVHRVIgREVGQVVMVCAwIiksCiAgICBdCiAgICBleGlzdGluZ19jb2xzID0ge3Jvd1sxXSBmb3Igcm93IGluIGNvbm4uZXhlY3V0ZSgiUFJBR01BIHRhYmxlX2luZm8oY29sbGVjdGlvbl9lbnRyaWVzKSIpLmZldGNoYWxsKCl9CiAgICBmb3IgY29sX25hbWUsIGNvbF9kZWYgaW4gX21pZ3JhdGVfY29sdW1uczoKICAgICAgICBpZiBjb2xfbmFtZSBub3QgaW4gZXhpc3RpbmdfY29sczoKICAgICAgICAgICAgY29ubi5leGVjdXRlKGYiQUxURVIgVEFCTEUgY29sbGVjdGlvbl9lbnRyaWVzIEFERCBDT0xVTU4ge2NvbF9uYW1lfSB7Y29sX2RlZn0iKQogICAgICAgICAgICBsb2dfY29sbGVjdC5pbmZvKGYiICBNaWdyYXRpb246IGFkZGVkIGNvbHVtbiAne2NvbF9uYW1lfScgdG8gY29sbGVjdGlvbl9lbnRyaWVzIikKICAgIGNvbm4uY29tbWl0KCkKICAgIGNvbm4uY2xvc2UoKQogICAgbG9nX2NvbGxlY3QuaW5mbyhmIiAgQ29sbGVjdGlvbiBEQjoge0NPTExFQ1RJT05fREJfUEFUSH0iKQoKCiMgRmllbGRzIHN0b3JlZCBhcyBKU09OIHN0cmluZ3MgaW4gU1FMaXRlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGFzIHBhcnNlZCBhcnJheXMKX0pTT05fRklFTERTID0gKCJjYXRlZ29yeSIsICJjb2xvcl9pZGVudGl0eSIsICJzdWJ0eXBlcyIsICJrZXl3b3JkcyIpCgoKZGVmIF9yb3dfdG9fZGljdChyb3cpIC0+IGRpY3Q6CiAgICAiIiJDb252ZXJ0IGEgc3FsaXRlMy5Sb3cgdG8gYSBwbGFpbiBkaWN0LCBwYXJzaW5nIEpTT04gYXJyYXkgZmllbGRzLiIiIgogICAgaWYgcm93IGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGQgPSBkaWN0KHJvdykKICAgIGZvciBmIGluIF9KU09OX0ZJRUxEUzoKICAgICAgICBpZiBmIGluIGQgYW5kIGlzaW5zdGFuY2UoZFtmXSwgc3RyKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZFtmXSA9IGpzb24ubG9hZHMoZFtmXSkKICAgICAgICAgICAgZXhjZXB0IChqc29uLkpTT05EZWNvZGVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgICAgIGRbZl0gPSBbXQogICAgcmV0dXJuIGQKCgpkZWYgX3NuYWtlX3RvX2NhbWVsKHM6IHN0cikgLT4gc3RyOgogICAgIiIiQ29udmVydCBzbmFrZV9jYXNlIHRvIGNhbWVsQ2FzZS4iIiIKICAgIHBhcnRzID0gcy5zcGxpdCgiXyIpCiAgICByZXR1cm4gcGFydHNbMF0gKyAiIi5qb2luKHAuY2FwaXRhbGl6ZSgpIGZvciBwIGluIHBhcnRzWzE6XSkKCgpkZWYgX2FkZF9pbWFnZV91cmwoY2FyZDogZGljdCkgLT4gZGljdDoKICAgICIiIkFkZCBpbWFnZVVybCBmaWVsZCBhbmQgY2FtZWxDYXNlIGFsaWFzZXMgZm9yIEpTIGNvbnN1bXB0aW9uLiIiIgogICAgc2NyeWZhbGxfaWQgPSBjYXJkLmdldCgic2NyeWZhbGxfaWQiLCAiIikKICAgIGlmIHNjcnlmYWxsX2lkOgogICAgICAgIGNhcmRbImltYWdlVXJsIl0gPSBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97c2NyeWZhbGxfaWR9P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIKICAgIGVsc2U6CiAgICAgICAgY2FyZFsiaW1hZ2VVcmwiXSA9IE5vbmUKICAgICMgQWRkIGNhbWVsQ2FzZSBhbGlhc2VzIGZvciBhbGwgc25ha2VfY2FzZSBrZXlzCiAgICBmb3Iga2V5IGluIGxpc3QoY2FyZC5rZXlzKCkpOgogICAgICAgIGlmICJfIiBpbiBrZXk6CiAgICAgICAgICAgIGNhbWVsID0gX3NuYWtlX3RvX2NhbWVsKGtleSkKICAgICAgICAgICAgaWYgY2FtZWwgbm90IGluIGNhcmQ6CiAgICAgICAgICAgICAgICBjYXJkW2NhbWVsXSA9IGNhcmRba2V5XQogICAgcmV0dXJuIGNhcmQKCgpkZWYgX2J1aWxkX2NvbGxlY3Rpb25fZmlsdGVycygKICAgIHE6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgY29sb3JzOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIHR5cGVzOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGlzTGVnZW5kYXJ5OiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBpc0Jhc2ljOiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBpc0dhbWVDaGFuZ2VyOiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBoaWdoU2FsdDogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgZmluaXNoOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGNtY01pbjogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIGNtY01heDogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIHByaWNlTWluOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgcHJpY2VNYXg6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBjYXRlZ29yeTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICByYXJpdHk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgc2V0Q29kZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBwb3dlck1pbjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBwb3dlck1heDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICB0b3VnaE1pbjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICB0b3VnaE1heDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBrZXl3b3JkOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGVkaHJlY01pbjogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICBlZGhyZWNNYXg6IE9wdGlvbmFsW2ludF0gPSBOb25lLAogICAgcXR5TWluOiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIHF0eU1heDogT3B0aW9uYWxbaW50XSA9IE5vbmUsCikgLT4gdHVwbGU6CiAgICAiIiJCdWlsZCBXSEVSRSBjbGF1c2UgYW5kIHBhcmFtcyBmb3IgY29sbGVjdGlvbiBxdWVyaWVzLiBSZXR1cm5zICh3aGVyZV9zdHIsIHBhcmFtc19saXN0KS4iIiIKICAgIGNvbmRpdGlvbnMgPSBbXQogICAgcGFyYW1zID0gW10KCiAgICBpZiBxOgogICAgICAgIGxpa2VfcSA9IGYiJXtxfSUiCiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoIihuYW1lIExJS0UgPyBPUiB0eXBlX2xpbmUgTElLRSA/IE9SIG9yYWNsZV90ZXh0IExJS0UgPykiKQogICAgICAgIHBhcmFtcy5leHRlbmQoW2xpa2VfcSwgbGlrZV9xLCBsaWtlX3FdKQoKICAgIGlmIGNvbG9yczoKICAgICAgICBjb2xvcl9saXN0ID0gW2Muc3RyaXAoKS51cHBlcigpIGZvciBjIGluIGNvbG9ycy5zcGxpdCgiLCIpIGlmIGMuc3RyaXAoKV0KICAgICAgICBmb3IgY29sb3IgaW4gY29sb3JfbGlzdDoKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImNvbG9yX2lkZW50aXR5IExJS0UgPyIpCiAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoZiclIntjb2xvcn0iJScpCgogICAgaWYgdHlwZXM6CiAgICAgICAgdHlwZV9saXN0ID0gW3Quc3RyaXAoKSBmb3IgdCBpbiB0eXBlcy5zcGxpdCgiLCIpIGlmIHQuc3RyaXAoKV0KICAgICAgICB0eXBlX2NvbmRpdGlvbnMgPSBbXQogICAgICAgIGZvciB0IGluIHR5cGVfbGlzdDoKICAgICAgICAgICAgdHlwZV9jb25kaXRpb25zLmFwcGVuZCgidHlwZV9saW5lIExJS0UgPyIpCiAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoZiIle3R9JSIpCiAgICAgICAgaWYgdHlwZV9jb25kaXRpb25zOgogICAgICAgICAgICBjb25kaXRpb25zLmFwcGVuZChmIih7JyBPUiAnLmpvaW4odHlwZV9jb25kaXRpb25zKX0pIikKCiAgICBpZiBpc0xlZ2VuZGFyeSBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiaXNfbGVnZW5kYXJ5ID0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZCgxIGlmIGlzTGVnZW5kYXJ5IGVsc2UgMCkKCiAgICBpZiBpc0Jhc2ljIGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJpc19iYXNpYyA9ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoMSBpZiBpc0Jhc2ljIGVsc2UgMCkKCiAgICBpZiBpc0dhbWVDaGFuZ2VyIGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJpc19nYW1lX2NoYW5nZXIgPSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKDEgaWYgaXNHYW1lQ2hhbmdlciBlbHNlIDApCgogICAgaWYgaGlnaFNhbHQ6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoInNhbHRfc2NvcmUgPiAyLjAiKQoKICAgIGlmIGZpbmlzaDoKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiZmluaXNoID0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChmaW5pc2gudXBwZXIoKSkKCiAgICBpZiBjbWNNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImNtYyA+PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKGNtY01pbikKCiAgICBpZiBjbWNNYXggaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImNtYyA8PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKGNtY01heCkKCiAgICBpZiBwcmljZU1pbiBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgidGNnX3ByaWNlID49ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQocHJpY2VNaW4pCgogICAgaWYgcHJpY2VNYXggaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoInRjZ19wcmljZSA8PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKHByaWNlTWF4KQoKICAgIGlmIGNhdGVnb3J5OgogICAgICAgIGNhdF9saXN0ID0gW2Muc3RyaXAoKSBmb3IgYyBpbiBjYXRlZ29yeS5zcGxpdCgiLCIpIGlmIGMuc3RyaXAoKV0KICAgICAgICBjYXRfY29uZGl0aW9ucyA9IFtdCiAgICAgICAgZm9yIGMgaW4gY2F0X2xpc3Q6CiAgICAgICAgICAgIGNhdF9jb25kaXRpb25zLmFwcGVuZCgiY2F0ZWdvcnkgTElLRSA/IikKICAgICAgICAgICAgcGFyYW1zLmFwcGVuZChmJyUie2N9IiUnKQogICAgICAgIGlmIGNhdF9jb25kaXRpb25zOgogICAgICAgICAgICBjb25kaXRpb25zLmFwcGVuZChmIih7JyBPUiAnLmpvaW4oY2F0X2NvbmRpdGlvbnMpfSkiKQoKICAgICMg4pSA4pSAIE5ldyBmaWx0ZXJzIOKUgOKUgAoKICAgIGlmIHJhcml0eToKICAgICAgICByYXJfbGlzdCA9IFtyLnN0cmlwKCkubG93ZXIoKSBmb3IgciBpbiByYXJpdHkuc3BsaXQoIiwiKSBpZiByLnN0cmlwKCldCiAgICAgICAgaWYgcmFyX2xpc3Q6CiAgICAgICAgICAgIHBsYWNlaG9sZGVycyA9ICIsIi5qb2luKFsiPyJdICogbGVuKHJhcl9saXN0KSkKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoZiJMT1dFUihyYXJpdHkpIElOICh7cGxhY2Vob2xkZXJzfSkiKQogICAgICAgICAgICBwYXJhbXMuZXh0ZW5kKHJhcl9saXN0KQoKICAgIGlmIHNldENvZGU6CiAgICAgICAgc2V0X2xpc3QgPSBbcy5zdHJpcCgpLnVwcGVyKCkgZm9yIHMgaW4gc2V0Q29kZS5zcGxpdCgiLCIpIGlmIHMuc3RyaXAoKV0KICAgICAgICBpZiBzZXRfbGlzdDoKICAgICAgICAgICAgcGxhY2Vob2xkZXJzID0gIiwiLmpvaW4oWyI/Il0gKiBsZW4oc2V0X2xpc3QpKQogICAgICAgICAgICBjb25kaXRpb25zLmFwcGVuZChmIlVQUEVSKHNldF9jb2RlKSBJTiAoe3BsYWNlaG9sZGVyc30pIikKICAgICAgICAgICAgcGFyYW1zLmV4dGVuZChzZXRfbGlzdCkKCiAgICBpZiBwb3dlck1pbiBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiQ0FTVChwb3dlciBBUyBSRUFMKSA+PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKGZsb2F0KHBvd2VyTWluKSkKCiAgICBpZiBwb3dlck1heCBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiQ0FTVChwb3dlciBBUyBSRUFMKSA8PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKGZsb2F0KHBvd2VyTWF4KSkKCiAgICBpZiB0b3VnaE1pbiBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiQ0FTVCh0b3VnaG5lc3MgQVMgUkVBTCkgPj0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChmbG9hdCh0b3VnaE1pbikpCgogICAgaWYgdG91Z2hNYXggaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoIkNBU1QodG91Z2huZXNzIEFTIFJFQUwpIDw9ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoZmxvYXQodG91Z2hNYXgpKQoKICAgIGlmIGtleXdvcmQ6CiAgICAgICAga3dfbGlzdCA9IFtrLnN0cmlwKCkgZm9yIGsgaW4ga2V5d29yZC5zcGxpdCgiLCIpIGlmIGsuc3RyaXAoKV0KICAgICAgICBmb3Iga3cgaW4ga3dfbGlzdDoKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImtleXdvcmRzIExJS0UgPyIpCiAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoZiIle2t3fSUiKQoKICAgIGlmIGVkaHJlY01pbiBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiZWRocmVjX3JhbmsgPj0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChlZGhyZWNNaW4pCgogICAgaWYgZWRocmVjTWF4IGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJlZGhyZWNfcmFuayA8PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKGVkaHJlY01heCkKCiAgICBpZiBxdHlNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoInF1YW50aXR5ID49ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQocXR5TWluKQoKICAgIGlmIHF0eU1heCBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgicXVhbnRpdHkgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChxdHlNYXgpCgogICAgd2hlcmVfc3RyID0gIiIKICAgIGlmIGNvbmRpdGlvbnM6CiAgICAgICAgd2hlcmVfc3RyID0gIldIRVJFICIgKyAiIEFORCAiLmpvaW4oY29uZGl0aW9ucykKCiAgICByZXR1cm4gd2hlcmVfc3RyLCBwYXJhbXMKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENvbGxlY3Rpb24gQ1JVRCBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKClZBTElEX1NPUlRfRklFTERTID0geyJuYW1lIiwgImNtYyIsICJ0Y2dfcHJpY2UiLCAic2FsdF9zY29yZSIsICJjYXRlZ29yeSIsICJjb2xvcl9pZGVudGl0eSIsICJxdWFudGl0eSIsICJ0eXBlX2xpbmUiLCAiZmluaXNoIiwgInJhcml0eSIsICJzZXRfY29kZSIsICJwb3dlciIsICJ0b3VnaG5lc3MiLCAiZWRocmVjX3JhbmsifQoKCkBhcHAuZ2V0KCIvYXBpL2NvbGxlY3Rpb24vZXhwb3J0IikKYXN5bmMgZGVmIGV4cG9ydF9jb2xsZWN0aW9uKAogICAgZm9ybWF0OiBzdHIgPSAiSU5URVJOQUxfQ1NWIiwKICAgIHE6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgY29sb3JzOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIHR5cGVzOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGlzTGVnZW5kYXJ5OiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBpc0Jhc2ljOiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBpc0dhbWVDaGFuZ2VyOiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBoaWdoU2FsdDogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgZmluaXNoOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGNtY01pbjogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIGNtY01heDogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIHByaWNlTWluOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgcHJpY2VNYXg6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBjYXRlZ29yeTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCik6CiAgICAiIiJFeHBvcnQgY29sbGVjdGlvbiBpbiB2YXJpb3VzIGZvcm1hdHMgd2l0aCBvcHRpb25hbCBmaWx0ZXJzLiIiIgogICAgd2hlcmVfc3RyLCBwYXJhbXMgPSBfYnVpbGRfY29sbGVjdGlvbl9maWx0ZXJzKAogICAgICAgIHE9cSwgY29sb3JzPWNvbG9ycywgdHlwZXM9dHlwZXMsIGlzTGVnZW5kYXJ5PWlzTGVnZW5kYXJ5LAogICAgICAgIGlzQmFzaWM9aXNCYXNpYywgaXNHYW1lQ2hhbmdlcj1pc0dhbWVDaGFuZ2VyLCBoaWdoU2FsdD1oaWdoU2FsdCwKICAgICAgICBmaW5pc2g9ZmluaXNoLCBjbWNNaW49Y21jTWluLCBjbWNNYXg9Y21jTWF4LAogICAgICAgIHByaWNlTWluPXByaWNlTWluLCBwcmljZU1heD1wcmljZU1heCwgY2F0ZWdvcnk9Y2F0ZWdvcnksCiAgICApCgogICAgc3FsID0gZiJTRUxFQ1QgKiBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyB7d2hlcmVfc3RyfSBPUkRFUiBCWSBuYW1lIEFTQyIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IFtfcm93X3RvX2RpY3QocikgZm9yIHIgaW4gY29ubi5leGVjdXRlKHNxbCwgcGFyYW1zKS5mZXRjaGFsbCgpXQoKICAgIGZtdCA9IGZvcm1hdC51cHBlcigpCiAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgaWYgZm10ID09ICJJTlRFUk5BTF9DU1YiOgogICAgICAgIGlmIHJvd3M6CiAgICAgICAgICAgIGZpZWxkbmFtZXMgPSBsaXN0KHJvd3NbMF0ua2V5cygpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpZWxkbmFtZXMgPSBbCiAgICAgICAgICAgICAgICAiaWQiLCAibmFtZSIsICJ0eXBlX2xpbmUiLCAic3VidHlwZXMiLCAiaXNfbGVnZW5kYXJ5IiwgImlzX2Jhc2ljIiwKICAgICAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSIsICJjbWMiLCAib3JhY2xlX3RleHQiLCAia2V5d29yZHMiLCAidGNnX3ByaWNlIiwKICAgICAgICAgICAgICAgICJzYWx0X3Njb3JlIiwgImlzX2dhbWVfY2hhbmdlciIsICJjYXRlZ29yeSIsICJzY3J5ZmFsbF9pZCIsICJ0Y2dwbGF5ZXJfaWQiLAogICAgICAgICAgICAgICAgInF1YW50aXR5IiwgImZpbmlzaCIsICJjb25kaXRpb24iLCAibGFuZ3VhZ2UiLCAibm90ZXMiLCAidGFncyIsCiAgICAgICAgICAgICAgICAic2V0X2NvZGUiLCAiY29sbGVjdG9yX251bWJlciIsICJjcmVhdGVkX2F0IiwgInVwZGF0ZWRfYXQiLAogICAgICAgICAgICBdCiAgICAgICAgd3JpdGVyID0gY3N2LkRpY3RXcml0ZXIob3V0cHV0LCBmaWVsZG5hbWVzPWZpZWxkbmFtZXMpCiAgICAgICAgd3JpdGVyLndyaXRlaGVhZGVyKCkKICAgICAgICB3cml0ZXIud3JpdGVyb3dzKHJvd3MpCiAgICAgICAgZmlsZW5hbWUgPSAiY29sbGVjdGlvbl9leHBvcnQuY3N2IgogICAgICAgIG1lZGlhX3R5cGUgPSAidGV4dC9jc3YiCgogICAgZWxpZiBmbXQgPT0gIk1PWEZJRUxEX0NTViI6CiAgICAgICAgZmllbGRuYW1lcyA9IFsiQ291bnQiLCAiTmFtZSIsICJFZGl0aW9uIiwgIkNvbmRpdGlvbiIsICJMYW5ndWFnZSIsICJGb2lsIiwgIkNvbGxlY3RvciBOdW1iZXIiXQogICAgICAgIHdyaXRlciA9IGNzdi5EaWN0V3JpdGVyKG91dHB1dCwgZmllbGRuYW1lcz1maWVsZG5hbWVzKQogICAgICAgIHdyaXRlci53cml0ZWhlYWRlcigpCiAgICAgICAgZm9yIHJvdyBpbiByb3dzOgogICAgICAgICAgICBmaW5pc2hfdmFsID0gcm93LmdldCgiZmluaXNoIiwgIk5PUk1BTCIpLnVwcGVyKCkKICAgICAgICAgICAgZm9pbF92YWwgPSAiZm9pbCIgaWYgZmluaXNoX3ZhbCA9PSAiRk9JTCIgZWxzZSAoImV0Y2hlZCIgaWYgZmluaXNoX3ZhbCA9PSAiRVRDSEVEIiBlbHNlICIiKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coewogICAgICAgICAgICAgICAgIkNvdW50Ijogcm93LmdldCgicXVhbnRpdHkiLCAxKSwKICAgICAgICAgICAgICAgICJOYW1lIjogcm93LmdldCgibmFtZSIsICIiKSwKICAgICAgICAgICAgICAgICJFZGl0aW9uIjogcm93LmdldCgic2V0X2NvZGUiLCAiIikudXBwZXIoKSwKICAgICAgICAgICAgICAgICJDb25kaXRpb24iOiByb3cuZ2V0KCJjb25kaXRpb24iLCAiIiksCiAgICAgICAgICAgICAgICAiTGFuZ3VhZ2UiOiByb3cuZ2V0KCJsYW5ndWFnZSIsICIiKSwKICAgICAgICAgICAgICAgICJGb2lsIjogZm9pbF92YWwsCiAgICAgICAgICAgICAgICAiQ29sbGVjdG9yIE51bWJlciI6IHJvdy5nZXQoImNvbGxlY3Rvcl9udW1iZXIiLCAiIiksCiAgICAgICAgICAgIH0pCiAgICAgICAgZmlsZW5hbWUgPSAiY29sbGVjdGlvbl9tb3hmaWVsZC5jc3YiCiAgICAgICAgbWVkaWFfdHlwZSA9ICJ0ZXh0L2NzdiIKCiAgICBlbGlmIGZtdCA9PSAiVEVYVCI6CiAgICAgICAgbGluZXMgPSBbXQogICAgICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICAgICAgcXR5ID0gcm93LmdldCgicXVhbnRpdHkiLCAxKQogICAgICAgICAgICBuYW1lID0gcm93LmdldCgibmFtZSIsICIiKQogICAgICAgICAgICBzZXRfY29kZSA9IHJvdy5nZXQoInNldF9jb2RlIiwgIiIpLnVwcGVyKCkKICAgICAgICAgICAgY29sbF9udW0gPSByb3cuZ2V0KCJjb2xsZWN0b3JfbnVtYmVyIiwgIiIpCiAgICAgICAgICAgIGlmIHNldF9jb2RlIGFuZCBjb2xsX251bToKICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIntxdHl9IHtuYW1lfSAoe3NldF9jb2RlfSkge2NvbGxfbnVtfSIpCiAgICAgICAgICAgIGVsaWYgc2V0X2NvZGU6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0gKHtzZXRfY29kZX0pIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIntxdHl9IHtuYW1lfSIpCiAgICAgICAgb3V0cHV0LndyaXRlKCJcbiIuam9pbihsaW5lcykpCiAgICAgICAgZmlsZW5hbWUgPSAiY29sbGVjdGlvbl9leHBvcnQudHh0IgogICAgICAgIG1lZGlhX3R5cGUgPSAidGV4dC9wbGFpbiIKCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCBmIlVua25vd24gZm9ybWF0OiB7Zm9ybWF0fS4gVXNlIElOVEVSTkFMX0NTViwgTU9YRklFTERfQ1NWLCBvciBURVhULiIpCgogICAgY29udGVudCA9IG91dHB1dC5nZXR2YWx1ZSgpCgogICAgZGVmIGl0ZXJfY29udGVudCgpOgogICAgICAgIHlpZWxkIGNvbnRlbnQuZW5jb2RlKCJ1dGYtOCIpCgogICAgcmV0dXJuIFN0cmVhbWluZ1Jlc3BvbnNlKAogICAgICAgIGl0ZXJfY29udGVudCgpLAogICAgICAgIG1lZGlhX3R5cGU9bWVkaWFfdHlwZSwKICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1EaXNwb3NpdGlvbiI6IGYnYXR0YWNobWVudDsgZmlsZW5hbWU9IntmaWxlbmFtZX0iJ30sCiAgICApCgoKQGFwcC5nZXQoIi9hcGkvY29sbGVjdGlvbi9zZXRzIikKYXN5bmMgZGVmIGNvbGxlY3Rpb25fc2V0cygpOgogICAgIiIiUmV0dXJuIGRpc3RpbmN0IHNldCBjb2RlcyArIG5hbWVzIGluIHRoZSBjb2xsZWN0aW9uIChmb3IgZmlsdGVyIGF1dG9jb21wbGV0ZSkuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCBESVNUSU5DVCBVUFBFUihzZXRfY29kZSkgYXMgY29kZSwgc2V0X25hbWUgYXMgbmFtZSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBzZXRfY29kZSAhPSAnJyBPUkRFUiBCWSBzZXRfbmFtZSBBU0MiCiAgICApLmZldGNoYWxsKCkKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgciBpbiByb3dzOgogICAgICAgIGNvZGUgPSByWyJjb2RlIl0gaWYgImNvZGUiIGluIHIua2V5cygpIGVsc2UgclswXQogICAgICAgIG5hbWUgPSByWyJuYW1lIl0gaWYgIm5hbWUiIGluIHIua2V5cygpIGVsc2UgclsxXQogICAgICAgIGlmIGNvZGU6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoeyJjb2RlIjogY29kZSwgIm5hbWUiOiBuYW1lIG9yIGNvZGV9KQogICAgcmV0dXJuIEpTT05SZXNwb25zZShyZXN1bHQpCgoKQGFwcC5nZXQoIi9hcGkvY29sbGVjdGlvbi9rZXl3b3JkcyIpCmFzeW5jIGRlZiBjb2xsZWN0aW9uX2tleXdvcmRzKCk6CiAgICAiIiJSZXR1cm4gZGlzdGluY3Qga2V5d29yZHMgZm91bmQgaW4gdGhlIGNvbGxlY3Rpb24uIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCBrZXl3b3JkcyBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBrZXl3b3JkcyAhPSAnJyBBTkQga2V5d29yZHMgIT0gJ1tdJyIpLmZldGNoYWxsKCkKICAgIGt3X3NldCA9IHNldCgpCiAgICBmb3IgciBpbiByb3dzOgogICAgICAgIHRyeToKICAgICAgICAgICAga3dzID0ganNvbi5sb2FkcyhyWyJrZXl3b3JkcyJdKSBpZiBpc2luc3RhbmNlKHJbImtleXdvcmRzIl0sIHN0cikgZWxzZSByWyJrZXl3b3JkcyJdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa3dzLCBsaXN0KToKICAgICAgICAgICAgICAgIGZvciBrIGluIGt3czoKICAgICAgICAgICAgICAgICAgICBpZiBrOgogICAgICAgICAgICAgICAgICAgICAgICBrd19zZXQuYWRkKGspCiAgICAgICAgZXhjZXB0IChqc29uLkpTT05EZWNvZGVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIEpTT05SZXNwb25zZShzb3J0ZWQoa3dfc2V0KSkKCgpAYXBwLmdldCgiL2FwaS9jb2xsZWN0aW9uIikKYXN5bmMgZGVmIGxpc3RfY29sbGVjdGlvbigKICAgIHBhZ2U6IGludCA9IDEsCiAgICBwYWdlU2l6ZTogaW50ID0gNTAsCiAgICBxOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIHNvcnRGaWVsZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBzb3J0RGlyOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGNvbG9yczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICB0eXBlczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBpc0xlZ2VuZGFyeTogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNCYXNpYzogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNHYW1lQ2hhbmdlcjogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaGlnaFNhbHQ6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGZpbmlzaDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBjbWNNaW46IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBjbWNNYXg6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBwcmljZU1pbjogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIHByaWNlTWF4OiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgY2F0ZWdvcnk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgZGVja19pZDogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICByYXJpdHk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgc2V0Q29kZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBwb3dlck1pbjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBwb3dlck1heDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICB0b3VnaE1pbjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICB0b3VnaE1heDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBrZXl3b3JkOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGVkaHJlY01pbjogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICBlZGhyZWNNYXg6IE9wdGlvbmFsW2ludF0gPSBOb25lLAogICAgcXR5TWluOiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIHF0eU1heDogT3B0aW9uYWxbaW50XSA9IE5vbmUsCik6CiAgICAiIiJMaXN0IGNvbGxlY3Rpb24gZW50cmllcyB3aXRoIHNlYXJjaCwgc29ydCwgYW5kIGZpbHRlci4KICAgIE9wdGlvbmFsIGRlY2tfaWQ6IHdoZW4gcHJvdmlkZWQsIGluY2x1ZGVzIGluX2RlY2tfcXVhbnRpdHkgZm9yIGVhY2ggcmVzdWx0LgogICAgIiIiCiAgICB3aGVyZV9zdHIsIHBhcmFtcyA9IF9idWlsZF9jb2xsZWN0aW9uX2ZpbHRlcnMoCiAgICAgICAgcT1xLCBjb2xvcnM9Y29sb3JzLCB0eXBlcz10eXBlcywgaXNMZWdlbmRhcnk9aXNMZWdlbmRhcnksCiAgICAgICAgaXNCYXNpYz1pc0Jhc2ljLCBpc0dhbWVDaGFuZ2VyPWlzR2FtZUNoYW5nZXIsIGhpZ2hTYWx0PWhpZ2hTYWx0LAogICAgICAgIGZpbmlzaD1maW5pc2gsIGNtY01pbj1jbWNNaW4sIGNtY01heD1jbWNNYXgsCiAgICAgICAgcHJpY2VNaW49cHJpY2VNaW4sIHByaWNlTWF4PXByaWNlTWF4LCBjYXRlZ29yeT1jYXRlZ29yeSwKICAgICAgICByYXJpdHk9cmFyaXR5LCBzZXRDb2RlPXNldENvZGUsIHBvd2VyTWluPXBvd2VyTWluLCBwb3dlck1heD1wb3dlck1heCwKICAgICAgICB0b3VnaE1pbj10b3VnaE1pbiwgdG91Z2hNYXg9dG91Z2hNYXgsIGtleXdvcmQ9a2V5d29yZCwKICAgICAgICBlZGhyZWNNaW49ZWRocmVjTWluLCBlZGhyZWNNYXg9ZWRocmVjTWF4LCBxdHlNaW49cXR5TWluLCBxdHlNYXg9cXR5TWF4LAogICAgKQoKICAgICMgVmFsaWRhdGUgc29ydAogICAgc29ydF9maWVsZCA9IHNvcnRGaWVsZCBpZiBzb3J0RmllbGQgaW4gVkFMSURfU09SVF9GSUVMRFMgZWxzZSAibmFtZSIKICAgIHNvcnRfZGlyID0gIkRFU0MiIGlmIChzb3J0RGlyIG9yICIiKS51cHBlcigpID09ICJERVNDIiBlbHNlICJBU0MiCgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgIyBDb3VudCB0b3RhbAogICAgY291bnRfc3FsID0gZiJTRUxFQ1QgQ09VTlQoKikgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMge3doZXJlX3N0cn0iCiAgICB0b3RhbCA9IGNvbm4uZXhlY3V0ZShjb3VudF9zcWwsIHBhcmFtcykuZmV0Y2hvbmUoKVswXQoKICAgICMgUGFnaW5hdGUKICAgIG9mZnNldCA9IChtYXgoMSwgcGFnZSkgLSAxKSAqIHBhZ2VTaXplCiAgICBkYXRhX3NxbCA9IGYiIiIKICAgICAgICBTRUxFQ1QgKiBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyB7d2hlcmVfc3RyfQogICAgICAgIE9SREVSIEJZIHtzb3J0X2ZpZWxkfSB7c29ydF9kaXJ9CiAgICAgICAgTElNSVQgPyBPRkZTRVQgPwogICAgIiIiCiAgICByb3dzID0gY29ubi5leGVjdXRlKGRhdGFfc3FsLCBwYXJhbXMgKyBbcGFnZVNpemUsIG9mZnNldF0pLmZldGNoYWxsKCkKICAgIGl0ZW1zID0gW19hZGRfaW1hZ2VfdXJsKF9yb3dfdG9fZGljdChyKSkgZm9yIHIgaW4gcm93c10KCiAgICAjIElmIGRlY2tfaWQgcHJvdmlkZWQsIGFubm90YXRlIGVhY2ggaXRlbSB3aXRoIGhvdyBtYW55IGNvcGllcyBhcmUgYWxyZWFkeSBpbiB0aGF0IGRlY2sKICAgIGlmIGRlY2tfaWQgaXMgbm90IE5vbmU6CiAgICAgICAgIyBCdWlsZCBhIG1hcCBvZiBzY3J5ZmFsbF9pZCAtPiBxdWFudGl0eSBpbiBkZWNrCiAgICAgICAgZGVja19jYXJkX3Jvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1Qgc2NyeWZhbGxfaWQsIFNVTShxdWFudGl0eSkgYXMgcXR5IEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBHUk9VUCBCWSBzY3J5ZmFsbF9pZCIsCiAgICAgICAgICAgIChkZWNrX2lkLCkKICAgICAgICApLmZldGNoYWxsKCkKICAgICAgICBpbl9kZWNrX21hcCA9IHtyb3dbInNjcnlmYWxsX2lkIl06IHJvd1sicXR5Il0gZm9yIHJvdyBpbiBkZWNrX2NhcmRfcm93c30KICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgaXRlbVsiaW5fZGVja19xdWFudGl0eSJdID0gaW5fZGVja19tYXAuZ2V0KGl0ZW0uZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSwgMCkKCiAgICByZXR1cm4geyJpdGVtcyI6IGl0ZW1zLCAicGFnZSI6IHBhZ2UsICJwYWdlU2l6ZSI6IHBhZ2VTaXplLCAidG90YWwiOiB0b3RhbH0KCgpAYXBwLmdldCgiL2FwaS9jb2xsZWN0aW9uL3tjYXJkSWR9IikKYXN5bmMgZGVmIGdldF9jb2xsZWN0aW9uX2NhcmQoY2FyZElkOiBpbnQpOgogICAgIiIiR2V0IGEgc2luZ2xlIGNvbGxlY3Rpb24gZW50cnkgYnkgSUQuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgaWQgPSA/IiwgKGNhcmRJZCwpKS5mZXRjaG9uZSgpCiAgICBpZiBub3Qgcm93OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkNhcmQgd2l0aCBpZCB7Y2FyZElkfSBub3QgZm91bmQiKQogICAgcmV0dXJuIF9hZGRfaW1hZ2VfdXJsKF9yb3dfdG9fZGljdChyb3cpKQoKCkBhcHAucGF0Y2goIi9hcGkvY29sbGVjdGlvbi97Y2FyZElkfSIpCmFzeW5jIGRlZiB1cGRhdGVfY29sbGVjdGlvbl9jYXJkKGNhcmRJZDogaW50LCBib2R5OiBkaWN0KToKICAgICIiIlVwZGF0ZSBtdXRhYmxlIGZpZWxkcyBvZiBhIGNvbGxlY3Rpb24gZW50cnkuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgaWQgPSA/IiwgKGNhcmRJZCwpKS5mZXRjaG9uZSgpCiAgICBpZiBub3Qgcm93OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkNhcmQgd2l0aCBpZCB7Y2FyZElkfSBub3QgZm91bmQiKQoKICAgIHVwZGF0ZXMgPSB7fQogICAgaWYgImNhdGVnb3J5IiBpbiBib2R5OgogICAgICAgIGNhdCA9IGJvZHlbImNhdGVnb3J5Il0KICAgICAgICBpZiBpc2luc3RhbmNlKGNhdCwgbGlzdCk6CiAgICAgICAgICAgIHVwZGF0ZXNbImNhdGVnb3J5Il0gPSBqc29uLmR1bXBzKGNhdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB1cGRhdGVzWyJjYXRlZ29yeSJdID0gY2F0CiAgICBpZiAidGFncyIgaW4gYm9keToKICAgICAgICB1cGRhdGVzWyJ0YWdzIl0gPSBzdHIoYm9keVsidGFncyJdKQogICAgaWYgIm5vdGVzIiBpbiBib2R5OgogICAgICAgIHVwZGF0ZXNbIm5vdGVzIl0gPSBzdHIoYm9keVsibm90ZXMiXSkKICAgIGlmICJmaW5pc2giIGluIGJvZHk6CiAgICAgICAgZmluaXNoX3ZhbCA9IHN0cihib2R5WyJmaW5pc2giXSkudXBwZXIoKQogICAgICAgIGlmIGZpbmlzaF92YWwgbm90IGluICgiTk9STUFMIiwgIkZPSUwiLCAiRVRDSEVEIik6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiZmluaXNoIG11c3QgYmUgTk9STUFMLCBGT0lMLCBvciBFVENIRUQiKQogICAgICAgIHVwZGF0ZXNbImZpbmlzaCJdID0gZmluaXNoX3ZhbAoKICAgIGlmIG5vdCB1cGRhdGVzOgogICAgICAgIHJldHVybiBfYWRkX2ltYWdlX3VybChfcm93X3RvX2RpY3Qocm93KSkKCiAgICB1cGRhdGVzWyJ1cGRhdGVkX2F0Il0gPSBkYXRldGltZS51dGNub3coKS5zdHJmdGltZSgiJVktJW0tJWQgJUg6JU06JVMiKQogICAgc2V0X2NsYXVzZSA9ICIsICIuam9pbihmIntrfSA9ID8iIGZvciBrIGluIHVwZGF0ZXMpCiAgICB2YWx1ZXMgPSBsaXN0KHVwZGF0ZXMudmFsdWVzKCkpICsgW2NhcmRJZF0KICAgIGNvbm4uZXhlY3V0ZShmIlVQREFURSBjb2xsZWN0aW9uX2VudHJpZXMgU0VUIHtzZXRfY2xhdXNlfSBXSEVSRSBpZCA9ID8iLCB2YWx1ZXMpCiAgICBjb25uLmNvbW1pdCgpCgogICAgdXBkYXRlZF9yb3cgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIGlkID0gPyIsIChjYXJkSWQsKSkuZmV0Y2hvbmUoKQogICAgcmV0dXJuIF9hZGRfaW1hZ2VfdXJsKF9yb3dfdG9fZGljdCh1cGRhdGVkX3JvdykpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb2xsZWN0aW9uIEltcG9ydCBIZWxwZXJzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIOKUgOKUgCBTY3J5ZmFsbCBSZXNwb25zZSBDYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBTUUxpdGUtYmFja2VkIGNhY2hlIGZvciBTY3J5ZmFsbCBBUEkgcmVzcG9uc2VzLgojIEtleWVkIGJ5IChuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcikuIERlZmF1bHQgVFRMOiA3IGRheXMuCiMgU2NyeWZhbGwgZGF0YSBjaGFuZ2VzIGluZnJlcXVlbnRseSAoc2V0IHJlbGVhc2VzIH5ldmVyeSAzIG1vbnRocykuCiMgRWxpbWluYXRlcyByZWR1bmRhbnQgSFRUUCBjYWxscyBhY3Jvc3MgaW1wb3J0cyBhbmQgcmUtZW5yaWNobWVudHMuCgpTQ1JZRkFMTF9DQUNIRV9EQl9QQVRIID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gInNjcnlmYWxsX2NhY2hlLmRiIgpTQ1JZRkFMTF9DQUNIRV9UVExfU0VDT05EUyA9IGludChvcy5lbnZpcm9uLmdldCgiU0NSWUZBTExfQ0FDSEVfVFRMIiwgNyAqIDI0ICogMzYwMCkpICAjIDcgZGF5cwoKCmNsYXNzIF9TY3J5ZmFsbENhY2hlOgogICAgIiIiCiAgICBUaHJlYWQtc2FmZSBTUUxpdGUgY2FjaGUgZm9yIHJhdyBTY3J5ZmFsbCBKU09OIHJlc3BvbnNlcy4KCiAgICBTY2hlbWE6CiAgICAgICAgY2FjaGVfa2V5ICBURVhUIFBSSU1BUlkgS0VZICDigJQgIm5hbWV8c2V0fGNuIiBub3JtYWxpc2VkIGxvd2VyY2FzZQogICAgICAgIGpzb25fYmxvYiAgVEVYVCAgICAgICAgICAgICAg4oCUIHJhdyBTY3J5ZmFsbCBBUEkgSlNPTiByZXNwb25zZQogICAgICAgIGZldGNoZWRfYXQgVEVYVCAgICAgICAgICAgICAg4oCUIElTTy04NjAxIFVUQyB0aW1lc3RhbXAKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYl9wYXRoOiBQYXRoID0gTm9uZSwgdHRsX3NlY29uZHM6IGludCA9IE5vbmUpOgogICAgICAgIHNlbGYuX2RiX3BhdGggPSBkYl9wYXRoIG9yIFNDUllGQUxMX0NBQ0hFX0RCX1BBVEgKICAgICAgICBzZWxmLl90dGwgPSB0dGxfc2Vjb25kcyBvciBTQ1JZRkFMTF9DQUNIRV9UVExfU0VDT05EUwogICAgICAgIHNlbGYuX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgc2VsZi5fY29ubjogT3B0aW9uYWxbc3FsaXRlMy5Db25uZWN0aW9uXSA9IE5vbmUKICAgICAgICBzZWxmLl9oaXRzID0gMAogICAgICAgIHNlbGYuX21pc3NlcyA9IDAKICAgICAgICBzZWxmLl9pbml0X2RiKCkKCiAgICAjIOKUgOKUgCBpbnRlcm5hbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBkZWYgX2luaXRfZGIoc2VsZik6CiAgICAgICAgc2VsZi5fY29ubiA9IHNxbGl0ZTMuY29ubmVjdChzdHIoc2VsZi5fZGJfcGF0aCksIGNoZWNrX3NhbWVfdGhyZWFkPUZhbHNlKQogICAgICAgIHNlbGYuX2Nvbm4uZXhlY3V0ZSgiUFJBR01BIGpvdXJuYWxfbW9kZT1XQUwiKQogICAgICAgIHNlbGYuX2Nvbm4uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgc2NyeWZhbGxfY2FjaGUgKAogICAgICAgICAgICAgICAgY2FjaGVfa2V5ICBURVhUIFBSSU1BUlkgS0VZLAogICAgICAgICAgICAgICAganNvbl9ibG9iICBURVhUICAgIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgZmV0Y2hlZF9hdCBURVhUICAgIE5PVCBOVUxMIERFRkFVTFQgKGRhdGV0aW1lKCdub3cnKSkKICAgICAgICAgICAgKQogICAgICAgICIiIikKICAgICAgICBzZWxmLl9jb25uLmNvbW1pdCgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9tYWtlX2tleShuYW1lOiBzdHIsIHNldF9jb2RlOiBzdHIsIGNvbGxlY3Rvcl9udW1iZXI6IHN0cikgLT4gc3RyOgogICAgICAgIHJldHVybiBmIntuYW1lLnN0cmlwKCkubG93ZXIoKX18eyhzZXRfY29kZSBvciAnJykuc3RyaXAoKS5sb3dlcigpfXx7KGNvbGxlY3Rvcl9udW1iZXIgb3IgJycpLnN0cmlwKCl9IgoKICAgICMg4pSA4pSAIHB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZGVmIGdldChzZWxmLCBuYW1lOiBzdHIsIHNldF9jb2RlOiBzdHIgPSAiIiwgY29sbGVjdG9yX251bWJlcjogc3RyID0gIiIpIC0+IE9wdGlvbmFsW2RpY3RdOgogICAgICAgICIiIlJldHVybiBjYWNoZWQgU2NyeWZhbGwgSlNPTiBkaWN0LCBvciBOb25lIGlmIG1pc3NpbmcgLyBleHBpcmVkLiIiIgogICAgICAgIGtleSA9IHNlbGYuX21ha2Vfa2V5KG5hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQogICAgICAgIHdpdGggc2VsZi5fbG9jazoKICAgICAgICAgICAgcm93ID0gc2VsZi5fY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlNFTEVDVCBqc29uX2Jsb2IsIGZldGNoZWRfYXQgRlJPTSBzY3J5ZmFsbF9jYWNoZSBXSEVSRSBjYWNoZV9rZXkgPSA/IiwKICAgICAgICAgICAgICAgIChrZXksKSwKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgaWYgbm90IHJvdzoKICAgICAgICAgICAgc2VsZi5fbWlzc2VzICs9IDEKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAjIFRUTCBjaGVjawogICAgICAgIHRyeToKICAgICAgICAgICAgZmV0Y2hlZCA9IGRhdGV0aW1lLmZyb21pc29mb3JtYXQocm93WzFdKQogICAgICAgICAgICBhZ2UgPSAoZGF0ZXRpbWUudXRjbm93KCkgLSBmZXRjaGVkKS50b3RhbF9zZWNvbmRzKCkKICAgICAgICAgICAgaWYgYWdlID4gc2VsZi5fdHRsOgogICAgICAgICAgICAgICAgc2VsZi5fbWlzc2VzICs9IDEKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgICAgICBzZWxmLl9taXNzZXMgKz0gMQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHNlbGYuX2hpdHMgKz0gMQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMocm93WzBdKQogICAgICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fbWlzc2VzICs9IDEKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgcHV0KHNlbGYsIG5hbWU6IHN0ciwgc2V0X2NvZGU6IHN0ciwgY29sbGVjdG9yX251bWJlcjogc3RyLCBjYXJkX2RhdGE6IGRpY3QpOgogICAgICAgICIiIlN0b3JlIGEgU2NyeWZhbGwgcmVzcG9uc2UgaW4gdGhlIGNhY2hlLiIiIgogICAgICAgIGtleSA9IHNlbGYuX21ha2Vfa2V5KG5hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQogICAgICAgIGJsb2IgPSBqc29uLmR1bXBzKGNhcmRfZGF0YSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpKQogICAgICAgIHdpdGggc2VsZi5fbG9jazoKICAgICAgICAgICAgc2VsZi5fY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIklOU0VSVCBPUiBSRVBMQUNFIElOVE8gc2NyeWZhbGxfY2FjaGUgKGNhY2hlX2tleSwganNvbl9ibG9iLCBmZXRjaGVkX2F0KSAiCiAgICAgICAgICAgICAgICAiVkFMVUVTICg/LCA/LCBkYXRldGltZSgnbm93JykpIiwKICAgICAgICAgICAgICAgIChrZXksIGJsb2IpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuX2Nvbm4uY29tbWl0KCkKCiAgICBkZWYgc3RhdHMoc2VsZikgLT4gZGljdDoKICAgICAgICAiIiJSZXR1cm4gY2FjaGUgc3RhdGlzdGljcy4iIiIKICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CiAgICAgICAgICAgIHRvdGFsID0gc2VsZi5fY29ubi5leGVjdXRlKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBzY3J5ZmFsbF9jYWNoZSIpLmZldGNob25lKClbMF0KICAgICAgICAgICAgb2xkZXN0X3JvdyA9IHNlbGYuX2Nvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJTRUxFQ1QgTUlOKGZldGNoZWRfYXQpIEZST00gc2NyeWZhbGxfY2FjaGUiCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgICAgICBuZXdlc3Rfcm93ID0gc2VsZi5fY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlNFTEVDVCBNQVgoZmV0Y2hlZF9hdCkgRlJPTSBzY3J5ZmFsbF9jYWNoZSIKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgICAgIGRiX3NpemVfYnl0ZXMgPSBvcy5wYXRoLmdldHNpemUoc3RyKHNlbGYuX2RiX3BhdGgpKSBpZiBzZWxmLl9kYl9wYXRoLmV4aXN0cygpIGVsc2UgMAogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJ0b3RhbF9lbnRyaWVzIjogdG90YWwsCiAgICAgICAgICAgICJoaXRzIjogc2VsZi5faGl0cywKICAgICAgICAgICAgIm1pc3NlcyI6IHNlbGYuX21pc3NlcywKICAgICAgICAgICAgImhpdF9yYXRlIjogcm91bmQoc2VsZi5faGl0cyAvIG1heChzZWxmLl9oaXRzICsgc2VsZi5fbWlzc2VzLCAxKSAqIDEwMCwgMSksCiAgICAgICAgICAgICJ0dGxfc2Vjb25kcyI6IHNlbGYuX3R0bCwKICAgICAgICAgICAgInR0bF9kYXlzIjogcm91bmQoc2VsZi5fdHRsIC8gODY0MDAsIDEpLAogICAgICAgICAgICAib2xkZXN0X2VudHJ5Ijogb2xkZXN0X3Jvd1swXSBpZiBvbGRlc3Rfcm93IGVsc2UgTm9uZSwKICAgICAgICAgICAgIm5ld2VzdF9lbnRyeSI6IG5ld2VzdF9yb3dbMF0gaWYgbmV3ZXN0X3JvdyBlbHNlIE5vbmUsCiAgICAgICAgICAgICJkYl9zaXplX2tiIjogcm91bmQoZGJfc2l6ZV9ieXRlcyAvIDEwMjQsIDEpLAogICAgICAgICAgICAiZGJfcGF0aCI6IHN0cihzZWxmLl9kYl9wYXRoKSwKICAgICAgICB9CgogICAgZGVmIGNsZWFyKHNlbGYpIC0+IGludDoKICAgICAgICAiIiJEZWxldGUgYWxsIGNhY2hlZCBlbnRyaWVzLiBSZXR1cm5zIGNvdW50IG9mIGRlbGV0ZWQgcm93cy4iIiIKICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CiAgICAgICAgICAgIGNvdW50ID0gc2VsZi5fY29ubi5leGVjdXRlKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBzY3J5ZmFsbF9jYWNoZSIpLmZldGNob25lKClbMF0KICAgICAgICAgICAgc2VsZi5fY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBzY3J5ZmFsbF9jYWNoZSIpCiAgICAgICAgICAgIHNlbGYuX2Nvbm4uY29tbWl0KCkKICAgICAgICAgICAgc2VsZi5fY29ubi5leGVjdXRlKCJWQUNVVU0iKSAgIyBtdXN0IHJ1biBvdXRzaWRlIHRyYW5zYWN0aW9uCiAgICAgICAgICAgIHNlbGYuX2hpdHMgPSAwCiAgICAgICAgICAgIHNlbGYuX21pc3NlcyA9IDAKICAgICAgICByZXR1cm4gY291bnQKCiAgICBkZWYgZXZpY3RfZXhwaXJlZChzZWxmKSAtPiBpbnQ6CiAgICAgICAgIiIiUmVtb3ZlIGVudHJpZXMgb2xkZXIgdGhhbiBUVEwuIFJldHVybnMgY291bnQgb2YgZXZpY3RlZCByb3dzLiIiIgogICAgICAgIGN1dG9mZiA9IGRhdGV0aW1lLnV0Y25vdygpLmlzb2Zvcm1hdCgpCiAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgogICAgICAgICAgICBzZWxmLl9jb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiREVMRVRFIEZST00gc2NyeWZhbGxfY2FjaGUgV0hFUkUgIgogICAgICAgICAgICAgICAgIihqdWxpYW5kYXkoPykgLSBqdWxpYW5kYXkoZmV0Y2hlZF9hdCkpICogODY0MDAgPiA/IiwKICAgICAgICAgICAgICAgIChjdXRvZmYsIHNlbGYuX3R0bCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGVsZXRlZCA9IHNlbGYuX2Nvbm4udG90YWxfY2hhbmdlcwogICAgICAgICAgICBzZWxmLl9jb25uLmNvbW1pdCgpCiAgICAgICAgcmV0dXJuIGRlbGV0ZWQKCgpfc2NyeWZhbGxfY2FjaGUgPSBfU2NyeWZhbGxDYWNoZSgpCgoKIyBTY3J5ZmFsbCByYXRlLWxpbWl0IHNlbWFwaG9yZSAobWF4IDEwIHJlcS9zZWMpCl9zY3J5ZmFsbF9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQpfc2NyeWZhbGxfbGFzdF9jYWxsID0gMC4wCgoKZGVmIF9zY3J5ZmFsbF9yYXRlX2xpbWl0KCk6CiAgICAiIiJFbmZvcmNlIGF0IG1vc3QgMTAgU2NyeWZhbGwgcmVxdWVzdHMgcGVyIHNlY29uZCB2aWEgc2ltcGxlIHNsZWVwLiIiIgogICAgZ2xvYmFsIF9zY3J5ZmFsbF9sYXN0X2NhbGwKICAgIHdpdGggX3NjcnlmYWxsX2xvY2s6CiAgICAgICAgbm93ID0gdGltZS5tb25vdG9uaWMoKQogICAgICAgIGVsYXBzZWQgPSBub3cgLSBfc2NyeWZhbGxfbGFzdF9jYWxsCiAgICAgICAgaWYgZWxhcHNlZCA8IDAuMToKICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEgLSBlbGFwc2VkKQogICAgICAgIF9zY3J5ZmFsbF9sYXN0X2NhbGwgPSB0aW1lLm1vbm90b25pYygpCgoKZGVmIF9wYXJzZV9maW5pc2gocmF3OiBzdHIpIC0+IHN0cjoKICAgICIiIk5vcm1hbGl6ZSBmaW5pc2ggc3RyaW5nIHRvIE5PUk1BTHxGT0lMfEVUQ0hFRC4iIiIKICAgIGlmIG5vdCByYXc6CiAgICAgICAgcmV0dXJuICJOT1JNQUwiCiAgICByID0gcmF3LnN0cmlwKCkubG93ZXIoKQogICAgaWYgciBpbiAoImV0Y2hlZCIsICJmb2lsIGV0Y2hlZCIsICJmb2lsX2V0Y2hlZCIsICJldGNoZWQgZm9pbCIpOgogICAgICAgIHJldHVybiAiRVRDSEVEIgogICAgaWYgciBpbiAoInllcyIsICJmb2lsIiwgInRydWUiLCAiMSIpOgogICAgICAgIHJldHVybiAiRk9JTCIKICAgIHJldHVybiAiTk9STUFMIgoKCmRlZiBfcGFyc2VfdGV4dF9saW5lKGxpbmU6IHN0cikgLT4gZGljdDoKICAgICIiIgogICAgUGFyc2UgYSB0ZXh0IGltcG9ydCBsaW5lIGludG8ge25hbWUsIHF1YW50aXR5LCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcn0uCiAgICBTdXBwb3J0cyBmb3JtYXRzOgogICAgICAtICIzIFNvbCBSaW5nIChDTVIpIDEyMyIKICAgICAgLSAiMXggU29sIFJpbmcgKENNUikiCiAgICAgIC0gIlNvbCBSaW5nIFtDTVI6MTIzXSIKICAgICAgLSAiMSBTb2wgUmluZyIKICAgICIiIgogICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCIjIikgb3IgbGluZS5zdGFydHN3aXRoKCIvLyIpOgogICAgICAgIHJldHVybiB7fQoKICAgIHJlc3VsdCA9IHsibmFtZSI6ICIiLCAicXVhbnRpdHkiOiAxLCAic2V0X2NvZGUiOiAiIiwgImNvbGxlY3Rvcl9udW1iZXIiOiAiIn0KCiAgICAjIFN0cmlwIHF1YW50aXR5IHByZWZpeAogICAgcXR5X21hdGNoID0gcmUubWF0Y2gociJeKFxkKyl4P1xzKyIsIGxpbmUpCiAgICBpZiBxdHlfbWF0Y2g6CiAgICAgICAgcmVzdWx0WyJxdWFudGl0eSJdID0gaW50KHF0eV9tYXRjaC5ncm91cCgxKSkKICAgICAgICBsaW5lID0gbGluZVtxdHlfbWF0Y2guZW5kKCk6XQoKICAgICMgRm9ybWF0OiAiTmFtZSBbU0VUOkNvbGxOdW1dIgogICAgYnJhY2tldF9tYXRjaCA9IHJlLnNlYXJjaChyIlxbKFtBLVphLXowLTldKyk6KFxTKylcXVxzKiQiLCBsaW5lKQogICAgaWYgYnJhY2tldF9tYXRjaDoKICAgICAgICByZXN1bHRbInNldF9jb2RlIl0gPSBicmFja2V0X21hdGNoLmdyb3VwKDEpLmxvd2VyKCkKICAgICAgICByZXN1bHRbImNvbGxlY3Rvcl9udW1iZXIiXSA9IGJyYWNrZXRfbWF0Y2guZ3JvdXAoMikKICAgICAgICBsaW5lID0gbGluZVs6YnJhY2tldF9tYXRjaC5zdGFydCgpXS5zdHJpcCgpCiAgICAgICAgcmVzdWx0WyJuYW1lIl0gPSBsaW5lCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICMgRm9ybWF0OiAiTmFtZSAoU0VUKSBDb2xsTnVtIgogICAgcGFyZW5fY29sbF9tYXRjaCA9IHJlLnNlYXJjaChyIlwoKFtBLVphLXowLTldKylcKVxzKyhcUyspXHMqJCIsIGxpbmUpCiAgICBpZiBwYXJlbl9jb2xsX21hdGNoOgogICAgICAgIHJlc3VsdFsic2V0X2NvZGUiXSA9IHBhcmVuX2NvbGxfbWF0Y2guZ3JvdXAoMSkubG93ZXIoKQogICAgICAgIHJlc3VsdFsiY29sbGVjdG9yX251bWJlciJdID0gcGFyZW5fY29sbF9tYXRjaC5ncm91cCgyKQogICAgICAgIGxpbmUgPSBsaW5lWzpwYXJlbl9jb2xsX21hdGNoLnN0YXJ0KCldLnN0cmlwKCkKICAgICAgICByZXN1bHRbIm5hbWUiXSA9IGxpbmUKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgIyBGb3JtYXQ6ICJOYW1lIChTRVQpIgogICAgcGFyZW5fbWF0Y2ggPSByZS5zZWFyY2gociJcKChbQS1aYS16MC05XSspXClccyokIiwgbGluZSkKICAgIGlmIHBhcmVuX21hdGNoOgogICAgICAgIHJlc3VsdFsic2V0X2NvZGUiXSA9IHBhcmVuX21hdGNoLmdyb3VwKDEpLmxvd2VyKCkKICAgICAgICBsaW5lID0gbGluZVs6cGFyZW5fbWF0Y2guc3RhcnQoKV0uc3RyaXAoKQogICAgICAgIHJlc3VsdFsibmFtZSJdID0gbGluZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICByZXN1bHRbIm5hbWUiXSA9IGxpbmUuc3RyaXAoKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfYXV0b19pbmZlcl9tYXBwaW5nKGhlYWRlcnM6IGxpc3QpIC0+IGRpY3Q6CiAgICAiIiIKICAgIEF1dG8taW5mZXIgY29sdW1uIOKGkiBmaWVsZCBtYXBwaW5nIGZyb20gaGVhZGVyIG5hbWVzLgogICAgUmV0dXJucyBkaWN0IG9mIHtoZWFkZXI6IGZpZWxkX2tleX0uCiAgICBGaWVsZCBrZXlzOiBuYW1lLCBxdWFudGl0eSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIsIGZpbmlzaCwgY29uZGl0aW9uLCBsYW5ndWFnZSwgbm90ZXMsIHRhZ3MKICAgICIiIgogICAgbWFwcGluZyA9IHt9CiAgICBoZWFkZXJfbG93ZXIgPSB7aDogaC5sb3dlcigpLnN0cmlwKCkgZm9yIGggaW4gaGVhZGVyc30KICAgIGZpZWxkX3BhdHRlcm5zID0gewogICAgICAgICJuYW1lIjogWyJuYW1lIiwgImNhcmQgbmFtZSIsICJjYXJkX25hbWUiLCAiY2FyZG5hbWUiLCAidGl0bGUiXSwKICAgICAgICAicXVhbnRpdHkiOiBbInF1YW50aXR5IiwgInF0eSIsICJjb3VudCIsICJhbW91bnQiLCAibnVtYmVyIiwgIiMiXSwKICAgICAgICAic2V0X2NvZGUiOiBbInNldCIsICJzZXQgY29kZSIsICJzZXRfY29kZSIsICJlZGl0aW9uIiwgInNldF9uYW1lIiwgImVkaXRpb24gY29kZSJdLAogICAgICAgICJjb2xsZWN0b3JfbnVtYmVyIjogWwogICAgICAgICAgICAiY29sbGVjdG9yIG51bWJlciIsICJjb2xsZWN0b3JfbnVtYmVyIiwgImNvbGxlY3Rvcm51bWJlciIsCiAgICAgICAgICAgICJjb2wgIyIsICJjb2wjIiwgIm51bWJlciIsICJjYXJkIG51bWJlciIsCiAgICAgICAgXSwKICAgICAgICAiZmluaXNoIjogWyJmaW5pc2giLCAiZm9pbCIsICJwcmludGluZyIsICJ0cmVhdG1lbnQiXSwKICAgICAgICAiY29uZGl0aW9uIjogWyJjb25kaXRpb24iLCAiY29uZCIsICJncmFkZSJdLAogICAgICAgICJsYW5ndWFnZSI6IFsibGFuZ3VhZ2UiLCAibGFuZyIsICJsb2NhbGUiXSwKICAgICAgICAibm90ZXMiOiBbIm5vdGVzIiwgIm5vdGUiLCAiY29tbWVudHMiLCAiY29tbWVudCJdLAogICAgICAgICJ0YWdzIjogWyJ0YWdzIiwgInRhZyIsICJsYWJlbHMiLCAibGFiZWwiXSwKICAgIH0KICAgIGZvciBoZWFkZXIsIGxvd2VyX2ggaW4gaGVhZGVyX2xvd2VyLml0ZW1zKCk6CiAgICAgICAgZm9yIGZpZWxkLCBwYXR0ZXJucyBpbiBmaWVsZF9wYXR0ZXJucy5pdGVtcygpOgogICAgICAgICAgICBpZiBsb3dlcl9oIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgbWFwcGluZ1toZWFkZXJdID0gZmllbGQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICByZXR1cm4gbWFwcGluZwoKCmRlZiBfcGFyc2VfY3N2X2NvbnRlbnQoY29udGVudDogc3RyLCBzb3VyY2U6IHN0ciwgbWFwcGluZzogT3B0aW9uYWxbZGljdF0pIC0+IGxpc3Q6CiAgICAiIiIKICAgIFBhcnNlIENTVi90ZXh0IGNvbnRlbnQgaW50byBhIGxpc3Qgb2YgUmF3SW1wb3J0Um93IGRpY3RzLgogICAgUmV0dXJucyBsaXN0IG9mIGRpY3RzIHdpdGgga2V5czogbmFtZSwgcXVhbnRpdHksIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyLCBmaW5pc2gsIGNvbmRpdGlvbiwgbGFuZ3VhZ2UsIG5vdGVzLCB0YWdzCiAgICAiIiIKICAgIHJvd3MgPSBbXQogICAgc291cmNlX3VwcGVyID0gKHNvdXJjZSBvciAiIikudXBwZXIoKQoKICAgIGlmIHNvdXJjZV91cHBlciA9PSAiVEVYVCI6CiAgICAgICAgZm9yIGxpbmUgaW4gY29udGVudC5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIHBhcnNlZCA9IF9wYXJzZV90ZXh0X2xpbmUobGluZSkKICAgICAgICAgICAgaWYgcGFyc2VkLmdldCgibmFtZSIpOgogICAgICAgICAgICAgICAgcm93cy5hcHBlbmQocGFyc2VkKQogICAgICAgIHJldHVybiByb3dzCgogICAgIyBDU1YtYmFzZWQgc291cmNlcwogICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoaW8uU3RyaW5nSU8oY29udGVudCkpCiAgICBoZWFkZXJzID0gcmVhZGVyLmZpZWxkbmFtZXMgb3IgW10KCiAgICAjIEJ1aWxkIGVmZmVjdGl2ZSBtYXBwaW5nCiAgICBpZiBtYXBwaW5nOgogICAgICAgIGNvbF9tYXAgPSB7aDogbWFwcGluZy5nZXQoaCwgIiIpIGZvciBoIGluIGhlYWRlcnN9CiAgICBlbHNlOgogICAgICAgIGNvbF9tYXAgPSBfYXV0b19pbmZlcl9tYXBwaW5nKGhlYWRlcnMpCgogICAgIyBOb3JtYWxpemUgY29sX21hcCBmaWVsZCB2YWx1ZXMgdG8gbG93ZXJjYXNlIHNvIGJvdGggIk5BTUUiIChVSSkgYW5kICJuYW1lIiAoYXV0by1pbmZlcikgd29yawogICAgY29sX21hcCA9IHtoOiAodi5sb3dlcigpIGlmIGlzaW5zdGFuY2Uodiwgc3RyKSBlbHNlIHYpIGZvciBoLCB2IGluIGNvbF9tYXAuaXRlbXMoKX0KCiAgICBmb3IgY3N2X3JvdyBpbiByZWFkZXI6CiAgICAgICAgcm93ID0gewogICAgICAgICAgICAibmFtZSI6ICIiLAogICAgICAgICAgICAicXVhbnRpdHkiOiAxLAogICAgICAgICAgICAic2V0X2NvZGUiOiAiIiwKICAgICAgICAgICAgImNvbGxlY3Rvcl9udW1iZXIiOiAiIiwKICAgICAgICAgICAgImZpbmlzaCI6ICJOT1JNQUwiLAogICAgICAgICAgICAiY29uZGl0aW9uIjogIiIsCiAgICAgICAgICAgICJsYW5ndWFnZSI6ICIiLAogICAgICAgICAgICAibm90ZXMiOiAiIiwKICAgICAgICAgICAgInRhZ3MiOiAiIiwKICAgICAgICB9CiAgICAgICAgZm9yIGhlYWRlciwgZmllbGQgaW4gY29sX21hcC5pdGVtcygpOgogICAgICAgICAgICB2YWwgPSBjc3Zfcm93LmdldChoZWFkZXIsICIiKS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCB2YWwgb3IgZmllbGQgPT0gImlnbm9yZSIgb3Igbm90IGZpZWxkOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZmllbGQgPT0gIm5hbWUiOgogICAgICAgICAgICAgICAgIyBTdHJpcCBmaW5pc2ggc3VmZml4IGxpa2UgIihGb2lsIEV0Y2hlZCkiCiAgICAgICAgICAgICAgICB2YWwgPSByZS5zdWIociJccypcKGZvaWwoPzogZXRjaGVkKT9cKVxzKiQiLCAiIiwgdmFsLCBmbGFncz1yZS5JR05PUkVDQVNFKS5zdHJpcCgpCiAgICAgICAgICAgICAgICByb3dbIm5hbWUiXSA9IHZhbAogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJxdWFudGl0eSI6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcm93WyJxdWFudGl0eSJdID0gaW50KGZsb2F0KHZhbCkpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICByb3dbInF1YW50aXR5Il0gPSAxCiAgICAgICAgICAgIGVsaWYgZmllbGQgaW4gKCJzZXRfY29kZSIsICJzZXRfY29kZV9zZWNvbmRhcnkiKToKICAgICAgICAgICAgICAgIHJvd1sic2V0X2NvZGUiXSA9IHZhbC5sb3dlcigpCiAgICAgICAgICAgIGVsaWYgZmllbGQgaW4gKCJjb2xsZWN0b3JfbnVtYmVyIiwgImNvbGxlY3Rvcl9udW1iZXJfc2Vjb25kYXJ5Iik6CiAgICAgICAgICAgICAgICByb3dbImNvbGxlY3Rvcl9udW1iZXIiXSA9IHZhbAogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJmaW5pc2giOgogICAgICAgICAgICAgICAgcm93WyJmaW5pc2giXSA9IF9wYXJzZV9maW5pc2godmFsKQogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJjb25kaXRpb24iOgogICAgICAgICAgICAgICAgcm93WyJjb25kaXRpb24iXSA9IHZhbAogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJsYW5ndWFnZSI6CiAgICAgICAgICAgICAgICByb3dbImxhbmd1YWdlIl0gPSB2YWwKICAgICAgICAgICAgZWxpZiBmaWVsZCA9PSAibm90ZXMiOgogICAgICAgICAgICAgICAgcm93WyJub3RlcyJdID0gdmFsCiAgICAgICAgICAgIGVsaWYgZmllbGQgPT0gInRhZ3MiOgogICAgICAgICAgICAgICAgcm93WyJ0YWdzIl0gPSB2YWwKCiAgICAgICAgaWYgcm93WyJuYW1lIl06CiAgICAgICAgICAgIHJvd3MuYXBwZW5kKHJvdykKCiAgICByZXR1cm4gcm93cwoKCmRlZiBfZmV0Y2hfc2NyeWZhbGxfYXBpKG5hbWU6IHN0ciwgc2V0X2NvZGU6IHN0ciA9ICIiLCBjb2xsZWN0b3JfbnVtYmVyOiBzdHIgPSAiIikgLT4gZGljdDoKICAgICIiIgogICAgRmV0Y2ggcmF3IGNhcmQgZGF0YSBmcm9tIFNjcnlmYWxsIEFQSSAod2l0aCBjYWNoaW5nKS4KICAgIFJldHVybnMgdGhlIHJhdyBTY3J5ZmFsbCBKU09OIGRpY3QsIG9yIGEgZGljdCB3aXRoICdfZXJyb3InIG9uIGZhaWx1cmUuCiAgICBDYWNoZSBpcyBjaGVja2VkIGZpcnN0OyBsaXZlIEhUVFAgY2FsbCBvbmx5IG9uIG1pc3MuCiAgICAiIiIKICAgIGZyb20gdXJsbGliLnBhcnNlIGltcG9ydCBxdW90ZQoKICAgICMg4pSA4pSAIENhY2hlIGNoZWNrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgY2FjaGVkID0gX3NjcnlmYWxsX2NhY2hlLmdldChuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcikKICAgIGlmIGNhY2hlZCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gY2FjaGVkCgogICAgIyDilIDilIAgTGl2ZSBmZXRjaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGNhcmRfZGF0YSA9IE5vbmUKICAgIGxhc3RfZXJyb3IgPSAiIgoKICAgICMgVHJ5IHNldCArIGNvbGxlY3RvciBudW1iZXIgZmlyc3QKICAgIGlmIHNldF9jb2RlIGFuZCBjb2xsZWN0b3JfbnVtYmVyOgogICAgICAgIF9zY3J5ZmFsbF9yYXRlX2xpbWl0KCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVybCA9IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3tzZXRfY29kZS5sb3dlcigpfS97Y29sbGVjdG9yX251bWJlcn0iCiAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPV9BUElfSEVBREVSUykKICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMCkgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGNhcmRfZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbGFzdF9lcnJvciA9IHN0cihlKQogICAgICAgICAgICBjYXJkX2RhdGEgPSBOb25lCgogICAgIyBGYWxsIGJhY2sgdG8gZXhhY3QgbmFtZSBsb29rdXAKICAgIGlmIG5vdCBjYXJkX2RhdGE6CiAgICAgICAgX3NjcnlmYWxsX3JhdGVfbGltaXQoKQogICAgICAgIHRyeToKICAgICAgICAgICAgZW5jb2RlZF9uYW1lID0gcXVvdGUobmFtZSkKICAgICAgICAgICAgdXJsID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZXhhY3Q9e2VuY29kZWRfbmFtZX0iCiAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPV9BUElfSEVBREVSUykKICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMCkgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGNhcmRfZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbGFzdF9lcnJvciA9IHN0cihlKQogICAgICAgICAgICByZXR1cm4geyJfZXJyb3IiOiBmIlNjcnlmYWxsIGxvb2t1cCBmYWlsZWQgZm9yICd7bmFtZX0nOiB7bGFzdF9lcnJvcn0ifQoKICAgIGlmIG5vdCBjYXJkX2RhdGEgb3IgY2FyZF9kYXRhLmdldCgib2JqZWN0IikgPT0gImVycm9yIjoKICAgICAgICBlcnJfZGV0YWlsID0gY2FyZF9kYXRhLmdldCgiZGV0YWlscyIsICJ1bmtub3duIGVycm9yIikgaWYgY2FyZF9kYXRhIGVsc2UgbGFzdF9lcnJvcgogICAgICAgIHJldHVybiB7Il9lcnJvciI6IGYiU2NyeWZhbGwgcmV0dXJuZWQgZXJyb3IgZm9yICd7bmFtZX0nOiB7ZXJyX2RldGFpbH0ifQoKICAgICMg4pSA4pSAIENhY2hlIHRoZSBzdWNjZXNzZnVsIHJlc3BvbnNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgX3NjcnlmYWxsX2NhY2hlLnB1dChuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlciwgY2FyZF9kYXRhKQogICAgIyBBbHNvIGNhY2hlIHVuZGVyIHRoZSBTY3J5ZmFsbC1yZXNvbHZlZCBuYW1lIChoYW5kbGVzIHNwZWxsaW5nIG5vcm1hbGlzYXRpb24pCiAgICByZXNvbHZlZF9uYW1lID0gY2FyZF9kYXRhLmdldCgibmFtZSIsICIiKQogICAgaWYgcmVzb2x2ZWRfbmFtZSBhbmQgcmVzb2x2ZWRfbmFtZS5sb3dlcigpICE9IG5hbWUuc3RyaXAoKS5sb3dlcigpOgogICAgICAgIF9zY3J5ZmFsbF9jYWNoZS5wdXQocmVzb2x2ZWRfbmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIsIGNhcmRfZGF0YSkKCiAgICByZXR1cm4gY2FyZF9kYXRhCgoKZGVmIF9lbnJpY2hfZnJvbV9zY3J5ZmFsbChuYW1lOiBzdHIsIHNldF9jb2RlOiBzdHIgPSAiIiwgY29sbGVjdG9yX251bWJlcjogc3RyID0gIiIpIC0+IGRpY3Q6CiAgICAiIiIKICAgIEZldGNoIGNhcmQgZGF0YSBmcm9tIFNjcnlmYWxsIChjYWNoZWQpIGFuZCByZXR1cm4gZW5yaWNoZWQgZmllbGRzIGRpY3QuCiAgICBUcmllcyBzZXQrY29sbGVjdG9yTnVtYmVyIGZpcnN0LCB0aGVuIGV4YWN0IG5hbWUgbG9va3VwLgogICAgUmV0dXJucyBlbXB0eSBkaWN0IG9uIGZhaWx1cmUuCiAgICAiIiIKICAgIGNhcmRfZGF0YSA9IF9mZXRjaF9zY3J5ZmFsbF9hcGkobmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIpCgogICAgaWYgbm90IGNhcmRfZGF0YSBvciAiX2Vycm9yIiBpbiBjYXJkX2RhdGE6CiAgICAgICAgcmV0dXJuIGNhcmRfZGF0YSBvciB7fQoKICAgICMgRXh0cmFjdCBmaWVsZHMKICAgIHR5cGVfbGluZSA9IGNhcmRfZGF0YS5nZXQoInR5cGVfbGluZSIsICIiKQogICAgY29sb3JfaWRlbnRpdHkgPSBjYXJkX2RhdGEuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKQogICAga2V5d29yZHMgPSBjYXJkX2RhdGEuZ2V0KCJrZXl3b3JkcyIsIFtdKQoKICAgICMgUGFyc2Ugc3VidHlwZXMgKGFmdGVyIGVtLWRhc2ggb3IgaHlwaGVuKQogICAgc3VidHlwZXMgPSBbXQogICAgZm9yIHNlcCBpbiBbIiBcdTIwMTQgIiwgIiAtICJdOgogICAgICAgIGlmIHNlcCBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHBhcnRzID0gdHlwZV9saW5lLnNwbGl0KHNlcCwgMSkKICAgICAgICAgICAgc3VidHlwZXMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHBhcnRzWzFdLnNwbGl0KCkgaWYgcy5zdHJpcCgpXQogICAgICAgICAgICBicmVhawoKICAgIGlzX2xlZ2VuZGFyeSA9IDEgaWYgIkxlZ2VuZGFyeSIgaW4gdHlwZV9saW5lIGVsc2UgMAogICAgaXNfYmFzaWMgPSAxIGlmICJCYXNpYyIgaW4gdHlwZV9saW5lIGVsc2UgMAoKICAgICMgR2V0IHByaWNlCiAgICBwcmljZXMgPSBjYXJkX2RhdGEuZ2V0KCJwcmljZXMiLCB7fSkKICAgIHRjZ19wcmljZSA9IDAuMAogICAgdHJ5OgogICAgICAgIHByaWNlX3ZhbCA9IHByaWNlcy5nZXQoInVzZCIpIG9yIHByaWNlcy5nZXQoInVzZF9mb2lsIikgb3IgIjAiCiAgICAgICAgdGNnX3ByaWNlID0gZmxvYXQocHJpY2VfdmFsKSBpZiBwcmljZV92YWwgZWxzZSAwLjAKICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICB0Y2dfcHJpY2UgPSAwLjAKCiAgICAjIEhhbmRsZSBkb3VibGUtZmFjZWQgY2FyZHM6IG9yYWNsZV90ZXh0IG1heSBiZSBvbiBjYXJkX2ZhY2VzCiAgICBvcmFjbGVfdGV4dCA9IGNhcmRfZGF0YS5nZXQoIm9yYWNsZV90ZXh0IiwgIiIpCiAgICBpZiBub3Qgb3JhY2xlX3RleHQgYW5kIGNhcmRfZGF0YS5nZXQoImNhcmRfZmFjZXMiKToKICAgICAgICBmYWNlX3RleHRzID0gW2YuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSBmb3IgZiBpbiBjYXJkX2RhdGFbImNhcmRfZmFjZXMiXV0KICAgICAgICBvcmFjbGVfdGV4dCA9ICJcbi8vXG4iLmpvaW4odCBmb3IgdCBpbiBmYWNlX3RleHRzIGlmIHQpCgogICAgIyBQb3dlci90b3VnaG5lc3MgKG1heSBiZSBvbiBjYXJkX2ZhY2VzIGZvciBERkNzKQogICAgcG93ZXIgPSBjYXJkX2RhdGEuZ2V0KCJwb3dlciIsICIiKQogICAgdG91Z2huZXNzID0gY2FyZF9kYXRhLmdldCgidG91Z2huZXNzIiwgIiIpCiAgICBpZiBub3QgcG93ZXIgYW5kIGNhcmRfZGF0YS5nZXQoImNhcmRfZmFjZXMiKToKICAgICAgICBwb3dlciA9IGNhcmRfZGF0YVsiY2FyZF9mYWNlcyJdWzBdLmdldCgicG93ZXIiLCAiIikKICAgICAgICB0b3VnaG5lc3MgPSBjYXJkX2RhdGFbImNhcmRfZmFjZXMiXVswXS5nZXQoInRvdWdobmVzcyIsICIiKQoKICAgICMgTWFuYSBjb3N0IChtYXkgYmUgb24gY2FyZF9mYWNlcyBmb3IgREZDcykKICAgIG1hbmFfY29zdCA9IGNhcmRfZGF0YS5nZXQoIm1hbmFfY29zdCIsICIiKQogICAgaWYgbm90IG1hbmFfY29zdCBhbmQgY2FyZF9kYXRhLmdldCgiY2FyZF9mYWNlcyIpOgogICAgICAgIG1hbmFfY29zdCA9IGNhcmRfZGF0YVsiY2FyZF9mYWNlcyJdWzBdLmdldCgibWFuYV9jb3N0IiwgIiIpCgogICAgIyBBdXRvLWRldGVjdCBmdW5jdGlvbmFsIGNhdGVnb3JpZXMKICAgIGF1dG9fcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMob3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMpCgogICAgcmV0dXJuIHsKICAgICAgICAibmFtZSI6IGNhcmRfZGF0YS5nZXQoIm5hbWUiLCBuYW1lKSwKICAgICAgICAidHlwZV9saW5lIjogdHlwZV9saW5lLAogICAgICAgICJzdWJ0eXBlcyI6IGpzb24uZHVtcHMoc3VidHlwZXMpLAogICAgICAgICJpc19sZWdlbmRhcnkiOiBpc19sZWdlbmRhcnksCiAgICAgICAgImlzX2Jhc2ljIjogaXNfYmFzaWMsCiAgICAgICAgImNvbG9yX2lkZW50aXR5IjoganNvbi5kdW1wcyhjb2xvcl9pZGVudGl0eSksCiAgICAgICAgImNtYyI6IGNhcmRfZGF0YS5nZXQoImNtYyIsIDAuMCksCiAgICAgICAgIm1hbmFfY29zdCI6IG1hbmFfY29zdCwKICAgICAgICAib3JhY2xlX3RleHQiOiBvcmFjbGVfdGV4dCwKICAgICAgICAia2V5d29yZHMiOiBqc29uLmR1bXBzKGtleXdvcmRzKSwKICAgICAgICAicG93ZXIiOiBwb3dlciBvciAiIiwKICAgICAgICAidG91Z2huZXNzIjogdG91Z2huZXNzIG9yICIiLAogICAgICAgICJyYXJpdHkiOiBjYXJkX2RhdGEuZ2V0KCJyYXJpdHkiLCAiIiksCiAgICAgICAgInNldF9uYW1lIjogY2FyZF9kYXRhLmdldCgic2V0X25hbWUiLCAiIiksCiAgICAgICAgImVkaHJlY19yYW5rIjogY2FyZF9kYXRhLmdldCgiZWRocmVjX3JhbmsiLCAwKSBvciAwLAogICAgICAgICJ0Y2dfcHJpY2UiOiB0Y2dfcHJpY2UsCiAgICAgICAgInNhbHRfc2NvcmUiOiAwLjAsCiAgICAgICAgImlzX2dhbWVfY2hhbmdlciI6IDAsCiAgICAgICAgImNhdGVnb3J5IjoganNvbi5kdW1wcyhhdXRvX3JvbGVzKSwKICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkX2RhdGEuZ2V0KCJpZCIsICIiKSwKICAgICAgICAidGNncGxheWVyX2lkIjogc3RyKGNhcmRfZGF0YS5nZXQoInRjZ3BsYXllcl9pZCIsICIiKSksCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb2xsZWN0aW9uIEltcG9ydCBFbmRwb2ludAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGFwcC5wb3N0KCIvYXBpL2NvbGxlY3Rpb24vaW1wb3J0IikKYXN5bmMgZGVmIGltcG9ydF9jb2xsZWN0aW9uKGJvZHk6IGRpY3QpOgogICAgIiIiCiAgICBJbXBvcnQgY2FyZHMgaW50byB0aGUgY29sbGVjdGlvbiBmcm9tIENTViwgTW94ZmllbGQsIEFyY2hpZGVrdCwgb3IgcGxhaW4gdGV4dC4KCiAgICBCb2R5OgogICAgICB7CiAgICAgICAgInNvdXJjZSI6ICJDU1YiIHwgIk1PWEZJRUxEIiB8ICJBUkNISURFS1QiIHwgIlRFWFQiLAogICAgICAgICJtb2RlIjogIk1FUkdFIiB8ICJSRVBMQUNFIiwKICAgICAgICAiY29udGVudCI6ICIuLi5jc3Ygb3IgdGV4dCBjb250ZW50Li4uIiwKICAgICAgICAibWFwcGluZyI6IHsgLi4uIG9wdGlvbmFsIGNvbHVtbiBtYXBwaW5nIC4uLiB9CiAgICAgIH0KICAgICIiIgogICAgc291cmNlID0gc3RyKGJvZHkuZ2V0KCJzb3VyY2UiLCAiQ1NWIikpLnVwcGVyKCkKICAgIG1vZGUgPSBzdHIoYm9keS5nZXQoIm1vZGUiLCAiTUVSR0UiKSkudXBwZXIoKQogICAgY29udGVudCA9IHN0cihib2R5LmdldCgiY29udGVudCIsICIiKSkKICAgIG1hcHBpbmcgPSBib2R5LmdldCgibWFwcGluZyIsIHt9KQoKICAgIGlmIG5vdCBjb250ZW50LnN0cmlwKCk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJjb250ZW50IGlzIHJlcXVpcmVkIikKCiAgICBpbXBvcnRlZF9jb3VudCA9IDAKICAgIHVwZGF0ZWRfY291bnQgPSAwCiAgICBmYWlsZWRfY291bnQgPSAwCiAgICBlcnJvcnMgPSBbXQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgUkVQTEFDRSBtb2RlOiBjbGVhciBleGlzdGluZyBlbnRyaWVzCiAgICBpZiBtb2RlID09ICJSRVBMQUNFIjoKICAgICAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyIpCiAgICAgICAgY29ubi5jb21taXQoKQoKICAgICMgUGFyc2UgdGhlIGNvbnRlbnQgaW50byByYXcgcm93cwogICAgdHJ5OgogICAgICAgIHJhd19yb3dzID0gX3BhcnNlX2Nzdl9jb250ZW50KGNvbnRlbnQsIHNvdXJjZSwgbWFwcGluZyBpZiBtYXBwaW5nIGVsc2UgTm9uZSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgZiJGYWlsZWQgdG8gcGFyc2UgY29udGVudDoge3N0cihlKX0iKQoKICAgIGZvciByYXcgaW4gcmF3X3Jvd3M6CiAgICAgICAgbmFtZSA9IHJhdy5nZXQoIm5hbWUiLCAiIikuc3RyaXAoKQogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBxdWFudGl0eSA9IGludChyYXcuZ2V0KCJxdWFudGl0eSIsIDEpKQogICAgICAgIHNldF9jb2RlID0gcmF3LmdldCgic2V0X2NvZGUiLCAiIikubG93ZXIoKQogICAgICAgIGNvbGxlY3Rvcl9udW1iZXIgPSByYXcuZ2V0KCJjb2xsZWN0b3JfbnVtYmVyIiwgIiIpCiAgICAgICAgZmluaXNoID0gX3BhcnNlX2ZpbmlzaChyYXcuZ2V0KCJmaW5pc2giLCAiIikpCiAgICAgICAgY29uZGl0aW9uID0gcmF3LmdldCgiY29uZGl0aW9uIiwgIiIpCiAgICAgICAgbGFuZ3VhZ2UgPSByYXcuZ2V0KCJsYW5ndWFnZSIsICIiKQogICAgICAgIG5vdGVzID0gcmF3LmdldCgibm90ZXMiLCAiIikKICAgICAgICB0YWdzID0gcmF3LmdldCgidGFncyIsICIiKQoKICAgICAgICAjIFNjcnlmYWxsIGVucmljaG1lbnQKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVucmljaGVkID0gX2VucmljaF9mcm9tX3NjcnlmYWxsKG5hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChmIlNjcnlmYWxsIGVycm9yIGZvciAne25hbWV9Jzoge3N0cihlKX0iKQogICAgICAgICAgICBmYWlsZWRfY291bnQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBub3QgZW5yaWNoZWQgb3IgIl9lcnJvciIgaW4gZW5yaWNoZWQ6CiAgICAgICAgICAgIGVycl9tc2cgPSBlbnJpY2hlZC5nZXQoIl9lcnJvciIsIGYiQ2FyZCBub3QgZm91bmQgb24gU2NyeWZhbGw6ICd7bmFtZX0nIikgaWYgZW5yaWNoZWQgZWxzZSBmIkNhcmQgbm90IGZvdW5kIG9uIFNjcnlmYWxsOiAne25hbWV9JyIKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChlcnJfbXNnKQogICAgICAgICAgICBmYWlsZWRfY291bnQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFVzZSBTY3J5ZmFsbC1yZXNvbHZlZCBuYW1lIGlmIGF2YWlsYWJsZQogICAgICAgIHJlc29sdmVkX25hbWUgPSBlbnJpY2hlZC5nZXQoIm5hbWUiLCBuYW1lKQoKICAgICAgICAjIENoZWNrIGZvciBleGlzdGluZyBlbnRyeSAoaWRlbnRpdHkga2V5KQogICAgICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiJTRUxFQ1QgaWQsIHF1YW50aXR5IEZST00gY29sbGVjdGlvbl9lbnRyaWVzCiAgICAgICAgICAgICAgIFdIRVJFIG5hbWUgPSA/IEFORCBzZXRfY29kZSA9ID8gQU5EIGNvbGxlY3Rvcl9udW1iZXIgPSA/IEFORCBmaW5pc2ggPSA/IiIiLAogICAgICAgICAgICAocmVzb2x2ZWRfbmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIsIGZpbmlzaCksCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIGlmIGV4aXN0aW5nIGFuZCBtb2RlID09ICJNRVJHRSI6CiAgICAgICAgICAgICMgVXBkYXRlIHF1YW50aXR5CiAgICAgICAgICAgIG5ld19xdHkgPSBleGlzdGluZ1sicXVhbnRpdHkiXSArIHF1YW50aXR5CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJVUERBVEUgY29sbGVjdGlvbl9lbnRyaWVzIFNFVCBxdWFudGl0eSA9ID8sIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIChuZXdfcXR5LCBleGlzdGluZ1siaWQiXSksCiAgICAgICAgICAgICkKICAgICAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgICAgICB1cGRhdGVkX2NvdW50ICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEluc2VydCBuZXcgcm93CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIklOU0VSVCBJTlRPIGNvbGxlY3Rpb25fZW50cmllcwogICAgICAgICAgICAgICAgICAgKG5hbWUsIHR5cGVfbGluZSwgc3VidHlwZXMsIGlzX2xlZ2VuZGFyeSwgaXNfYmFzaWMsIGNvbG9yX2lkZW50aXR5LAogICAgICAgICAgICAgICAgICAgIGNtYywgbWFuYV9jb3N0LCBvcmFjbGVfdGV4dCwga2V5d29yZHMsCiAgICAgICAgICAgICAgICAgICAgcG93ZXIsIHRvdWdobmVzcywgcmFyaXR5LCBzZXRfbmFtZSwgZWRocmVjX3JhbmssCiAgICAgICAgICAgICAgICAgICAgdGNnX3ByaWNlLCBzYWx0X3Njb3JlLCBpc19nYW1lX2NoYW5nZXIsCiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnksIHNjcnlmYWxsX2lkLCB0Y2dwbGF5ZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHksIGZpbmlzaCwgY29uZGl0aW9uLCBsYW5ndWFnZSwgbm90ZXMsIHRhZ3MsCiAgICAgICAgICAgICAgICAgICAgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIpCiAgICAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8pIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJ0eXBlX2xpbmUiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzdWJ0eXBlcyIsICJbXSIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiaXNfbGVnZW5kYXJ5IiwgMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJpc19iYXNpYyIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiY29sb3JfaWRlbnRpdHkiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImNtYyIsIDAuMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImtleXdvcmRzIiwgIltdIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJwb3dlciIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInRvdWdobmVzcyIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInJhcml0eSIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInNldF9uYW1lIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiZWRocmVjX3JhbmsiLCAwKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInRjZ19wcmljZSIsIDAuMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzYWx0X3Njb3JlIiwgMC4wKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImlzX2dhbWVfY2hhbmdlciIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiY2F0ZWdvcnkiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInNjcnlmYWxsX2lkIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgidGNncGxheWVyX2lkIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIHF1YW50aXR5LAogICAgICAgICAgICAgICAgICAgIGZpbmlzaCwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24sCiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgbm90ZXMsCiAgICAgICAgICAgICAgICAgICAgdGFncywKICAgICAgICAgICAgICAgICAgICBzZXRfY29kZSwKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0b3JfbnVtYmVyLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgICAgIGltcG9ydGVkX2NvdW50ICs9IDEKCiAgICByZXR1cm4gewogICAgICAgICJpbXBvcnRlZENvdW50IjogaW1wb3J0ZWRfY291bnQsCiAgICAgICAgInVwZGF0ZWRDb3VudCI6IHVwZGF0ZWRfY291bnQsCiAgICAgICAgImZhaWxlZENvdW50IjogZmFpbGVkX2NvdW50LAogICAgICAgICJlcnJvcnMiOiBlcnJvcnMsCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBTY3J5ZmFsbCBDYWNoZSBNYW5hZ2VtZW50IEVuZHBvaW50cwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKCkBhcHAuZ2V0KCIvYXBpL2NhY2hlL3NjcnlmYWxsIikKYXN5bmMgZGVmIHNjcnlmYWxsX2NhY2hlX3N0YXRzKCk6CiAgICAiIiJSZXR1cm4gU2NyeWZhbGwgcmVzcG9uc2UgY2FjaGUgc3RhdGlzdGljcy4iIiIKICAgIHJldHVybiBfc2NyeWZhbGxfY2FjaGUuc3RhdHMoKQoKCkBhcHAuZGVsZXRlKCIvYXBpL2NhY2hlL3NjcnlmYWxsIikKYXN5bmMgZGVmIHNjcnlmYWxsX2NhY2hlX2NsZWFyKCk6CiAgICAiIiJDbGVhciBhbGwgY2FjaGVkIFNjcnlmYWxsIHJlc3BvbnNlcy4iIiIKICAgIGRlbGV0ZWQgPSBfc2NyeWZhbGxfY2FjaGUuY2xlYXIoKQogICAgcmV0dXJuIHsiY2xlYXJlZCI6IGRlbGV0ZWQsICJtZXNzYWdlIjogZiJEZWxldGVkIHtkZWxldGVkfSBjYWNoZWQgZW50cmllcyJ9CgoKQGFwcC5wb3N0KCIvYXBpL2NhY2hlL3NjcnlmYWxsL2V2aWN0IikKYXN5bmMgZGVmIHNjcnlmYWxsX2NhY2hlX2V2aWN0X2V4cGlyZWQoKToKICAgICIiIlJlbW92ZSBvbmx5IGV4cGlyZWQgZW50cmllcyAob2xkZXIgdGhhbiBUVEwpIGZyb20gdGhlIGNhY2hlLiIiIgogICAgZXZpY3RlZCA9IF9zY3J5ZmFsbF9jYWNoZS5ldmljdF9leHBpcmVkKCkKICAgIHJldHVybiB7ImV2aWN0ZWQiOiBldmljdGVkLCAibWVzc2FnZSI6IGYiRXZpY3RlZCB7ZXZpY3RlZH0gZXhwaXJlZCBlbnRyaWVzIn0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIERlY2sgQnVpbGRlciBIZWxwZXJzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIFR5cGUgY2xhc3NpZmljYXRpb24gcHJpb3JpdHkgb3JkZXIKX1RZUEVfUFJJT1JJVFkgPSBbIkxhbmQiLCAiSW5zdGFudCIsICJTb3JjZXJ5IiwgIkFydGlmYWN0IiwgIkVuY2hhbnRtZW50IiwgIlBsYW5lc3dhbGtlciIsICJDcmVhdHVyZSJdCgojIFRhcmdldCByYW5nZXM6IHt0eXBlOiBbbWluLCBtYXhdfQpfVFlQRV9UQVJHRVRTID0gewogICAgIkxhbmQiOiBbMzYsIDM4XSwKICAgICJJbnN0YW50IjogWzksIDExXSwKICAgICJTb3JjZXJ5IjogWzcsIDldLAogICAgIkFydGlmYWN0IjogWzksIDExXSwKICAgICJDcmVhdHVyZSI6IFsyMCwgMzBdLAogICAgIkVuY2hhbnRtZW50IjogWzUsIDEwXSwKICAgICJQbGFuZXN3YWxrZXIiOiBbMCwgNV0sCn0KCgpkZWYgX2NsYXNzaWZ5X2NhcmRfdHlwZSh0eXBlX2xpbmU6IHN0cikgLT4gc3RyOgogICAgIiIiQ2xhc3NpZnkgYSBjYXJkJ3MgcHJpbWFyeSB0eXBlIHBlciBwcmlvcml0eSBvcmRlci4iIiIKICAgIHRsID0gdHlwZV9saW5lIG9yICIiCiAgICBmb3IgdCBpbiBfVFlQRV9QUklPUklUWToKICAgICAgICBpZiB0IGluIHRsOgogICAgICAgICAgICByZXR1cm4gdAogICAgcmV0dXJuICJPdGhlciIKCgpkZWYgX2RldGVjdF9jYXJkX3JvbGVzKG9yYWNsZV90ZXh0OiBzdHIsIHR5cGVfbGluZTogc3RyLCBrZXl3b3JkcykgLT4gbGlzdDoKICAgICIiIgogICAgRGV0ZWN0IGZ1bmN0aW9uYWwgcm9sZXMgZnJvbSBvcmFjbGUgdGV4dCwgdHlwZSBsaW5lLCBhbmQga2V5d29yZHMuCiAgICBJbnNwaXJlZCBieSBBcmNoaWRla3QgYXV0by1jYXRlZ29yeSBzeXN0ZW0uCiAgICBSZXR1cm5zIGEgbGlzdCBvZiByb2xlIHN0cmluZ3MuCiAgICAiIiIKICAgIHJvbGVzID0gW10KICAgIG90ID0gKG9yYWNsZV90ZXh0IG9yICIiKS5sb3dlcigpCiAgICB0bCA9ICh0eXBlX2xpbmUgb3IgIiIpLmxvd2VyKCkKICAgIGt3X3JhdyA9IGtleXdvcmRzIG9yIFtdCiAgICBpZiBpc2luc3RhbmNlKGt3X3Jhdywgc3RyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGt3X3JhdyA9IGpzb24ubG9hZHMoa3dfcmF3KQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGt3X3JhdyA9IFtdCiAgICBrdyA9ICIgIi5qb2luKHN0cihrKS5sb3dlcigpIGZvciBrIGluIGt3X3JhdykKCiAgICAjIOKUgOKUgCBSYW1wIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJhZGQgeyIgaW4gb3QKICAgICAgICBvciAiYWRkIG9uZSBtYW5hIiBpbiBvdAogICAgICAgIG9yICgic2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgYSIgaW4gb3QgYW5kICJsYW5kIiBpbiBvdCkKICAgICAgICBvciAoImxhbmQiIGluIHRsIGFuZCAiZW50ZXJzIiBpbiBvdCBhbmQgImFkZCIgaW4gb3QpCiAgICAgICAgb3IgInRyZWFzdXJlIHRva2VuIiBpbiBvdAogICAgICAgIG9yICJhZGQgbWFuYSIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJSYW1wIikKCiAgICAjIOKUgOKUgCBEcmF3IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJkcmF3IGEgY2FyZCIgaW4gb3QKICAgICAgICBvciAiZHJhdyBjYXJkcyIgaW4gb3QKICAgICAgICBvciAiZHJhd3MgYSBjYXJkIiBpbiBvdAogICAgICAgIG9yICJkcmF3IHR3byBjYXJkcyIgaW4gb3QKICAgICAgICBvciAiZHJhdyB0aHJlZSBjYXJkcyIgaW4gb3QKICAgICAgICBvciByZS5zZWFyY2gociJkcmF3IFxkKyBjYXJkcz8iLCBvdCkKICAgICAgICBvciAid2hlbmV2ZXIiIGluIG90IGFuZCAiZHJhdyIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJEcmF3IikKCiAgICAjIOKUgOKUgCBSZW1vdmFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJkZXN0cm95IHRhcmdldCIgaW4gb3QKICAgICAgICBvciAiZXhpbGUgdGFyZ2V0IiBpbiBvdAogICAgICAgIG9yIHJlLnNlYXJjaChyImRlYWxzPyBcZCsgZGFtYWdlIHRvICh0YXJnZXR8YW55IHRhcmdldCkiLCBvdCkKICAgICAgICBvciByZS5zZWFyY2gociJkZWFscz8geCBkYW1hZ2UgdG8gKHRhcmdldHxhbnkgdGFyZ2V0KSIsIG90KQogICAgICAgIG9yICJ0YXJnZXQgY3JlYXR1cmUgZ2V0cyAtIiBpbiBvdAogICAgICAgIG9yICJmaWdodHMgdGFyZ2V0IiBpbiBvdAogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIlJlbW92YWwiKQoKICAgICMg4pSA4pSAIEJvYXJkIFdpcGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgImRlc3Ryb3kgYWxsIiBpbiBvdAogICAgICAgIG9yICJleGlsZSBhbGwiIGluIG90CiAgICAgICAgb3IgcmUuc2VhcmNoKHIiYWxsIGNyZWF0dXJlcyBnZXQgLVxkKy8tXGQrIiwgb3QpCiAgICAgICAgb3IgcmUuc2VhcmNoKHIiZWFjaCBjcmVhdHVyZSBnZXRzIC1cZCsvLVxkKyIsIG90KQogICAgICAgIG9yICgiZGVhbHMiIGluIG90IGFuZCAidG8gZWFjaCBjcmVhdHVyZSIgaW4gb3QpCiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiQm9hcmQgV2lwZSIpCgogICAgIyDilIDilIAgQW50aGVtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgIHJlLnNlYXJjaChyImNyZWF0dXJlcz8geW91IGNvbnRyb2wgZ2V0IFwrIiwgb3QpCiAgICAgICAgb3IgcmUuc2VhcmNoKHIiY3JlYXR1cmVzPyB5b3UgY29udHJvbCBoYXZlIiwgb3QpCiAgICAgICAgb3IgcmUuc2VhcmNoKHIib3RoZXIgY3JlYXR1cmVzPyB5b3UgY29udHJvbCBnZXQgXCsiLCBvdCkKICAgICAgICBvciByZS5zZWFyY2gociJlYWNoIGNyZWF0dXJlIHlvdSBjb250cm9sIGdldHM/IFwrIiwgb3QpCiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiQW50aGVtIikKCiAgICAjIOKUgOKUgCBQcm90ZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJoZXhwcm9vZiIgaW4gb3Qgb3IgImhleHByb29mIiBpbiBrdwogICAgICAgIG9yICJpbmRlc3RydWN0aWJsZSIgaW4gb3Qgb3IgImluZGVzdHJ1Y3RpYmxlIiBpbiBrdwogICAgICAgIG9yICJzaHJvdWQiIGluIG90IG9yICJzaHJvdWQiIGluIGt3CiAgICAgICAgb3IgIndhcmQiIGluIG90IG9yICJ3YXJkIiBpbiBrdwogICAgICAgIG9yICJwcm90ZWN0aW9uIGZyb20iIGluIG90CiAgICAgICAgb3IgImNhbid0IGJlIHRoZSB0YXJnZXQiIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiUHJvdGVjdGlvbiIpCgogICAgIyDilIDilIAgVHV0b3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAic2VhcmNoIHlvdXIgbGlicmFyeSIgaW4gb3Q6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJUdXRvciIpCgogICAgIyDilIDilIAgQ291bnRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICJjb3VudGVyIHRhcmdldCIgaW4gb3Q6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJDb3VudGVyIikKCiAgICAjIOKUgOKUgCBUb2tlbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICByZS5zZWFyY2gociJjcmVhdGVbc2RdPyAuKnRva2VuIiwgb3QpCiAgICAgICAgb3IgImNyZWF0dXJlIHRva2VuIiBpbiBvdAogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIlRva2VuIikKCiAgICAjIOKUgOKUgCBTYWNyaWZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgInNhY3JpZmljZSBhICIgaW4gb3QKICAgICAgICBvciAic2FjcmlmaWNlIGFub3RoZXIiIGluIG90CiAgICAgICAgb3IgIndoZW4iIGluIG90IGFuZCAic2FjcmlmaWNlIiBpbiBvdCBhbmQgImRpZXMiIG5vdCBpbiBvdAogICAgICAgIG9yICJlYWNoIHBsYXllciBzYWNyaWZpY2VzIiBpbiBvdAogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIlNhY3JpZmljZSIpCgogICAgIyDilIDilIAgUmVjdXJzaW9uIC8gUmVhbmltYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJyZXR1cm4iIGluIG90IGFuZCAiZnJvbSB5b3VyIGdyYXZleWFyZCIgaW4gb3QKICAgICAgICBvciAicmV0dXJuIiBpbiBvdCBhbmQgImZyb20gYSBncmF2ZXlhcmQiIGluIG90CiAgICAgICAgb3IgInB1dCIgaW4gb3QgYW5kICJmcm9tIHlvdXIgZ3JhdmV5YXJkIiBpbiBvdCBhbmQgIm9udG8gdGhlIGJhdHRsZWZpZWxkIiBpbiBvdAogICAgICAgIG9yICJwdXQiIGluIG90IGFuZCAiZnJvbSBhIGdyYXZleWFyZCIgaW4gb3QgYW5kICJvbnRvIHRoZSBiYXR0bGVmaWVsZCIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJSZWN1cnNpb24iKQoKICAgICMg4pSA4pSAIEdyYXZleWFyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiZ3JhdmV5YXJkIiBpbiBvdAogICAgICAgIGFuZCAoIm1pbGwiIGluIG90IG9yICJwdXQiIGluIG90IGFuZCAiaW50byIgaW4gb3QgYW5kICJncmF2ZXlhcmQiIGluIG90KQogICAgKSBvciAibWlsbCIgaW4ga3c6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJHcmF2ZXlhcmQiKQoKICAgICMg4pSA4pSAIExpZmVnYWluIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJnYWluIiBpbiBvdCBhbmQgImxpZmUiIGluIG90CiAgICAgICAgb3IgImxpZmVsaW5rIiBpbiBvdCBvciAibGlmZWxpbmsiIGluIGt3CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiTGlmZWdhaW4iKQoKICAgICMg4pSA4pSAIEJ1cm4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgcmUuc2VhcmNoKHIiZGVhbHM/IFxkKyBkYW1hZ2UgdG8gKGVhY2h8YW55fHRhcmdldCkgKG9wcG9uZW50fHBsYXllcikiLCBvdCkKICAgICAgICBvciAiZWFjaCBvcHBvbmVudCBsb3NlcyIgaW4gb3QgYW5kICJsaWZlIiBpbiBvdAogICAgICAgIG9yICJkZWFscyBkYW1hZ2UgdG8gZWFjaCBvcHBvbmVudCIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJCdXJuIikKCiAgICAjIOKUgOKUgCBTdGF4IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJjYW4ndCBjYXN0IiBpbiBvdAogICAgICAgIG9yICJjYW4ndCBhdHRhY2siIGluIG90CiAgICAgICAgb3IgImNhbid0IGFjdGl2YXRlIiBpbiBvdAogICAgICAgIG9yICJlbnRlcnMgdGhlIGJhdHRsZWZpZWxkIHRhcHBlZCIgaW4gb3QgYW5kICJvcHBvbmVudHMiIGluIG90CiAgICAgICAgb3IgImVhY2ggcGxheWVyIGNhbid0IiBpbiBvdAogICAgICAgIG9yICJwbGF5ZXJzIGNhbid0IiBpbiBvdAogICAgICAgIG9yICJjb3N0IHsiIGluIG90IGFuZCAibW9yZSB0byBjYXN0IiBpbiBvdAogICAgICAgIG9yICJjb3N0IG1vcmUiIGluIG90IGFuZCAic3BlbGxzIiBpbiBvdAogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIlN0YXgiKQoKICAgICMg4pSA4pSAIEV2YXNpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgImZseWluZyIgaW4ga3cKICAgICAgICBvciAidHJhbXBsZSIgaW4ga3cKICAgICAgICBvciAibWVuYWNlIiBpbiBrdwogICAgICAgIG9yICJzaGFkb3ciIGluIGt3CiAgICAgICAgb3IgImZlYXIiIGluIGt3CiAgICAgICAgb3IgImludGltaWRhdGUiIGluIGt3CiAgICAgICAgb3IgImNhbid0IGJlIGJsb2NrZWQiIGluIG90CiAgICAgICAgb3IgInVuYmxvY2thYmxlIiBpbiBvdAogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIkV2YXNpb24iKQoKICAgICMg4pSA4pSAIEZpbmlzaGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJ5b3Ugd2luIHRoZSBnYW1lIiBpbiBvdAogICAgICAgIG9yICJleHRyYSB0dXJuIiBpbiBvdAogICAgICAgIG9yICJpbmZpbml0ZSIgaW4gb3QKICAgICAgICBvciAibG9zZXMgdGhlIGdhbWUiIGluIG90CiAgICAgICAgb3IgImRhbWFnZSBlcXVhbCB0byIgaW4gb3QgYW5kICgibnVtYmVyIiBpbiBvdCBvciAidG90YWwiIGluIG90KQogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIkZpbmlzaGVyIikKCiAgICAjIOKUgOKUgCBDb21ibyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAidW50YXAgYWxsIiBpbiBvdAogICAgICAgIG9yICJjb3B5IiBpbiBvdCBhbmQgInNwZWxsIiBpbiBvdAogICAgICAgIG9yICJ0YWtlIGFuIGV4dHJhIiBpbiBvdAogICAgICAgIG9yICJkb3VibGUiIGluIG90IGFuZCAoImRhbWFnZSIgaW4gb3Qgb3IgImNvdW50ZXJzIiBpbiBvdCBvciAidG9rZW5zIiBpbiBvdCkKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJDb21ibyIpCgogICAgcmV0dXJuIHJvbGVzCgoKZGVmIF9nZXRfZGVja19vcl80MDQoZGVja19pZDogaW50KToKICAgICIiIkZldGNoIGEgZGVjayByb3cgb3IgcmFpc2UgNDA0LiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gZGVja3MgV0hFUkUgaWQgPSA/IiwgKGRlY2tfaWQsKSkuZmV0Y2hvbmUoKQogICAgaWYgbm90IHJvdzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJEZWNrIHtkZWNrX2lkfSBub3QgZm91bmQiKQogICAgZCA9IGRpY3Qocm93KQogICAgdHJ5OgogICAgICAgIGRbImNvbG9yX2lkZW50aXR5Il0gPSBqc29uLmxvYWRzKGQuZ2V0KCJjb2xvcl9pZGVudGl0eSIsICJbXSIpKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBkWyJjb2xvcl9pZGVudGl0eSJdID0gW10KICAgIHJldHVybiBkCgoKZGVmIF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZDogaW50KSAtPiBkaWN0OgogICAgIiIiCiAgICBCdWlsZCB0aGUgZnVsbCBhbmFseXNpcyBkaWN0IGZvciBhIGRlY2suCiAgICBKb2lucyBkZWNrX2NhcmRzIHdpdGggY29sbGVjdGlvbl9lbnRyaWVzIHZpYSBzY3J5ZmFsbF9pZC4KICAgICIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiIKICAgICAgICBTRUxFQ1QgZGMuaWQsIGRjLnNjcnlmYWxsX2lkLCBkYy5jYXJkX25hbWUsIGRjLnF1YW50aXR5LCBkYy5pc19jb21tYW5kZXIsIGRjLnJvbGVfdGFnLAogICAgICAgICAgICAgICBjZS50eXBlX2xpbmUsIGNlLm9yYWNsZV90ZXh0LCBjZS5rZXl3b3JkcywgY2UuY21jLCBjZS5jb2xvcl9pZGVudGl0eQogICAgICAgIEZST00gZGVja19jYXJkcyBkYwogICAgICAgIExFRlQgSk9JTiAoCiAgICAgICAgICAgIFNFTEVDVCBzY3J5ZmFsbF9pZCwgdHlwZV9saW5lLCBvcmFjbGVfdGV4dCwga2V5d29yZHMsIGNtYywgY29sb3JfaWRlbnRpdHkKICAgICAgICAgICAgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgR1JPVVAgQlkgc2NyeWZhbGxfaWQKICAgICAgICApIGNlIE9OIGNlLnNjcnlmYWxsX2lkID0gZGMuc2NyeWZhbGxfaWQKICAgICAgICBXSEVSRSBkYy5kZWNrX2lkID0gPwogICAgICAgICIiIiwKICAgICAgICAoZGVja19pZCwpCiAgICApLmZldGNoYWxsKCkKCiAgICBjb3VudHNfYnlfdHlwZSA9IHt0OiAwIGZvciB0IGluIF9UWVBFX1BSSU9SSVRZfQogICAgY291bnRzX2J5X3R5cGVbIk90aGVyIl0gPSAwCiAgICBtYW5hX2N1cnZlID0gezA6IDAsIDE6IDAsIDI6IDAsIDM6IDAsIDQ6IDAsIDU6IDAsICI2KyI6IDB9CiAgICBjb2xvcl9waXBzID0geyJXIjogMCwgIlUiOiAwLCAiQiI6IDAsICJSIjogMCwgIkciOiAwfQogICAgcm9sZXNfY291bnQgPSB7IlJhbXAiOiAwLCAiRHJhdyI6IDAsICJSZW1vdmFsIjogMCwgIkJvYXJkV2lwZSI6IDAsCiAgICAgICAgICAgICAgICAgICAiUHJvdGVjdGlvbiI6IDAsICJUdXRvciI6IDAsICJDb3VudGVyIjogMH0KICAgIHRvdGFsX2NhcmRzID0gMAoKICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBxdHkgPSByb3dbInF1YW50aXR5Il0gb3IgMQogICAgICAgIHRvdGFsX2NhcmRzICs9IHF0eQogICAgICAgIHR5cGVfbGluZSA9IHJvd1sidHlwZV9saW5lIl0gb3IgIiIKICAgICAgICBvcmFjbGVfdGV4dCA9IHJvd1sib3JhY2xlX3RleHQiXSBvciAiIgogICAgICAgIGtleXdvcmRzID0gcm93WyJrZXl3b3JkcyJdIG9yICJbXSIKICAgICAgICBjbWMgPSBmbG9hdChyb3dbImNtYyJdIG9yIDApCiAgICAgICAgY29sX2lkX3JhdyA9IHJvd1siY29sb3JfaWRlbnRpdHkiXSBvciAiW10iCgogICAgICAgIGNhcmRfdHlwZSA9IF9jbGFzc2lmeV9jYXJkX3R5cGUodHlwZV9saW5lKQogICAgICAgIGNvdW50c19ieV90eXBlW2NhcmRfdHlwZV0gPSBjb3VudHNfYnlfdHlwZS5nZXQoY2FyZF90eXBlLCAwKSArIHF0eQoKICAgICAgICAjIE1hbmEgY3VydmUgKGV4Y2x1ZGUgbGFuZHMpCiAgICAgICAgaWYgY2FyZF90eXBlICE9ICJMYW5kIjoKICAgICAgICAgICAgY21jX2ludCA9IGludChjbWMpCiAgICAgICAgICAgIGlmIGNtY19pbnQgPj0gNjoKICAgICAgICAgICAgICAgIG1hbmFfY3VydmVbIjYrIl0gKz0gcXR5CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtYW5hX2N1cnZlW2NtY19pbnRdID0gbWFuYV9jdXJ2ZS5nZXQoY21jX2ludCwgMCkgKyBxdHkKCiAgICAgICAgIyBDb2xvciBwaXBzIGZyb20gY29sb3JfaWRlbnRpdHkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNpID0ganNvbi5sb2Fkcyhjb2xfaWRfcmF3KSBpZiBpc2luc3RhbmNlKGNvbF9pZF9yYXcsIHN0cikgZWxzZSBjb2xfaWRfcmF3CiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY2kgPSBbXQogICAgICAgIGZvciBjIGluIGNpOgogICAgICAgICAgICBpZiBjIGluIGNvbG9yX3BpcHM6CiAgICAgICAgICAgICAgICBjb2xvcl9waXBzW2NdICs9IHF0eQoKICAgICAgICAjIERldGVjdCByb2xlcwogICAgICAgIGNhcmRfcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMob3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMpCiAgICAgICAgZm9yIHJvbGUgaW4gY2FyZF9yb2xlczoKICAgICAgICAgICAgaWYgcm9sZSBpbiByb2xlc19jb3VudDoKICAgICAgICAgICAgICAgIHJvbGVzX2NvdW50W3JvbGVdICs9IHF0eQoKICAgICMgQ29tcHV0ZSBkZWx0YXM6IGN1cnJlbnQgLSBtaWRwb2ludCBvZiB0YXJnZXQgcmFuZ2UKICAgIGRlbHRhcyA9IHt9CiAgICBmb3IgdCwgKGxvLCBoaSkgaW4gX1RZUEVfVEFSR0VUUy5pdGVtcygpOgogICAgICAgIG1pZCA9IChsbyArIGhpKSAvIDIKICAgICAgICBjdXJyZW50ID0gY291bnRzX2J5X3R5cGUuZ2V0KHQsIDApCiAgICAgICAgZGVsdGEgPSBjdXJyZW50IC0gbWlkCiAgICAgICAgZGVsdGFzW3RdID0gcm91bmQoZGVsdGEsIDEpCgogICAgcmV0dXJuIHsKICAgICAgICAiY291bnRzX2J5X3R5cGUiOiBjb3VudHNfYnlfdHlwZSwKICAgICAgICAidGFyZ2V0cyI6IF9UWVBFX1RBUkdFVFMsCiAgICAgICAgImRlbHRhcyI6IGRlbHRhcywKICAgICAgICAibWFuYV9jdXJ2ZSI6IG1hbmFfY3VydmUsCiAgICAgICAgImNvbG9yX3BpcHMiOiBjb2xvcl9waXBzLAogICAgICAgICJ0b3RhbF9jYXJkcyI6IHRvdGFsX2NhcmRzLAogICAgICAgICJyb2xlcyI6IHJvbGVzX2NvdW50LAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVjayBCdWlsZGVyIEVuZHBvaW50cwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyDilIDilIAgMi4xIERlY2sgQ1JVRCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAucG9zdCgiL2FwaS9kZWNrcyIpCmFzeW5jIGRlZiBjcmVhdGVfZGVjayhyZXE6IENyZWF0ZURlY2tSZXF1ZXN0KToKICAgICIiIkNyZWF0ZSBhIG5ldyBkZWNrLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjb2xvcl9pZGVudGl0eV9qc29uID0ganNvbi5kdW1wcyhyZXEuY29sb3JfaWRlbnRpdHkgb3IgW10pCiAgICBjdXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgSU5TRVJUIElOVE8gZGVja3MgKG5hbWUsIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCwgY29tbWFuZGVyX25hbWUsIGNvbG9yX2lkZW50aXR5LCBzdHJhdGVneV90YWcpCiAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/KQogICAgICAgICIiIiwKICAgICAgICAoCiAgICAgICAgICAgIHJlcS5uYW1lLAogICAgICAgICAgICByZXEuY29tbWFuZGVyX3NjcnlmYWxsX2lkIG9yICIiLAogICAgICAgICAgICByZXEuY29tbWFuZGVyX25hbWUgb3IgIiIsCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5X2pzb24sCiAgICAgICAgICAgIHJlcS5zdHJhdGVneV90YWcgb3IgIiIsCiAgICAgICAgKQogICAgKQogICAgY29ubi5jb21taXQoKQogICAgZGVja19pZCA9IGN1ci5sYXN0cm93aWQKICAgIHJldHVybiBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCgoKQGFwcC5nZXQoIi9hcGkvZGVja3MiKQphc3luYyBkZWYgbGlzdF9kZWNrc19kYigpOgogICAgIiIiTGlzdCBhbGwgZGVja3Mgd2l0aCBjYXJkIGNvdW50cy4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiIKICAgICAgICBTRUxFQ1QgZC4qLAogICAgICAgICAgICAgICBDT0FMRVNDRShTVU0oZGMucXVhbnRpdHkpLCAwKSBBUyB0b3RhbF9jYXJkcywKICAgICAgICAgICAgICAgQ09VTlQoZGMuaWQpIEFTIGNhcmRfc2xvdHMKICAgICAgICBGUk9NIGRlY2tzIGQKICAgICAgICBMRUZUIEpPSU4gZGVja19jYXJkcyBkYyBPTiBkYy5kZWNrX2lkID0gZC5pZAogICAgICAgIEdST1VQIEJZIGQuaWQKICAgICAgICBPUkRFUiBCWSBkLnVwZGF0ZWRfYXQgREVTQwogICAgICAgICIiIgogICAgKS5mZXRjaGFsbCgpCiAgICBkZWNrcyA9IFtdCiAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgZCA9IGRpY3Qocm93KQogICAgICAgIHRyeToKICAgICAgICAgICAgZFsiY29sb3JfaWRlbnRpdHkiXSA9IGpzb24ubG9hZHMoZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgIltdIikpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZFsiY29sb3JfaWRlbnRpdHkiXSA9IFtdCiAgICAgICAgZGVja3MuYXBwZW5kKGQpCiAgICByZXR1cm4geyJkZWNrcyI6IGRlY2tzfQoKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfSIpCmFzeW5jIGRlZiBnZXRfZGVjayhkZWNrX2lkOiBpbnQpOgogICAgIiIiR2V0IGZ1bGwgZGVjayBpbmZvIHdpdGggY29tcG9zaXRpb24gc3VtbWFyeS4iIiIKICAgIGRlY2sgPSBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGNhcmRfcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUICogRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IE9SREVSIEJZIGlzX2NvbW1hbmRlciBERVNDLCBjYXJkX25hbWUgQVNDIiwKICAgICAgICAoZGVja19pZCwpCiAgICApLmZldGNoYWxsKCkKICAgIGRlY2tbImNhcmRzIl0gPSBbZGljdChyKSBmb3IgciBpbiBjYXJkX3Jvd3NdCiAgICBkZWNrWyJ0b3RhbF9jYXJkcyJdID0gc3VtKHJbInF1YW50aXR5Il0gZm9yIHIgaW4gY2FyZF9yb3dzKQogICAgZGVja1siY2FyZF9zbG90cyJdID0gbGVuKGNhcmRfcm93cykKICAgICMgQ29tcG9zaXRpb24gc3VtbWFyeSBieSB0eXBlCiAgICBhbmFseXNpcyA9IF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZCkKICAgIGRlY2tbImNvbXBvc2l0aW9uIl0gPSBhbmFseXNpc1siY291bnRzX2J5X3R5cGUiXQogICAgcmV0dXJuIGRlY2sKCgpAYXBwLnB1dCgiL2FwaS9kZWNrcy97ZGVja19pZH0iKQphc3luYyBkZWYgdXBkYXRlX2RlY2soZGVja19pZDogaW50LCByZXE6IFVwZGF0ZURlY2tSZXF1ZXN0KToKICAgICIiIlVwZGF0ZSBkZWNrIG1ldGFkYXRhLiIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKSAgIyBlbnN1cmUgZXhpc3RzCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICB1cGRhdGVzID0ge30KICAgIGlmIHJlcS5uYW1lIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbIm5hbWUiXSA9IHJlcS5uYW1lCiAgICBpZiByZXEuY29tbWFuZGVyX3NjcnlmYWxsX2lkIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbImNvbW1hbmRlcl9zY3J5ZmFsbF9pZCJdID0gcmVxLmNvbW1hbmRlcl9zY3J5ZmFsbF9pZAogICAgaWYgcmVxLmNvbW1hbmRlcl9uYW1lIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbImNvbW1hbmRlcl9uYW1lIl0gPSByZXEuY29tbWFuZGVyX25hbWUKICAgIGlmIHJlcS5jb2xvcl9pZGVudGl0eSBpcyBub3QgTm9uZToKICAgICAgICB1cGRhdGVzWyJjb2xvcl9pZGVudGl0eSJdID0ganNvbi5kdW1wcyhyZXEuY29sb3JfaWRlbnRpdHkpCiAgICBpZiByZXEuc3RyYXRlZ3lfdGFnIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbInN0cmF0ZWd5X3RhZyJdID0gcmVxLnN0cmF0ZWd5X3RhZwoKICAgIGlmIG5vdCB1cGRhdGVzOgogICAgICAgIHJldHVybiBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCgogICAgdXBkYXRlc1sidXBkYXRlZF9hdCJdID0gZGF0ZXRpbWUudXRjbm93KCkuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIikKICAgIHNldF9jbGF1c2UgPSAiLCAiLmpvaW4oZiJ7a30gPSA/IiBmb3IgayBpbiB1cGRhdGVzKQogICAgY29ubi5leGVjdXRlKGYiVVBEQVRFIGRlY2tzIFNFVCB7c2V0X2NsYXVzZX0gV0hFUkUgaWQgPSA/IiwgbGlzdCh1cGRhdGVzLnZhbHVlcygpKSArIFtkZWNrX2lkXSkKICAgIGNvbm4uY29tbWl0KCkKICAgIHJldHVybiBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCgoKQGFwcC5kZWxldGUoIi9hcGkvZGVja3Mve2RlY2tfaWR9IikKYXN5bmMgZGVmIGRlbGV0ZV9kZWNrKGRlY2tfaWQ6IGludCk6CiAgICAiIiJEZWxldGUgYSBkZWNrIGFuZCBhbGwgaXRzIGNhcmRzIChjYXNjYWRlKS4iIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkgICMgZW5zdXJlIGV4aXN0cwogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrcyBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5jb21taXQoKQogICAgcmV0dXJuIHsiZGVsZXRlZCI6IFRydWUsICJkZWNrX2lkIjogZGVja19pZH0KCgpAYXBwLmRlbGV0ZSgiL2FwaS9kZWNrcyIpCmFzeW5jIGRlZiBkZWxldGVfYWxsX2RlY2tzKCk6CiAgICAiIiJEZWxldGUgQUxMIGRlY2tzIGFuZCB0aGVpciBjYXJkcy4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrX2NhcmRzIikKICAgIGNvdW50ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBkZWNrcyIpLmZldGNob25lKClbMF0KICAgIGNvbm4uZXhlY3V0ZSgiREVMRVRFIEZST00gZGVja3MiKQogICAgY29ubi5jb21taXQoKQogICAgcmV0dXJuIHsiZGVsZXRlZCI6IFRydWUsICJjb3VudCI6IGNvdW50fQoKCiMg4pSA4pSAIDIuMiBEZWNrIENhcmQgTWFuaXB1bGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKQGFwcC5nZXQoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2NhcmRzIikKYXN5bmMgZGVmIGdldF9kZWNrX2NhcmRzKGRlY2tfaWQ6IGludCk6CiAgICAiIiJHZXQgYWxsIGNhcmRzIGluIGEgZGVjayB3aXRoIGpvaW5lZCBjb2xsZWN0aW9uIGRhdGEuIiIiCiAgICBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUCiAgICAgICAgICAgIGRjLmlkLCBkYy5kZWNrX2lkLCBkYy5zY3J5ZmFsbF9pZCwgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwKICAgICAgICAgICAgZGMuaXNfY29tbWFuZGVyLCBkYy5yb2xlX3RhZywKICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5jbWMsIGNlLm1hbmFfY29zdCwgY2UuY29sb3JfaWRlbnRpdHksIGNlLm9yYWNsZV90ZXh0LCBjZS5rZXl3b3JkcywKICAgICAgICAgICAgY2UudGNnX3ByaWNlLCBjZS5xdWFudGl0eSBBUyBvd25lZF9xdHksIGNlLmlzX2xlZ2VuZGFyeSwKICAgICAgICAgICAgY2Uuc2FsdF9zY29yZSwgY2UuaXNfZ2FtZV9jaGFuZ2VyCiAgICAgICAgRlJPTSBkZWNrX2NhcmRzIGRjCiAgICAgICAgTEVGVCBKT0lOICgKICAgICAgICAgICAgU0VMRUNUIHNjcnlmYWxsX2lkLCB0eXBlX2xpbmUsIGNtYywgbWFuYV9jb3N0LCBjb2xvcl9pZGVudGl0eSwKICAgICAgICAgICAgICAgICAgIG9yYWNsZV90ZXh0LCBrZXl3b3JkcywgdGNnX3ByaWNlLCBxdWFudGl0eSwgaXNfbGVnZW5kYXJ5LAogICAgICAgICAgICAgICAgICAgc2FsdF9zY29yZSwgaXNfZ2FtZV9jaGFuZ2VyCiAgICAgICAgICAgIEZST00gY29sbGVjdGlvbl9lbnRyaWVzCiAgICAgICAgICAgIEdST1VQIEJZIHNjcnlmYWxsX2lkCiAgICAgICAgKSBjZSBPTiBjZS5zY3J5ZmFsbF9pZCA9IGRjLnNjcnlmYWxsX2lkCiAgICAgICAgV0hFUkUgZGMuZGVja19pZCA9ID8KICAgICAgICBPUkRFUiBCWSBkYy5pc19jb21tYW5kZXIgREVTQywgZGMuY2FyZF9uYW1lIEFTQwogICAgICAgICIiIiwKICAgICAgICAoZGVja19pZCwpCiAgICApLmZldGNoYWxsKCkKICAgIGNhcmRzID0gW10KICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBkID0gZGljdChyb3cpCiAgICAgICAgIyBQYXJzZSBKU09OIGZpZWxkcwogICAgICAgIGZvciBmIGluICgiY29sb3JfaWRlbnRpdHkiLCAia2V5d29yZHMiKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkLmdldChmKSwgc3RyKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBkW2ZdID0ganNvbi5sb2FkcyhkW2ZdKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBkW2ZdID0gW10KICAgICAgICBkWyJpbWFnZV91cmwiXSA9ICgKICAgICAgICAgICAgZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve2RbJ3NjcnlmYWxsX2lkJ119P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIKICAgICAgICAgICAgaWYgZC5nZXQoInNjcnlmYWxsX2lkIikgZWxzZSBOb25lCiAgICAgICAgKQogICAgICAgIGNhcmRzLmFwcGVuZChkKQogICAgcmV0dXJuIHsiY2FyZHMiOiBjYXJkcywgInRvdGFsIjogbGVuKGNhcmRzKX0KCgpAYXBwLnBvc3QoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2NhcmRzIikKYXN5bmMgZGVmIGFkZF9kZWNrX2NhcmQoZGVja19pZDogaW50LCByZXE6IEFkZERlY2tDYXJkUmVxdWVzdCk6CiAgICAiIiJBZGQgb3IgdXBkYXRlIGEgY2FyZCBpbiB0aGUgZGVjay4iIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgTG9vayB1cCBjYXJkX25hbWUgZnJvbSBjb2xsZWN0aW9uX2VudHJpZXMgYnkgc2NyeWZhbGxfaWQsIGZhbGwgYmFjayB0byByZXF1ZXN0CiAgICBjZV9yb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCBuYW1lIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHNjcnlmYWxsX2lkID0gPyBMSU1JVCAxIiwKICAgICAgICAocmVxLnNjcnlmYWxsX2lkLCkKICAgICkuZmV0Y2hvbmUoKQogICAgY2FyZF9uYW1lID0gY2Vfcm93WyJuYW1lIl0gaWYgY2Vfcm93IGVsc2UgKHJlcS5jYXJkX25hbWUgb3IgIiIpCgogICAgIyBDaGVjayBpZiB0aGlzIHNjcnlmYWxsX2lkIGlzIGFscmVhZHkgaW4gdGhlIGRlY2sKICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgaWQsIHF1YW50aXR5IEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgc2NyeWZhbGxfaWQgPSA/IiwKICAgICAgICAoZGVja19pZCwgcmVxLnNjcnlmYWxsX2lkKQogICAgKS5mZXRjaG9uZSgpCgogICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgbmV3X3F0eSA9IGV4aXN0aW5nWyJxdWFudGl0eSJdICsgKHJlcS5xdWFudGl0eSBvciAxKQogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlVQREFURSBkZWNrX2NhcmRzIFNFVCBxdWFudGl0eSA9ID8sIHJvbGVfdGFnID0gPywgaXNfY29tbWFuZGVyID0gPyBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAobmV3X3F0eSwgcmVxLnJvbGVfdGFnIG9yICIiLCByZXEuaXNfY29tbWFuZGVyIG9yIDAsIGV4aXN0aW5nWyJpZCJdKQogICAgICAgICkKICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IiwgKGV4aXN0aW5nWyJpZCJdLCkpLmZldGNob25lKCkKICAgIGVsc2U6CiAgICAgICAgY3VyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiIKICAgICAgICAgICAgSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHksIGlzX2NvbW1hbmRlciwgcm9sZV90YWcpCiAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgPykKICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBkZWNrX2lkLCByZXEuc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwKICAgICAgICAgICAgICAgIHJlcS5xdWFudGl0eSBvciAxLAogICAgICAgICAgICAgICAgcmVxLmlzX2NvbW1hbmRlciBvciAwLAogICAgICAgICAgICAgICAgcmVxLnJvbGVfdGFnIG9yICIiCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGlkID0gPyIsIChjdXIubGFzdHJvd2lkLCkpLmZldGNob25lKCkKCiAgICAjIFVwZGF0ZSBkZWNrIHVwZGF0ZWRfYXQKICAgIGNvbm4uZXhlY3V0ZSgiVVBEQVRFIGRlY2tzIFNFVCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCiAgICByZXR1cm4gZGljdChyb3cpCgoKQGFwcC5kZWxldGUoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2NhcmRzL3tjYXJkX2lkfSIpCmFzeW5jIGRlZiByZW1vdmVfZGVja19jYXJkKGRlY2tfaWQ6IGludCwgY2FyZF9pZDogaW50KToKICAgICIiIlJlbW92ZSBhIGNhcmQgZnJvbSBhIGRlY2suIiIiCiAgICBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIGlkIEZST00gZGVja19jYXJkcyBXSEVSRSBpZCA9ID8gQU5EIGRlY2tfaWQgPSA/IiwgKGNhcmRfaWQsIGRlY2tfaWQpCiAgICApLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiQ2FyZCBzbG90IHtjYXJkX2lkfSBub3QgZm91bmQgaW4gZGVjayB7ZGVja19pZH0iKQogICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGlkID0gPyIsIChjYXJkX2lkLCkpCiAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5jb21taXQoKQogICAgcmV0dXJuIHsiZGVsZXRlZCI6IFRydWUsICJjYXJkX2lkIjogY2FyZF9pZCwgImRlY2tfaWQiOiBkZWNrX2lkfQoKCkBhcHAucGF0Y2goIi9hcGkvZGVja3Mve2RlY2tfaWR9L2NhcmRzL3tjYXJkX2lkfSIpCmFzeW5jIGRlZiBwYXRjaF9kZWNrX2NhcmQoZGVja19pZDogaW50LCBjYXJkX2lkOiBpbnQsIHJlcTogUGF0Y2hEZWNrQ2FyZFJlcXVlc3QpOgogICAgIiIiVXBkYXRlIHF1YW50aXR5IG9yIHJvbGVfdGFnIGZvciBhIGNhcmQgaW4gYSBkZWNrLiIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCAqIEZST00gZGVja19jYXJkcyBXSEVSRSBpZCA9ID8gQU5EIGRlY2tfaWQgPSA/IiwgKGNhcmRfaWQsIGRlY2tfaWQpCiAgICApLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiQ2FyZCBzbG90IHtjYXJkX2lkfSBub3QgZm91bmQgaW4gZGVjayB7ZGVja19pZH0iKQoKICAgIHVwZGF0ZXMgPSB7fQogICAgaWYgcmVxLnF1YW50aXR5IGlzIG5vdCBOb25lOgogICAgICAgIGlmIHJlcS5xdWFudGl0eSA8IDE6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAicXVhbnRpdHkgbXVzdCBiZSA+PSAxIikKICAgICAgICB1cGRhdGVzWyJxdWFudGl0eSJdID0gcmVxLnF1YW50aXR5CiAgICBpZiByZXEucm9sZV90YWcgaXMgbm90IE5vbmU6CiAgICAgICAgdXBkYXRlc1sicm9sZV90YWciXSA9IHJlcS5yb2xlX3RhZwoKICAgIGlmIHVwZGF0ZXM6CiAgICAgICAgc2V0X2NsYXVzZSA9ICIsICIuam9pbihmIntrfSA9ID8iIGZvciBrIGluIHVwZGF0ZXMpCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICBmIlVQREFURSBkZWNrX2NhcmRzIFNFVCB7c2V0X2NsYXVzZX0gV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgbGlzdCh1cGRhdGVzLnZhbHVlcygpKSArIFtjYXJkX2lkXQogICAgICAgICkKICAgICAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICB1cGRhdGVkID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IiwgKGNhcmRfaWQsKSkuZmV0Y2hvbmUoKQogICAgcmV0dXJuIGRpY3QodXBkYXRlZCkKCgojIOKUgOKUgCAyLjMgRGVjayBBbmFseXNpcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9hbmFseXNpcyIpCmFzeW5jIGRlZiBkZWNrX2FuYWx5c2lzKGRlY2tfaWQ6IGludCk6CiAgICAiIiJBbmFseXplIGRlY2sgY29tcG9zaXRpb24g4oCUIHR5cGUgY291bnRzLCBtYW5hIGN1cnZlLCBjb2xvciBwaXBzLCByb2xlcywgdGFyZ2V0cywgZGVsdGFzLiIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgcmV0dXJuIF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZCkKCgojIOKUgOKUgCAyLjUgUmVjb21tZW5kYXRpb25zIGZyb20gQ29sbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9yZWNvbW1lbmRlZC1mcm9tLWNvbGxlY3Rpb24iKQphc3luYyBkZWYgcmVjb21tZW5kX2Zyb21fY29sbGVjdGlvbihkZWNrX2lkOiBpbnQsIG1heF9yZXN1bHRzOiBpbnQgPSAyMCwgcm9sZXM6IE9wdGlvbmFsW3N0cl0gPSBOb25lKToKICAgICIiIgogICAgUmVjb21tZW5kIGNhcmRzIGZyb20gdGhlIHVzZXIncyBjb2xsZWN0aW9uIGZvciBhIGRlY2suCiAgICBGaW5kcyBzaG9ydGZhbGxzLCB0aGVuIHNjb3JlcyBvd25lZCBjYXJkcyBieSBob3cgd2VsbCB0aGV5IGZpdC4KICAgICIiIgogICAgZGVjayA9IF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGRlY2tfY29sb3JfaWRlbnRpdHkgPSBkZWNrLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgUnVuIGFuYWx5c2lzIHRvIGZpbmQgc2hvcnRmYWxscwogICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICBkZWx0YXMgPSBhbmFseXNpc1siZGVsdGFzIl0KICAgIGNvdW50c19ieV90eXBlID0gYW5hbHlzaXNbImNvdW50c19ieV90eXBlIl0KCiAgICAjIEZpbmQgdHlwZXMgdGhhdCBhcmUgYmVsb3cgdGhlaXIgdGFyZ2V0IG1pZHBvaW50IChzaG9ydGZhbGwpCiAgICBzaG9ydGZhbGxfdHlwZXMgPSBzZXQoKQogICAgZm9yIHQsIGRlbHRhIGluIGRlbHRhcy5pdGVtcygpOgogICAgICAgIGxvLCBoaSA9IF9UWVBFX1RBUkdFVFMuZ2V0KHQsIFswLCAwXSkKICAgICAgICBpZiBjb3VudHNfYnlfdHlwZS5nZXQodCwgMCkgPCBsbzoKICAgICAgICAgICAgc2hvcnRmYWxsX3R5cGVzLmFkZCh0KQoKICAgICMgR2V0IHNjcnlmYWxsX2lkcyBhbHJlYWR5IGluIGRlY2sgdG8gZXhjbHVkZQogICAgaW5fZGVja19pZHMgPSBzZXQoCiAgICAgICAgclsic2NyeWZhbGxfaWQiXSBmb3IgciBpbgogICAgICAgIGNvbm4uZXhlY3V0ZSgiU0VMRUNUIHNjcnlmYWxsX2lkIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyIsIChkZWNrX2lkLCkpLmZldGNoYWxsKCkKICAgICkKCiAgICAjIFBhcnNlIHJvbGUgZmlsdGVyCiAgICByb2xlX2ZpbHRlciA9IFtyLnN0cmlwKCkgZm9yIHIgaW4gcm9sZXMuc3BsaXQoIiwiKSBpZiByLnN0cmlwKCldIGlmIHJvbGVzIGVsc2UgW10KCiAgICAjIFF1ZXJ5IGNvbGxlY3Rpb24gZm9yIGNhbmRpZGF0ZSBjYXJkcwogICAgY29sbF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgKiBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBxdWFudGl0eSA+IDAiCiAgICApLmZldGNoYWxsKCkKCiAgICBzY29yZWQgPSBbXQogICAgZm9yIHJvdyBpbiBjb2xsX3Jvd3M6CiAgICAgICAgY2FyZCA9IF9yb3dfdG9fZGljdChyb3cpCiAgICAgICAgY2FyZF9pZCA9IGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKQoKICAgICAgICAjIFNraXAgY2FyZHMgYWxyZWFkeSBpbiBkZWNrCiAgICAgICAgaWYgY2FyZF9pZCBpbiBpbl9kZWNrX2lkczoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBDb2xvciBpZGVudGl0eSBjaGVjazogYWxsIGNhcmQgY29sb3JzIG11c3QgYmUgaW4gZGVjayBjb2xvcnMKICAgICAgICBjYXJkX2NpID0gY2FyZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pCiAgICAgICAgaWYgaXNpbnN0YW5jZShjYXJkX2NpLCBzdHIpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjYXJkX2NpID0ganNvbi5sb2FkcyhjYXJkX2NpKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgY2FyZF9jaSA9IFtdCiAgICAgICAgaWYgZGVja19jb2xvcl9pZGVudGl0eSBhbmQgY2FyZF9jaToKICAgICAgICAgICAgaWYgbm90IGFsbChjIGluIGRlY2tfY29sb3JfaWRlbnRpdHkgZm9yIGMgaW4gY2FyZF9jaSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICB0eXBlX2xpbmUgPSBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpCiAgICAgICAgb3JhY2xlX3RleHQgPSBjYXJkLmdldCgib3JhY2xlX3RleHQiLCAiIikKICAgICAgICBrZXl3b3JkcyA9IGNhcmQuZ2V0KCJrZXl3b3JkcyIsIFtdKQogICAgICAgIGNhcmRfdHlwZSA9IF9jbGFzc2lmeV9jYXJkX3R5cGUodHlwZV9saW5lKQogICAgICAgIGNhcmRfcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMob3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMpCgogICAgICAgICMgUm9sZSBmaWx0ZXIKICAgICAgICBpZiByb2xlX2ZpbHRlciBhbmQgbm90IGFueShyIGluIGNhcmRfcm9sZXMgZm9yIHIgaW4gcm9sZV9maWx0ZXIpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFNjb3JpbmcKICAgICAgICBzY29yZSA9IDAKICAgICAgICAjICszIGlmIGNhcmQgdHlwZSBpcyBpbiBzaG9ydGZhbGwKICAgICAgICBpZiBjYXJkX3R5cGUgaW4gc2hvcnRmYWxsX3R5cGVzOgogICAgICAgICAgICBzY29yZSArPSAzCiAgICAgICAgIyArMiBwZXIgbWF0Y2hpbmcgcm9sZQogICAgICAgIGZvciByIGluIGNhcmRfcm9sZXM6CiAgICAgICAgICAgIGlmIHIgaW4gKCJSYW1wIiwgIkRyYXciLCAiUmVtb3ZhbCIsICJCb2FyZFdpcGUiKToKICAgICAgICAgICAgICAgIHNjb3JlICs9IDIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNjb3JlICs9IDEKICAgICAgICAjICsxIGZvciBsb3dlciBDTUMgKGN1cnZlIGZpdCkKICAgICAgICBjbWMgPSBmbG9hdChjYXJkLmdldCgiY21jIiwgMCkpCiAgICAgICAgaWYgY21jIDw9IDM6CiAgICAgICAgICAgIHNjb3JlICs9IDEKCiAgICAgICAgc2NvcmVkLmFwcGVuZCh7CiAgICAgICAgICAgICJpZCI6IGNhcmQuZ2V0KCJpZCIpLAogICAgICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkX2lkLAogICAgICAgICAgICAibmFtZSI6IGNhcmQuZ2V0KCJuYW1lIiksCiAgICAgICAgICAgICJ0eXBlX2xpbmUiOiB0eXBlX2xpbmUsCiAgICAgICAgICAgICJjYXJkX3R5cGUiOiBjYXJkX3R5cGUsCiAgICAgICAgICAgICJjbWMiOiBjbWMsCiAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNhcmRfY2ksCiAgICAgICAgICAgICJvd25lZF9xdHkiOiBjYXJkLmdldCgicXVhbnRpdHkiLCAwKSwKICAgICAgICAgICAgInJvbGVzIjogY2FyZF9yb2xlcywKICAgICAgICAgICAgInNjb3JlIjogc2NvcmUsCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97Y2FyZF9pZH0/Zm9ybWF0PWltYWdlJnZlcnNpb249bm9ybWFsIiBpZiBjYXJkX2lkIGVsc2UgTm9uZSwKICAgICAgICB9KQoKICAgIHNjb3JlZC5zb3J0KGtleT1sYW1iZGEgeDogeFsic2NvcmUiXSwgcmV2ZXJzZT1UcnVlKQoKICAgICMgR3JvdXAgYnkgdHlwZQogICAgZ3JvdXBlZCA9IHt9CiAgICBmb3IgY2FyZCBpbiBzY29yZWRbOm1heF9yZXN1bHRzXToKICAgICAgICBjdCA9IGNhcmRbImNhcmRfdHlwZSJdCiAgICAgICAgZ3JvdXBlZC5zZXRkZWZhdWx0KGN0LCBbXSkuYXBwZW5kKGNhcmQpCgogICAgcmV0dXJuIHsKICAgICAgICAic2hvcnRmYWxsX3R5cGVzIjogbGlzdChzaG9ydGZhbGxfdHlwZXMpLAogICAgICAgICJyb2xlX2ZpbHRlciI6IHJvbGVfZmlsdGVyLAogICAgICAgICJncm91cGVkIjogZ3JvdXBlZCwKICAgICAgICAidG90YWwiOiBsZW4oc2NvcmVkWzptYXhfcmVzdWx0c10pLAogICAgfQoKCiMg4pSA4pSAIDIuNiBFREhSRUMtc3R5bGUgUmVjb21tZW5kYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKQGFwcC5nZXQoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2VkaC1yZWNzIikKYXN5bmMgZGVmIGRlY2tfZWRoX3JlY3MoZGVja19pZDogaW50LCBvbmx5X293bmVkOiBib29sID0gRmFsc2UsIG1heF9yZXN1bHRzOiBpbnQgPSAzMCk6CiAgICAiIiIKICAgIEZldGNoIEVESFJFQyBhdmVyYWdlIGRlY2sgcmVjb21tZW5kYXRpb25zIGZvciB0aGlzIGRlY2sncyBjb21tYW5kZXIuCiAgICBDcm9zcy1yZWZlcmVuY2VzIHdpdGggY29sbGVjdGlvbiBmb3Igb3duZWQgc3RhdHVzLgogICAgIiIiCiAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29tbWFuZGVyX25hbWUgPSBkZWNrLmdldCgiY29tbWFuZGVyX25hbWUiLCAiIikKICAgIGlmIG5vdCBjb21tYW5kZXJfbmFtZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIkRlY2sgaGFzIG5vIGNvbW1hbmRlcl9uYW1lIHNldC4gVXBkYXRlIHRoZSBkZWNrIGZpcnN0LiIpCgogICAgIyBDYWNoZSBjaGVjawogICAgY2FjaGVfa2V5ID0gZiJlZGhyZWM6YXZnOntfdG9fZWRocmVjX3NsdWcoY29tbWFuZGVyX25hbWUpfSIKICAgIGNhY2hlZF9wcm9maWxlID0gX2VkaHJlY19jYWNoZV9nZXQoY2FjaGVfa2V5KQogICAgaWYgY2FjaGVkX3Byb2ZpbGUgaXMgTm9uZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhY2hlZF9wcm9maWxlID0gX2ZldGNoX2VkaHJlY19hdmVyYWdlKGNvbW1hbmRlcl9uYW1lKQogICAgICAgICAgICBfZWRocmVjX2NhY2hlX3NldChjYWNoZV9rZXksIGNhY2hlZF9wcm9maWxlKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDIsIGYiRmFpbGVkIHRvIGZldGNoIEVESFJFQyBkYXRhIGZvciAne2NvbW1hbmRlcl9uYW1lfSc6IHtzdHIoZSl9IikKCiAgICBlZGhyZWNfcHJvZmlsZSA9IGNhY2hlZF9wcm9maWxlCiAgICBtYWluYm9hcmQgPSBlZGhyZWNfcHJvZmlsZS5nZXQoIm1haW5ib2FyZCIsIHt9KQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgR2V0IGNhcmRzIGFscmVhZHkgaW4gZGVjawogICAgaW5fZGVja19uYW1lcyA9IHNldCgKICAgICAgICByWyJjYXJkX25hbWUiXS5sb3dlcigpIGZvciByIGluCiAgICAgICAgY29ubi5leGVjdXRlKCJTRUxFQ1QgY2FyZF9uYW1lIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyIsIChkZWNrX2lkLCkpLmZldGNoYWxsKCkKICAgICkKCiAgICAjIEJ1aWxkIGNvbGxlY3Rpb24gbG9va3VwOiBuYW1lIChsb3dlcikgLT4ge293bmVkLCBxdHksIHNjcnlmYWxsX2lkfQogICAgY29sbF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgbmFtZSwgcXVhbnRpdHksIHNjcnlmYWxsX2lkIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIgogICAgKS5mZXRjaGFsbCgpCiAgICBjb2xsX21hcCA9IHt9CiAgICBmb3IgciBpbiBjb2xsX3Jvd3M6CiAgICAgICAga2V5ID0gclsibmFtZSJdLmxvd2VyKCkKICAgICAgICBleGlzdGluZyA9IGNvbGxfbWFwLmdldChrZXkpCiAgICAgICAgaWYgbm90IGV4aXN0aW5nIG9yIHJbInF1YW50aXR5Il0gPiBleGlzdGluZ1sicXR5Il06CiAgICAgICAgICAgIGNvbGxfbWFwW2tleV0gPSB7Im93bmVkIjogVHJ1ZSwgInF0eSI6IHJbInF1YW50aXR5Il0sICJzY3J5ZmFsbF9pZCI6IHJbInNjcnlmYWxsX2lkIl19CgogICAgIyBBbHNvIGxvb2sgdXAgY2FyZCBkZXRhaWxzIGZyb20gY29sbGVjdGlvbl9lbnRyaWVzIGZvciB0eXBlL3JvbGUKICAgIGNvbGxfZGV0YWlscyA9IHt9CiAgICBmb3IgciBpbiBjb25uLmV4ZWN1dGUoIlNFTEVDVCBuYW1lLCB0eXBlX2xpbmUsIG9yYWNsZV90ZXh0LCBrZXl3b3Jkcywgc2NyeWZhbGxfaWQgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMiKS5mZXRjaGFsbCgpOgogICAgICAgIGtleSA9IHJbIm5hbWUiXS5sb3dlcigpCiAgICAgICAgaWYga2V5IG5vdCBpbiBjb2xsX2RldGFpbHM6CiAgICAgICAgICAgIGNvbGxfZGV0YWlsc1trZXldID0gZGljdChyKQoKICAgIHJlc3VsdHMgPSBbXQogICAgZm9yIGNhcmRfbmFtZSBpbiBtYWluYm9hcmQ6CiAgICAgICAgbmFtZV9sb3dlciA9IGNhcmRfbmFtZS5sb3dlcigpCiAgICAgICAgIyBTa2lwIGNhcmRzIGFscmVhZHkgaW4gZGVjawogICAgICAgIGlmIG5hbWVfbG93ZXIgaW4gaW5fZGVja19uYW1lczoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgb3duZWRfaW5mbyA9IGNvbGxfbWFwLmdldChuYW1lX2xvd2VyLCB7Im93bmVkIjogRmFsc2UsICJxdHkiOiAwLCAic2NyeWZhbGxfaWQiOiAiIn0pCgogICAgICAgIGlmIG9ubHlfb3duZWQgYW5kIG5vdCBvd25lZF9pbmZvWyJvd25lZCJdOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIEdldCB0eXBlL3JvbGUgZnJvbSBjb2xsZWN0aW9uIGlmIGF2YWlsYWJsZQogICAgICAgIGRldGFpbHMgPSBjb2xsX2RldGFpbHMuZ2V0KG5hbWVfbG93ZXIsIHt9KQogICAgICAgIHR5cGVfbGluZSA9IGRldGFpbHMuZ2V0KCJ0eXBlX2xpbmUiLCAiIikKICAgICAgICBvcmFjbGVfdGV4dCA9IGRldGFpbHMuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKQogICAgICAgIGtleXdvcmRzID0gZGV0YWlscy5nZXQoImtleXdvcmRzIiwgIltdIikKICAgICAgICBjYXJkX3JvbGVzID0gX2RldGVjdF9jYXJkX3JvbGVzKG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzKQogICAgICAgIHNjcnlmYWxsX2lkID0gb3duZWRfaW5mby5nZXQoInNjcnlmYWxsX2lkIikgb3IgZGV0YWlscy5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCgogICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgIm5hbWUiOiBjYXJkX25hbWUsCiAgICAgICAgICAgICJ0eXBlX2xpbmUiOiB0eXBlX2xpbmUsCiAgICAgICAgICAgICJyb2xlIjogY2FyZF9yb2xlc1swXSBpZiBjYXJkX3JvbGVzIGVsc2UgIk90aGVyIiwKICAgICAgICAgICAgInJvbGVzIjogY2FyZF9yb2xlcywKICAgICAgICAgICAgImluY2x1c2lvbl9wY3QiOiBOb25lLCAgIyBFREhSRUMgYXZlcmFnZSBkb2Vzbid0IGV4cG9zZSAlIGRpcmVjdGx5IGluIHRoaXMgcGF0aAogICAgICAgICAgICAic3luZXJneV9zY29yZSI6IE5vbmUsCiAgICAgICAgICAgICJvd25lZCI6IG93bmVkX2luZm9bIm93bmVkIl0sCiAgICAgICAgICAgICJvd25lZF9xdHkiOiBvd25lZF9pbmZvWyJxdHkiXSwKICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97c2NyeWZhbGxfaWR9P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIgaWYgc2NyeWZhbGxfaWQgZWxzZSBOb25lLAogICAgICAgIH0pCgogICAgcmV0dXJuIHsKICAgICAgICAiY29tbWFuZGVyIjogY29tbWFuZGVyX25hbWUsCiAgICAgICAgInNvdXJjZSI6ICJFREhSRUMgQXZlcmFnZSIsCiAgICAgICAgInRvdGFsIjogbGVuKHJlc3VsdHNbOm1heF9yZXN1bHRzXSksCiAgICAgICAgInJlY29tbWVuZGF0aW9ucyI6IHJlc3VsdHNbOm1heF9yZXN1bHRzXSwKICAgIH0KCgojIOKUgOKUgCAyLjcgQnVsayBBZGQgT3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBfY2hlY2tfcmF0aW9fbGltaXQoZGVja19pZDogaW50LCBjYXJkX3R5cGU6IHN0ciwgY291bnRfdG9fYWRkOiBpbnQgPSAxKSAtPiBib29sOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBhZGRpbmcgY291bnRfdG9fYWRkIGNhcmRzIG9mIGNhcmRfdHlwZSBzdGF5cyB3aXRoaW4gdGFyZ2V0IG1heC4KICAgICIiIgogICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICBjdXJyZW50ID0gYW5hbHlzaXNbImNvdW50c19ieV90eXBlIl0uZ2V0KGNhcmRfdHlwZSwgMCkKICAgIHRhcmdldF9tYXggPSBfVFlQRV9UQVJHRVRTLmdldChjYXJkX3R5cGUsIFswLCA5OTk5XSlbMV0KICAgIHJldHVybiAoY3VycmVudCArIGNvdW50X3RvX2FkZCkgPD0gdGFyZ2V0X21heAoKCkBhcHAucG9zdCgiL2FwaS9kZWNrcy97ZGVja19pZH0vYnVsay1hZGQiKQphc3luYyBkZWYgYnVsa19hZGRfY2FyZHMoZGVja19pZDogaW50LCByZXE6IEJ1bGtBZGRSZXF1ZXN0KToKICAgICIiIgogICAgQnVsay1hZGQgY2FyZHMgdG8gYSBkZWNrIGJ5IHNjcnlmYWxsX2lkLgogICAgSWYgcmVzcGVjdF9yYXRpb3MsIHNraXBzIGNhcmRzIG9mIGEgdHlwZSB3aGVuIHRoZSB0YXJnZXQgbWF4IGlzIGFscmVhZHkgcmVhY2hlZC4KICAgICIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgYWRkZWQgPSAwCiAgICBza2lwcGVkID0gMAogICAgZGV0YWlscyA9IFtdCgogICAgZm9yIGNhcmRfZW50cnkgaW4gcmVxLmNhcmRzOgogICAgICAgIHNjcnlmYWxsX2lkID0gc3RyKGNhcmRfZW50cnkuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSkuc3RyaXAoKQogICAgICAgIHF1YW50aXR5ID0gaW50KGNhcmRfZW50cnkuZ2V0KCJxdWFudGl0eSIsIDEpKQogICAgICAgIGlmIG5vdCBzY3J5ZmFsbF9pZDoKICAgICAgICAgICAgc2tpcHBlZCArPSAxCiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHsic2NyeWZhbGxfaWQiOiBzY3J5ZmFsbF9pZCwgInN0YXR1cyI6ICJza2lwcGVkIiwgInJlYXNvbiI6ICJtaXNzaW5nIHNjcnlmYWxsX2lkIn0pCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgTG9vayB1cCBjYXJkIG5hbWUgYW5kIHR5cGUgZnJvbSBjb2xsZWN0aW9uCiAgICAgICAgY2Vfcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIG5hbWUsIHR5cGVfbGluZSwgb3JhY2xlX3RleHQsIGtleXdvcmRzIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHNjcnlmYWxsX2lkID0gPyBMSU1JVCAxIiwKICAgICAgICAgICAgKHNjcnlmYWxsX2lkLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBjYXJkX25hbWUgPSBjZV9yb3dbIm5hbWUiXSBpZiBjZV9yb3cgZWxzZSAiIgogICAgICAgIHR5cGVfbGluZSA9IGNlX3Jvd1sidHlwZV9saW5lIl0gaWYgY2Vfcm93IGVsc2UgIiIKICAgICAgICBjYXJkX3R5cGUgPSBfY2xhc3NpZnlfY2FyZF90eXBlKHR5cGVfbGluZSkKCiAgICAgICAgaWYgcmVxLnJlc3BlY3RfcmF0aW9zIGFuZCBub3QgX2NoZWNrX3JhdGlvX2xpbWl0KGRlY2tfaWQsIGNhcmRfdHlwZSwgcXVhbnRpdHkpOgogICAgICAgICAgICBza2lwcGVkICs9IDEKICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoewogICAgICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGNhcmRfbmFtZSwKICAgICAgICAgICAgICAgICJjYXJkX3R5cGUiOiBjYXJkX3R5cGUsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogInNraXBwZWQiLAogICAgICAgICAgICAgICAgInJlYXNvbiI6IGYiVHlwZSAne2NhcmRfdHlwZX0nIGF0IG9yIGFib3ZlIHRhcmdldCBtYXgiLAogICAgICAgICAgICB9KQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFVwc2VydAogICAgICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIGlkLCBxdWFudGl0eSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gQU5EIHNjcnlmYWxsX2lkID0gPyIsCiAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCkKICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJVUERBVEUgZGVja19jYXJkcyBTRVQgcXVhbnRpdHkgPSA/IFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICAoZXhpc3RpbmdbInF1YW50aXR5Il0gKyBxdWFudGl0eSwgZXhpc3RpbmdbImlkIl0pCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHkpIFZBTFVFUyAoPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5KQogICAgICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGFkZGVkICs9IDEKICAgICAgICBkZXRhaWxzLmFwcGVuZCh7InNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsICJuYW1lIjogY2FyZF9uYW1lLCAiY2FyZF90eXBlIjogY2FyZF90eXBlLCAic3RhdHVzIjogImFkZGVkIiwgInF1YW50aXR5IjogcXVhbnRpdHl9KQoKICAgIGNvbm4uZXhlY3V0ZSgiVVBEQVRFIGRlY2tzIFNFVCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCgogICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICByZXR1cm4geyJhZGRlZCI6IGFkZGVkLCAic2tpcHBlZCI6IHNraXBwZWQsICJkZXRhaWxzIjogZGV0YWlscywgImFuYWx5c2lzIjogYW5hbHlzaXN9CgoKQGFwcC5wb3N0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9idWxrLWFkZC1yZWNvbW1lbmRlZCIpCmFzeW5jIGRlZiBidWxrX2FkZF9yZWNvbW1lbmRlZChkZWNrX2lkOiBpbnQsIHJlcTogQnVsa0FkZFJlY29tbWVuZGVkUmVxdWVzdCk6CiAgICAiIiIKICAgIEZldGNoIHJlY29tbWVuZGF0aW9ucyBmcm9tICdjb2xsZWN0aW9uJyBvciAnZWRocmVjJywgZmlsdGVyLCBhbmQgYnVsay1hZGQgdG8gZGVjay4KICAgICIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgc291cmNlID0gKHJlcS5zb3VyY2Ugb3IgImNvbGxlY3Rpb24iKS5sb3dlcigpCiAgICB0eXBlX2ZpbHRlciA9IFt0LnN0cmlwKCkgZm9yIHQgaW4gcmVxLnR5cGVzXSBpZiByZXEudHlwZXMgZWxzZSBbXQogICAgcm9sZV9maWx0ZXIgPSBbci5zdHJpcCgpIGZvciByIGluIHJlcS5yb2xlc10gaWYgcmVxLnJvbGVzIGVsc2UgW10KCiAgICBjYW5kaWRhdGVzID0gW10KCiAgICBpZiBzb3VyY2UgPT0gImNvbGxlY3Rpb24iOgogICAgICAgICMgUmV1c2UgdGhlIHJlY29tbWVuZF9mcm9tX2NvbGxlY3Rpb24gbG9naWMKICAgICAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgICAgIGRlY2tfY29sb3JfaWRlbnRpdHkgPSBkZWNrLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgICAgICBhbmFseXNpcyA9IF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZCkKICAgICAgICBjb3VudHNfYnlfdHlwZSA9IGFuYWx5c2lzWyJjb3VudHNfYnlfdHlwZSJdCiAgICAgICAgc2hvcnRmYWxsX3R5cGVzID0ge3QgZm9yIHQsIChsbywgXykgaW4gX1RZUEVfVEFSR0VUUy5pdGVtcygpIGlmIGNvdW50c19ieV90eXBlLmdldCh0LCAwKSA8IGxvfQoKICAgICAgICBpbl9kZWNrX2lkcyA9IHNldCgKICAgICAgICAgICAgclsic2NyeWZhbGxfaWQiXSBmb3IgciBpbgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoIlNFTEVDVCBzY3J5ZmFsbF9pZCBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8iLCAoZGVja19pZCwpKS5mZXRjaGFsbCgpCiAgICAgICAgKQogICAgICAgIGNvbGxfcm93cyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgcXVhbnRpdHkgPiAwIikuZmV0Y2hhbGwoKQogICAgICAgIGZvciByb3cgaW4gY29sbF9yb3dzOgogICAgICAgICAgICBjYXJkID0gX3Jvd190b19kaWN0KHJvdykKICAgICAgICAgICAgY2lkID0gY2FyZC5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCiAgICAgICAgICAgIGlmIGNpZCBpbiBpbl9kZWNrX2lkczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNhcmRfY2kgPSBjYXJkLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjYXJkX2NpLCBzdHIpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGNhcmRfY2kgPSBqc29uLmxvYWRzKGNhcmRfY2kpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGNhcmRfY2kgPSBbXQogICAgICAgICAgICBpZiBkZWNrX2NvbG9yX2lkZW50aXR5IGFuZCBjYXJkX2NpOgogICAgICAgICAgICAgICAgaWYgbm90IGFsbChjIGluIGRlY2tfY29sb3JfaWRlbnRpdHkgZm9yIGMgaW4gY2FyZF9jaSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdGwgPSBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpCiAgICAgICAgICAgIGN0ID0gX2NsYXNzaWZ5X2NhcmRfdHlwZSh0bCkKICAgICAgICAgICAgY2FyZF9yb2xlcyA9IF9kZXRlY3RfY2FyZF9yb2xlcyhjYXJkLmdldCgib3JhY2xlX3RleHQiLCAiIiksIHRsLCBjYXJkLmdldCgia2V5d29yZHMiLCBbXSkpCiAgICAgICAgICAgIGlmIHR5cGVfZmlsdGVyIGFuZCBjdCBub3QgaW4gdHlwZV9maWx0ZXI6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiByb2xlX2ZpbHRlciBhbmQgbm90IGFueShyIGluIGNhcmRfcm9sZXMgZm9yIHIgaW4gcm9sZV9maWx0ZXIpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoeyJzY3J5ZmFsbF9pZCI6IGNpZCwgImNhcmRfdHlwZSI6IGN0LCAicXVhbnRpdHkiOiAxfSkKCiAgICBlbGlmIHNvdXJjZSA9PSAiZWRocmVjIjoKICAgICAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgICAgIGNvbW1hbmRlcl9uYW1lID0gZGVjay5nZXQoImNvbW1hbmRlcl9uYW1lIiwgIiIpCiAgICAgICAgaWYgbm90IGNvbW1hbmRlcl9uYW1lOgogICAgICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIkRlY2sgaGFzIG5vIGNvbW1hbmRlcl9uYW1lIHNldCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBlZGhyZWNfcHJvZmlsZSA9IF9mZXRjaF9lZGhyZWNfYXZlcmFnZShjb21tYW5kZXJfbmFtZSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAyLCBmIkVESFJFQyBmZXRjaCBmYWlsZWQ6IHtlfSIpCiAgICAgICAgbWFpbmJvYXJkID0gZWRocmVjX3Byb2ZpbGUuZ2V0KCJtYWluYm9hcmQiLCB7fSkKICAgICAgICBpbl9kZWNrX25hbWVzID0gc2V0KAogICAgICAgICAgICByWyJjYXJkX25hbWUiXS5sb3dlcigpIGZvciByIGluCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgiU0VMRUNUIGNhcmRfbmFtZSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8iLCAoZGVja19pZCwpKS5mZXRjaGFsbCgpCiAgICAgICAgKQogICAgICAgIGNvbGxfcm93cyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUIG5hbWUsIHNjcnlmYWxsX2lkLCB0eXBlX2xpbmUsIG9yYWNsZV90ZXh0LCBrZXl3b3JkcywgcXVhbnRpdHkgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMiKS5mZXRjaGFsbCgpCiAgICAgICAgY29sbF9tYXAgPSB7clsibmFtZSJdLmxvd2VyKCk6IGRpY3QocikgZm9yIHIgaW4gY29sbF9yb3dzfQoKICAgICAgICBmb3IgY2FyZF9uYW1lIGluIG1haW5ib2FyZDoKICAgICAgICAgICAgbmFtZV9sb3dlciA9IGNhcmRfbmFtZS5sb3dlcigpCiAgICAgICAgICAgIGlmIG5hbWVfbG93ZXIgaW4gaW5fZGVja19uYW1lczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNvbGxfaW5mbyA9IGNvbGxfbWFwLmdldChuYW1lX2xvd2VyKQogICAgICAgICAgICBpZiByZXEub25seV9vd25lZCBhbmQgbm90IGNvbGxfaW5mbzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBjb2xsX2luZm86CiAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBjYW4ndCBhZGQgd2l0aG91dCBzY3J5ZmFsbF9pZAogICAgICAgICAgICBzY3J5ZmFsbF9pZCA9IGNvbGxfaW5mby5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCiAgICAgICAgICAgIGlmIG5vdCBzY3J5ZmFsbF9pZDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRsID0gY29sbF9pbmZvLmdldCgidHlwZV9saW5lIiwgIiIpCiAgICAgICAgICAgIGN0ID0gX2NsYXNzaWZ5X2NhcmRfdHlwZSh0bCkKICAgICAgICAgICAgY2FyZF9yb2xlcyA9IF9kZXRlY3RfY2FyZF9yb2xlcyhjb2xsX2luZm8uZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSwgdGwsIGNvbGxfaW5mby5nZXQoImtleXdvcmRzIiwgW10pKQogICAgICAgICAgICBpZiB0eXBlX2ZpbHRlciBhbmQgY3Qgbm90IGluIHR5cGVfZmlsdGVyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcm9sZV9maWx0ZXIgYW5kIG5vdCBhbnkociBpbiBjYXJkX3JvbGVzIGZvciByIGluIHJvbGVfZmlsdGVyKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKHsic2NyeWZhbGxfaWQiOiBzY3J5ZmFsbF9pZCwgImNhcmRfdHlwZSI6IGN0LCAicXVhbnRpdHkiOiAxfSkKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIGYiVW5rbm93biBzb3VyY2UgJ3tzb3VyY2V9Jy4gVXNlICdjb2xsZWN0aW9uJyBvciAnZWRocmVjJy4iKQoKICAgICMgTm93IGJ1bGstYWRkIGNhbmRpZGF0ZXMKICAgIGFkZGVkID0gMAogICAgc2tpcHBlZCA9IDAKICAgIGRldGFpbHMgPSBbXQoKICAgIGZvciBjIGluIGNhbmRpZGF0ZXM6CiAgICAgICAgc2NyeWZhbGxfaWQgPSBjWyJzY3J5ZmFsbF9pZCJdCiAgICAgICAgY2FyZF90eXBlID0gY1siY2FyZF90eXBlIl0KICAgICAgICBxdWFudGl0eSA9IGNbInF1YW50aXR5Il0KCiAgICAgICAgaWYgcmVxLnJlc3BlY3RfcmF0aW9zIGFuZCBub3QgX2NoZWNrX3JhdGlvX2xpbWl0KGRlY2tfaWQsIGNhcmRfdHlwZSwgcXVhbnRpdHkpOgogICAgICAgICAgICBza2lwcGVkICs9IDEKICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoeyJzY3J5ZmFsbF9pZCI6IHNjcnlmYWxsX2lkLCAiY2FyZF90eXBlIjogY2FyZF90eXBlLCAic3RhdHVzIjogInNraXBwZWQiLCAicmVhc29uIjogInJhdGlvIGxpbWl0In0pCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGNlX3JvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBuYW1lIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHNjcnlmYWxsX2lkID0gPyBMSU1JVCAxIiwgKHNjcnlmYWxsX2lkLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBjYXJkX25hbWUgPSBjZV9yb3dbIm5hbWUiXSBpZiBjZV9yb3cgZWxzZSAiIgoKICAgICAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBpZCwgcXVhbnRpdHkgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IEFORCBzY3J5ZmFsbF9pZCA9ID8iLAogICAgICAgICAgICAoZGVja19pZCwgc2NyeWZhbGxfaWQpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJVUERBVEUgZGVja19jYXJkcyBTRVQgcXVhbnRpdHkgPSA/IFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICAoZXhpc3RpbmdbInF1YW50aXR5Il0gKyBxdWFudGl0eSwgZXhpc3RpbmdbImlkIl0pCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHkpIFZBTFVFUyAoPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5KQogICAgICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGFkZGVkICs9IDEKICAgICAgICBkZXRhaWxzLmFwcGVuZCh7InNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsICJuYW1lIjogY2FyZF9uYW1lLCAiY2FyZF90eXBlIjogY2FyZF90eXBlLCAic3RhdHVzIjogImFkZGVkIn0pCgogICAgY29ubi5leGVjdXRlKCJVUERBVEUgZGVja3MgU0VUIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwgKGRlY2tfaWQsKSkKICAgIGNvbm4uY29tbWl0KCkKCiAgICBhbmFseXNpcyA9IF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZCkKICAgIHJldHVybiB7ImFkZGVkIjogYWRkZWQsICJza2lwcGVkIjogc2tpcHBlZCwgImRldGFpbHMiOiBkZXRhaWxzLCAiYW5hbHlzaXMiOiBhbmFseXNpc30KCgojIOKUgOKUgCAyLjkgU2ltdWxhdGlvbiBFeHBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpAYXBwLnBvc3QoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2V4cG9ydC10by1zaW0iKQphc3luYyBkZWYgZXhwb3J0X2RlY2tfdG9fc2ltKGRlY2tfaWQ6IGludCk6CiAgICAiIiIKICAgIEV4cG9ydCBhIGRlY2sgdG8gRm9yZ2UgLmRjayBmb3JtYXQgYW5kIHNhdmUgdG8gdGhlIEZvcmdlIGRlY2tzIGRpcmVjdG9yeS4KICAgIFJldHVybnMgdGhlIGRlY2sgbmFtZSBmb3IgdXNlIGluIHNpbXVsYXRpb25zLgogICAgIiIiCiAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgY2FyZF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBPUkRFUiBCWSBpc19jb21tYW5kZXIgREVTQywgY2FyZF9uYW1lIEFTQyIsCiAgICAgICAgKGRlY2tfaWQsKQogICAgKS5mZXRjaGFsbCgpCgogICAgaWYgbm90IGNhcmRfcm93czoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIkRlY2sgaGFzIG5vIGNhcmRzIHRvIGV4cG9ydCIpCgogICAgIyBCdWlsZCAuZGNrIGNvbnRlbnQKICAgIGxpbmVzID0gWyJbbWV0YWRhdGFdIl0KICAgIGRlY2tfbmFtZSA9IGRlY2suZ2V0KCJuYW1lIiwgZiJEZWNrIHtkZWNrX2lkfSIpCiAgICBsaW5lcy5hcHBlbmQoZiJOYW1lPXtkZWNrX25hbWV9IikKICAgIGxpbmVzLmFwcGVuZCgiIikKCiAgICBjb21tYW5kZXJzID0gW3IgZm9yIHIgaW4gY2FyZF9yb3dzIGlmIHJbImlzX2NvbW1hbmRlciJdXQogICAgbWFpbmJvYXJkID0gW3IgZm9yIHIgaW4gY2FyZF9yb3dzIGlmIG5vdCByWyJpc19jb21tYW5kZXIiXV0KCiAgICBsaW5lcy5hcHBlbmQoIltDb21tYW5kZXJdIikKICAgIGZvciByIGluIGNvbW1hbmRlcnM6CiAgICAgICAgbmFtZSA9IHJbImNhcmRfbmFtZSJdIG9yICJVbmtub3duIgogICAgICAgIHF0eSA9IHJbInF1YW50aXR5Il0gb3IgMQogICAgICAgIGxpbmVzLmFwcGVuZChmIntxdHl9IHtuYW1lfSIpCgogICAgbGluZXMuYXBwZW5kKCIiKQogICAgbGluZXMuYXBwZW5kKCJbTWFpbl0iKQogICAgZm9yIHIgaW4gbWFpbmJvYXJkOgogICAgICAgIG5hbWUgPSByWyJjYXJkX25hbWUiXSBvciAiVW5rbm93biIKICAgICAgICBxdHkgPSByWyJxdWFudGl0eSJdIG9yIDEKICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0iKQoKICAgIGNvbnRlbnQgPSAiXG4iLmpvaW4obGluZXMpCgogICAgIyBEZXRlcm1pbmUgc2F2ZSBkaXJlY3RvcnkKICAgIHNhZmVfbmFtZSA9IHJlLnN1YihyIlteYS16QS1aMC05IF8tXSIsICIiLCBkZWNrX25hbWUpLnJlcGxhY2UoIiAiLCAiXyIpLnN0cmlwKCkKICAgIGlmIG5vdCBzYWZlX25hbWU6CiAgICAgICAgc2FmZV9uYW1lID0gZiJkZWNrX3tkZWNrX2lkfSIKCiAgICBzYXZlX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgIGlmIG5vdCBzYXZlX2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihzYXZlX2Rpcik6CiAgICAgICAgc2F2ZV9kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImV4cG9ydGVkLWRlY2tzIikKICAgICAgICBvcy5tYWtlZGlycyhzYXZlX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBvdXRfcGF0aCA9IFBhdGgoc2F2ZV9kaXIpIC8gZiJ7c2FmZV9uYW1lfS5kY2siCiAgICBvdXRfcGF0aC53cml0ZV90ZXh0KGNvbnRlbnQsIGVuY29kaW5nPSJ1dGYtOCIpCiAgICBsb2dfZGVja2dlbi5pbmZvKGYiICBFeHBvcnRlZCBkZWNrIHtkZWNrX2lkfSB0byB7b3V0X3BhdGh9IikKCiAgICByZXR1cm4gewogICAgICAgICJzdWNjZXNzIjogVHJ1ZSwKICAgICAgICAiZGVja05hbWUiOiBzYWZlX25hbWUsCiAgICAgICAgImRja0ZpbGUiOiBzdHIob3V0X3BhdGgpLAogICAgICAgICJ0b3RhbENhcmRzIjogc3VtKHJbInF1YW50aXR5Il0gZm9yIHIgaW4gY2FyZF9yb3dzKSwKICAgICAgICAiY29tbWFuZGVyQ291bnQiOiBsZW4oY29tbWFuZGVycyksCiAgICAgICAgIm1haW5ib2FyZENvdW50IjogbGVuKG1haW5ib2FyZCksCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEZWNrIEltcG9ydCBFbmRwb2ludAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKCmRlZiBfcGFyc2VfZGVja2xpc3RfdGV4dCh0ZXh0OiBzdHIpIC0+IGRpY3Q6CiAgICAiIiIKICAgIFBhcnNlIGEgZGVja2xpc3QgZnJvbSB0ZXh0LiBTdXBwb3J0czoKICAgICAgLSBGb3JnZSAuZGNrIGZvcm1hdCB3aXRoIFtDb21tYW5kZXJdLCBbRGVja10sIFtNYWluXSBzZWN0aW9ucwogICAgICAtIE1UR0EgZm9ybWF0OiAxIENhcmQgTmFtZQogICAgICAtIFBsYWluOiBDYXJkIE5hbWUgKGFzc3VtZWQgcXR5IDEpCiAgICAgIC0gTGluZXMgc3RhcnRpbmcgd2l0aCAvLyBvciAjIGFyZSBjb21tZW50cwogICAgUmV0dXJucyB7ICdjb21tYW5kZXJzJzogW3snbmFtZSc6IHN0ciwgJ3F0eSc6IGludH1dLCAnY2FyZHMnOiBbeyduYW1lJzogc3RyLCAncXR5JzogaW50fV0gfQogICAgIiIiCiAgICBjb21tYW5kZXJzID0gW10KICAgIGNhcmRzID0gW10KICAgIHNlY3Rpb24gPSAnbWFpbicgICMgZGVmYXVsdCBzZWN0aW9uCgogICAgZm9yIHJhd19saW5lIGluIHRleHQuc3BsaXRsaW5lcygpOgogICAgICAgIGxpbmUgPSByYXdfbGluZS5zdHJpcCgpCiAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCcvLycpIG9yIGxpbmUuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFNlY3Rpb24gaGVhZGVycwogICAgICAgIGxvdyA9IGxpbmUubG93ZXIoKQogICAgICAgIGlmIGxvdy5zdGFydHN3aXRoKCdbY29tbWFuZGVyJyk6CiAgICAgICAgICAgIHNlY3Rpb24gPSAnY29tbWFuZGVyJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGxvdy5zdGFydHN3aXRoKCdbZGVjaycpIG9yIGxvdy5zdGFydHN3aXRoKCdbbWFpbicpIG9yIGxvdy5zdGFydHN3aXRoKCdbbWFpbmJvYXJkJyk6CiAgICAgICAgICAgIHNlY3Rpb24gPSAnbWFpbicKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBsb3cuc3RhcnRzd2l0aCgnW3NpZGVib2FyZCcpIG9yIGxvdy5zdGFydHN3aXRoKCdbc2lkZScpIG9yIGxvdy5zdGFydHN3aXRoKCdbbWV0YWRhdGEnKToKICAgICAgICAgICAgc2VjdGlvbiA9ICdza2lwJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGxvdy5zdGFydHN3aXRoKCdbJyk6CiAgICAgICAgICAgICMgVW5rbm93biBzZWN0aW9uLCB0cmVhdCBhcyBtYWluCiAgICAgICAgICAgIHNlY3Rpb24gPSAnbWFpbicKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgc2VjdGlvbiA9PSAnc2tpcCc6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgUGFyc2UgcXVhbnRpdHkgKyBuYW1lCiAgICAgICAgbSA9IHJlLm1hdGNoKHInXihcZCspXHMqW3hYXT9ccysoLispJCcsIGxpbmUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgcXR5ID0gaW50KG0uZ3JvdXAoMSkpCiAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDIpLnN0cmlwKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBxdHkgPSAxCiAgICAgICAgICAgIG5hbWUgPSBsaW5lCgogICAgICAgICMgU3RyaXAgc2V0IGNvZGVzIGxpa2UgIihNMjEpIiBvciAiKE0yMSkgMTIzIiBmcm9tIE1UR0EgZXhwb3J0cwogICAgICAgIG5hbWUgPSByZS5zdWIocidccypcKFtBLVowLTldK1wpXHMqXGQqXHMqJCcsICcnLCBuYW1lKS5zdHJpcCgpCgogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBzZWN0aW9uID09ICdjb21tYW5kZXInOgogICAgICAgICAgICBjb21tYW5kZXJzLmFwcGVuZCh7J25hbWUnOiBuYW1lLCAncXR5JzogcXR5fSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjYXJkcy5hcHBlbmQoeyduYW1lJzogbmFtZSwgJ3F0eSc6IHF0eX0pCgogICAgcmV0dXJuIHsnY29tbWFuZGVycyc6IGNvbW1hbmRlcnMsICdjYXJkcyc6IGNhcmRzfQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrcy97ZGVja19pZH0vaW1wb3J0JykKYXN5bmMgZGVmIGltcG9ydF9kZWNrbGlzdChkZWNrX2lkOiBpbnQsIHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIgogICAgSW1wb3J0IGEgZGVja2xpc3QgaW50byBhbiBleGlzdGluZyBkZWNrLiBQYXJzZXMgdGV4dCwgbG9va3MgdXAgZWFjaCBjYXJkCiAgICBvbiBTY3J5ZmFsbCwgYW5kIGFkZHMgdGhlbSB0byB0aGUgZGVjay4KCiAgICBCb2R5OiB7ICJ0ZXh0IjogIjEgU29sIFJpbmdcbjEgQ3VsdGl2YXRlLi4uIiAsICJjbGVhckZpcnN0IjogZmFsc2UgfQogICAgIiIiCiAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpCiAgICB0ZXh0ID0gYm9keS5nZXQoJ3RleHQnLCAnJykKICAgIGNsZWFyX2ZpcnN0ID0gYm9keS5nZXQoJ2NsZWFyRmlyc3QnLCBGYWxzZSkKCiAgICBpZiBub3QgdGV4dC5zdHJpcCgpOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdObyBkZWNrbGlzdCB0ZXh0IHByb3ZpZGVkJ30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBwYXJzZWQgPSBfcGFyc2VfZGVja2xpc3RfdGV4dCh0ZXh0KQogICAgYWxsX2VudHJpZXMgPSBbXQogICAgZm9yIGMgaW4gcGFyc2VkWydjb21tYW5kZXJzJ106CiAgICAgICAgYWxsX2VudHJpZXMuYXBwZW5kKHsqKmMsICdpc19jb21tYW5kZXInOiBUcnVlfSkKICAgIGZvciBjIGluIHBhcnNlZFsnY2FyZHMnXToKICAgICAgICBhbGxfZW50cmllcy5hcHBlbmQoeyoqYywgJ2lzX2NvbW1hbmRlcic6IEZhbHNlfSkKCiAgICBpZiBub3QgYWxsX2VudHJpZXM6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ05vIGNhcmRzIGZvdW5kIGluIGRlY2tsaXN0J30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIE9wdGlvbmFsbHkgY2xlYXIgZXhpc3RpbmcgY2FyZHMKICAgIGlmIGNsZWFyX2ZpcnN0OgogICAgICAgIGNvbm4uZXhlY3V0ZSgnREVMRVRFIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPycsIChkZWNrX2lkLCkpCiAgICAgICAgY29ubi5jb21taXQoKQoKICAgIGFkZGVkID0gMAogICAgZmFpbGVkID0gW10KICAgIHJlc3VsdHMgPSBbXQoKICAgIGZvciBlbnRyeSBpbiBhbGxfZW50cmllczoKICAgICAgICBuYW1lID0gZW50cnlbJ25hbWUnXQogICAgICAgIHF0eSA9IGVudHJ5WydxdHknXQogICAgICAgIGlzX2NtZCA9IGVudHJ5Wydpc19jb21tYW5kZXInXQoKICAgICAgICAjIExvb2sgdXAgb24gU2NyeWZhbGwKICAgICAgICBzZiA9IF9zY3J5ZmFsbF9mdXp6eV9sb29rdXAobmFtZSkKICAgICAgICBpZiBub3Qgc2Y6CiAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQobmFtZSkKICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoeyduYW1lJzogbmFtZSwgJ3N0YXR1cyc6ICdub3RfZm91bmQnfSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgc2NyeWZhbGxfaWQgPSBzZi5nZXQoJ2lkJywgJycpCiAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IHNmLmdldCgnbmFtZScsIG5hbWUpCgogICAgICAgICMgQ2hlY2sgaWYgYWxyZWFkeSBpbiBkZWNrCiAgICAgICAgZXhpc3RpbmcgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICdTRUxFQ1QgaWQsIHF1YW50aXR5IEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgc2NyeWZhbGxfaWQgPSA/JywKICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkKQogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICBpZiBleGlzdGluZzoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgJ1VQREFURSBkZWNrX2NhcmRzIFNFVCBxdWFudGl0eSA9ID8sIGlzX2NvbW1hbmRlciA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIChleGlzdGluZ1sncXVhbnRpdHknXSArIHF0eSwgMSBpZiBpc19jbWQgZWxzZSBleGlzdGluZy5nZXQoJ2lzX2NvbW1hbmRlcicsIDApLCBleGlzdGluZ1snaWQnXSkKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICdJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyKSBWQUxVRVMgKD8sID8sID8sID8sID8pJywKICAgICAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgcmVzb2x2ZWRfbmFtZSwgcXR5LCAxIGlmIGlzX2NtZCBlbHNlIDApCiAgICAgICAgICAgICkKICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgYWRkZWQgKz0gMQogICAgICAgIHJlc3VsdHMuYXBwZW5kKHsnbmFtZSc6IHJlc29sdmVkX25hbWUsICdxdHknOiBxdHksICdzdGF0dXMnOiAnYWRkZWQnLCAnaXNDb21tYW5kZXInOiBpc19jbWR9KQoKICAgICMgVXBkYXRlIGNvbW1hbmRlciBvbiBkZWNrIHJlY29yZCBpZiB3ZSBmb3VuZCBvbmUKICAgIGNtZF9lbnRyaWVzID0gW3IgZm9yIHIgaW4gcmVzdWx0cyBpZiByLmdldCgnaXNDb21tYW5kZXInKV0KICAgIGlmIGNtZF9lbnRyaWVzOgogICAgICAgIGNtZF9uYW1lID0gY21kX2VudHJpZXNbMF1bJ25hbWUnXQogICAgICAgICMgTG9vayB1cCBzY3J5ZmFsbF9pZCBmcm9tIHRoZSBkZWNrX2NhcmRzIHdlIGp1c3QgaW5zZXJ0ZWQKICAgICAgICBjbWRfcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAnU0VMRUNUIHNjcnlmYWxsX2lkIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgaXNfY29tbWFuZGVyID0gMSBMSU1JVCAxJywKICAgICAgICAgICAgKGRlY2tfaWQsKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGNtZF9zZl9pZCA9IGNtZF9yb3dbJ3NjcnlmYWxsX2lkJ10gaWYgY21kX3JvdyBlbHNlICcnCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAnVVBEQVRFIGRlY2tzIFNFVCBjb21tYW5kZXJfbmFtZSA9ID8sIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCA9ID8sIHVwZGF0ZWRfYXQgPSBkYXRldGltZShcJ25vd1wnKSBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICAoY21kX25hbWUsIGNtZF9zZl9pZCwgZGVja19pZCkKICAgICAgICApCiAgICBlbHNlOgogICAgICAgIGNvbm4uZXhlY3V0ZSgiVVBEQVRFIGRlY2tzIFNFVCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCgogICAgcmV0dXJuIHsKICAgICAgICAnYWRkZWQnOiBhZGRlZCwKICAgICAgICAnZmFpbGVkJzogbGVuKGZhaWxlZCksCiAgICAgICAgJ2ZhaWxlZE5hbWVzJzogZmFpbGVkLAogICAgICAgICd0b3RhbCc6IGxlbihhbGxfZW50cmllcyksCiAgICAgICAgJ3Jlc3VsdHMnOiByZXN1bHRzLAogICAgfQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrcy9pbXBvcnQtbmV3JykKYXN5bmMgZGVmIGltcG9ydF9kZWNrbGlzdF9uZXcocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiCiAgICBJbXBvcnQgYSBkZWNrbGlzdCBhcyBhIGJyYW5kLW5ldyBkZWNrLiBDcmVhdGVzIHRoZSBkZWNrLCB0aGVuIGltcG9ydHMgY2FyZHMuCgogICAgQm9keTogeyAidGV4dCI6ICIuLi4iLCAibmFtZSI6ICJNeSBEZWNrIiB9CiAgICAiIiIKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgdGV4dCA9IGJvZHkuZ2V0KCd0ZXh0JywgJycpCiAgICBkZWNrX25hbWUgPSBib2R5LmdldCgnbmFtZScsICcnKS5zdHJpcCgpCgogICAgaWYgbm90IHRleHQuc3RyaXAoKToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnTm8gZGVja2xpc3QgdGV4dCBwcm92aWRlZCd9LCBzdGF0dXNfY29kZT00MDApCgogICAgcGFyc2VkID0gX3BhcnNlX2RlY2tsaXN0X3RleHQodGV4dCkKICAgIGFsbF9lbnRyaWVzID0gW10KICAgIGZvciBjIGluIHBhcnNlZFsnY29tbWFuZGVycyddOgogICAgICAgIGFsbF9lbnRyaWVzLmFwcGVuZCh7KipjLCAnaXNfY29tbWFuZGVyJzogVHJ1ZX0pCiAgICBmb3IgYyBpbiBwYXJzZWRbJ2NhcmRzJ106CiAgICAgICAgYWxsX2VudHJpZXMuYXBwZW5kKHsqKmMsICdpc19jb21tYW5kZXInOiBGYWxzZX0pCgogICAgaWYgbm90IGFsbF9lbnRyaWVzOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdObyBjYXJkcyBmb3VuZCBpbiBkZWNrbGlzdCd9LCBzdGF0dXNfY29kZT00MDApCgogICAgIyBBdXRvLW5hbWUgZnJvbSBmaXJzdCBjb21tYW5kZXIgaWYgbm8gbmFtZSBnaXZlbgogICAgaWYgbm90IGRlY2tfbmFtZToKICAgICAgICBjbWQgPSBwYXJzZWRbJ2NvbW1hbmRlcnMnXVswXVsnbmFtZSddIGlmIHBhcnNlZFsnY29tbWFuZGVycyddIGVsc2UgTm9uZQogICAgICAgIGRlY2tfbmFtZSA9IGNtZCBvciAnSW1wb3J0ZWQgRGVjaycKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGN1ciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiSU5TRVJUIElOVE8gZGVja3MgKG5hbWUsIGNyZWF0ZWRfYXQsIHVwZGF0ZWRfYXQpIFZBTFVFUyAoPywgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpIiwKICAgICAgICAoZGVja19uYW1lLCkKICAgICkKICAgIGNvbm4uY29tbWl0KCkKICAgIG5ld19kZWNrX2lkID0gY3VyLmxhc3Ryb3dpZAoKICAgICMgU2V0IGNvbW1hbmRlciBvbiB0aGUgZGVjayBpZiB3ZSBoYXZlIG9uZQogICAgZmlyc3RfY21kX3NjcnlmYWxsID0gTm9uZQogICAgZmlyc3RfY21kX25hbWUgPSBOb25lCgogICAgYWRkZWQgPSAwCiAgICBmYWlsZWQgPSBbXQoKICAgIGZvciBlbnRyeSBpbiBhbGxfZW50cmllczoKICAgICAgICBuYW1lID0gZW50cnlbJ25hbWUnXQogICAgICAgIHF0eSA9IGVudHJ5WydxdHknXQogICAgICAgIGlzX2NtZCA9IGVudHJ5Wydpc19jb21tYW5kZXInXQoKICAgICAgICBzZiA9IF9zY3J5ZmFsbF9mdXp6eV9sb29rdXAobmFtZSkKICAgICAgICBpZiBub3Qgc2Y6CiAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQobmFtZSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgc2NyeWZhbGxfaWQgPSBzZi5nZXQoJ2lkJywgJycpCiAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IHNmLmdldCgnbmFtZScsIG5hbWUpCgogICAgICAgIGlmIGlzX2NtZCBhbmQgbm90IGZpcnN0X2NtZF9zY3J5ZmFsbDoKICAgICAgICAgICAgZmlyc3RfY21kX3NjcnlmYWxsID0gc2NyeWZhbGxfaWQKICAgICAgICAgICAgZmlyc3RfY21kX25hbWUgPSByZXNvbHZlZF9uYW1lCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgJ0lOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5LCBpc19jb21tYW5kZXIpIFZBTFVFUyAoPywgPywgPywgPywgPyknLAogICAgICAgICAgICAobmV3X2RlY2tfaWQsIHNjcnlmYWxsX2lkLCByZXNvbHZlZF9uYW1lLCBxdHksIDEgaWYgaXNfY21kIGVsc2UgMCkKICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGFkZGVkICs9IDEKCiAgICAjIFVwZGF0ZSBjb21tYW5kZXIgb24gZGVjayByZWNvcmQKICAgIGlmIGZpcnN0X2NtZF9zY3J5ZmFsbDoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICdVUERBVEUgZGVja3MgU0VUIGNvbW1hbmRlcl9uYW1lID0gPywgY29tbWFuZGVyX3NjcnlmYWxsX2lkID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICAoZmlyc3RfY21kX25hbWUsIGZpcnN0X2NtZF9zY3J5ZmFsbCwgbmV3X2RlY2tfaWQpCiAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICByZXR1cm4gewogICAgICAgICdkZWNrSWQnOiBuZXdfZGVja19pZCwKICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgJ2FkZGVkJzogYWRkZWQsCiAgICAgICAgJ2ZhaWxlZCc6IGxlbihmYWlsZWQpLAogICAgICAgICdmYWlsZWROYW1lcyc6IGZhaWxlZCwKICAgICAgICAndG90YWwnOiBsZW4oYWxsX2VudHJpZXMpLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ2FyZCBTY2FubmVyIEVuZHBvaW50CiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgX3NjcnlmYWxsX2Z1enp5X2xvb2t1cChuYW1lOiBzdHIpIC0+IE9wdGlvbmFsW2RpY3RdOgogICAgIiIiCiAgICBGdXp6eS1zZWFyY2ggU2NyeWZhbGwgZm9yIGEgY2FyZCBuYW1lICh1c2VkIGJ5IHRoZSBzY2FubmVyIHBpcGVsaW5lKS4KICAgIFJldHVybnMgdGhlIHJhdyBTY3J5ZmFsbCBKU09OIGRpY3QsIG9yIE5vbmUgb24gZmFpbHVyZS4KICAgICIiIgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHF1b3RlCiAgICBfc2NyeWZhbGxfcmF0ZV9saW1pdCgpCiAgICB0cnk6CiAgICAgICAgZW5jb2RlZCA9IHF1b3RlKG5hbWUpCiAgICAgICAgdXJsID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZnV6enk9e2VuY29kZWR9IgogICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPV9BUElfSEVBREVSUykKICAgICAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PTEwKSBhcyByZXNwOgogICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgICAgaWYgZGF0YS5nZXQoIm9iamVjdCIpID09ICJlcnJvciI6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGRhdGEKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuIE5vbmUKCgpAYXBwLnBvc3QoIi9hcGkvY29sbGVjdGlvbi9zY2FuIikKYXN5bmMgZGVmIHNjYW5fY2FyZF9pbWFnZShyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiIKICAgIFNjYW4gYSBjYXJkIGltYWdlIGFuZCByZXR1cm4gcmVjb2duaXplZCBjYXJkIG5hbWUocykuCgogICAgVXNlcyBYaW1pbGFyIFZpc3VhbCBBSSBmb3IgY2FyZCByZWNvZ25pdGlvbi4KCiAgICBBY2NlcHRzIG11bHRpcGFydC9mb3JtLWRhdGEgd2l0aDoKICAgICAgLSBmaWxlOiBpbWFnZSBmaWxlIChKUEVHL1BORykKICAgICAgLSBtb2RlOiAic2luZ2xlIiAoZGVmYXVsdCkgb3IgIm11bHRpIgoKICAgIFJldHVybnM6CiAgICAgIHsgInJlc3VsdHMiOiBbIHsgcmF3X29jciwgbWF0Y2hlZF9uYW1lLCBzZXRfY29kZSwgc2NyeWZhbGxfaWQsIGNvbmZpZGVuY2UsIGltYWdlX3VyaSwgZXJyb3IsIGNvbGxlY3Rvcl9udW1iZXIsIHJhcml0eSwgdGNncGxheWVyX3VybCB9LCAuLi4gXSB9CiAgICAiIiIKICAgIHRyeToKICAgICAgICBmcm9tIHNjYW5uZXIucGlwZWxpbmUgaW1wb3J0IHNjYW5fc2luZ2xlLCBzY2FuX211bHRpCiAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJTY2FubmVyIG1vZHVsZSBub3QgYXZhaWxhYmxlOiB7ZX0iKQoKICAgICMgVHJ5IENGRyBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgdG8gZW52IHZhcgogICAgYXBpX2tleSA9IENGRy54aW1pbGFyX2FwaV9rZXkgb3Igb3MuZW52aXJvbi5nZXQoIlhJTUlMQVJfQVBJX0tFWSIsICIiKQogICAgaWYgbm90IGFwaV9rZXk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDYXJkIHNjYW5uZXIgbm90IGNvbmZpZ3VyZWQuIFN0YXJ0IHRoZSBzZXJ2ZXIgd2l0aCAtLXhpbWlsYXIta2V5IFlPVVJfS0VZIG9yIHNldCBYSU1JTEFSX0FQSV9LRVkgZW52IHZhci4iKQoKICAgICMgUGFyc2UgbXVsdGlwYXJ0IGZvcm0KICAgIGZvcm0gPSBhd2FpdCByZXF1ZXN0LmZvcm0oKQogICAgdXBsb2FkID0gZm9ybS5nZXQoImZpbGUiKQogICAgaWYgdXBsb2FkIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJObyBmaWxlIHVwbG9hZGVkLiBTZW5kIGFuIGltYWdlIGFzICdmaWxlJyBpbiBtdWx0aXBhcnQvZm9ybS1kYXRhLiIpCgogICAgbW9kZSA9IHN0cihmb3JtLmdldCgibW9kZSIsICJzaW5nbGUiKSkubG93ZXIoKQogICAgaW1hZ2VfYnl0ZXMgPSBhd2FpdCB1cGxvYWQucmVhZCgpCgogICAgaWYgbGVuKGltYWdlX2J5dGVzKSA9PSAwOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiVXBsb2FkZWQgZmlsZSBpcyBlbXB0eSIpCgogICAgIyBMaW1pdCBmaWxlIHNpemUgKDIwIE1CKQogICAgaWYgbGVuKGltYWdlX2J5dGVzKSA+IDIwICogMTAyNCAqIDEwMjQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJJbWFnZSBmaWxlIHRvbyBsYXJnZSAobWF4IDIwIE1CKSIpCgogICAgbG9nX3NjYW4uaW5mbyhmIiAgUHJvY2Vzc2luZyB7bGVuKGltYWdlX2J5dGVzKX0gYnl0ZXMsIG1vZGU9e21vZGV9IChYaW1pbGFyIEFJKSIpCgogICAgaWYgbW9kZSA9PSAibXVsdGkiOgogICAgICAgIHJlc3VsdHMgPSBzY2FuX211bHRpKGltYWdlX2J5dGVzLCBfc2NyeWZhbGxfZnV6enlfbG9va3VwLCB4aW1pbGFyX2FwaV9rZXk9YXBpX2tleSkKICAgIGVsc2U6CiAgICAgICAgcmVzdWx0ID0gc2Nhbl9zaW5nbGUoaW1hZ2VfYnl0ZXMsIF9zY3J5ZmFsbF9mdXp6eV9sb29rdXAsIHhpbWlsYXJfYXBpX2tleT1hcGlfa2V5KQogICAgICAgIHJlc3VsdHMgPSBbcmVzdWx0XQoKICAgIHJldHVybiB7CiAgICAgICAgInJlc3VsdHMiOiBbci50b19kaWN0KCkgZm9yIHIgaW4gcmVzdWx0c10KICAgIH0KCgpAYXBwLnBvc3QoIi9hcGkvY29sbGVjdGlvbi9zY2FuL2FkZCIpCmFzeW5jIGRlZiBzY2FuX2FkZF9jYXJkcyhib2R5OiBkaWN0KToKICAgICIiIgogICAgQWRkIHNjYW5uZWQgY2FyZHMgdG8gdGhlIGNvbGxlY3Rpb24uCgogICAgQm9keToKICAgICAgewogICAgICAgICJjYXJkcyI6IFsKICAgICAgICAgIHsgIm5hbWUiOiAiTGlnaHRuaW5nIEJvbHQiLCAic2V0X2NvZGUiOiAibTExIiwgInF1YW50aXR5IjogMSB9LAogICAgICAgICAgLi4uCiAgICAgICAgXQogICAgICB9CiAgICAiIiIKICAgIGNhcmRzID0gYm9keS5nZXQoImNhcmRzIiwgW10pCiAgICBpZiBub3QgY2FyZHM6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJObyBjYXJkcyBwcm92aWRlZCIpCgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBpbXBvcnRlZCA9IDAKICAgIHVwZGF0ZWQgPSAwCiAgICBlcnJvcnMgPSBbXQoKICAgIGZvciBjYXJkX3JlcSBpbiBjYXJkczoKICAgICAgICBuYW1lID0gc3RyKGNhcmRfcmVxLmdldCgibmFtZSIsICIiKSkuc3RyaXAoKQogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBxdWFudGl0eSA9IGludChjYXJkX3JlcS5nZXQoInF1YW50aXR5IiwgMSkpCiAgICAgICAgc2V0X2NvZGUgPSBzdHIoY2FyZF9yZXEuZ2V0KCJzZXRfY29kZSIsICIiKSkubG93ZXIoKQogICAgICAgIGNvbGxlY3Rvcl9udW1iZXIgPSBzdHIoY2FyZF9yZXEuZ2V0KCJjb2xsZWN0b3JfbnVtYmVyIiwgIiIpKQogICAgICAgIGZpbmlzaCA9ICJOT1JNQUwiCgogICAgICAgIHRyeToKICAgICAgICAgICAgZW5yaWNoZWQgPSBfZW5yaWNoX2Zyb21fc2NyeWZhbGwobmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBlcnJvcnMuYXBwZW5kKGYiU2NyeWZhbGwgZXJyb3IgZm9yICd7bmFtZX0nOiB7ZX0iKQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBub3QgZW5yaWNoZWQgb3IgIl9lcnJvciIgaW4gZW5yaWNoZWQ6CiAgICAgICAgICAgIGVycl9tc2cgPSBlbnJpY2hlZC5nZXQoIl9lcnJvciIsIGYiTm90IGZvdW5kOiAne25hbWV9JyIpIGlmIGVucmljaGVkIGVsc2UgZiJOb3QgZm91bmQ6ICd7bmFtZX0nIgogICAgICAgICAgICBlcnJvcnMuYXBwZW5kKGVycl9tc2cpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHJlc29sdmVkX25hbWUgPSBlbnJpY2hlZC5nZXQoIm5hbWUiLCBuYW1lKQoKICAgICAgICAjIENoZWNrIGZvciBleGlzdGluZyBlbnRyeQogICAgICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiJTRUxFQ1QgaWQsIHF1YW50aXR5IEZST00gY29sbGVjdGlvbl9lbnRyaWVzCiAgICAgICAgICAgICAgIFdIRVJFIG5hbWUgPSA/IEFORCBzZXRfY29kZSA9ID8gQU5EIGNvbGxlY3Rvcl9udW1iZXIgPSA/IEFORCBmaW5pc2ggPSA/IiIiLAogICAgICAgICAgICAocmVzb2x2ZWRfbmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIsIGZpbmlzaCksCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIGlmIGV4aXN0aW5nOgogICAgICAgICAgICBuZXdfcXR5ID0gZXhpc3RpbmdbInF1YW50aXR5Il0gKyBxdWFudGl0eQogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiVVBEQVRFIGNvbGxlY3Rpb25fZW50cmllcyBTRVQgcXVhbnRpdHkgPSA/LCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICAobmV3X3F0eSwgZXhpc3RpbmdbImlkIl0pLAogICAgICAgICAgICApCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICAgICAgdXBkYXRlZCArPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIiIiSU5TRVJUIElOVE8gY29sbGVjdGlvbl9lbnRyaWVzCiAgICAgICAgICAgICAgICAgICAobmFtZSwgdHlwZV9saW5lLCBzdWJ0eXBlcywgaXNfbGVnZW5kYXJ5LCBpc19iYXNpYywgY29sb3JfaWRlbnRpdHksCiAgICAgICAgICAgICAgICAgICAgY21jLCBtYW5hX2Nvc3QsIG9yYWNsZV90ZXh0LCBrZXl3b3JkcywKICAgICAgICAgICAgICAgICAgICBwb3dlciwgdG91Z2huZXNzLCByYXJpdHksIHNldF9uYW1lLCBlZGhyZWNfcmFuaywKICAgICAgICAgICAgICAgICAgICB0Y2dfcHJpY2UsIHNhbHRfc2NvcmUsIGlzX2dhbWVfY2hhbmdlciwKICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSwgc2NyeWZhbGxfaWQsIHRjZ3BsYXllcl9pZCwKICAgICAgICAgICAgICAgICAgICBxdWFudGl0eSwgZmluaXNoLCBjb25kaXRpb24sIGxhbmd1YWdlLCBub3RlcywgdGFncywKICAgICAgICAgICAgICAgICAgICBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcikKICAgICAgICAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPykiIiIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInR5cGVfbGluZSIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInN1YnR5cGVzIiwgIltdIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJpc19sZWdlbmRhcnkiLCAwKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImlzX2Jhc2ljIiwgMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJjb2xvcl9pZGVudGl0eSIsICJbXSIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiY21jIiwgMC4wKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoIm1hbmFfY29zdCIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoIm9yYWNsZV90ZXh0IiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgia2V5d29yZHMiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInBvd2VyIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgidG91Z2huZXNzIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgicmFyaXR5IiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgic2V0X25hbWUiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJlZGhyZWNfcmFuayIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgidGNnX3ByaWNlIiwgMC4wKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInNhbHRfc2NvcmUiLCAwLjApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiaXNfZ2FtZV9jaGFuZ2VyIiwgMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJjYXRlZ29yeSIsICJbXSIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgic2NyeWZhbGxfaWQiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJ0Y2dwbGF5ZXJfaWQiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHksCiAgICAgICAgICAgICAgICAgICAgZmluaXNoLAogICAgICAgICAgICAgICAgICAgICIiLCAgIyBjb25kaXRpb24KICAgICAgICAgICAgICAgICAgICAiIiwgICMgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgICAiIiwgICMgbm90ZXMKICAgICAgICAgICAgICAgICAgICAiIiwgICMgdGFncwogICAgICAgICAgICAgICAgICAgIHNldF9jb2RlLAogICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rvcl9udW1iZXIsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICAgICAgaW1wb3J0ZWQgKz0gMQoKICAgIHJldHVybiB7CiAgICAgICAgImltcG9ydGVkQ291bnQiOiBpbXBvcnRlZCwKICAgICAgICAidXBkYXRlZENvdW50IjogdXBkYXRlZCwKICAgICAgICAiZmFpbGVkQ291bnQiOiBsZW4oZXJyb3JzKSwKICAgICAgICAiZXJyb3JzIjogZXJyb3JzLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUmUtZW5yaWNoIENvbGxlY3Rpb24gZnJvbSBTY3J5ZmFsbAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGFwcC5wb3N0KCIvYXBpL2NvbGxlY3Rpb24vcmUtZW5yaWNoIikKYXN5bmMgZGVmIHJlX2VucmljaF9jb2xsZWN0aW9uKCk6CiAgICAiIiIKICAgIFJlLWZldGNoIFNjcnlmYWxsIGRhdGEgZm9yIGFsbCBjb2xsZWN0aW9uIGVudHJpZXMgdG8gYmFja2ZpbGwKICAgIG1pc3NpbmcgZmllbGRzIChtYW5hX2Nvc3QsIHBvd2VyLCB0b3VnaG5lc3MsIHJhcml0eSwgc2V0X25hbWUsIGVkaHJlY19yYW5rKS4KICAgIEFsc28gcmVmcmVzaGVzOiB0eXBlX2xpbmUsIG9yYWNsZV90ZXh0LCBrZXl3b3JkcywgY21jLCBjb2xvcl9pZGVudGl0eSwgcHJpY2VzLgogICAgUnVucyBzeW5jaHJvbm91c2x5IOKAlCBtYXkgdGFrZSBhIHdoaWxlIGZvciBsYXJnZSBjb2xsZWN0aW9ucy4KICAgICIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgaWQsIG5hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIE9SREVSIEJZIGlkIgogICAgKS5mZXRjaGFsbCgpCgogICAgdG90YWwgPSBsZW4ocm93cykKICAgIGVucmljaGVkX2NvdW50ID0gMAogICAgc2tpcHBlZF9jb3VudCA9IDAKICAgIGVycm9ycyA9IFtdCgogICAgZm9yIHJvdyBpbiByb3dzOgogICAgICAgIGNhcmRfaWQgPSByb3dbImlkIl0KICAgICAgICBuYW1lID0gcm93WyJuYW1lIl0KICAgICAgICBzZXRfY29kZSA9IHJvd1sic2V0X2NvZGUiXSBvciAiIgogICAgICAgIGNvbGxlY3Rvcl9udW1iZXIgPSByb3dbImNvbGxlY3Rvcl9udW1iZXIiXSBvciAiIgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRhdGEgPSBfZW5yaWNoX2Zyb21fc2NyeWZhbGwobmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBlcnJvcnMuYXBwZW5kKGYiRXJyb3IgZm9yICd7bmFtZX0nOiB7ZX0iKQogICAgICAgICAgICBza2lwcGVkX2NvdW50ICs9IDEKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbm90IGRhdGEgb3IgIl9lcnJvciIgaW4gZGF0YToKICAgICAgICAgICAgZXJyX21zZyA9IGRhdGEuZ2V0KCJfZXJyb3IiLCBmIk5vdCBmb3VuZDogJ3tuYW1lfSciKSBpZiBkYXRhIGVsc2UgZiJOb3QgZm91bmQ6ICd7bmFtZX0nIgogICAgICAgICAgICBlcnJvcnMuYXBwZW5kKGVycl9tc2cpCiAgICAgICAgICAgIHNraXBwZWRfY291bnQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIlVQREFURSBjb2xsZWN0aW9uX2VudHJpZXMgU0VUCiAgICAgICAgICAgICAgICB0eXBlX2xpbmUgPSA/LCBzdWJ0eXBlcyA9ID8sIGlzX2xlZ2VuZGFyeSA9ID8sIGlzX2Jhc2ljID0gPywKICAgICAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5ID0gPywgY21jID0gPywgbWFuYV9jb3N0ID0gPywKICAgICAgICAgICAgICAgIG9yYWNsZV90ZXh0ID0gPywga2V5d29yZHMgPSA/LAogICAgICAgICAgICAgICAgcG93ZXIgPSA/LCB0b3VnaG5lc3MgPSA/LAogICAgICAgICAgICAgICAgcmFyaXR5ID0gPywgc2V0X25hbWUgPSA/LCBlZGhyZWNfcmFuayA9ID8sCiAgICAgICAgICAgICAgICB0Y2dfcHJpY2UgPSA/LCBzY3J5ZmFsbF9pZCA9ID8sIHRjZ3BsYXllcl9pZCA9ID8sCiAgICAgICAgICAgICAgICBjYXRlZ29yeSA9ID8sCiAgICAgICAgICAgICAgICB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpCiAgICAgICAgICAgIFdIRVJFIGlkID0gPyIiIiwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInR5cGVfbGluZSIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJzdWJ0eXBlcyIsICJbXSIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoImlzX2xlZ2VuZGFyeSIsIDApLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoImlzX2Jhc2ljIiwgMCksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgiY29sb3JfaWRlbnRpdHkiLCAiW10iKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJjbWMiLCAwLjApLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoIm1hbmFfY29zdCIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJrZXl3b3JkcyIsICJbXSIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInBvd2VyIiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInRvdWdobmVzcyIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJyYXJpdHkiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgic2V0X25hbWUiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgiZWRocmVjX3JhbmsiLCAwKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJ0Y2dfcHJpY2UiLCAwLjApLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInNjcnlmYWxsX2lkIiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInRjZ3BsYXllcl9pZCIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJjYXRlZ29yeSIsICJbXSIpLAogICAgICAgICAgICAgICAgY2FyZF9pZCwKICAgICAgICAgICAgKSwKICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGVucmljaGVkX2NvdW50ICs9IDEKCiAgICByZXR1cm4gewogICAgICAgICJ0b3RhbCI6IHRvdGFsLAogICAgICAgICJlbnJpY2hlZENvdW50IjogZW5yaWNoZWRfY291bnQsCiAgICAgICAgInNraXBwZWRDb3VudCI6IHNraXBwZWRfY291bnQsCiAgICAgICAgImVycm9ycyI6IGVycm9yc1s6NTBdLCAgIyBjYXAgZXJyb3IgbGlzdAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQXV0by1DbGFzc2lmeSBDb2xsZWN0aW9uCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpAYXBwLnBvc3QoIi9hcGkvY29sbGVjdGlvbi9hdXRvLWNsYXNzaWZ5IikKYXN5bmMgZGVmIGF1dG9fY2xhc3NpZnlfY29sbGVjdGlvbigpOgogICAgIiIiCiAgICBSdW4gYXV0by1jbGFzc2lmaWNhdGlvbiBvbiBhbGwgY29sbGVjdGlvbiBlbnRyaWVzLgogICAgVXNlcyBvcmFjbGVfdGV4dCwgdHlwZV9saW5lLCBhbmQga2V5d29yZHMgdG8gZGV0ZWN0IGZ1bmN0aW9uYWwgcm9sZXMKICAgIChSYW1wLCBEcmF3LCBSZW1vdmFsLCBCb2FyZCBXaXBlLCBBbnRoZW0sIFN0YXgsIGV0Yy4pLgogICAgT25seSB1cGRhdGVzIGNhcmRzIHdob3NlIGN1cnJlbnQgY2F0ZWdvcnkgaXMgZW1wdHkgb3IgJ1tdJy4KICAgICIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgaWQsIG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzLCBjYXRlZ29yeSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBPUkRFUiBCWSBpZCIKICAgICkuZmV0Y2hhbGwoKQoKICAgIHRvdGFsID0gbGVuKHJvd3MpCiAgICBjbGFzc2lmaWVkX2NvdW50ID0gMAogICAgc2tpcHBlZF9jb3VudCA9IDAKCiAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgY2FyZF9pZCA9IHJvd1siaWQiXQogICAgICAgIGV4aXN0aW5nX2NhdHMgPSByb3dbImNhdGVnb3J5Il0gb3IgIltdIgoKICAgICAgICAjIFBhcnNlIGV4aXN0aW5nIGNhdGVnb3JpZXMKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhdHMgPSBqc29uLmxvYWRzKGV4aXN0aW5nX2NhdHMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY2F0cyA9IFtdCgogICAgICAgICMgU2tpcCBjYXJkcyB0aGF0IGFscmVhZHkgaGF2ZSBtYW51YWxseS1zZXQgY2F0ZWdvcmllcwogICAgICAgIGlmIGNhdHM6CiAgICAgICAgICAgIHNraXBwZWRfY291bnQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBvcmFjbGVfdGV4dCA9IHJvd1sib3JhY2xlX3RleHQiXSBvciAiIgogICAgICAgIHR5cGVfbGluZSA9IHJvd1sidHlwZV9saW5lIl0gb3IgIiIKICAgICAgICBrZXl3b3JkcyA9IHJvd1sia2V5d29yZHMiXSBvciAiW10iCgogICAgICAgIHJvbGVzID0gX2RldGVjdF9jYXJkX3JvbGVzKG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzKQoKICAgICAgICBpZiByb2xlczoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlVQREFURSBjb2xsZWN0aW9uX2VudHJpZXMgU0VUIGNhdGVnb3J5ID0gPywgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAgICAgKGpzb24uZHVtcHMocm9sZXMpLCBjYXJkX2lkKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBjbGFzc2lmaWVkX2NvdW50ICs9IDEKCiAgICBjb25uLmNvbW1pdCgpCgogICAgcmV0dXJuIHsKICAgICAgICAidG90YWwiOiB0b3RhbCwKICAgICAgICAiY2xhc3NpZmllZENvdW50IjogY2xhc3NpZmllZF9jb3VudCwKICAgICAgICAic2tpcHBlZENvdW50Ijogc2tpcHBlZF9jb3VudCwKICAgICAgICAibWVzc2FnZSI6IGYiQ2xhc3NpZmllZCB7Y2xhc3NpZmllZF9jb3VudH0gY2FyZHMsIHNraXBwZWQge3NraXBwZWRfY291bnR9IChhbHJlYWR5IGhhZCBjYXRlZ29yaWVzKSIsCiAgICB9CgoKQGFwcC5wb3N0KCIvYXBpL2NvbGxlY3Rpb24vYXV0by1jbGFzc2lmeS1hbGwiKQphc3luYyBkZWYgYXV0b19jbGFzc2lmeV9hbGxfY29sbGVjdGlvbigpOgogICAgIiIiCiAgICBGb3JjZSByZS1jbGFzc2lmeSBBTEwgY29sbGVjdGlvbiBlbnRyaWVzLCBvdmVyd3JpdGluZyBleGlzdGluZyBjYXRlZ29yaWVzLgogICAgIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCBpZCwgb3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgT1JERVIgQlkgaWQiCiAgICApLmZldGNoYWxsKCkKCiAgICB0b3RhbCA9IGxlbihyb3dzKQogICAgY2xhc3NpZmllZF9jb3VudCA9IDAKCiAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgY2FyZF9pZCA9IHJvd1siaWQiXQogICAgICAgIG9yYWNsZV90ZXh0ID0gcm93WyJvcmFjbGVfdGV4dCJdIG9yICIiCiAgICAgICAgdHlwZV9saW5lID0gcm93WyJ0eXBlX2xpbmUiXSBvciAiIgogICAgICAgIGtleXdvcmRzID0gcm93WyJrZXl3b3JkcyJdIG9yICJbXSIKCiAgICAgICAgcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMob3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMpCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAiVVBEQVRFIGNvbGxlY3Rpb25fZW50cmllcyBTRVQgY2F0ZWdvcnkgPSA/LCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIChqc29uLmR1bXBzKHJvbGVzKSwgY2FyZF9pZCksCiAgICAgICAgKQogICAgICAgIGNsYXNzaWZpZWRfY291bnQgKz0gMQoKICAgIGNvbm4uY29tbWl0KCkKCiAgICByZXR1cm4gewogICAgICAgICJ0b3RhbCI6IHRvdGFsLAogICAgICAgICJjbGFzc2lmaWVkQ291bnQiOiBjbGFzc2lmaWVkX2NvdW50LAogICAgICAgICJtZXNzYWdlIjogZiJSZS1jbGFzc2lmaWVkIGFsbCB7Y2xhc3NpZmllZF9jb3VudH0gY2FyZHMiLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRURIUkVDIFJlY29tbWVuZGF0aW9ucyBDYWNoZSArIEVuZHBvaW50CiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIFNpbXBsZSBpbi1tZW1vcnkgY2FjaGU6IHtjYWNoZV9rZXk6IHsiZGF0YSI6IC4uLiwgImV4cGlyZXMiOiBmbG9hdH19Cl9lZGhyZWNfY2FjaGU6IGRpY3QgPSB7fQpfRURIUkVDX1RUTCA9IDM2MDAgICMgMSBob3VyCgoKZGVmIF9lZGhyZWNfY2FjaGVfZ2V0KGtleTogc3RyKToKICAgIGVudHJ5ID0gX2VkaHJlY19jYWNoZS5nZXQoa2V5KQogICAgaWYgZW50cnkgYW5kIHRpbWUubW9ub3RvbmljKCkgPCBlbnRyeVsiZXhwaXJlcyJdOgogICAgICAgIHJldHVybiBlbnRyeVsiZGF0YSJdCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfZWRocmVjX2NhY2hlX3NldChrZXk6IHN0ciwgZGF0YSk6CiAgICBfZWRocmVjX2NhY2hlW2tleV0gPSB7ImRhdGEiOiBkYXRhLCAiZXhwaXJlcyI6IHRpbWUubW9ub3RvbmljKCkgKyBfRURIUkVDX1RUTH0KCgpAYXBwLmdldCgiL2FwaS9jb2xsZWN0aW9uL3tjYXJkSWR9L2VkaHJlYyIpCmFzeW5jIGRlZiBnZXRfY2FyZF9lZGhyZWMoY2FyZElkOiBpbnQpOgogICAgIiIiCiAgICBHZXQgRURIUkVDIHJlY29tbWVuZGF0aW9ucyBmb3IgYSBjb2xsZWN0aW9uIGNhcmQuCiAgICBGb3IgbGVnZW5kYXJ5IGNyZWF0dXJlcyAocG90ZW50aWFsIGNvbW1hbmRlcnMpOiBmZXRjaCBjb21tYW5kZXIgc3luZXJneSBkYXRhLgogICAgRm9yIG90aGVyIGNhcmRzOiBmZXRjaCAnYWxzbyBwbGF5ZWQgd2l0aCcgZGF0YS4KICAgICIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIGlkID0gPyIsIChjYXJkSWQsKSkuZmV0Y2hvbmUoKQogICAgaWYgbm90IHJvdzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJDYXJkIHdpdGggaWQge2NhcmRJZH0gbm90IGZvdW5kIikKCiAgICBjYXJkID0gX3Jvd190b19kaWN0KHJvdykKICAgIG5hbWUgPSBjYXJkWyJuYW1lIl0KICAgIHR5cGVfbGluZSA9IGNhcmQuZ2V0KCJ0eXBlX2xpbmUiLCAiIikKICAgIGlzX2xlZ2VuZGFyeSA9IGNhcmQuZ2V0KCJpc19sZWdlbmRhcnkiLCAwKQoKICAgICMgRGV0ZXJtaW5lIGlmIGl0J3MgYSBsZWdlbmRhcnkgY3JlYXR1cmUgKHBvdGVudGlhbCBjb21tYW5kZXIpCiAgICBpc19jb21tYW5kZXIgPSBib29sKAogICAgICAgIGlzX2xlZ2VuZGFyeSBhbmQKICAgICAgICByZS5zZWFyY2gociJcYkNyZWF0dXJlXGIiLCB0eXBlX2xpbmUsIHJlLklHTk9SRUNBU0UpCiAgICApCgogICAgc2x1ZyA9IF90b19lZGhyZWNfc2x1ZyhuYW1lKQogICAgY2FjaGVfa2V5ID0gZiJlZGhyZWM6eydjbWQnIGlmIGlzX2NvbW1hbmRlciBlbHNlICdjYXJkJ306e3NsdWd9IgoKICAgIGNhY2hlZCA9IF9lZGhyZWNfY2FjaGVfZ2V0KGNhY2hlX2tleSkKICAgIGlmIGNhY2hlZDoKICAgICAgICByZXR1cm4gY2FjaGVkCgogICAgcmVjb21tZW5kYXRpb25zID0gW10KICAgIGxpbmtzID0gewogICAgICAgICJlZGhyZWNQYWdlIjogKAogICAgICAgICAgICBmImh0dHBzOi8vZWRocmVjLmNvbS9jb21tYW5kZXJzL3tzbHVnfSIKICAgICAgICAgICAgaWYgaXNfY29tbWFuZGVyCiAgICAgICAgICAgIGVsc2UgZiJodHRwczovL2VkaHJlYy5jb20vY2FyZHMve3NsdWd9IgogICAgICAgICksCiAgICAgICAgImFyY2hpZGVrdFNlYXJjaCI6IGYiaHR0cHM6Ly9hcmNoaWRla3QuY29tL3NlYXJjaC9jYXJkcz9xPXtuYW1lLnJlcGxhY2UoJyAnLCAnKycpfSIsCiAgICAgICAgIm1veGZpZWxkU2VhcmNoIjogZiJodHRwczovL3d3dy5tb3hmaWVsZC5jb20vc2VhcmNoP3E9e25hbWUucmVwbGFjZSgnICcsICcrJyl9IiwKICAgIH0KCiAgICB0cnk6CiAgICAgICAgaWYgaXNfY29tbWFuZGVyOgogICAgICAgICAgICB1cmwgPSBmImh0dHBzOi8vanNvbi5lZGhyZWMuY29tL3BhZ2VzL2NvbW1hbmRlcnMve3NsdWd9Lmpzb24iCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXJsID0gZiJodHRwczovL2pzb24uZWRocmVjLmNvbS9wYWdlcy9jYXJkcy97c2x1Z30uanNvbiIKCiAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwsIGhlYWRlcnM9X0FQSV9IRUFERVJTKQogICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9MTApIGFzIHJlc3A6CiAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKCiAgICAgICAgaWYgaXNfY29tbWFuZGVyOgogICAgICAgICAgICAjIEV4dHJhY3QgdG9wIGNhcmRzIGZyb20gY2FyZGxpc3RzCiAgICAgICAgICAgIGNvbnRhaW5lciA9IGRhdGEuZ2V0KCJjb250YWluZXIiLCB7fSkKICAgICAgICAgICAganNvbl9kaWN0ID0gY29udGFpbmVyLmdldCgianNvbl9kaWN0Iiwge30pCiAgICAgICAgICAgIGZvciBjYXJkbGlzdCBpbiBqc29uX2RpY3QuZ2V0KCJjYXJkbGlzdHMiLCBbXSk6CiAgICAgICAgICAgICAgICB0YWcgPSBjYXJkbGlzdC5nZXQoInRhZyIsICIiKQogICAgICAgICAgICAgICAgZm9yIGN2IGluIGNhcmRsaXN0LmdldCgiY2FyZHZpZXdzIiwgW10pWzoxMF06CiAgICAgICAgICAgICAgICAgICAgcmVjX25hbWUgPSBjdi5nZXQoIm5hbWUiLCAiIikKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVjX25hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgc3luZXJneSA9IGN2LmdldCgic3luZXJneSIsIDAuMCkKICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRhdGlvbnMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiByZWNfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgInN5bmVyZ3kiOiBzeW5lcmd5LAogICAgICAgICAgICAgICAgICAgICAgICAicm9sZSI6IHRhZyBvciAiUmVjb21tZW5kZWQiLAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBFeHRyYWN0ICJhbHNvIHBsYXllZCB3aXRoIiBjYXJkcwogICAgICAgICAgICBjb250YWluZXIgPSBkYXRhLmdldCgiY29udGFpbmVyIiwge30pCiAgICAgICAgICAgIGpzb25fZGljdCA9IGNvbnRhaW5lci5nZXQoImpzb25fZGljdCIsIHt9KQogICAgICAgICAgICBmb3IgY2FyZGxpc3QgaW4ganNvbl9kaWN0LmdldCgiY2FyZGxpc3RzIiwgW10pOgogICAgICAgICAgICAgICAgdGFnID0gY2FyZGxpc3QuZ2V0KCJ0YWciLCAiIikKICAgICAgICAgICAgICAgIGZvciBjdiBpbiBjYXJkbGlzdC5nZXQoImNhcmR2aWV3cyIsIFtdKVs6MTBdOgogICAgICAgICAgICAgICAgICAgIHJlY19uYW1lID0gY3YuZ2V0KCJuYW1lIiwgIiIpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlY19uYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIHN5bmVyZ3kgPSBjdi5nZXQoInN5bmVyZ3kiLCAwLjApCiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb25zLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogcmVjX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJzeW5lcmd5Ijogc3luZXJneSwKICAgICAgICAgICAgICAgICAgICAgICAgInJvbGUiOiB0YWcgb3IgIkFsc28gUGxheWVkIFdpdGgiLAogICAgICAgICAgICAgICAgICAgIH0pCgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ19kZWNrZ2VuLmVycm9yKGYiICBFcnJvciBmZXRjaGluZyBkYXRhIGZvciAne25hbWV9Jzoge2V9IikKICAgICAgICAjIEdyYWNlZnVsIGRlZ3JhZGF0aW9uIOKAlCByZXR1cm4gZW1wdHkgcmVzdWx0cwoKICAgIHJlc3VsdCA9IHsKICAgICAgICAicmVjb21tZW5kYXRpb25zIjogcmVjb21tZW5kYXRpb25zWzozMF0sCiAgICAgICAgImxpbmtzIjogbGlua3MsCiAgICB9CiAgICBfZWRocmVjX2NhY2hlX3NldChjYWNoZV9rZXksIHJlc3VsdCkKICAgIHJldHVybiByZXN1bHQKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENvbW1hbmRlciBNZXRhIE1hcHBpbmcgKGxvYWRlZCBhdCBzdGFydHVwKQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQlVJTFRJTl9DT01NQU5ERVJTID0gewogICAgIkVkZ2FyIE1hcmtvdiI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImFnZ3JvIiwgImNvbG9ySWRlbnRpdHkiOiBbIlciLCJCIiwiUiJdfV0sCiAgICAiQXRyYXhhLCBQcmFldG9ycycgVm9pY2UiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJtaWRyYW5nZSIsICJjb2xvcklkZW50aXR5IjogWyJXIiwiVSIsIkIiLCJHIl19XSwKICAgICJLb3J2b2xkLCBGYWUtQ3Vyc2VkIEtpbmciOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJjb21ibyIsICJjb2xvcklkZW50aXR5IjogWyJCIiwiUiIsIkciXX1dLAogICAgIk11bGRyb3RoYSwgdGhlIEdyYXZldGlkZSI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogIm1pZHJhbmdlIiwgImNvbG9ySWRlbnRpdHkiOiBbIlUiLCJCIiwiRyJdfV0sCiAgICAiVGhlIFVyLURyYWdvbiI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogIm1pZHJhbmdlIiwgImNvbG9ySWRlbnRpdHkiOiBbIlciLCJVIiwiQiIsIlIiLCJHIl19XSwKICAgICJZdXJpa28sIHRoZSBUaWdlcidzIFNoYWRvdyI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImFnZ3JvIiwgImNvbG9ySWRlbnRpdHkiOiBbIlUiLCJCIl19XSwKICAgICJLcmVua28sIE1vYiBCb3NzIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiYWdncm8iLCAiY29sb3JJZGVudGl0eSI6IFsiUiJdfV0sCiAgICAiTWVyZW4gb2YgQ2xhbiBOZWwgVG90aCI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogIm1pZHJhbmdlIiwgImNvbG9ySWRlbnRpdHkiOiBbIkIiLCJHIl19XSwKICAgICJQcm9zc2gsIFNreXJhaWRlciBvZiBLaGVyIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiY29tYm8iLCAiY29sb3JJZGVudGl0eSI6IFsiQiIsIlIiLCJHIl19XSwKICAgICJLYWFsaWEgb2YgdGhlIFZhc3QiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJhZ2dybyIsICJjb2xvcklkZW50aXR5IjogWyJXIiwiQiIsIlIiXX1dLAogICAgIlRhbHJhbmQsIFNreSBTdW1tb25lciI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImNvbnRyb2wiLCAiY29sb3JJZGVudGl0eSI6IFsiVSJdfV0sCiAgICAiT21uYXRoLCBMb2N1cyBvZiBDcmVhdGlvbiI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImNvbWJvIiwgImNvbG9ySWRlbnRpdHkiOiBbIlciLCJVIiwiUiIsIkciXX1dLAogICAgIlRleXNhIEthcmxvdiI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImNvbWJvIiwgImNvbG9ySWRlbnRpdHkiOiBbIlciLCJCIl19XSwKICAgICJMYXRocmlsLCBCbGFkZSBvZiB0aGUgRWx2ZXMiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJhZ2dybyIsICJjb2xvcklkZW50aXR5IjogWyJCIiwiRyJdfV0sCiAgICAiQnJleWEsIEV0aGVyaXVtIFNoYXBlciI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImNvbWJvIiwgImNvbG9ySWRlbnRpdHkiOiBbIlciLCJVIiwiQiIsIlIiXX1dLAp9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBQeXRob24gU2ltdWxhdG9yIEFQSQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKaW1wb3J0IHRocmVhZGluZyBhcyBfdGhyZWFkaW5nCmltcG9ydCB1dWlkIGFzIF91dWlkCgojIEluLW1lbW9yeSBzdG9yZSBmb3Igc2ltdWxhdGlvbiBydW5zCl9zaW1fcnVucyA9IHt9ICAjIHNpbV9pZCAtPiB7IHN0YXR1cywgcmVzdWx0LCBlcnJvciB9Cl9zaW1fbG9jayA9IF90aHJlYWRpbmcuTG9jaygpCgoKZGVmIF9ydW5fc2ltX3RocmVhZF92MihzaW1faWQ6IHN0ciwgY2FyZF9kYXRhOiBsaXN0W2RpY3RdLCBudW1fZ2FtZXM6IGludCwgZGVja19uYW1lOiBzdHIsIHJlY29yZF9sb2dzOiBib29sKToKICAgICIiIkJhY2tncm91bmQgdGhyZWFkIGZvciBzaW11bGF0aW9ucyB3aXRoIGZ1bGwgY2FyZCBkYXRhIGZyb20gdGhlIERCLiIiIgogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMsIG9zCiAgICAgICAgc3JjX2RpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksICdzcmMnKQogICAgICAgIGlmIHNyY19kaXIgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc3JjX2RpcikKCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5tb2RlbHMgaW1wb3J0IENhcmQKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLmVuZ2luZSBpbXBvcnQgR2FtZUVuZ2luZQogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0ucnVsZXMgaW1wb3J0IGVucmljaF9jYXJkCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLmxhYi5leHBlcmltZW50cyBpbXBvcnQgX2dlbmVyYXRlX3RyYWluaW5nX2RlY2sKCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdydW5uaW5nJwoKICAgICAgICAjIEJ1aWxkIGRlY2sgd2l0aCByZWFsIGNhcmQgZGF0YSBmcm9tIERCCiAgICAgICAgZGVja19hID0gW10KICAgICAgICBmb3IgY2QgaW4gY2FyZF9kYXRhOgogICAgICAgICAgICBjID0gQ2FyZChuYW1lPWNkWyduYW1lJ10pCiAgICAgICAgICAgIGlmIGNkLmdldCgndHlwZV9saW5lJyk6CiAgICAgICAgICAgICAgICBjLnR5cGVfbGluZSA9IGNkWyd0eXBlX2xpbmUnXQogICAgICAgICAgICBpZiBjZC5nZXQoJ2NtYycpOgogICAgICAgICAgICAgICAgYy5jbWMgPSBmbG9hdChjZFsnY21jJ10pCiAgICAgICAgICAgIGlmIGNkLmdldCgncG93ZXInKSBhbmQgY2QuZ2V0KCd0b3VnaG5lc3MnKToKICAgICAgICAgICAgICAgIGMucG93ZXIgPSBzdHIoY2RbJ3Bvd2VyJ10pCiAgICAgICAgICAgICAgICBjLnRvdWdobmVzcyA9IHN0cihjZFsndG91Z2huZXNzJ10pCiAgICAgICAgICAgICAgICBjLnB0ID0gYy5wb3dlciArICcvJyArIGMudG91Z2huZXNzCiAgICAgICAgICAgIGlmIGNkLmdldCgnb3JhY2xlX3RleHQnKToKICAgICAgICAgICAgICAgIGMub3JhY2xlX3RleHQgPSBjZFsnb3JhY2xlX3RleHQnXQogICAgICAgICAgICBpZiBjZC5nZXQoJ21hbmFfY29zdCcpOgogICAgICAgICAgICAgICAgYy5tYW5hX2Nvc3QgPSBjZFsnbWFuYV9jb3N0J10KICAgICAgICAgICAgaWYgY2QuZ2V0KCdrZXl3b3JkcycpOgogICAgICAgICAgICAgICAga3cgPSBjZFsna2V5d29yZHMnXQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrdywgc3RyKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqc29uIGFzIF9qc29uCiAgICAgICAgICAgICAgICAgICAgICAgIGt3ID0gX2pzb24ubG9hZHMoa3cpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAga3cgPSBbXQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrdywgbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgYy5rZXl3b3JkcyA9IGt3CiAgICAgICAgICAgICMgRW5yaWNoIGZpbGxzIGluIGZsYWdzIGxpa2UgaXNfcmVtb3ZhbCwgaXNfcmFtcCwgaXNfYm9hcmRfd2lwZQogICAgICAgICAgICBlbnJpY2hfY2FyZChjKQogICAgICAgICAgICBkZWNrX2EuYXBwZW5kKGMpCgogICAgICAgIGRlY2tfYiA9IF9nZW5lcmF0ZV90cmFpbmluZ19kZWNrKCkKCiAgICAgICAgZW5naW5lID0gR2FtZUVuZ2luZShtYXhfdHVybnM9MjUsIHJlY29yZF9sb2c9cmVjb3JkX2xvZ3MpCiAgICAgICAgaW1wb3J0IHRpbWUKICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCgogICAgICAgIHdpbnMgPSAwCiAgICAgICAgbG9zc2VzID0gMAogICAgICAgIHRvdGFsX3R1cm5zID0gMAogICAgICAgIHRvdGFsX2RhbWFnZV9kZWFsdCA9IDAKICAgICAgICB0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgPSAwCiAgICAgICAgdG90YWxfc3BlbGxzX2Nhc3QgPSAwCiAgICAgICAgdG90YWxfY3JlYXR1cmVzX3BsYXllZCA9IDAKICAgICAgICB0b3RhbF9yZW1vdmFsX3VzZWQgPSAwCiAgICAgICAgdG90YWxfcmFtcF9wbGF5ZWQgPSAwCiAgICAgICAgdG90YWxfY2FyZHNfZHJhd24gPSAwCiAgICAgICAgdG90YWxfbWF4X2JvYXJkID0gMAogICAgICAgIGdhbWVfcmVzdWx0cyA9IFtdCgogICAgICAgIGZvciBpIGluIHJhbmdlKG51bV9nYW1lcyk6CiAgICAgICAgICAgIHJlc3VsdCA9IGVuZ2luZS5ydW4oZGVja19hLCBkZWNrX2IsIG5hbWVfYT1kZWNrX25hbWUsIG5hbWVfYj0iVHJhaW5pbmcgRGVjayIpCgogICAgICAgICAgICBnYW1lX2RhdGEgPSByZXN1bHQudG9fZGljdCgpCiAgICAgICAgICAgIGdhbWVfZGF0YVsnZ2FtZU51bWJlciddID0gaSArIDEKICAgICAgICAgICAgZ2FtZV9yZXN1bHRzLmFwcGVuZChnYW1lX2RhdGEpCgogICAgICAgICAgICBpZiByZXN1bHQud2lubmVyID09IDA6CiAgICAgICAgICAgICAgICB3aW5zICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvc3NlcyArPSAxCgogICAgICAgICAgICB0b3RhbF90dXJucyArPSByZXN1bHQudHVybnMKICAgICAgICAgICAgaWYgcmVzdWx0LnBsYXllcl9hX3N0YXRzOgogICAgICAgICAgICAgICAgdG90YWxfZGFtYWdlX2RlYWx0ICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5kYW1hZ2VfZGVhbHQKICAgICAgICAgICAgICAgIHRvdGFsX2RhbWFnZV9yZWNlaXZlZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuZGFtYWdlX3JlY2VpdmVkCiAgICAgICAgICAgICAgICB0b3RhbF9zcGVsbHNfY2FzdCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuc3BlbGxzX2Nhc3QKICAgICAgICAgICAgICAgIHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmNyZWF0dXJlc19wbGF5ZWQKICAgICAgICAgICAgICAgIHRvdGFsX3JlbW92YWxfdXNlZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMucmVtb3ZhbF91c2VkCiAgICAgICAgICAgICAgICB0b3RhbF9yYW1wX3BsYXllZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMucmFtcF9wbGF5ZWQKICAgICAgICAgICAgICAgIHRvdGFsX2NhcmRzX2RyYXduICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5jYXJkc19kcmF3bgogICAgICAgICAgICAgICAgdG90YWxfbWF4X2JvYXJkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5tYXhfYm9hcmRfc2l6ZQoKICAgICAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnY29tcGxldGVkJ10gPSBpICsgMQoKICAgICAgICBlbGFwc2VkID0gdGltZS50aW1lKCkgLSBzdGFydAogICAgICAgIG4gPSBudW1fZ2FtZXMKCiAgICAgICAgc3VtbWFyeSA9IHsKICAgICAgICAgICAgJ2RlY2tOYW1lJzogZGVja19uYW1lLAogICAgICAgICAgICAnb3Bwb25lbnROYW1lJzogJ1RyYWluaW5nIERlY2snLAogICAgICAgICAgICAndG90YWxHYW1lcyc6IG4sCiAgICAgICAgICAgICd3aW5zJzogd2lucywKICAgICAgICAgICAgJ2xvc3Nlcyc6IGxvc3NlcywKICAgICAgICAgICAgJ3dpblJhdGUnOiByb3VuZCh3aW5zIC8gbiAqIDEwMCwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdUdXJucyc6IHJvdW5kKHRvdGFsX3R1cm5zIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdEYW1hZ2VEZWFsdCc6IHJvdW5kKHRvdGFsX2RhbWFnZV9kZWFsdCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnRGFtYWdlUmVjZWl2ZWQnOiByb3VuZCh0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1NwZWxsc0Nhc3QnOiByb3VuZCh0b3RhbF9zcGVsbHNfY2FzdCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnQ3JlYXR1cmVzUGxheWVkJzogcm91bmQodG90YWxfY3JlYXR1cmVzX3BsYXllZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnUmVtb3ZhbFVzZWQnOiByb3VuZCh0b3RhbF9yZW1vdmFsX3VzZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1JhbXBQbGF5ZWQnOiByb3VuZCh0b3RhbF9yYW1wX3BsYXllZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnQ2FyZHNEcmF3bic6IHJvdW5kKHRvdGFsX2NhcmRzX2RyYXduIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdNYXhCb2FyZFNpemUnOiByb3VuZCh0b3RhbF9tYXhfYm9hcmQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2VsYXBzZWRTZWNvbmRzJzogcm91bmQoZWxhcHNlZCwgMyksCiAgICAgICAgfQoKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ2NvbXBsZXRlJwogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsncmVzdWx0J10gPSB7CiAgICAgICAgICAgICAgICAnc3VtbWFyeSc6IHN1bW1hcnksCiAgICAgICAgICAgICAgICAnZ2FtZXMnOiBnYW1lX3Jlc3VsdHMsCiAgICAgICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdlcnJvcicKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ2Vycm9yJ10gPSBzdHIoZSkKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpkZWYgX3J1bl9zaW1fdGhyZWFkKHNpbV9pZDogc3RyLCBkZWNrbGlzdDogbGlzdCwgbnVtX2dhbWVzOiBpbnQsIGRlY2tfbmFtZTogc3RyLCByZWNvcmRfbG9nczogYm9vbCk6CiAgICAiIiJCYWNrZ3JvdW5kIHRocmVhZCBmb3IgcnVubmluZyBNb250ZSBDYXJsbyBzaW11bGF0aW9ucy4iIiIKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzLCBvcwogICAgICAgICMgQWRkIHNyYy8gdG8gcGF0aCBpZiBuZWVkZWQgZm9yIHRoZSBzaW11bGF0b3IgcGFja2FnZQogICAgICAgIHNyY19kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCAnc3JjJykKICAgICAgICBpZiBzcmNfZGlyIG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNyY19kaXIpCgogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0ubW9kZWxzIGltcG9ydCBDYXJkCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5lbmdpbmUgaW1wb3J0IEdhbWVFbmdpbmUKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLnJ1bGVzIGltcG9ydCBlbnJpY2hfY2FyZCwgcGFyc2VfZGVja2xpc3QKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIubGFiLmV4cGVyaW1lbnRzIGltcG9ydCBidWlsZF9kZWNrLCBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjawoKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ3J1bm5pbmcnCgogICAgICAgIGRlY2tfYSA9IGJ1aWxkX2RlY2soZGVja2xpc3QpCiAgICAgICAgZGVja19iID0gX2dlbmVyYXRlX3RyYWluaW5nX2RlY2soKQoKICAgICAgICBlbmdpbmUgPSBHYW1lRW5naW5lKG1heF90dXJucz0yNSwgcmVjb3JkX2xvZz1yZWNvcmRfbG9ncykKICAgICAgICBpbXBvcnQgdGltZQogICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKCiAgICAgICAgd2lucyA9IDAKICAgICAgICBsb3NzZXMgPSAwCiAgICAgICAgdG90YWxfdHVybnMgPSAwCiAgICAgICAgdG90YWxfZGFtYWdlX2RlYWx0ID0gMAogICAgICAgIHRvdGFsX2RhbWFnZV9yZWNlaXZlZCA9IDAKICAgICAgICB0b3RhbF9zcGVsbHNfY2FzdCA9IDAKICAgICAgICB0b3RhbF9jcmVhdHVyZXNfcGxheWVkID0gMAogICAgICAgIHRvdGFsX3JlbW92YWxfdXNlZCA9IDAKICAgICAgICB0b3RhbF9yYW1wX3BsYXllZCA9IDAKICAgICAgICB0b3RhbF9jYXJkc19kcmF3biA9IDAKICAgICAgICB0b3RhbF9tYXhfYm9hcmQgPSAwCiAgICAgICAgZ2FtZV9yZXN1bHRzID0gW10KCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtX2dhbWVzKToKICAgICAgICAgICAgcmVzdWx0ID0gZW5naW5lLnJ1bihkZWNrX2EsIGRlY2tfYiwgbmFtZV9hPWRlY2tfbmFtZSwgbmFtZV9iPSJUcmFpbmluZyBEZWNrIikKCiAgICAgICAgICAgIGdhbWVfZGF0YSA9IHJlc3VsdC50b19kaWN0KCkKICAgICAgICAgICAgZ2FtZV9kYXRhWydnYW1lTnVtYmVyJ10gPSBpICsgMQogICAgICAgICAgICBnYW1lX3Jlc3VsdHMuYXBwZW5kKGdhbWVfZGF0YSkKCiAgICAgICAgICAgIGlmIHJlc3VsdC53aW5uZXIgPT0gMDoKICAgICAgICAgICAgICAgIHdpbnMgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9zc2VzICs9IDEKCiAgICAgICAgICAgIHRvdGFsX3R1cm5zICs9IHJlc3VsdC50dXJucwogICAgICAgICAgICBpZiByZXN1bHQucGxheWVyX2Ffc3RhdHM6CiAgICAgICAgICAgICAgICB0b3RhbF9kYW1hZ2VfZGVhbHQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9kZWFsdAogICAgICAgICAgICAgICAgdG90YWxfZGFtYWdlX3JlY2VpdmVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5kYW1hZ2VfcmVjZWl2ZWQKICAgICAgICAgICAgICAgIHRvdGFsX3NwZWxsc19jYXN0ICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5zcGVsbHNfY2FzdAogICAgICAgICAgICAgICAgdG90YWxfY3JlYXR1cmVzX3BsYXllZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY3JlYXR1cmVzX3BsYXllZAogICAgICAgICAgICAgICAgdG90YWxfcmVtb3ZhbF91c2VkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5yZW1vdmFsX3VzZWQKICAgICAgICAgICAgICAgIHRvdGFsX3JhbXBfcGxheWVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5yYW1wX3BsYXllZAogICAgICAgICAgICAgICAgdG90YWxfY2FyZHNfZHJhd24gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmNhcmRzX2RyYXduCiAgICAgICAgICAgICAgICB0b3RhbF9tYXhfYm9hcmQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLm1heF9ib2FyZF9zaXplCgogICAgICAgICAgICAjIFVwZGF0ZSBwcm9ncmVzcwogICAgICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydjb21wbGV0ZWQnXSA9IGkgKyAxCgogICAgICAgIGVsYXBzZWQgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0CiAgICAgICAgbiA9IG51bV9nYW1lcwoKICAgICAgICBzdW1tYXJ5ID0gewogICAgICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgICAgICdvcHBvbmVudE5hbWUnOiAnVHJhaW5pbmcgRGVjaycsCiAgICAgICAgICAgICd0b3RhbEdhbWVzJzogbiwKICAgICAgICAgICAgJ3dpbnMnOiB3aW5zLAogICAgICAgICAgICAnbG9zc2VzJzogbG9zc2VzLAogICAgICAgICAgICAnd2luUmF0ZSc6IHJvdW5kKHdpbnMgLyBuICogMTAwLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1R1cm5zJzogcm91bmQodG90YWxfdHVybnMgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0RhbWFnZURlYWx0Jzogcm91bmQodG90YWxfZGFtYWdlX2RlYWx0IC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdEYW1hZ2VSZWNlaXZlZCc6IHJvdW5kKHRvdGFsX2RhbWFnZV9yZWNlaXZlZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnU3BlbGxzQ2FzdCc6IHJvdW5kKHRvdGFsX3NwZWxsc19jYXN0IC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdDcmVhdHVyZXNQbGF5ZWQnOiByb3VuZCh0b3RhbF9jcmVhdHVyZXNfcGxheWVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdSZW1vdmFsVXNlZCc6IHJvdW5kKHRvdGFsX3JlbW92YWxfdXNlZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnUmFtcFBsYXllZCc6IHJvdW5kKHRvdGFsX3JhbXBfcGxheWVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdDYXJkc0RyYXduJzogcm91bmQodG90YWxfY2FyZHNfZHJhd24gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z01heEJvYXJkU2l6ZSc6IHJvdW5kKHRvdGFsX21heF9ib2FyZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnZWxhcHNlZFNlY29uZHMnOiByb3VuZChlbGFwc2VkLCAzKSwKICAgICAgICB9CgogICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAnY29tcGxldGUnCiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydyZXN1bHQnXSA9IHsKICAgICAgICAgICAgICAgICdzdW1tYXJ5Jzogc3VtbWFyeSwKICAgICAgICAgICAgICAgICdnYW1lcyc6IGdhbWVfcmVzdWx0cywKICAgICAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ2Vycm9yJwogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnZXJyb3InXSA9IHN0cihlKQogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQoKCkBhcHAucG9zdCgnL2FwaS9zaW0vcnVuJykKYXN5bmMgZGVmIHNpbV9ydW4ocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgYSBNb250ZSBDYXJsbyBzaW11bGF0aW9uIHdpdGggdGhlIFB5dGhvbiBlbmdpbmUuIiIiCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIGRlY2tsaXN0ID0gYm9keS5nZXQoJ2RlY2tsaXN0JywgW10pCiAgICBudW1fZ2FtZXMgPSBib2R5LmdldCgnbnVtR2FtZXMnLCAxMCkKICAgIGRlY2tfbmFtZSA9IGJvZHkuZ2V0KCdkZWNrTmFtZScsICdNeSBEZWNrJykKICAgIHJlY29yZF9sb2dzID0gYm9keS5nZXQoJ3JlY29yZExvZ3MnLCBUcnVlKQoKICAgIGlmIG5vdCBkZWNrbGlzdDoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnZGVja2xpc3QgaXMgcmVxdWlyZWQnfSwgc3RhdHVzX2NvZGU9NDAwKQogICAgaWYgbnVtX2dhbWVzIDwgMSBvciBudW1fZ2FtZXMgPiAxMDAwOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdudW1HYW1lcyBtdXN0IGJlIDEtMTAwMCd9LCBzdGF0dXNfY29kZT00MDApCgogICAgc2ltX2lkID0gc3RyKF91dWlkLnV1aWQ0KCkpWzo4XQogICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF0gPSB7CiAgICAgICAgICAgICdzdGF0dXMnOiAncXVldWVkJywKICAgICAgICAgICAgJ2NvbXBsZXRlZCc6IDAsCiAgICAgICAgICAgICd0b3RhbCc6IG51bV9nYW1lcywKICAgICAgICAgICAgJ2RlY2tOYW1lJzogZGVja19uYW1lLAogICAgICAgICAgICAncmVzdWx0JzogTm9uZSwKICAgICAgICAgICAgJ2Vycm9yJzogTm9uZSwKICAgICAgICB9CgogICAgdCA9IF90aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1fcnVuX3NpbV90aHJlYWQsIGFyZ3M9KHNpbV9pZCwgZGVja2xpc3QsIG51bV9nYW1lcywgZGVja19uYW1lLCByZWNvcmRfbG9ncyksIGRhZW1vbj1UcnVlKQogICAgdC5zdGFydCgpCgogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J3NpbUlkJzogc2ltX2lkLCAnc3RhdHVzJzogJ3F1ZXVlZCcsICd0b3RhbCc6IG51bV9nYW1lc30pCgoKQGFwcC5nZXQoJy9hcGkvc2ltL3N0YXR1cycpCmFzeW5jIGRlZiBzaW1fc3RhdHVzKHNpbUlkOiBzdHIpOgogICAgIiIiUG9sbCBzaW11bGF0aW9uIHByb2dyZXNzLiIiIgogICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgcnVuID0gX3NpbV9ydW5zLmdldChzaW1JZCkKICAgIGlmIG5vdCBydW46CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ3NpbSBub3QgZm91bmQnfSwgc3RhdHVzX2NvZGU9NDA0KQogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7CiAgICAgICAgJ3NpbUlkJzogc2ltSWQsCiAgICAgICAgJ3N0YXR1cyc6IHJ1blsnc3RhdHVzJ10sCiAgICAgICAgJ2NvbXBsZXRlZCc6IHJ1blsnY29tcGxldGVkJ10sCiAgICAgICAgJ3RvdGFsJzogcnVuWyd0b3RhbCddLAogICAgICAgICdkZWNrTmFtZSc6IHJ1bi5nZXQoJ2RlY2tOYW1lJywgJycpLAogICAgICAgICdlcnJvcic6IHJ1bi5nZXQoJ2Vycm9yJyksCiAgICB9KQoKCkBhcHAuZ2V0KCcvYXBpL3NpbS9yZXN1bHQnKQphc3luYyBkZWYgc2ltX3Jlc3VsdChzaW1JZDogc3RyKToKICAgICIiIkdldCBjb21wbGV0ZWQgc2ltdWxhdGlvbiByZXN1bHRzLiIiIgogICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgcnVuID0gX3NpbV9ydW5zLmdldChzaW1JZCkKICAgIGlmIG5vdCBydW46CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ3NpbSBub3QgZm91bmQnfSwgc3RhdHVzX2NvZGU9NDA0KQogICAgaWYgcnVuWydzdGF0dXMnXSAhPSAnY29tcGxldGUnOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdzaW0gbm90IGNvbXBsZXRlJywgJ3N0YXR1cyc6IHJ1blsnc3RhdHVzJ119LCBzdGF0dXNfY29kZT00MDApCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHJ1blsncmVzdWx0J10pCgoKQGFwcC5wb3N0KCcvYXBpL3NpbS9ydW4tZnJvbS1kZWNrJykKYXN5bmMgZGVmIHNpbV9ydW5fZnJvbV9kZWNrKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlN0YXJ0IHNpbXVsYXRpb24gdXNpbmcgYSBkZWNrIGZyb20gdGhlIERlY2sgQnVpbGRlciAoYnkgZGVjayBJRCkuIiIiCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIGRlY2tfaWQgPSBib2R5LmdldCgnZGVja0lkJykKICAgIG51bV9nYW1lcyA9IGJvZHkuZ2V0KCdudW1HYW1lcycsIDEwKQogICAgcmVjb3JkX2xvZ3MgPSBib2R5LmdldCgncmVjb3JkTG9ncycsIFRydWUpCgogICAgaWYgbm90IGRlY2tfaWQ6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ2RlY2tJZCByZXF1aXJlZCd9LCBzdGF0dXNfY29kZT00MDApCgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjdXIgPSBjb25uLmN1cnNvcigpCiAgICBjdXIuZXhlY3V0ZSgnU0VMRUNUIG5hbWUgRlJPTSBkZWNrcyBXSEVSRSBpZCA9ID8nLCAoZGVja19pZCwpKQogICAgcm93ID0gY3VyLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ2RlY2sgbm90IGZvdW5kJ30sIHN0YXR1c19jb2RlPTQwNCkKICAgIGRlY2tfbmFtZSA9IHJvd1swXQoKICAgICMgUHVsbCBmdWxsIGNhcmQgZGF0YSBmcm9tIGNvbGxlY3Rpb24gam9pbiBzbyB0aGUgc2ltIGVuZ2luZSBoYXMgcmVhbCB0eXBlcy9zdGF0cwogICAgY3VyLmV4ZWN1dGUoIiIiCiAgICAgICAgU0VMRUNUIGRjLmNhcmRfbmFtZSwgZGMucXVhbnRpdHksCiAgICAgICAgICAgICAgIGNlLnR5cGVfbGluZSwgY2UuY21jLCBjZS5wb3dlciwgY2UudG91Z2huZXNzLAogICAgICAgICAgICAgICBjZS5vcmFjbGVfdGV4dCwgY2Uua2V5d29yZHMsIGNlLm1hbmFfY29zdAogICAgICAgIEZST00gZGVja19jYXJkcyBkYwogICAgICAgIExFRlQgSk9JTiAoCiAgICAgICAgICAgIFNFTEVDVCBzY3J5ZmFsbF9pZCwgdHlwZV9saW5lLCBjbWMsIHBvd2VyLCB0b3VnaG5lc3MsCiAgICAgICAgICAgICAgICAgICBvcmFjbGVfdGV4dCwga2V5d29yZHMsIG1hbmFfY29zdAogICAgICAgICAgICBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBHUk9VUCBCWSBzY3J5ZmFsbF9pZAogICAgICAgICkgY2UgT04gY2Uuc2NyeWZhbGxfaWQgPSBkYy5zY3J5ZmFsbF9pZAogICAgICAgIFdIRVJFIGRjLmRlY2tfaWQgPSA/CiAgICAiIiIsIChkZWNrX2lkLCkpCiAgICBjYXJkX2RhdGEgPSBbXQogICAgZm9yIHIgaW4gY3VyLmZldGNoYWxsKCk6CiAgICAgICAgZm9yIF8gaW4gcmFuZ2UoclsxXSBvciAxKToKICAgICAgICAgICAgY2FyZF9kYXRhLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAnbmFtZSc6IHJbMF0sCiAgICAgICAgICAgICAgICAndHlwZV9saW5lJzogclsyXSBvciAnJywKICAgICAgICAgICAgICAgICdjbWMnOiByWzNdIG9yIDAsCiAgICAgICAgICAgICAgICAncG93ZXInOiByWzRdIG9yICcnLAogICAgICAgICAgICAgICAgJ3RvdWdobmVzcyc6IHJbNV0gb3IgJycsCiAgICAgICAgICAgICAgICAnb3JhY2xlX3RleHQnOiByWzZdIG9yICcnLAogICAgICAgICAgICAgICAgJ2tleXdvcmRzJzogcls3XSBvciAnJywKICAgICAgICAgICAgICAgICdtYW5hX2Nvc3QnOiByWzhdIG9yICcnLAogICAgICAgICAgICB9KQogICAgaWYgbm90IGNhcmRfZGF0YToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnZGVjayBoYXMgbm8gY2FyZHMnfSwgc3RhdHVzX2NvZGU9NDAwKQoKICAgIHNpbV9pZCA9IHN0cihfdXVpZC51dWlkNCgpKVs6OF0KICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgIF9zaW1fcnVuc1tzaW1faWRdID0gewogICAgICAgICAgICAnc3RhdHVzJzogJ3F1ZXVlZCcsCiAgICAgICAgICAgICdjb21wbGV0ZWQnOiAwLAogICAgICAgICAgICAndG90YWwnOiBudW1fZ2FtZXMsCiAgICAgICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAgICAgJ3Jlc3VsdCc6IE5vbmUsCiAgICAgICAgICAgICdlcnJvcic6IE5vbmUsCiAgICAgICAgfQoKICAgIHQgPSBfdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3J1bl9zaW1fdGhyZWFkX3YyLCBhcmdzPShzaW1faWQsIGNhcmRfZGF0YSwgbnVtX2dhbWVzLCBkZWNrX25hbWUsIHJlY29yZF9sb2dzKSwgZGFlbW9uPVRydWUpCiAgICB0LnN0YXJ0KCkKCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnc2ltSWQnOiBzaW1faWQsICdzdGF0dXMnOiAncXVldWVkJywgJ3RvdGFsJzogbnVtX2dhbWVzLCAnZGVja05hbWUnOiBkZWNrX25hbWV9KQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVlcFNlZWsgQUkgT3Bwb25lbnQgQnJhaW4KIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiMgR2xvYmFsIERlZXBTZWVrIGJyYWluIGluc3RhbmNlIChsYXp5LWluaXRpYWxpemVkKQpfZGVlcHNlZWtfYnJhaW4gPSBOb25lCl9kZWVwc2Vla19sb2NrID0gX3RocmVhZGluZy5Mb2NrKCkKCmRlZiBfZ2V0X2RlZXBzZWVrX2JyYWluKCk6CiAgICAiIiJHZXQgb3IgY3JlYXRlIHRoZSBnbG9iYWwgRGVlcFNlZWsgYnJhaW4gaW5zdGFuY2UuIiIiCiAgICBnbG9iYWwgX2RlZXBzZWVrX2JyYWluCiAgICBpZiBfZGVlcHNlZWtfYnJhaW4gaXMgTm9uZToKICAgICAgICB3aXRoIF9kZWVwc2Vla19sb2NrOgogICAgICAgICAgICBpZiBfZGVlcHNlZWtfYnJhaW4gaXMgTm9uZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3lzIGFzIF9zeXMyLCBvcyBhcyBfb3MyCiAgICAgICAgICAgICAgICAgICAgc3JjX2RpciA9IF9vczIucGF0aC5qb2luKF9vczIucGF0aC5kaXJuYW1lKF9vczIucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksICdzcmMnKQogICAgICAgICAgICAgICAgICAgIGlmIHNyY19kaXIgbm90IGluIF9zeXMyLnBhdGg6CiAgICAgICAgICAgICAgICAgICAgICAgIF9zeXMyLnBhdGguaW5zZXJ0KDAsIHNyY19kaXIpCiAgICAgICAgICAgICAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5kZWVwc2Vla19icmFpbiBpbXBvcnQgRGVlcFNlZWtCcmFpbiwgRGVlcFNlZWtDb25maWcKICAgICAgICAgICAgICAgICAgICBjZmcgPSBEZWVwU2Vla0NvbmZpZygpCiAgICAgICAgICAgICAgICAgICAgIyBBbGxvdyBlbnYgdmFyIG92ZXJyaWRlcwogICAgICAgICAgICAgICAgICAgIGlmIF9vczIuZW52aXJvbi5nZXQoJ0RFRVBTRUVLX0FQSV9CQVNFJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5hcGlfYmFzZSA9IF9vczIuZW52aXJvblsnREVFUFNFRUtfQVBJX0JBU0UnXQogICAgICAgICAgICAgICAgICAgIGlmIF9vczIuZW52aXJvbi5nZXQoJ0RFRVBTRUVLX01PREVMJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5tb2RlbCA9IF9vczIuZW52aXJvblsnREVFUFNFRUtfTU9ERUwnXQogICAgICAgICAgICAgICAgICAgIGNmZy5sb2dfZGlyID0gX29zMi5wYXRoLmpvaW4oX29zMi5wYXRoLmRpcm5hbWUoX29zMi5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgJ2xvZ3MnLCAnZGVjaXNpb25zJykKICAgICAgICAgICAgICAgICAgICBfZGVlcHNlZWtfYnJhaW4gPSBEZWVwU2Vla0JyYWluKGNmZykKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICBsb2dfc2ltLmVycm9yKGYnRmFpbGVkIHRvIGluaXRpYWxpemUgYnJhaW46IHtlfScpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBfZGVlcHNlZWtfYnJhaW4KCgpAYXBwLnBvc3QoJy9hcGkvZGVlcHNlZWsvY29ubmVjdCcpCmFzeW5jIGRlZiBkZWVwc2Vla19jb25uZWN0KHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlRlc3QgY29ubmVjdGlvbiB0byB0aGUgRGVlcFNlZWsgTExNIGVuZHBvaW50IGFuZCBhdXRvLWRldGVjdCBtb2RlbC4iIiIKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKSBpZiBhd2FpdCByZXF1ZXN0LmJvZHkoKSBlbHNlIHt9CiAgICBhcGlfYmFzZSA9IGJvZHkuZ2V0KCdhcGlCYXNlJywgTm9uZSkKICAgIG1vZGVsID0gYm9keS5nZXQoJ21vZGVsJywgTm9uZSkKCiAgICBicmFpbiA9IF9nZXRfZGVlcHNlZWtfYnJhaW4oKQogICAgaWYgYnJhaW4gaXMgTm9uZToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnRGVlcFNlZWsgYnJhaW4gZmFpbGVkIHRvIGluaXRpYWxpemUnfSwgc3RhdHVzX2NvZGU9NTAwKQoKICAgICMgQWxsb3cgcnVudGltZSByZWNvbmZpZ3VyYXRpb24KICAgIGlmIGFwaV9iYXNlOgogICAgICAgIGJyYWluLmNvbmZpZy5hcGlfYmFzZSA9IGFwaV9iYXNlCiAgICBpZiBtb2RlbDoKICAgICAgICBicmFpbi5jb25maWcubW9kZWwgPSBtb2RlbAoKICAgIGNvbm5lY3RlZCA9IGJyYWluLmNoZWNrX2Nvbm5lY3Rpb24oKQogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7CiAgICAgICAgJ2Nvbm5lY3RlZCc6IGNvbm5lY3RlZCwKICAgICAgICAnYXBpQmFzZSc6IGJyYWluLmNvbmZpZy5hcGlfYmFzZSwKICAgICAgICAnbW9kZWwnOiBicmFpbi5jb25maWcubW9kZWwsCiAgICAgICAgJ3N0YXRzJzogYnJhaW4uZ2V0X3N0YXRzKCksCiAgICB9KQoKCkBhcHAuZ2V0KCcvYXBpL2RlZXBzZWVrL3N0YXR1cycpCmFzeW5jIGRlZiBkZWVwc2Vla19zdGF0dXMoKToKICAgICIiIkdldCBEZWVwU2VlayBicmFpbiBzdGF0dXMgYW5kIHBlcmZvcm1hbmNlIHN0YXRzLiIiIgogICAgYnJhaW4gPSBfZ2V0X2RlZXBzZWVrX2JyYWluKCkKICAgIGlmIGJyYWluIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Nvbm5lY3RlZCc6IEZhbHNlLCAnZXJyb3InOiAnQnJhaW4gbm90IGluaXRpYWxpemVkJ30pCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKGJyYWluLmdldF9zdGF0cygpKQoKCkBhcHAucG9zdCgnL2FwaS9kZWVwc2Vlay9jb25maWd1cmUnKQphc3luYyBkZWYgZGVlcHNlZWtfY29uZmlndXJlKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlVwZGF0ZSBEZWVwU2VlayBjb25maWd1cmF0aW9uIGF0IHJ1bnRpbWUuIiIiCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIGJyYWluID0gX2dldF9kZWVwc2Vla19icmFpbigpCiAgICBpZiBicmFpbiBpcyBOb25lOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdCcmFpbiBub3QgaW5pdGlhbGl6ZWQnfSwgc3RhdHVzX2NvZGU9NTAwKQoKICAgIGlmICdhcGlCYXNlJyBpbiBib2R5OgogICAgICAgIGJyYWluLmNvbmZpZy5hcGlfYmFzZSA9IGJvZHlbJ2FwaUJhc2UnXQogICAgaWYgJ21vZGVsJyBpbiBib2R5OgogICAgICAgIGJyYWluLmNvbmZpZy5tb2RlbCA9IGJvZHlbJ21vZGVsJ10KICAgIGlmICd0ZW1wZXJhdHVyZScgaW4gYm9keToKICAgICAgICBicmFpbi5jb25maWcudGVtcGVyYXR1cmUgPSBmbG9hdChib2R5Wyd0ZW1wZXJhdHVyZSddKQogICAgaWYgJ21heFRva2VucycgaW4gYm9keToKICAgICAgICBicmFpbi5jb25maWcubWF4X3Rva2VucyA9IGludChib2R5WydtYXhUb2tlbnMnXSkKICAgIGlmICd0aW1lb3V0JyBpbiBib2R5OgogICAgICAgIGJyYWluLmNvbmZpZy5yZXF1ZXN0X3RpbWVvdXQgPSBmbG9hdChib2R5Wyd0aW1lb3V0J10pCiAgICBpZiAnY2FjaGVFbmFibGVkJyBpbiBib2R5OgogICAgICAgIGJyYWluLmNvbmZpZy5jYWNoZV9lbmFibGVkID0gYm9vbChib2R5WydjYWNoZUVuYWJsZWQnXSkKICAgIGlmICdsb2dEZWNpc2lvbnMnIGluIGJvZHk6CiAgICAgICAgYnJhaW4uY29uZmlnLmxvZ19kZWNpc2lvbnMgPSBib29sKGJvZHlbJ2xvZ0RlY2lzaW9ucyddKQogICAgaWYgJ2ZhbGxiYWNrT25UaW1lb3V0JyBpbiBib2R5OgogICAgICAgIGJyYWluLmNvbmZpZy5mYWxsYmFja19vbl90aW1lb3V0ID0gYm9vbChib2R5WydmYWxsYmFja09uVGltZW91dCddKQoKICAgICMgUmUtdGVzdCBjb25uZWN0aW9uIHdpdGggbmV3IHNldHRpbmdzCiAgICBjb25uZWN0ZWQgPSBicmFpbi5jaGVja19jb25uZWN0aW9uKCkKCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsKICAgICAgICAnY29ubmVjdGVkJzogY29ubmVjdGVkLAogICAgICAgICdjb25maWcnOiB7CiAgICAgICAgICAgICdhcGlCYXNlJzogYnJhaW4uY29uZmlnLmFwaV9iYXNlLAogICAgICAgICAgICAnbW9kZWwnOiBicmFpbi5jb25maWcubW9kZWwsCiAgICAgICAgICAgICd0ZW1wZXJhdHVyZSc6IGJyYWluLmNvbmZpZy50ZW1wZXJhdHVyZSwKICAgICAgICAgICAgJ21heFRva2Vucyc6IGJyYWluLmNvbmZpZy5tYXhfdG9rZW5zLAogICAgICAgICAgICAndGltZW91dCc6IGJyYWluLmNvbmZpZy5yZXF1ZXN0X3RpbWVvdXQsCiAgICAgICAgICAgICdjYWNoZUVuYWJsZWQnOiBicmFpbi5jb25maWcuY2FjaGVfZW5hYmxlZCwKICAgICAgICAgICAgJ2xvZ0RlY2lzaW9ucyc6IGJyYWluLmNvbmZpZy5sb2dfZGVjaXNpb25zLAogICAgICAgICAgICAnZmFsbGJhY2tPblRpbWVvdXQnOiBicmFpbi5jb25maWcuZmFsbGJhY2tfb25fdGltZW91dCwKICAgICAgICB9LAogICAgfSkKCgpAYXBwLmdldCgnL2FwaS9kZWVwc2Vlay9sb2dzJykKYXN5bmMgZGVmIGRlZXBzZWVrX2xvZ3MoKToKICAgICIiIkdldCBkZWNpc2lvbiBsb2cgc3RhdHMgYW5kIGZsdXNoIHBlbmRpbmcgZW50cmllcy4iIiIKICAgIGJyYWluID0gX2dldF9kZWVwc2Vla19icmFpbigpCiAgICBpZiBicmFpbiBpcyBOb25lOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdCcmFpbiBub3QgaW5pdGlhbGl6ZWQnfSwgc3RhdHVzX2NvZGU9NTAwKQoKICAgIHBlbmRpbmcgPSBsZW4oYnJhaW4uX2RlY2lzaW9uX2xvZykKICAgIGZsdXNoZWRfcGF0aCA9IE5vbmUKICAgIGlmIHBlbmRpbmcgPiAwOgogICAgICAgIHRyeToKICAgICAgICAgICAgZmx1c2hlZF9wYXRoID0gYnJhaW4uZmx1c2hfbG9nKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6IGYnRmFpbGVkIHRvIGZsdXNoOiB7ZX0nfSwgc3RhdHVzX2NvZGU9NTAwKQoKICAgICMgTGlzdCBleGlzdGluZyBsb2cgZmlsZXMKICAgIGltcG9ydCBnbG9iIGFzIF9nbG9iCiAgICBsb2dfZGlyID0gYnJhaW4uY29uZmlnLmxvZ19kaXIKICAgIGxvZ19maWxlcyA9IFtdCiAgICBpZiBsb2dfZGlyIGFuZCBvcy5wYXRoLmlzZGlyKGxvZ19kaXIpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChfZ2xvYi5nbG9iKG9zLnBhdGguam9pbihsb2dfZGlyLCAnZGVjaXNpb25zXyouanNvbmwnKSkpOgogICAgICAgICAgICBzdGF0ID0gb3Muc3RhdChmKQogICAgICAgICAgICBsb2dfZmlsZXMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICdmaWxlbmFtZSc6IG9zLnBhdGguYmFzZW5hbWUoZiksCiAgICAgICAgICAgICAgICAnc2l6ZV9ieXRlcyc6IHN0YXQuc3Rfc2l6ZSwKICAgICAgICAgICAgICAgICdtb2RpZmllZCc6IHN0YXQuc3RfbXRpbWUsCiAgICAgICAgICAgIH0pCgogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7CiAgICAgICAgJ2ZsdXNoZWQnOiBwZW5kaW5nLAogICAgICAgICdmbHVzaGVkUGF0aCc6IGZsdXNoZWRfcGF0aCwKICAgICAgICAnbG9nRmlsZXMnOiBsb2dfZmlsZXNbLTIwOl0sICAjIGxhc3QgMjAKICAgIH0pCgoKZGVmIF9ydW5fc2ltX3RocmVhZF9kZWVwc2VlayhzaW1faWQ6IHN0ciwgY2FyZF9kYXRhOiBsaXN0W2RpY3RdLCBudW1fZ2FtZXM6IGludCwgZGVja19uYW1lOiBzdHIsIHJlY29yZF9sb2dzOiBib29sKToKICAgICIiIkJhY2tncm91bmQgdGhyZWFkIGZvciBzaW11bGF0aW9ucyB1c2luZyBEZWVwU2VlayBBSSBvcHBvbmVudC4iIiIKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzLCBvcwogICAgICAgIHNyY19kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCAnc3JjJykKICAgICAgICBpZiBzcmNfZGlyIG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNyY19kaXIpCgogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0ubW9kZWxzIGltcG9ydCBDYXJkCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5kZWVwc2Vla19lbmdpbmUgaW1wb3J0IERlZXBTZWVrR2FtZUVuZ2luZQogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0ucnVsZXMgaW1wb3J0IGVucmljaF9jYXJkCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLmxhYi5leHBlcmltZW50cyBpbXBvcnQgX2dlbmVyYXRlX3RyYWluaW5nX2RlY2sKCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdydW5uaW5nJwoKICAgICAgICAjIEJ1aWxkIHBsYXllcidzIGRlY2sgd2l0aCByZWFsIGNhcmQgZGF0YQogICAgICAgIGRlY2tfYSA9IFtdCiAgICAgICAgZm9yIGNkIGluIGNhcmRfZGF0YToKICAgICAgICAgICAgYyA9IENhcmQobmFtZT1jZFsnbmFtZSddKQogICAgICAgICAgICBpZiBjZC5nZXQoJ3R5cGVfbGluZScpOgogICAgICAgICAgICAgICAgYy50eXBlX2xpbmUgPSBjZFsndHlwZV9saW5lJ10KICAgICAgICAgICAgaWYgY2QuZ2V0KCdjbWMnKToKICAgICAgICAgICAgICAgIGMuY21jID0gZmxvYXQoY2RbJ2NtYyddKQogICAgICAgICAgICBpZiBjZC5nZXQoJ3Bvd2VyJykgYW5kIGNkLmdldCgndG91Z2huZXNzJyk6CiAgICAgICAgICAgICAgICBjLnBvd2VyID0gc3RyKGNkWydwb3dlciddKQogICAgICAgICAgICAgICAgYy50b3VnaG5lc3MgPSBzdHIoY2RbJ3RvdWdobmVzcyddKQogICAgICAgICAgICAgICAgYy5wdCA9IGMucG93ZXIgKyAnLycgKyBjLnRvdWdobmVzcwogICAgICAgICAgICBpZiBjZC5nZXQoJ29yYWNsZV90ZXh0Jyk6CiAgICAgICAgICAgICAgICBjLm9yYWNsZV90ZXh0ID0gY2RbJ29yYWNsZV90ZXh0J10KICAgICAgICAgICAgaWYgY2QuZ2V0KCdtYW5hX2Nvc3QnKToKICAgICAgICAgICAgICAgIGMubWFuYV9jb3N0ID0gY2RbJ21hbmFfY29zdCddCiAgICAgICAgICAgIGlmIGNkLmdldCgna2V5d29yZHMnKToKICAgICAgICAgICAgICAgIGt3ID0gY2RbJ2tleXdvcmRzJ10KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa3csIHN0cik6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQganNvbiBhcyBfanNvbgogICAgICAgICAgICAgICAgICAgICAgICBrdyA9IF9qc29uLmxvYWRzKGt3KQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIGt3ID0gW10KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa3csIGxpc3QpOgogICAgICAgICAgICAgICAgICAgIGMua2V5d29yZHMgPSBrdwogICAgICAgICAgICBlbnJpY2hfY2FyZChjKQogICAgICAgICAgICBkZWNrX2EuYXBwZW5kKGMpCgogICAgICAgIGRlY2tfYiA9IF9nZW5lcmF0ZV90cmFpbmluZ19kZWNrKCkKCiAgICAgICAgIyBHZXQgRGVlcFNlZWsgYnJhaW4KICAgICAgICBicmFpbiA9IF9nZXRfZGVlcHNlZWtfYnJhaW4oKQogICAgICAgIGlmIGJyYWluIGFuZCBub3QgYnJhaW4uX2Nvbm5lY3RlZDoKICAgICAgICAgICAgYnJhaW4uY2hlY2tfY29ubmVjdGlvbigpCgogICAgICAgIGVuZ2luZSA9IERlZXBTZWVrR2FtZUVuZ2luZSgKICAgICAgICAgICAgYnJhaW49YnJhaW4sCiAgICAgICAgICAgIGFpX3BsYXllcl9pbmRleD0xLCAgIyBUcmFpbmluZyBkZWNrIGlzIHBsYXllciBCIChpbmRleCAxKQogICAgICAgICAgICBtYXhfdHVybnM9MjUsCiAgICAgICAgICAgIHJlY29yZF9sb2c9cmVjb3JkX2xvZ3MsCiAgICAgICAgKQoKICAgICAgICBpbXBvcnQgdGltZQogICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKCiAgICAgICAgd2lucyA9IDAKICAgICAgICBsb3NzZXMgPSAwCiAgICAgICAgdG90YWxfdHVybnMgPSAwCiAgICAgICAgdG90YWxfZGFtYWdlX2RlYWx0ID0gMAogICAgICAgIHRvdGFsX2RhbWFnZV9yZWNlaXZlZCA9IDAKICAgICAgICB0b3RhbF9zcGVsbHNfY2FzdCA9IDAKICAgICAgICB0b3RhbF9jcmVhdHVyZXNfcGxheWVkID0gMAogICAgICAgIHRvdGFsX3JlbW92YWxfdXNlZCA9IDAKICAgICAgICB0b3RhbF9yYW1wX3BsYXllZCA9IDAKICAgICAgICB0b3RhbF9jYXJkc19kcmF3biA9IDAKICAgICAgICB0b3RhbF9tYXhfYm9hcmQgPSAwCiAgICAgICAgZ2FtZV9yZXN1bHRzID0gW10KCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtX2dhbWVzKToKICAgICAgICAgICAgZ2FtZV9pZCA9IGYnZHMtc2ltLXtzaW1faWRbOjhdfS1ne2krMX0nCiAgICAgICAgICAgIHJlc3VsdCA9IGVuZ2luZS5ydW4oZGVja19hLCBkZWNrX2IsIG5hbWVfYT1kZWNrX25hbWUsIG5hbWVfYj0nRGVlcFNlZWsgQUknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtZV9pZD1nYW1lX2lkLCBhcmNoZXR5cGU9J21pZHJhbmdlJykKCiAgICAgICAgICAgIGdhbWVfZGF0YSA9IHJlc3VsdC50b19kaWN0KCkKICAgICAgICAgICAgZ2FtZV9kYXRhWydnYW1lTnVtYmVyJ10gPSBpICsgMQogICAgICAgICAgICBnYW1lX3Jlc3VsdHMuYXBwZW5kKGdhbWVfZGF0YSkKCiAgICAgICAgICAgIGlmIHJlc3VsdC53aW5uZXIgPT0gMDoKICAgICAgICAgICAgICAgIHdpbnMgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9zc2VzICs9IDEKCiAgICAgICAgICAgIHRvdGFsX3R1cm5zICs9IHJlc3VsdC50dXJucwogICAgICAgICAgICBpZiByZXN1bHQucGxheWVyX2Ffc3RhdHM6CiAgICAgICAgICAgICAgICB0b3RhbF9kYW1hZ2VfZGVhbHQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9kZWFsdAogICAgICAgICAgICAgICAgdG90YWxfZGFtYWdlX3JlY2VpdmVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5kYW1hZ2VfcmVjZWl2ZWQKICAgICAgICAgICAgICAgIHRvdGFsX3NwZWxsc19jYXN0ICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5zcGVsbHNfY2FzdAogICAgICAgICAgICAgICAgdG90YWxfY3JlYXR1cmVzX3BsYXllZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY3JlYXR1cmVzX3BsYXllZAogICAgICAgICAgICAgICAgdG90YWxfcmVtb3ZhbF91c2VkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5yZW1vdmFsX3VzZWQKICAgICAgICAgICAgICAgIHRvdGFsX3JhbXBfcGxheWVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5yYW1wX3BsYXllZAogICAgICAgICAgICAgICAgdG90YWxfY2FyZHNfZHJhd24gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmNhcmRzX2RyYXduCiAgICAgICAgICAgICAgICB0b3RhbF9tYXhfYm9hcmQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLm1heF9ib2FyZF9zaXplCgogICAgICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydjb21wbGV0ZWQnXSA9IGkgKyAxCgogICAgICAgIGVsYXBzZWQgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0CiAgICAgICAgbiA9IG51bV9nYW1lcwoKICAgICAgICAjIFdyaXRlIE1MIGRlY2lzaW9uIEpTT05MIGZvciB0cmFpbmluZyBwaXBlbGluZQogICAgICAgIG1sX2RlY2lzaW9ucyA9IGVuZ2luZS5mbHVzaF9tbF9kZWNpc2lvbnMoKQogICAgICAgIGlmIG1sX2RlY2lzaW9uczoKICAgICAgICAgICAgbWxfanNvbmxfcGF0aCA9IG9zLnBhdGguam9pbigncmVzdWx0cycsIGYnbWwtZGVjaXNpb25zLXNpbS17c2ltX2lkWzo4XX0uanNvbmwnKQogICAgICAgICAgICBvcy5tYWtlZGlycygncmVzdWx0cycsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIHdpdGggb3BlbihtbF9qc29ubF9wYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIG1mOgogICAgICAgICAgICAgICAgaW1wb3J0IGpzb24gYXMgX21sanNvbgogICAgICAgICAgICAgICAgZm9yIGRlYyBpbiBtbF9kZWNpc2lvbnM6CiAgICAgICAgICAgICAgICAgICAgbWYud3JpdGUoX21sanNvbi5kdW1wcyhkZWMpICsgJ1xuJykKCiAgICAgICAgIyBHZXQgRGVlcFNlZWsgc3RhdHMgZm9yIHRoZSBzdW1tYXJ5CiAgICAgICAgZHNfc3RhdHMgPSBicmFpbi5nZXRfc3RhdHMoKSBpZiBicmFpbiBlbHNlIHt9CgogICAgICAgIHN1bW1hcnkgPSB7CiAgICAgICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAgICAgJ29wcG9uZW50TmFtZSc6ICdEZWVwU2VlayBBSScsCiAgICAgICAgICAgICdvcHBvbmVudFR5cGUnOiAnZGVlcHNlZWsnLAogICAgICAgICAgICAndG90YWxHYW1lcyc6IG4sCiAgICAgICAgICAgICd3aW5zJzogd2lucywKICAgICAgICAgICAgJ2xvc3Nlcyc6IGxvc3NlcywKICAgICAgICAgICAgJ3dpblJhdGUnOiByb3VuZCh3aW5zIC8gbiAqIDEwMCwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdUdXJucyc6IHJvdW5kKHRvdGFsX3R1cm5zIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdEYW1hZ2VEZWFsdCc6IHJvdW5kKHRvdGFsX2RhbWFnZV9kZWFsdCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnRGFtYWdlUmVjZWl2ZWQnOiByb3VuZCh0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1NwZWxsc0Nhc3QnOiByb3VuZCh0b3RhbF9zcGVsbHNfY2FzdCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnQ3JlYXR1cmVzUGxheWVkJzogcm91bmQodG90YWxfY3JlYXR1cmVzX3BsYXllZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnUmVtb3ZhbFVzZWQnOiByb3VuZCh0b3RhbF9yZW1vdmFsX3VzZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1JhbXBQbGF5ZWQnOiByb3VuZCh0b3RhbF9yYW1wX3BsYXllZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnQ2FyZHNEcmF3bic6IHJvdW5kKHRvdGFsX2NhcmRzX2RyYXduIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdNYXhCb2FyZFNpemUnOiByb3VuZCh0b3RhbF9tYXhfYm9hcmQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2VsYXBzZWRTZWNvbmRzJzogcm91bmQoZWxhcHNlZCwgMyksCiAgICAgICAgICAgICdkZWVwc2Vla1N0YXRzJzogZHNfc3RhdHMsCiAgICAgICAgfQoKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ2NvbXBsZXRlJwogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsncmVzdWx0J10gPSB7CiAgICAgICAgICAgICAgICAnc3VtbWFyeSc6IHN1bW1hcnksCiAgICAgICAgICAgICAgICAnZ2FtZXMnOiBnYW1lX3Jlc3VsdHMsCiAgICAgICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdlcnJvcicKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ2Vycm9yJ10gPSBzdHIoZSkKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpAYXBwLnBvc3QoJy9hcGkvc2ltL3J1bi1kZWVwc2VlaycpCmFzeW5jIGRlZiBzaW1fcnVuX2RlZXBzZWVrKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlN0YXJ0IHNpbXVsYXRpb24gdXNpbmcgRGVlcFNlZWsgQUkgYXMgdGhlIG9wcG9uZW50IGJyYWluLiIiIgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpCiAgICBkZWNrX2lkID0gYm9keS5nZXQoJ2RlY2tJZCcpCiAgICBudW1fZ2FtZXMgPSBib2R5LmdldCgnbnVtR2FtZXMnLCA1KSAgIyBEZWZhdWx0IDUgKExMTSBpcyBzbG93ZXIpCiAgICByZWNvcmRfbG9ncyA9IGJvZHkuZ2V0KCdyZWNvcmRMb2dzJywgVHJ1ZSkKCiAgICBpZiBub3QgZGVja19pZDoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnZGVja0lkIHJlcXVpcmVkJ30sIHN0YXR1c19jb2RlPTQwMCkKICAgIGlmIG51bV9nYW1lcyA8IDEgb3IgbnVtX2dhbWVzID4gNTA6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ251bUdhbWVzIG11c3QgYmUgMS01MCBmb3IgRGVlcFNlZWsgbW9kZSd9LCBzdGF0dXNfY29kZT00MDApCgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjdXIgPSBjb25uLmN1cnNvcigpCiAgICBjdXIuZXhlY3V0ZSgnU0VMRUNUIG5hbWUgRlJPTSBkZWNrcyBXSEVSRSBpZCA9ID8nLCAoZGVja19pZCwpKQogICAgcm93ID0gY3VyLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ2RlY2sgbm90IGZvdW5kJ30sIHN0YXR1c19jb2RlPTQwNCkKICAgIGRlY2tfbmFtZSA9IHJvd1swXQoKICAgIGN1ci5leGVjdXRlKCIiIgogICAgICAgIFNFTEVDVCBkYy5jYXJkX25hbWUsIGRjLnF1YW50aXR5LAogICAgICAgICAgICAgICBjZS50eXBlX2xpbmUsIGNlLmNtYywgY2UucG93ZXIsIGNlLnRvdWdobmVzcywKICAgICAgICAgICAgICAgY2Uub3JhY2xlX3RleHQsIGNlLmtleXdvcmRzLCBjZS5tYW5hX2Nvc3QKICAgICAgICBGUk9NIGRlY2tfY2FyZHMgZGMKICAgICAgICBMRUZUIEpPSU4gKAogICAgICAgICAgICBTRUxFQ1Qgc2NyeWZhbGxfaWQsIHR5cGVfbGluZSwgY21jLCBwb3dlciwgdG91Z2huZXNzLAogICAgICAgICAgICAgICAgICAgb3JhY2xlX3RleHQsIGtleXdvcmRzLCBtYW5hX2Nvc3QKICAgICAgICAgICAgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgR1JPVVAgQlkgc2NyeWZhbGxfaWQKICAgICAgICApIGNlIE9OIGNlLnNjcnlmYWxsX2lkID0gZGMuc2NyeWZhbGxfaWQKICAgICAgICBXSEVSRSBkYy5kZWNrX2lkID0gPwogICAgIiIiLCAoZGVja19pZCwpKQogICAgY2FyZF9kYXRhID0gW10KICAgIGZvciByIGluIGN1ci5mZXRjaGFsbCgpOgogICAgICAgIGZvciBfIGluIHJhbmdlKHJbMV0gb3IgMSk6CiAgICAgICAgICAgIGNhcmRfZGF0YS5hcHBlbmQoewogICAgICAgICAgICAgICAgJ25hbWUnOiByWzBdLAogICAgICAgICAgICAgICAgJ3R5cGVfbGluZSc6IHJbMl0gb3IgJycsCiAgICAgICAgICAgICAgICAnY21jJzogclszXSBvciAwLAogICAgICAgICAgICAgICAgJ3Bvd2VyJzogcls0XSBvciAnJywKICAgICAgICAgICAgICAgICd0b3VnaG5lc3MnOiByWzVdIG9yICcnLAogICAgICAgICAgICAgICAgJ29yYWNsZV90ZXh0Jzogcls2XSBvciAnJywKICAgICAgICAgICAgICAgICdrZXl3b3Jkcyc6IHJbN10gb3IgJycsCiAgICAgICAgICAgICAgICAnbWFuYV9jb3N0Jzogcls4XSBvciAnJywKICAgICAgICAgICAgfSkKICAgIGlmIG5vdCBjYXJkX2RhdGE6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ2RlY2sgaGFzIG5vIGNhcmRzJ30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBzaW1faWQgPSBzdHIoX3V1aWQudXVpZDQoKSlbOjhdCiAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXSA9IHsKICAgICAgICAgICAgJ3N0YXR1cyc6ICdxdWV1ZWQnLAogICAgICAgICAgICAnY29tcGxldGVkJzogMCwKICAgICAgICAgICAgJ3RvdGFsJzogbnVtX2dhbWVzLAogICAgICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgICAgICdyZXN1bHQnOiBOb25lLAogICAgICAgICAgICAnZXJyb3InOiBOb25lLAogICAgICAgIH0KCiAgICB0ID0gX3RocmVhZGluZy5UaHJlYWQoCiAgICAgICAgdGFyZ2V0PV9ydW5fc2ltX3RocmVhZF9kZWVwc2VlaywKICAgICAgICBhcmdzPShzaW1faWQsIGNhcmRfZGF0YSwgbnVtX2dhbWVzLCBkZWNrX25hbWUsIHJlY29yZF9sb2dzKSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkKICAgIHQuc3RhcnQoKQoKICAgIHJldHVybiBKU09OUmVzcG9uc2UoewogICAgICAgICdzaW1JZCc6IHNpbV9pZCwKICAgICAgICAnc3RhdHVzJzogJ3F1ZXVlZCcsCiAgICAgICAgJ3RvdGFsJzogbnVtX2dhbWVzLAogICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAnb3Bwb25lbnRUeXBlJzogJ2RlZXBzZWVrJywKICAgIH0pCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBBdXRvIERlY2sgR2VuZXJhdG9yCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgoKZGVmIF9yZXNvbHZlX2NvbW1hbmRlcihyZXE6IERlY2tHZW5lcmF0aW9uUmVxdWVzdCkgLT4gZGljdDoKICAgICIiIgogICAgUmVzb2x2ZSBjb21tYW5kZXIgaW5mbyBmcm9tIGEgRGVja0dlbmVyYXRpb25SZXF1ZXN0LgogICAgUmV0dXJucyBkaWN0IHdpdGg6IG5hbWUsIHNjcnlmYWxsX2lkLCBjb2xvcl9pZGVudGl0eSwgdHlwZV9saW5lLCBtYW5hX2Nvc3QsIGltYWdlX3VybAogICAgIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIFRyeSBzY3J5ZmFsbF9pZCBmaXJzdAogICAgaWYgcmVxLmNvbW1hbmRlcl9zY3J5ZmFsbF9pZDoKICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgbmFtZSwgdHlwZV9saW5lLCBjb2xvcl9pZGVudGl0eSwgbWFuYV9jb3N0LCBzY3J5ZmFsbF9pZCBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBzY3J5ZmFsbF9pZCA9ID8gTElNSVQgMSIsCiAgICAgICAgICAgIChyZXEuY29tbWFuZGVyX3NjcnlmYWxsX2lkLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBpZiByb3c6CiAgICAgICAgICAgIGNpID0gcm93WyJjb2xvcl9pZGVudGl0eSJdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2ksIHN0cik6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgY2kgPSBqc29uLmxvYWRzKGNpKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBjaSA9IFtdCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHJvd1sibmFtZSJdLAogICAgICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogcm93WyJzY3J5ZmFsbF9pZCJdLAogICAgICAgICAgICAgICAgImNvbG9yX2lkZW50aXR5IjogY2ksCiAgICAgICAgICAgICAgICAidHlwZV9saW5lIjogcm93WyJ0eXBlX2xpbmUiXSwKICAgICAgICAgICAgICAgICJtYW5hX2Nvc3QiOiByb3dbIm1hbmFfY29zdCJdIG9yICIiLAogICAgICAgICAgICAgICAgImltYWdlX3VybCI6IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3tyb3dbJ3NjcnlmYWxsX2lkJ119P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIsCiAgICAgICAgICAgIH0KICAgICAgICAjIEZhbGxiYWNrIHRvIFNjcnlmYWxsIEFQSQogICAgICAgIF9zY3J5ZmFsbF9yYXRlX2xpbWl0KCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVybCA9IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3tyZXEuY29tbWFuZGVyX3NjcnlmYWxsX2lkfSIKICAgICAgICAgICAgcnEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz17IlVzZXItQWdlbnQiOiAiQ29tbWFuZGVyQUlMYWIvMS4wIiwgIkFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uIn0pCiAgICAgICAgICAgIHdpdGggdXJsb3BlbihycSwgdGltZW91dD0xNSkgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKICAgICAgICAgICAgcmV0dXJuIF9zY3J5ZmFsbF90b19jb21tYW5kZXIoZGF0YSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgIyBUcnkgbmFtZSBzZWFyY2gKICAgIGlmIHJlcS5jb21tYW5kZXJfbmFtZToKICAgICAgICBuYW1lX2xvd2VyID0gcmVxLmNvbW1hbmRlcl9uYW1lLnN0cmlwKCkubG93ZXIoKQogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBuYW1lLCB0eXBlX2xpbmUsIGNvbG9yX2lkZW50aXR5LCBtYW5hX2Nvc3QsIHNjcnlmYWxsX2lkIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIExPV0VSKG5hbWUpID0gPyBMSU1JVCAxIiwKICAgICAgICAgICAgKG5hbWVfbG93ZXIsKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGlmIHJvdzoKICAgICAgICAgICAgY2kgPSByb3dbImNvbG9yX2lkZW50aXR5Il0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaSwgc3RyKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBjaSA9IGpzb24ubG9hZHMoY2kpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGNpID0gW10KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJuYW1lIjogcm93WyJuYW1lIl0sCiAgICAgICAgICAgICAgICAic2NyeWZhbGxfaWQiOiByb3dbInNjcnlmYWxsX2lkIl0sCiAgICAgICAgICAgICAgICAiY29sb3JfaWRlbnRpdHkiOiBjaSwKICAgICAgICAgICAgICAgICJ0eXBlX2xpbmUiOiByb3dbInR5cGVfbGluZSJdLAogICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6IHJvd1sibWFuYV9jb3N0Il0gb3IgIiIsCiAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve3Jvd1snc2NyeWZhbGxfaWQnXX0/Zm9ybWF0PWltYWdlJnZlcnNpb249bm9ybWFsIiwKICAgICAgICAgICAgfQoKICAgICAgICAjIEZhbGxiYWNrIHRvIFNjcnlmYWxsIGZ1enp5IHNlYXJjaAogICAgICAgIF9zY3J5ZmFsbF9yYXRlX2xpbWl0KCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCB1cmxsaWIucGFyc2UKICAgICAgICAgICAgZW5jb2RlZCA9IHVybGxpYi5wYXJzZS5xdW90ZShyZXEuY29tbWFuZGVyX25hbWUpCiAgICAgICAgICAgIHVybCA9IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL25hbWVkP2Z1enp5PXtlbmNvZGVkfSIKICAgICAgICAgICAgcnEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz17IlVzZXItQWdlbnQiOiAiQ29tbWFuZGVyQUlMYWIvMS4wIiwgIkFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uIn0pCiAgICAgICAgICAgIHdpdGggdXJsb3BlbihycSwgdGltZW91dD0xNSkgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKICAgICAgICAgICAgcmV0dXJuIF9zY3J5ZmFsbF90b19jb21tYW5kZXIoZGF0YSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgcmV0dXJuIE5vbmUKCgpkZWYgX3NjcnlmYWxsX3RvX2NvbW1hbmRlcihkYXRhOiBkaWN0KSAtPiBkaWN0OgogICAgIiIiQ29udmVydCBTY3J5ZmFsbCBBUEkgcmVzcG9uc2UgdG8gY29tbWFuZGVyIGluZm8gZGljdC4iIiIKICAgIGNpID0gZGF0YS5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pCiAgICBpbWFnZV91cmlzID0gZGF0YS5nZXQoImltYWdlX3VyaXMiLCB7fSkKICAgIGlmIG5vdCBpbWFnZV91cmlzIGFuZCBkYXRhLmdldCgiY2FyZF9mYWNlcyIpOgogICAgICAgIGltYWdlX3VyaXMgPSBkYXRhWyJjYXJkX2ZhY2VzIl1bMF0uZ2V0KCJpbWFnZV91cmlzIiwge30pCiAgICByZXR1cm4gewogICAgICAgICJuYW1lIjogZGF0YS5nZXQoIm5hbWUiLCAiIiksCiAgICAgICAgInNjcnlmYWxsX2lkIjogZGF0YS5nZXQoImlkIiwgIiIpLAogICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNpLAogICAgICAgICJ0eXBlX2xpbmUiOiBkYXRhLmdldCgidHlwZV9saW5lIiwgIiIpLAogICAgICAgICJtYW5hX2Nvc3QiOiBkYXRhLmdldCgibWFuYV9jb3N0IiwgIiIpLAogICAgICAgICJpbWFnZV91cmwiOiBpbWFnZV91cmlzLmdldCgibm9ybWFsIiwgIiIpLAogICAgfQoKCmRlZiBfZ2V0X2NvbGxlY3Rpb25fZm9yX2NvbG9ycyhjb2xvcl9pZGVudGl0eTogbGlzdCkgLT4gbGlzdDoKICAgICIiIgogICAgRmV0Y2ggYWxsIGNvbGxlY3Rpb24gY2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSBnaXZlbiBjb2xvciBpZGVudGl0eS4KICAgIFJldHVybnMgbGlzdCBvZiBkaWN0cyB3aXRoIGNhcmQgZGV0YWlscy4KICAgICIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgKiBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBxdWFudGl0eSA+IDAiCiAgICApLmZldGNoYWxsKCkKCiAgICB2YWxpZCA9IFtdCiAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgY2FyZCA9IF9yb3dfdG9fZGljdChyb3cpCiAgICAgICAgY2FyZF9jaSA9IGNhcmQuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKQogICAgICAgIGlmIGlzaW5zdGFuY2UoY2FyZF9jaSwgc3RyKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY2FyZF9jaSA9IGpzb24ubG9hZHMoY2FyZF9jaSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIGNhcmRfY2kgPSBbXQoKICAgICAgICAjIENvbG9yIGlkZW50aXR5IGNoZWNrOiBhbGwgY2FyZCBjb2xvcnMgbXVzdCBiZSB3aXRoaW4gY29tbWFuZGVyJ3MgaWRlbnRpdHkKICAgICAgICBpZiBjb2xvcl9pZGVudGl0eSBhbmQgY2FyZF9jaToKICAgICAgICAgICAgaWYgbm90IGFsbChjIGluIGNvbG9yX2lkZW50aXR5IGZvciBjIGluIGNhcmRfY2kpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBTa2lwIGlmIG5vIHNjcnlmYWxsX2lkCiAgICAgICAgaWYgbm90IGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBjYXJkWyJjb2xvcl9pZGVudGl0eSJdID0gY2FyZF9jaQogICAgICAgIHZhbGlkLmFwcGVuZChjYXJkKQoKICAgIHJldHVybiB2YWxpZAoKCmRlZiBfZ2VuZXJhdGVfZGVjayhyZXE6IERlY2tHZW5lcmF0aW9uUmVxdWVzdCkgLT4gZGljdDoKICAgICIiIgogICAgQ29yZSBkZWNrIGdlbmVyYXRpb24gYWxnb3JpdGhtLgoKICAgIDEuIFJlc29sdmUgY29tbWFuZGVyCiAgICAyLiBMb2FkIGNvbGxlY3Rpb24gZmlsdGVyZWQgdG8gY29sb3IgaWRlbnRpdHkKICAgIDMuIENhbGwgZW5hYmxlZCBzb3VyY2UgYWRhcHRlcnMgKHN0dWJiZWQpCiAgICA0LiBCdWlsZCBjYW5kaWRhdGUgcG9vbCwgc2NvcmUgYnkgcm9sZS90eXBlIGZpdAogICAgNS4gRmlsbCBzbG90cyBwZXIgdGFyZ2V0IHJhdGlvcywgcHJlZmVycmluZyBvd25lZCBjYXJkcwogICAgNi4gUmV0dXJuIHJlc3BvbnNlIGRpY3QKICAgICIiIgogICAgIyAxLiBSZXNvbHZlIGNvbW1hbmRlcgogICAgY29tbWFuZGVyID0gX3Jlc29sdmVfY29tbWFuZGVyKHJlcSkKICAgIGlmIG5vdCBjb21tYW5kZXI6CiAgICAgICAgcmV0dXJuIHsiZXJyb3IiOiAiQ29tbWFuZGVyIG5vdCBmb3VuZC4gUGxlYXNlIGNoZWNrIHRoZSBuYW1lIG9yIFNjcnlmYWxsIElELiJ9CgogICAgY29sb3JfaWRlbnRpdHkgPSByZXEuY29sb3JfaWRlbnRpdHkgb3IgY29tbWFuZGVyLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgIGxvZ19kZWNrZ2VuLmluZm8oZiIgIENvbW1hbmRlcjoge2NvbW1hbmRlclsnbmFtZSddfSwgQ0k6IHtjb2xvcl9pZGVudGl0eX0iKQoKICAgICMgMi4gTG9hZCBjb2xsZWN0aW9uCiAgICBjb2xsZWN0aW9uID0gX2dldF9jb2xsZWN0aW9uX2Zvcl9jb2xvcnMoY29sb3JfaWRlbnRpdHkpCiAgICBsb2dfZGVja2dlbi5pbmZvKGYiICB7bGVuKGNvbGxlY3Rpb24pfSBjYXJkcyBpbiBjb2xsZWN0aW9uIG1hdGNoIGNvbG9yIGlkZW50aXR5IikKCiAgICAjIDMuIENhbGwgc291cmNlIGFkYXB0ZXJzIChjdXJyZW50bHkgc3R1YmJlZCkKICAgIHRlbXBsYXRlX2NhcmRzID0gW10gICMgbGlzdCBvZiAobmFtZSwgd2VpZ2h0LCBzb3VyY2VfbmFtZSkKICAgIHNvdXJjZXMgPSByZXEuc291cmNlcyBvciBEZWNrR2VuZXJhdGlvblNvdXJjZUNvbmZpZygpCgogICAgdHJ5OgogICAgICAgIGlmIHNvdXJjZXMudXNlX2FyY2hpZGVrdDoKICAgICAgICAgICAgZnJvbSBkZWNrX3NvdXJjZXMuYXJjaGlkZWt0X2FkYXB0ZXIgaW1wb3J0IGZldGNoX3RlbXBsYXRlX2RlY2tzIGFzIGFyY2hpZGVrdF9mZXRjaAogICAgICAgICAgICBmb3IgdGQgaW4gYXJjaGlkZWt0X2ZldGNoKGNvbW1hbmRlclsibmFtZSJdLCBjb2xvcl9pZGVudGl0eSwgeyJ1cmwiOiBzb3VyY2VzLmFyY2hpZGVrdF91cmx9KToKICAgICAgICAgICAgICAgIGZvciB0YyBpbiB0ZC5jYXJkczoKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jYXJkcy5hcHBlbmQoKHRjLm5hbWUsIHRjLnF1YW50aXR5LCAiYXJjaGlkZWt0IikpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX2RlY2tnZW4uZXJyb3IoZiIgIEFyY2hpZGVrdCBhZGFwdGVyIGVycm9yOiB7ZX0iKQoKICAgIHRyeToKICAgICAgICBpZiBzb3VyY2VzLnVzZV9lZGhyZWM6CiAgICAgICAgICAgIGZyb20gZGVja19zb3VyY2VzLmVkaHJlY19hZGFwdGVyIGltcG9ydCBmZXRjaF90ZW1wbGF0ZV9kZWNrcyBhcyBlZGhyZWNfZmV0Y2gKICAgICAgICAgICAgZm9yIHRkIGluIGVkaHJlY19mZXRjaChjb21tYW5kZXJbIm5hbWUiXSwgY29sb3JfaWRlbnRpdHkpOgogICAgICAgICAgICAgICAgZm9yIHRjIGluIHRkLmNhcmRzOgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2NhcmRzLmFwcGVuZCgodGMubmFtZSwgdGMucXVhbnRpdHksICJlZGhyZWMiKSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfZGVja2dlbi5lcnJvcihmIiAgRURIUkVDIGFkYXB0ZXIgZXJyb3I6IHtlfSIpCgogICAgdHJ5OgogICAgICAgIGlmIHNvdXJjZXMudXNlX21veGZpZWxkOgogICAgICAgICAgICBmcm9tIGRlY2tfc291cmNlcy5tb3hmaWVsZF9hZGFwdGVyIGltcG9ydCBmZXRjaF90ZW1wbGF0ZV9kZWNrcyBhcyBtb3hmaWVsZF9mZXRjaAogICAgICAgICAgICBmb3IgdGQgaW4gbW94ZmllbGRfZmV0Y2goY29tbWFuZGVyWyJuYW1lIl0sIGNvbG9yX2lkZW50aXR5LCB7InVybCI6IHNvdXJjZXMubW94ZmllbGRfdXJsfSk6CiAgICAgICAgICAgICAgICBmb3IgdGMgaW4gdGQuY2FyZHM6CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfY2FyZHMuYXBwZW5kKCh0Yy5uYW1lLCB0Yy5xdWFudGl0eSwgIm1veGZpZWxkIikpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX2RlY2tnZW4uZXJyb3IoZiIgIE1veGZpZWxkIGFkYXB0ZXIgZXJyb3I6IHtlfSIpCgogICAgdHJ5OgogICAgICAgIGlmIHNvdXJjZXMudXNlX210Z2dvbGRmaXNoOgogICAgICAgICAgICBmcm9tIGRlY2tfc291cmNlcy5tdGdnb2xkZmlzaF9hZGFwdGVyIGltcG9ydCBmZXRjaF90ZW1wbGF0ZV9kZWNrcyBhcyBtdGdnb2xkZmlzaF9mZXRjaAogICAgICAgICAgICBmb3IgdGQgaW4gbXRnZ29sZGZpc2hfZmV0Y2goY29tbWFuZGVyWyJuYW1lIl0sIGNvbG9yX2lkZW50aXR5LCB7InVybCI6IHNvdXJjZXMubXRnZ29sZGZpc2hfdXJsfSk6CiAgICAgICAgICAgICAgICBmb3IgdGMgaW4gdGQuY2FyZHM6CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfY2FyZHMuYXBwZW5kKCh0Yy5uYW1lLCB0Yy5xdWFudGl0eSwgIm10Z2dvbGRmaXNoIikpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX2RlY2tnZW4uZXJyb3IoZiIgIE1UR0dvbGRmaXNoIGFkYXB0ZXIgZXJyb3I6IHtlfSIpCgogICAgIyA0LiBCdWlsZCBjYW5kaWRhdGUgcG9vbCBmcm9tIGNvbGxlY3Rpb24sIHNjb3JlZCBieSB0eXBlIG5lZWQKICAgICMgICAgQnVpbGQgYSBtYXA6IG5hbWVfbG93ZXIgLT4gY2FyZCBkaWN0IChkZWR1cGVkKQogICAgY2FuZGlkYXRlX21hcCA9IHt9CiAgICBmb3IgY2FyZCBpbiBjb2xsZWN0aW9uOgogICAgICAgIG5hbWUgPSBjYXJkLmdldCgibmFtZSIsICIiKQogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGtleSA9IG5hbWUubG93ZXIoKQogICAgICAgICMgU2tpcCB0aGUgY29tbWFuZGVyIGl0c2VsZgogICAgICAgIGlmIGtleSA9PSBjb21tYW5kZXJbIm5hbWUiXS5sb3dlcigpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGtleSBub3QgaW4gY2FuZGlkYXRlX21hcDoKICAgICAgICAgICAgdHlwZV9saW5lID0gY2FyZC5nZXQoInR5cGVfbGluZSIsICIiKQogICAgICAgICAgICBjYXJkX3R5cGUgPSBfY2xhc3NpZnlfY2FyZF90eXBlKHR5cGVfbGluZSkKICAgICAgICAgICAgY2FyZF9yb2xlcyA9IF9kZXRlY3RfY2FyZF9yb2xlcygKICAgICAgICAgICAgICAgIGNhcmQuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSwKICAgICAgICAgICAgICAgIHR5cGVfbGluZSwKICAgICAgICAgICAgICAgIGNhcmQuZ2V0KCJrZXl3b3JkcyIsIFtdKQogICAgICAgICAgICApCiAgICAgICAgICAgIGNhbmRpZGF0ZV9tYXBba2V5XSA9IHsKICAgICAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSwKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJ0eXBlX2xpbmUiOiB0eXBlX2xpbmUsCiAgICAgICAgICAgICAgICAibWFuYV9jb3N0IjogY2FyZC5nZXQoIm1hbmFfY29zdCIsICIiKSwKICAgICAgICAgICAgICAgICJjbWMiOiBmbG9hdChjYXJkLmdldCgiY21jIiwgMCkpLAogICAgICAgICAgICAgICAgImNhcmRfdHlwZSI6IGNhcmRfdHlwZSwKICAgICAgICAgICAgICAgICJyb2xlcyI6IGNhcmRfcm9sZXMsCiAgICAgICAgICAgICAgICAic291cmNlIjogImNvbGxlY3Rpb24iLAogICAgICAgICAgICAgICAgInF1YW50aXR5IjogMSwKICAgICAgICAgICAgICAgICJvd25lZF9xdHkiOiBpbnQoY2FyZC5nZXQoInF1YW50aXR5IiwgMCkpLAogICAgICAgICAgICAgICAgImlzX3Byb3h5IjogRmFsc2UsCiAgICAgICAgICAgICAgICAiZWRocmVjX3JhbmsiOiBpbnQoY2FyZC5nZXQoImVkaHJlY19yYW5rIiwgOTk5OTkpKSwKICAgICAgICAgICAgICAgICJpbWFnZV91cmwiOiBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97Y2FyZC5nZXQoJ3NjcnlmYWxsX2lkJywgJycpfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2FyZC5nZXQoInNjcnlmYWxsX2lkIikgZWxzZSAiIiwKICAgICAgICAgICAgfQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTWVyZ2UgcXVhbnRpdGllcwogICAgICAgICAgICBjYW5kaWRhdGVfbWFwW2tleV1bIm93bmVkX3F0eSJdICs9IGludChjYXJkLmdldCgicXVhbnRpdHkiLCAwKSkKCiAgICAjIEFkZCB0ZW1wbGF0ZSBjYXJkcyB0aGF0IGFyZW4ndCBpbiBjb2xsZWN0aW9uIChhcyBwb3RlbnRpYWwgcHJveGllcykKICAgIGZvciB0bmFtZSwgdHF0eSwgdHNvdXJjZSBpbiB0ZW1wbGF0ZV9jYXJkczoKICAgICAgICBrZXkgPSB0bmFtZS5sb3dlcigpCiAgICAgICAgaWYga2V5ID09IGNvbW1hbmRlclsibmFtZSJdLmxvd2VyKCk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYga2V5IGluIGNhbmRpZGF0ZV9tYXA6CiAgICAgICAgICAgICMgQm9vc3QgcHJpb3JpdHkgZm9yIGNhcmRzIHRoYXQgYXBwZWFyIGluIHRlbXBsYXRlcwogICAgICAgICAgICBjYW5kaWRhdGVfbWFwW2tleV1bIl90ZW1wbGF0ZV93ZWlnaHQiXSA9IGNhbmRpZGF0ZV9tYXBba2V5XS5nZXQoIl90ZW1wbGF0ZV93ZWlnaHQiLCAwKSArIHRxdHkKICAgICAgICAgICAgaWYgY2FuZGlkYXRlX21hcFtrZXldWyJzb3VyY2UiXSA9PSAiY29sbGVjdGlvbiI6CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVfbWFwW2tleV1bInNvdXJjZSJdID0gZiJjb2xsZWN0aW9uK3t0c291cmNlfSIKICAgICAgICBlbGlmIHJlcS5hbGxvd19wcm94aWVzOgogICAgICAgICAgICBjYW5kaWRhdGVfbWFwW2tleV0gPSB7CiAgICAgICAgICAgICAgICAic2NyeWZhbGxfaWQiOiAiIiwKICAgICAgICAgICAgICAgICJuYW1lIjogdG5hbWUsCiAgICAgICAgICAgICAgICAidHlwZV9saW5lIjogIiIsCiAgICAgICAgICAgICAgICAibWFuYV9jb3N0IjogIiIsCiAgICAgICAgICAgICAgICAiY21jIjogMCwKICAgICAgICAgICAgICAgICJjYXJkX3R5cGUiOiAiT3RoZXIiLAogICAgICAgICAgICAgICAgInJvbGVzIjogW10sCiAgICAgICAgICAgICAgICAic291cmNlIjogdHNvdXJjZSwKICAgICAgICAgICAgICAgICJxdWFudGl0eSI6IDEsCiAgICAgICAgICAgICAgICAib3duZWRfcXR5IjogMCwKICAgICAgICAgICAgICAgICJpc19wcm94eSI6IFRydWUsCiAgICAgICAgICAgICAgICAiZWRocmVjX3JhbmsiOiA5OTk5OSwKICAgICAgICAgICAgICAgICJpbWFnZV91cmwiOiAiIiwKICAgICAgICAgICAgICAgICJfdGVtcGxhdGVfd2VpZ2h0IjogdHF0eSwKICAgICAgICAgICAgfQoKICAgICMgNS4gRmlsbCBzbG90cyBwZXIgdGFyZ2V0IHJhdGlvcwogICAgdGFyZ2V0cyA9IHsKICAgICAgICAiTGFuZCI6IHJlcS50YXJnZXRfbGFuZF9jb3VudCwKICAgICAgICAiQ3JlYXR1cmUiOiByZXEudGFyZ2V0X2NyZWF0dXJlX2NvdW50LAogICAgICAgICJJbnN0YW50IjogcmVxLnRhcmdldF9pbnN0YW50X2NvdW50LAogICAgICAgICJTb3JjZXJ5IjogcmVxLnRhcmdldF9zb3JjZXJ5X2NvdW50LAogICAgICAgICJBcnRpZmFjdCI6IHJlcS50YXJnZXRfYXJ0aWZhY3RfY291bnQsCiAgICAgICAgIkVuY2hhbnRtZW50IjogcmVxLnRhcmdldF9lbmNoYW50bWVudF9jb3VudCwKICAgICAgICAiUGxhbmVzd2Fsa2VyIjogcmVxLnRhcmdldF9wbGFuZXN3YWxrZXJfY291bnQsCiAgICB9CgogICAgIyBHcm91cCBjYW5kaWRhdGVzIGJ5IHR5cGUKICAgIGJ5X3R5cGUgPSB7fQogICAgZm9yIGNhcmQgaW4gY2FuZGlkYXRlX21hcC52YWx1ZXMoKToKICAgICAgICBjdCA9IGNhcmRbImNhcmRfdHlwZSJdCiAgICAgICAgYnlfdHlwZS5zZXRkZWZhdWx0KGN0LCBbXSkuYXBwZW5kKGNhcmQpCgogICAgIyBTY29yZSBhbmQgc29ydCBjYW5kaWRhdGVzIHdpdGhpbiBlYWNoIHR5cGUKICAgIGZvciBjdCwgY2FyZHMgaW4gYnlfdHlwZS5pdGVtcygpOgogICAgICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgICAgICBzY29yZSA9IDAKICAgICAgICAgICAgIyBQcmVmZXIgb3duZWQgY2FyZHMgaGVhdmlseQogICAgICAgICAgICBpZiBjYXJkWyJvd25lZF9xdHkiXSA+IDA6CiAgICAgICAgICAgICAgICBzY29yZSArPSAxMDAKICAgICAgICAgICAgIyBQcmVmZXIgY2FyZHMgd2l0aCBmdW5jdGlvbmFsIHJvbGVzCiAgICAgICAgICAgIGZvciByIGluIGNhcmQuZ2V0KCJyb2xlcyIsIFtdKToKICAgICAgICAgICAgICAgIGlmIHIgaW4gKCJSYW1wIiwgIkRyYXciLCAiUmVtb3ZhbCIsICJCb2FyZFdpcGUiKToKICAgICAgICAgICAgICAgICAgICBzY29yZSArPSAxMAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzY29yZSArPSAzCiAgICAgICAgICAgICMgUHJlZmVyIGxvd2VyIEVESFJFQyByYW5rIChtb3JlIHBvcHVsYXIgY2FyZHMpCiAgICAgICAgICAgIGVkaHJlY19yYW5rID0gY2FyZC5nZXQoImVkaHJlY19yYW5rIiwgOTk5OTkpCiAgICAgICAgICAgIGlmIGVkaHJlY19yYW5rIDwgNTAwOgogICAgICAgICAgICAgICAgc2NvcmUgKz0gMTUKICAgICAgICAgICAgZWxpZiBlZGhyZWNfcmFuayA8IDIwMDA6CiAgICAgICAgICAgICAgICBzY29yZSArPSAxMAogICAgICAgICAgICBlbGlmIGVkaHJlY19yYW5rIDwgNTAwMDoKICAgICAgICAgICAgICAgIHNjb3JlICs9IDUKICAgICAgICAgICAgIyBQcmVmZXIgY2FyZHMgZnJvbSB0ZW1wbGF0ZXMKICAgICAgICAgICAgc2NvcmUgKz0gY2FyZC5nZXQoIl90ZW1wbGF0ZV93ZWlnaHQiLCAwKSAqIDUKICAgICAgICAgICAgIyBQcmVmZXIgbG93ZXIgQ01DIChjdXJ2ZSBvcHRpbWl6YXRpb24pCiAgICAgICAgICAgIGNtYyA9IGNhcmQuZ2V0KCJjbWMiLCAwKQogICAgICAgICAgICBpZiBjbWMgPD0gMjoKICAgICAgICAgICAgICAgIHNjb3JlICs9IDUKICAgICAgICAgICAgZWxpZiBjbWMgPD0gNDoKICAgICAgICAgICAgICAgIHNjb3JlICs9IDMKICAgICAgICAgICAgY2FyZFsiX3Njb3JlIl0gPSBzY29yZQogICAgICAgIGNhcmRzLnNvcnQoa2V5PWxhbWJkYSB4OiB4WyJfc2NvcmUiXSwgcmV2ZXJzZT1UcnVlKQoKICAgICMgUGljayBjYXJkcyBmb3IgZWFjaCBzbG90IHR5cGUKICAgIGRlY2tfY2FyZHMgPSBbXQogICAgdXNlZF9uYW1lcyA9IHNldCgpICAjIHRyYWNrIGJ5IG5hbWUgdG8gYXZvaWQgZHVwbGljYXRlcwoKICAgIGZvciBjYXJkX3R5cGUsIHRhcmdldCBpbiB0YXJnZXRzLml0ZW1zKCk6CiAgICAgICAgY2FuZGlkYXRlcyA9IGJ5X3R5cGUuZ2V0KGNhcmRfdHlwZSwgW10pCiAgICAgICAgcGlja2VkID0gMAogICAgICAgIGZvciBjYXJkIGluIGNhbmRpZGF0ZXM6CiAgICAgICAgICAgIGlmIHBpY2tlZCA+PSB0YXJnZXQ6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBuYW1lX2tleSA9IGNhcmRbIm5hbWUiXS5sb3dlcigpCiAgICAgICAgICAgIGlmIG5hbWVfa2V5IGluIHVzZWRfbmFtZXM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAjIElmIG9ubHkgY29sbGVjdGlvbiwgc2tpcCBwcm94aWVzCiAgICAgICAgICAgIGlmIHJlcS5vbmx5X2NhcmRzX2luX2NvbGxlY3Rpb24gYW5kIGNhcmRbIm93bmVkX3F0eSJdIDw9IDA6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB1c2VkX25hbWVzLmFkZChuYW1lX2tleSkKICAgICAgICAgICAgZGVja19jYXJkcy5hcHBlbmQoY2FyZCkKICAgICAgICAgICAgcGlja2VkICs9IDEKCiAgICAjIEZpbGwgcmVtYWluaW5nIHNsb3RzIHVwIHRvIDk5IChjb21tYW5kZXIgaXMgIzEwMCkKICAgIHRvdGFsID0gc3VtKHRhcmdldHMudmFsdWVzKCkpCiAgICBpZiB0b3RhbCA8IDk5OgogICAgICAgIHJlbWFpbmluZyA9IDk5IC0gbGVuKGRlY2tfY2FyZHMpCiAgICAgICAgIyBGaWxsIHdpdGggYmVzdCByZW1haW5pbmcgY2FyZHMgZnJvbSBhbnkgdHlwZQogICAgICAgIGFsbF9yZW1haW5pbmcgPSBbXQogICAgICAgIGZvciBjdCwgY2FyZHMgaW4gYnlfdHlwZS5pdGVtcygpOgogICAgICAgICAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICAgICAgICAgIGlmIGNhcmRbIm5hbWUiXS5sb3dlcigpIG5vdCBpbiB1c2VkX25hbWVzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZXEub25seV9jYXJkc19pbl9jb2xsZWN0aW9uIG9yIGNhcmRbIm93bmVkX3F0eSJdID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3JlbWFpbmluZy5hcHBlbmQoY2FyZCkKICAgICAgICBhbGxfcmVtYWluaW5nLnNvcnQoa2V5PWxhbWJkYSB4OiB4LmdldCgiX3Njb3JlIiwgMCksIHJldmVyc2U9VHJ1ZSkKICAgICAgICBmb3IgY2FyZCBpbiBhbGxfcmVtYWluaW5nWzpyZW1haW5pbmddOgogICAgICAgICAgICB1c2VkX25hbWVzLmFkZChjYXJkWyJuYW1lIl0ubG93ZXIoKSkKICAgICAgICAgICAgZGVja19jYXJkcy5hcHBlbmQoY2FyZCkKICAgIGVsaWYgbGVuKGRlY2tfY2FyZHMpID4gOTk6CiAgICAgICAgZGVja19jYXJkcyA9IGRlY2tfY2FyZHNbOjk5XQoKICAgICMgNi4gQ29tcHV0ZSBzdGF0cwogICAgc3RhdHMgPSB7InRvdGFsIjogbGVuKGRlY2tfY2FyZHMpICsgMSwgImxhbmQiOiAwLCAibm9ubGFuZCI6IDAsICJieV90eXBlIjoge30sICJvd25lZCI6IDAsICJwcm94eSI6IDB9CiAgICBmb3IgY2FyZCBpbiBkZWNrX2NhcmRzOgogICAgICAgIGN0ID0gY2FyZC5nZXQoImNhcmRfdHlwZSIsICJPdGhlciIpCiAgICAgICAgc3RhdHNbImJ5X3R5cGUiXVtjdF0gPSBzdGF0c1siYnlfdHlwZSJdLmdldChjdCwgMCkgKyAxCiAgICAgICAgaWYgY3QgPT0gIkxhbmQiOgogICAgICAgICAgICBzdGF0c1sibGFuZCJdICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGF0c1sibm9ubGFuZCJdICs9IDEKICAgICAgICBpZiBjYXJkLmdldCgib3duZWRfcXR5IiwgMCkgPiAwOgogICAgICAgICAgICBzdGF0c1sib3duZWQiXSArPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhdHNbInByb3h5Il0gKz0gMQoKICAgICMgQ2xlYW4gdXAgaW50ZXJuYWwgc2NvcmluZyBrZXlzCiAgICBjbGVhbl9jYXJkcyA9IFtdCiAgICBmb3IgY2FyZCBpbiBkZWNrX2NhcmRzOgogICAgICAgIGNsZWFuX2NhcmRzLmFwcGVuZCh7CiAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSwKICAgICAgICAgICAgIm5hbWUiOiBjYXJkLmdldCgibmFtZSIsICIiKSwKICAgICAgICAgICAgInR5cGVfbGluZSI6IGNhcmQuZ2V0KCJ0eXBlX2xpbmUiLCAiIiksCiAgICAgICAgICAgICJtYW5hX2Nvc3QiOiBjYXJkLmdldCgibWFuYV9jb3N0IiwgIiIpLAogICAgICAgICAgICAiY21jIjogY2FyZC5nZXQoImNtYyIsIDApLAogICAgICAgICAgICAiY2FyZF90eXBlIjogY2FyZC5nZXQoImNhcmRfdHlwZSIsICJPdGhlciIpLAogICAgICAgICAgICAicm9sZXMiOiBjYXJkLmdldCgicm9sZXMiLCBbXSksCiAgICAgICAgICAgICJzb3VyY2UiOiBjYXJkLmdldCgic291cmNlIiwgImNvbGxlY3Rpb24iKSwKICAgICAgICAgICAgInF1YW50aXR5IjogMSwKICAgICAgICAgICAgImltYWdlX3VybCI6IGNhcmQuZ2V0KCJpbWFnZV91cmwiLCAiIiksCiAgICAgICAgICAgICJvd25lZF9xdHkiOiBjYXJkLmdldCgib3duZWRfcXR5IiwgMCksCiAgICAgICAgICAgICJpc19wcm94eSI6IGNhcmQuZ2V0KCJpc19wcm94eSIsIEZhbHNlKSwKICAgICAgICB9KQoKICAgIGxvZ19kZWNrZ2VuLmluZm8oZiIgIEdlbmVyYXRlZCBkZWNrOiB7bGVuKGNsZWFuX2NhcmRzKX0gY2FyZHMgKyBjb21tYW5kZXIiKQogICAgbG9nX2RlY2tnZW4uaW5mbyhmIiAgU3RhdHM6IHtzdGF0c30iKQoKICAgIHJldHVybiB7CiAgICAgICAgImNvbW1hbmRlciI6IGNvbW1hbmRlciwKICAgICAgICAiY29sb3JfaWRlbnRpdHkiOiBjb2xvcl9pZGVudGl0eSwKICAgICAgICAiY2FyZHMiOiBjbGVhbl9jYXJkcywKICAgICAgICAic3RhdHMiOiBzdGF0cywKICAgICAgICAidGFyZ2V0cyI6IHRhcmdldHMsCiAgICB9CgoKQGFwcC5nZXQoIi9hcGkvZGVjay1nZW5lcmF0b3IvY29uZmlnIikKYXN5bmMgZGVmIGRlY2tfZ2VuZXJhdG9yX2NvbmZpZygpOgogICAgIiIiCiAgICBSZXR1cm4gZGVmYXVsdCByYXRpb3MsIHN1cHBvcnRlZCBzb3VyY2VzLCBhbmQgbGltaXRzLgogICAgVXNlZCBieSB0aGUgZnJvbnRlbmQgdG8gcHJlZmlsbCB0aGUgZ2VuZXJhdG9yIGZvcm0uCiAgICAiIiIKICAgIHJldHVybiB7CiAgICAgICAgImRlZmF1bHRzIjogewogICAgICAgICAgICAidGFyZ2V0X2xhbmRfY291bnQiOiAzNywKICAgICAgICAgICAgInRhcmdldF9pbnN0YW50X2NvdW50IjogMTAsCiAgICAgICAgICAgICJ0YXJnZXRfc29yY2VyeV9jb3VudCI6IDgsCiAgICAgICAgICAgICJ0YXJnZXRfYXJ0aWZhY3RfY291bnQiOiAxMCwKICAgICAgICAgICAgInRhcmdldF9lbmNoYW50bWVudF9jb3VudCI6IDgsCiAgICAgICAgICAgICJ0YXJnZXRfY3JlYXR1cmVfY291bnQiOiAyNSwKICAgICAgICAgICAgInRhcmdldF9wbGFuZXN3YWxrZXJfY291bnQiOiAyLAogICAgICAgICAgICAib25seV9jYXJkc19pbl9jb2xsZWN0aW9uIjogRmFsc2UsCiAgICAgICAgICAgICJhbGxvd19wcm94aWVzIjogVHJ1ZSwKICAgICAgICB9LAogICAgICAgICJzb3VyY2VzIjogWwogICAgICAgICAgICB7ImlkIjogImFyY2hpZGVrdCIsICJuYW1lIjogIkFyY2hpZGVrdCIsICJlbmFibGVkIjogVHJ1ZSwgImV4cGVyaW1lbnRhbCI6IEZhbHNlfSwKICAgICAgICAgICAgeyJpZCI6ICJlZGhyZWMiLCAibmFtZSI6ICJFREhSRUMiLCAiZW5hYmxlZCI6IFRydWUsICJleHBlcmltZW50YWwiOiBGYWxzZX0sCiAgICAgICAgICAgIHsiaWQiOiAibW94ZmllbGQiLCAibmFtZSI6ICJNb3hmaWVsZCIsICJlbmFibGVkIjogRmFsc2UsICJleHBlcmltZW50YWwiOiBUcnVlfSwKICAgICAgICAgICAgeyJpZCI6ICJtdGdnb2xkZmlzaCIsICJuYW1lIjogIk1UR0dvbGRmaXNoIiwgImVuYWJsZWQiOiBGYWxzZSwgImV4cGVyaW1lbnRhbCI6IFRydWV9LAogICAgICAgIF0sCiAgICAgICAgImxpbWl0cyI6IHsKICAgICAgICAgICAgImRlY2tfc2l6ZSI6IDEwMCwKICAgICAgICAgICAgIm1heF9leHRlcm5hbF90ZW1wbGF0ZXMiOiA1LAogICAgICAgIH0sCiAgICB9CgoKQGFwcC5wb3N0KCIvYXBpL2RlY2stZ2VuZXJhdG9yL3ByZXZpZXciKQphc3luYyBkZWYgZGVja19nZW5lcmF0b3JfcHJldmlldyhyZXE6IERlY2tHZW5lcmF0aW9uUmVxdWVzdCk6CiAgICAiIiIKICAgIEdlbmVyYXRlIGEgZGVjayBwcmV2aWV3IHdpdGhvdXQgc2F2aW5nIGl0LgogICAgUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGRlY2sgZGF0YSBmb3IgdXNlciByZXZpZXcuCiAgICAiIiIKICAgIHJlc3VsdCA9IF9nZW5lcmF0ZV9kZWNrKHJlcSkKICAgIGlmICJlcnJvciIgaW4gcmVzdWx0OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCByZXN1bHRbImVycm9yIl0pCiAgICByZXR1cm4gcmVzdWx0CgoKQGFwcC5wb3N0KCIvYXBpL2RlY2stZ2VuZXJhdG9yL2NvbW1pdCIpCmFzeW5jIGRlZiBkZWNrX2dlbmVyYXRvcl9jb21taXQocmVxOiBEZWNrR2VuZXJhdGlvblJlcXVlc3QpOgogICAgIiIiCiAgICBHZW5lcmF0ZSBhIGRlY2sgYW5kIHNhdmUgaXQgdG8gdGhlIERlY2sgQnVpbGRlci4KICAgIFJldHVybnMgdGhlIGdlbmVyYXRlZCBkZWNrIGRhdGEgcGx1cyBkZWNrX2lkIGFuZCBkZWNrX25hbWUuCiAgICAiIiIKICAgIHJlc3VsdCA9IF9nZW5lcmF0ZV9kZWNrKHJlcSkKICAgIGlmICJlcnJvciIgaW4gcmVzdWx0OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCByZXN1bHRbImVycm9yIl0pCgogICAgY29tbWFuZGVyID0gcmVzdWx0WyJjb21tYW5kZXIiXQogICAgY29sb3JfaWRlbnRpdHkgPSByZXN1bHRbImNvbG9yX2lkZW50aXR5Il0KICAgIGNhcmRzID0gcmVzdWx0WyJjYXJkcyJdCgogICAgIyBEZXRlcm1pbmUgZGVjayBuYW1lCiAgICBkZWNrX25hbWUgPSByZXEuZGVja19uYW1lIG9yIGYiQXV0byAtIHtjb21tYW5kZXJbJ25hbWUnXX0gLSB7ZGF0ZXRpbWUubm93KCkuc3RyZnRpbWUoJyVZLSVtLSVkICVIOiVNJyl9IgoKICAgICMgQ3JlYXRlIHRoZSBkZWNrIGluIHRoZSBkYXRhYmFzZQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjb2xvcl9pZGVudGl0eV9qc29uID0ganNvbi5kdW1wcyhjb2xvcl9pZGVudGl0eSkKICAgIGN1ciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiIKICAgICAgICBJTlNFUlQgSU5UTyBkZWNrcyAobmFtZSwgY29tbWFuZGVyX3NjcnlmYWxsX2lkLCBjb21tYW5kZXJfbmFtZSwgY29sb3JfaWRlbnRpdHksIHN0cmF0ZWd5X3RhZykKICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8pCiAgICAgICAgIiIiLAogICAgICAgICgKICAgICAgICAgICAgZGVja19uYW1lLAogICAgICAgICAgICBjb21tYW5kZXIuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSwKICAgICAgICAgICAgY29tbWFuZGVyLmdldCgibmFtZSIsICIiKSwKICAgICAgICAgICAgY29sb3JfaWRlbnRpdHlfanNvbiwKICAgICAgICAgICAgImF1dG8tZ2VuZXJhdGVkIiwKICAgICAgICApCiAgICApCiAgICBjb25uLmNvbW1pdCgpCiAgICBkZWNrX2lkID0gY3VyLmxhc3Ryb3dpZAoKICAgICMgSW5zZXJ0IGNvbW1hbmRlciBhcyBhIGRlY2sgY2FyZCB3aXRoIGlzX2NvbW1hbmRlcj0xCiAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5LCBpc19jb21tYW5kZXIsIHJvbGVfdGFnKSBWQUxVRVMgKD8sID8sID8sIDEsIDEsICdDb21tYW5kZXInKSIsCiAgICAgICAgKGRlY2tfaWQsIGNvbW1hbmRlci5nZXQoInNjcnlmYWxsX2lkIiwgIiIpLCBjb21tYW5kZXIuZ2V0KCJuYW1lIiwgIiIpKQogICAgKQoKICAgICMgSW5zZXJ0IHRoZSA5OSBjYXJkcwogICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgc2NyeWZhbGxfaWQgPSBjYXJkLmdldCgic2NyeWZhbGxfaWQiLCAiIikKICAgICAgICBjYXJkX25hbWUgPSBjYXJkLmdldCgibmFtZSIsICIiKQogICAgICAgIHF1YW50aXR5ID0gY2FyZC5nZXQoInF1YW50aXR5IiwgMSkKICAgICAgICBpZiBub3Qgc2NyeWZhbGxfaWQgYW5kIG5vdCBjYXJkX25hbWU6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHksIGlzX2NvbW1hbmRlciwgcm9sZV90YWcpIFZBTFVFUyAoPywgPywgPywgPywgMCwgPykiLAogICAgICAgICAgICAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHksIGNhcmQuZ2V0KCJjYXJkX3R5cGUiLCAiIikpCiAgICAgICAgKQogICAgY29ubi5jb21taXQoKQoKICAgICMgQWxzbyBleHBvcnQgYSAuZGNrIGZpbGUgdG8gdGhlIEZvcmdlIGRlY2tzIGRpcmVjdG9yeSBzbyBpdCBhcHBlYXJzIGluIHRoZSBTaW0gTGFiCiAgICB0cnk6CiAgICAgICAgZGVja3NfZGlyID0gQ0ZHLmZvcmdlX2RlY2tzX2RpcgogICAgICAgIGlmIGRlY2tzX2RpciBhbmQgb3MucGF0aC5pc2RpcihkZWNrc19kaXIpOgogICAgICAgICAgICBzYWZlX25hbWUgPSByZS5zdWIocidbXmEtekEtWjAtOV9cLVxzXScsICcnLCBkZWNrX25hbWUpLnN0cmlwKCkucmVwbGFjZSgnICcsICdfJykKICAgICAgICAgICAgaWYgbm90IHNhZmVfbmFtZToKICAgICAgICAgICAgICAgIHNhZmVfbmFtZSA9IGYiQXV0b0RlY2tfe2RlY2tfaWR9IgogICAgICAgICAgICBkY2tfcGF0aCA9IG9zLnBhdGguam9pbihkZWNrc19kaXIsIGYie3NhZmVfbmFtZX0uZGNrIikKICAgICAgICAgICAgZGNrX2xpbmVzID0gW10KICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZCgiW21ldGFkYXRhXSIpCiAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoZiJOYW1lPXtkZWNrX25hbWV9IikKICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZCgiIikKICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZCgiW0NvbW1hbmRlcl0iKQogICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKGYiMSB7Y29tbWFuZGVyWyduYW1lJ119IikKICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZCgiIikKICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZCgiW01haW5dIikKICAgICAgICAgICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgICAgICAgICBjYXJkX25hbWUgPSBjYXJkLmdldCgibmFtZSIsICIiKQogICAgICAgICAgICAgICAgaWYgY2FyZF9uYW1lOgogICAgICAgICAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoZiJ7Y2FyZC5nZXQoJ3F1YW50aXR5JywgMSl9IHtjYXJkX25hbWV9IikKICAgICAgICAgICAgd2l0aCBvcGVuKGRja19wYXRoLCAidyIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKCJcbiIuam9pbihkY2tfbGluZXMpKQogICAgICAgICAgICBsb2dfZGVja2dlbi5pbmZvKGYiICBFeHBvcnRlZCAuZGNrIGZpbGU6IHtkY2tfcGF0aH0iKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ19kZWNrZ2VuLndhcm5pbmcoZiIgIFdhcm5pbmc6IEZhaWxlZCB0byBleHBvcnQgLmRjayBmaWxlOiB7ZX0iKQoKICAgIGxvZ19kZWNrZ2VuLmluZm8oZiIgIFNhdmVkIGRlY2sgJ3tkZWNrX25hbWV9JyAoSUQ6IHtkZWNrX2lkfSkgd2l0aCB7bGVuKGNhcmRzKX0gY2FyZHMgKyBjb21tYW5kZXIiKQoKICAgIHJlc3VsdFsiZGVja19pZCJdID0gZGVja19pZAogICAgcmVzdWx0WyJkZWNrX25hbWUiXSA9IGRlY2tfbmFtZQogICAgcmV0dXJuIHJlc3VsdAoKCkBhcHAuZ2V0KCIvYXBpL2RlY2stZ2VuZXJhdG9yL2NvbW1hbmRlci1zZWFyY2giKQphc3luYyBkZWYgZGVja19nZW5lcmF0b3JfY29tbWFuZGVyX3NlYXJjaChxOiBzdHIgPSAiIik6CiAgICAiIiIKICAgIFNlYXJjaCBmb3IgbGVnZW5kYXJ5IGNyZWF0dXJlcy9wbGFuZXN3YWxrZXJzIHRvIHVzZSBhcyBjb21tYW5kZXIuCiAgICBGaXJzdCBjaGVja3MgY29sbGVjdGlvbiwgdGhlbiBmYWxscyBiYWNrIHRvIFNjcnlmYWxsLgogICAgIiIiCiAgICBpZiBub3QgcSBvciBsZW4ocSkgPCAyOgogICAgICAgIHJldHVybiB7InJlc3VsdHMiOiBbXX0KCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHFfbG93ZXIgPSBmIiV7cS5sb3dlcigpfSUiCgogICAgIyBTZWFyY2ggY29sbGVjdGlvbiBmaXJzdAogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiIKICAgICAgICBTRUxFQ1QgRElTVElOQ1QgbmFtZSwgdHlwZV9saW5lLCBjb2xvcl9pZGVudGl0eSwgbWFuYV9jb3N0LCBzY3J5ZmFsbF9pZAogICAgICAgIEZST00gY29sbGVjdGlvbl9lbnRyaWVzCiAgICAgICAgV0hFUkUgTE9XRVIobmFtZSkgTElLRSA/IEFORCBpc19sZWdlbmRhcnkgPSAxCiAgICAgICAgICBBTkQgKHR5cGVfbGluZSBMSUtFICclQ3JlYXR1cmUlJyBPUiB0eXBlX2xpbmUgTElLRSAnJVBsYW5lc3dhbGtlciUnKQogICAgICAgIE9SREVSIEJZIG5hbWUgQVNDCiAgICAgICAgTElNSVQgMjAKICAgICAgICAiIiIsCiAgICAgICAgKHFfbG93ZXIsKQogICAgKS5mZXRjaGFsbCgpCgogICAgcmVzdWx0cyA9IFtdCiAgICBmb3IgciBpbiByb3dzOgogICAgICAgIGNpID0gclsiY29sb3JfaWRlbnRpdHkiXQogICAgICAgIGlmIGlzaW5zdGFuY2UoY2ksIHN0cik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNpID0ganNvbi5sb2FkcyhjaSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIGNpID0gW10KICAgICAgICByZXN1bHRzLmFwcGVuZCh7CiAgICAgICAgICAgICJuYW1lIjogclsibmFtZSJdLAogICAgICAgICAgICAidHlwZV9saW5lIjogclsidHlwZV9saW5lIl0sCiAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNpLAogICAgICAgICAgICAibWFuYV9jb3N0IjogclsibWFuYV9jb3N0Il0gb3IgIiIsCiAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IHJbInNjcnlmYWxsX2lkIl0sCiAgICAgICAgICAgICJpbl9jb2xsZWN0aW9uIjogVHJ1ZSwKICAgICAgICAgICAgImltYWdlX3VybCI6IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3tyWydzY3J5ZmFsbF9pZCddfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWwiCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiByWyJzY3J5ZmFsbF9pZCJdIGVsc2UgIiIsCiAgICAgICAgfSkKCiAgICAjIElmIGZldyByZXN1bHRzLCBzdXBwbGVtZW50IHdpdGggU2NyeWZhbGwKICAgIGlmIGxlbihyZXN1bHRzKSA8IDU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgdXJsbGliLnBhcnNlCiAgICAgICAgICAgIGVuY29kZWQgPSB1cmxsaWIucGFyc2UucXVvdGUocSkKICAgICAgICAgICAgX3NjcnlmYWxsX3JhdGVfbGltaXQoKQogICAgICAgICAgICB1cmwgPSBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy9zZWFyY2g/cT17ZW5jb2RlZH0rdCUzQWxlZ2VuZGFyeSsodCUzQWNyZWF0dXJlK09SK3QlM0FwbGFuZXN3YWxrZXIpJm9yZGVyPWVkaHJlYyZ1bmlxdWU9Y2FyZHMiCiAgICAgICAgICAgIHJxID0gUmVxdWVzdCh1cmwsIGhlYWRlcnM9eyJVc2VyLUFnZW50IjogIkNvbW1hbmRlckFJTGFiLzEuMCIsICJBY2NlcHQiOiAiYXBwbGljYXRpb24vanNvbiJ9KQogICAgICAgICAgICB3aXRoIHVybG9wZW4ocnEsIHRpbWVvdXQ9MTUpIGFzIHJlc3A6CiAgICAgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCgogICAgICAgICAgICBleGlzdGluZ19uYW1lcyA9IHtyWyJuYW1lIl0ubG93ZXIoKSBmb3IgciBpbiByZXN1bHRzfQogICAgICAgICAgICBmb3IgY2FyZCBpbiBkYXRhLmdldCgiZGF0YSIsIFtdKVs6MTBdOgogICAgICAgICAgICAgICAgaWYgY2FyZFsibmFtZSJdLmxvd2VyKCkgaW4gZXhpc3RpbmdfbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGltYWdlX3VyaXMgPSBjYXJkLmdldCgiaW1hZ2VfdXJpcyIsIHt9KQogICAgICAgICAgICAgICAgaWYgbm90IGltYWdlX3VyaXMgYW5kIGNhcmQuZ2V0KCJjYXJkX2ZhY2VzIik6CiAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJpcyA9IGNhcmRbImNhcmRfZmFjZXMiXVswXS5nZXQoImltYWdlX3VyaXMiLCB7fSkKICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6IGNhcmRbIm5hbWUiXSwKICAgICAgICAgICAgICAgICAgICAidHlwZV9saW5lIjogY2FyZC5nZXQoInR5cGVfbGluZSIsICIiKSwKICAgICAgICAgICAgICAgICAgICAiY29sb3JfaWRlbnRpdHkiOiBjYXJkLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSksCiAgICAgICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6IGNhcmQuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogY2FyZC5nZXQoImlkIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICJpbl9jb2xsZWN0aW9uIjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImltYWdlX3VybCI6IGltYWdlX3VyaXMuZ2V0KCJub3JtYWwiLCBpbWFnZV91cmlzLmdldCgic21hbGwiLCAiIikpLAogICAgICAgICAgICAgICAgfSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ19kZWNrZ2VuLmVycm9yKGYiICBTY3J5ZmFsbCBzZWFyY2ggZXJyb3I6IHtlfSIpCgogICAgcmV0dXJuIHsicmVzdWx0cyI6IHJlc3VsdHNbOjIwXX0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFBlcnBsZXhpdHkgQVBJIOKAlCBBSSBEZWNrIFJlc2VhcmNoICYgR2VuZXJhdGlvbgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKCmNsYXNzIERlY2tSZXNlYXJjaFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGRlY2tfaWQ6IGludCAgIyBEZWNrIHRvIHJlc2VhcmNoCiAgICBnb2FsOiBPcHRpb25hbFtzdHJdID0gIklkZW50aWZ5IHdlYWtuZXNzZXMgYW5kIHN1Z2dlc3QgdXBncmFkZXMiCiAgICBidWRnZXRfdXNkOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lCiAgICBvbWl0X2NhcmRzOiBPcHRpb25hbFtsaXN0W3N0cl1dID0gW10KICAgIHVzZV9jb2xsZWN0aW9uOiBib29sID0gVHJ1ZQoKCmNsYXNzIERlY2tHZW5lcmF0ZUFJUmVxdWVzdChCYXNlTW9kZWwpOgogICAgY29tbWFuZGVyOiBzdHIKICAgIGJ1ZGdldF91c2Q6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUKICAgIGJ1ZGdldF9tb2RlOiBzdHIgPSAidG90YWwiICAjICJ0b3RhbCIgb3IgInBlcl9jYXJkIgogICAgb21pdF9jYXJkczogT3B0aW9uYWxbbGlzdFtzdHJdXSA9IFtdCiAgICB1c2VfY29sbGVjdGlvbjogYm9vbCA9IFRydWUKCgpkZWYgX2J1aWxkX2NvbGxlY3Rpb25fc3VtbWFyeShjb2xvcl9pZGVudGl0eTogbGlzdFtzdHJdIHwgTm9uZSA9IE5vbmUpIC0+IGRpY3Q6CiAgICAiIiJCdWlsZCBhIGNvbXBhY3QgY29sbGVjdGlvbiBzdW1tYXJ5IGZvciB0aGUgQUksIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgY29sb3IgaWRlbnRpdHkuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIEJhc2UgcXVlcnk6IGFsbCBjb2xsZWN0aW9uIGVudHJpZXMgd2l0aCBvcmFjbGUgdGV4dAogICAgd2hlcmUgPSAiV0hFUkUgcXVhbnRpdHkgPiAwIgogICAgcGFyYW1zID0gW10KCiAgICAjIEZpbHRlciBieSBjb2xvciBpZGVudGl0eSBpZiBwcm92aWRlZAogICAgaWYgY29sb3JfaWRlbnRpdHk6CiAgICAgICAgIyBDYXJkcyBtdXN0IG9ubHkgY29udGFpbiBjb2xvcnMgaW4gdGhlIGNvbW1hbmRlcidzIGlkZW50aXR5ICgrIGNvbG9ybGVzcykKICAgICAgICBjaV9zZXQgPSBzZXQoYy51cHBlcigpIGZvciBjIGluIGNvbG9yX2lkZW50aXR5KQogICAgICAgICMgV2UnbGwgZG8gYSBwb3N0LWZpbHRlciBzaW5jZSBjb2xvcl9pZGVudGl0eSBpcyBKU09OIGluIHRoZSBEQgogICAgICAgIHBhc3MgICMgZmlsdGVyIGluIFB5dGhvbiBhZnRlciBmZXRjaAoKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoZiIiIgogICAgICAgIFNFTEVDVCBuYW1lLCB0eXBlX2xpbmUsIGNtYywgb3JhY2xlX3RleHQsIGtleXdvcmRzLCB0Y2dfcHJpY2UsIHF1YW50aXR5LAogICAgICAgICAgICAgICBjb2xvcl9pZGVudGl0eSwgY2F0ZWdvcnksIGlzX2dhbWVfY2hhbmdlciwgc2FsdF9zY29yZQogICAgICAgIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIHt3aGVyZX0KICAgICAgICBPUkRFUiBCWSBlZGhyZWNfcmFuayBBU0MsIHRjZ19wcmljZSBERVNDCiAgICAiIiIsIHBhcmFtcykuZmV0Y2hhbGwoKQoKICAgICMgQ29sb3IgaWRlbnRpdHkgZmlsdGVyCiAgICBkZWYgY2FyZF9maXRzX2lkZW50aXR5KGNhcmRfY2lfc3RyLCBjaV9zZXQpOgogICAgICAgIGlmIG5vdCBjaV9zZXQ6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjYXJkX2NpID0ganNvbi5sb2FkcyhjYXJkX2NpX3N0cikgaWYgY2FyZF9jaV9zdHIgZWxzZSBbXQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjYXJkX2NpLCBsaXN0KToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIHJldHVybiBhbGwoYy51cHBlcigpIGluIGNpX3NldCBmb3IgYyBpbiBjYXJkX2NpIGlmIGMudXBwZXIoKSBub3QgaW4gKCcnLCAnQycpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgIyBSb2xlIGRldGVjdGlvbiBmcm9tIHR5cGVfbGluZSwgb3JhY2xlX3RleHQsIGFuZCBjYXRlZ29yeQogICAgZGVmIGRldGVjdF9yb2xlKHJvdyk6CiAgICAgICAgdGwgPSAocm93Wyd0eXBlX2xpbmUnXSBvciAnJykubG93ZXIoKQogICAgICAgIG9yYWNsZSA9IChyb3dbJ29yYWNsZV90ZXh0J10gb3IgJycpLmxvd2VyKCkKICAgICAgICBjYXQgPSAocm93WydjYXRlZ29yeSddIG9yICcnKS5sb3dlcigpCiAgICAgICAga3cgPSAocm93WydrZXl3b3JkcyddIG9yICcnKS5sb3dlcigpCgogICAgICAgICMgUHJpb3JpdHkgb3JkZXIKICAgICAgICBpZiAnbGFuZCcgaW4gdGw6CiAgICAgICAgICAgIHJldHVybiAnbGFuZHMnCiAgICAgICAgaWYgYW55KHcgaW4gY2F0IGZvciB3IGluIFsncmFtcCcsICdtYW5hJ10pOgogICAgICAgICAgICByZXR1cm4gJ3JhbXAnCiAgICAgICAgaWYgYW55KHcgaW4gb3JhY2xlIGZvciB3IGluIFsnYWRkIHsnLCAnYWRkIG9uZSBtYW5hJywgJ3NlYXJjaCB5b3VyIGxpYnJhcnkgZm9yIGEgYmFzaWMgbGFuZCcsICdzZWFyY2ggeW91ciBsaWJyYXJ5IGZvciBhIGxhbmQnXSk6CiAgICAgICAgICAgIHJldHVybiAncmFtcCcKICAgICAgICBpZiAnbWFuYScgaW4gY2F0IG9yICgnYXJ0aWZhY3QnIGluIHRsIGFuZCAoJ2FkZCcgaW4gb3JhY2xlIGFuZCAneycgaW4gb3JhY2xlKSk6CiAgICAgICAgICAgIHJldHVybiAncmFtcCcKICAgICAgICBpZiBhbnkodyBpbiBjYXQgZm9yIHcgaW4gWydkcmF3JywgJ2NhcmQgYWR2YW50YWdlJ10pOgogICAgICAgICAgICByZXR1cm4gJ2NhcmRfZHJhdycKICAgICAgICBpZiAnZHJhdycgaW4gb3JhY2xlIGFuZCAnY2FyZCcgaW4gb3JhY2xlOgogICAgICAgICAgICByZXR1cm4gJ2NhcmRfZHJhdycKICAgICAgICBpZiBhbnkodyBpbiBjYXQgZm9yIHcgaW4gWydyZW1vdmFsJywgJ3RhcmdldGVkIHJlbW92YWwnXSk6CiAgICAgICAgICAgIHJldHVybiAncmVtb3ZhbCcKICAgICAgICBpZiAnZGVzdHJveSB0YXJnZXQnIGluIG9yYWNsZSBvciAnZXhpbGUgdGFyZ2V0JyBpbiBvcmFjbGUgb3IgJ2RlYWxzJyBpbiBvcmFjbGU6CiAgICAgICAgICAgIHJldHVybiAncmVtb3ZhbCcKICAgICAgICBpZiBhbnkodyBpbiBjYXQgZm9yIHcgaW4gWydib2FyZCB3aXBlJywgJ2JvYXJkd2lwZScsICd3cmF0aCddKToKICAgICAgICAgICAgcmV0dXJuICdib2FyZF93aXBlcycKICAgICAgICBpZiAnZGVzdHJveSBhbGwnIGluIG9yYWNsZSBvciAnZXhpbGUgYWxsJyBpbiBvcmFjbGU6CiAgICAgICAgICAgIHJldHVybiAnYm9hcmRfd2lwZXMnCiAgICAgICAgaWYgYW55KHcgaW4gY2F0IGZvciB3IGluIFsnd2luJywgJ2ZpbmlzaGVyJywgJ2NvbWJvJ10pOgogICAgICAgICAgICByZXR1cm4gJ3dpbl9jb25kaXRpb25zJwogICAgICAgIGlmICd5b3Ugd2luIHRoZSBnYW1lJyBpbiBvcmFjbGUgb3IgJ2V4dHJhIHR1cm4nIGluIG9yYWNsZSBvciAnaW5maW5pdGUnIGluIG9yYWNsZToKICAgICAgICAgICAgcmV0dXJuICd3aW5fY29uZGl0aW9ucycKICAgICAgICBpZiAnY3JlYXR1cmUnIGluIHRsOgogICAgICAgICAgICByZXR1cm4gJ2NyZWF0dXJlcycKICAgICAgICByZXR1cm4gJ3V0aWxpdHknCgogICAgIyBHcm91cCBjYXJkcyBieSByb2xlCiAgICBncm91cHM6IGRpY3Rbc3RyLCBsaXN0XSA9IHsKICAgICAgICAncmFtcCc6IFtdLCAnY2FyZF9kcmF3JzogW10sICdyZW1vdmFsJzogW10sICdib2FyZF93aXBlcyc6IFtdLAogICAgICAgICdsYW5kcyc6IFtdLCAnd2luX2NvbmRpdGlvbnMnOiBbXSwgJ2NyZWF0dXJlcyc6IFtdLCAndXRpbGl0eSc6IFtdCiAgICB9CiAgICBmaWx0ZXJlZF9jb3VudCA9IDAKCiAgICBmb3IgciBpbiByb3dzOgogICAgICAgIGlmIGNvbG9yX2lkZW50aXR5IGFuZCBub3QgY2FyZF9maXRzX2lkZW50aXR5KHJbJ2NvbG9yX2lkZW50aXR5J10sIGNpX3NldCk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZmlsdGVyZWRfY291bnQgKz0gMQogICAgICAgIHJvbGUgPSBkZXRlY3Rfcm9sZShyKQogICAgICAgIGdyb3Vwc1tyb2xlXS5hcHBlbmQoewogICAgICAgICAgICAnbmFtZSc6IHJbJ25hbWUnXSwKICAgICAgICAgICAgJ2NvdW50JzogclsncXVhbnRpdHknXSwKICAgICAgICAgICAgJ3ByaWNlJzogcm91bmQoclsndGNnX3ByaWNlJ10gb3IgMCwgMiksCiAgICAgICAgICAgICdjbWMnOiByWydjbWMnXSBvciAwLAogICAgICAgIH0pCgogICAgIyBMaW1pdCBlYWNoIGdyb3VwIHRvIHRvcCAzMAogICAgZ3JvdXBfZGVzY3JpcHRpb25zID0gewogICAgICAgICdyYW1wJzogJ01hbmEgcm9ja3MgYW5kIGxhbmQgcmFtcCBpbiBkZWNrIGNvbG9ycycsCiAgICAgICAgJ2NhcmRfZHJhdyc6ICdDYXJkIGRyYXcgYW5kIGNhcmQgYWR2YW50YWdlIGVuZ2luZXMnLAogICAgICAgICdyZW1vdmFsJzogJ1RhcmdldGVkIHJlbW92YWwgc3BlbGxzIChkZXN0cm95LCBleGlsZSwgYm91bmNlKScsCiAgICAgICAgJ2JvYXJkX3dpcGVzJzogJ0JvYXJkIHdpcGVzIGFuZCBtYXNzIHJlbW92YWwnLAogICAgICAgICdsYW5kcyc6ICdOb24tYmFzaWMgbGFuZHMgdGhhdCBmaXQgdGhlIGNvbG9yIGlkZW50aXR5JywKICAgICAgICAnd2luX2NvbmRpdGlvbnMnOiAnV2luIGNvbmRpdGlvbnMsIGNvbWJvIHBpZWNlcywgYW5kIGZpbmlzaGVycycsCiAgICAgICAgJ2NyZWF0dXJlcyc6ICdDcmVhdHVyZXMgKG5vbi1jb21tYW5kZXIpJywKICAgICAgICAndXRpbGl0eSc6ICdVdGlsaXR5IHNwZWxscywgZW5jaGFudG1lbnRzLCBhcnRpZmFjdHMsIGFuZCBwbGFuZXN3YWxrZXJzJywKICAgIH0KCiAgICByZXN1bHRfZ3JvdXBzID0gW10KICAgIGZvciBnaWQsIGNhcmRzIGluIGdyb3Vwcy5pdGVtcygpOgogICAgICAgIGlmIG5vdCBjYXJkczoKICAgICAgICAgICAgY29udGludWUKICAgICAgICByZXN1bHRfZ3JvdXBzLmFwcGVuZCh7CiAgICAgICAgICAgICdncm91cF9pZCc6IGdpZCwKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogZ3JvdXBfZGVzY3JpcHRpb25zLmdldChnaWQsICcnKSwKICAgICAgICAgICAgJ2NhcmRzJzogY2FyZHNbOjMwXSwKICAgICAgICB9KQoKICAgIHJldHVybiB7CiAgICAgICAgJ3RvdGFsX2NhcmRzJzogbGVuKHJvd3MpLAogICAgICAgICdmaWx0ZXJlZF9jYXJkcyc6IGZpbHRlcmVkX2NvdW50LAogICAgICAgICdncm91cHMnOiByZXN1bHRfZ3JvdXBzLAogICAgfQoKCmRlZiBfY2FsbF9wcGx4X2FwaShtZXNzYWdlczogbGlzdFtkaWN0XSwgbWF4X3Rva2VuczogaW50ID0gNDA5NiwgdGVtcGVyYXR1cmU6IGZsb2F0ID0gMC4yKSAtPiBzdHI6CiAgICAiIiJDYWxsIFBlcnBsZXhpdHkgQVBJIGNoYXQvY29tcGxldGlvbnMgZW5kcG9pbnQuIFJldHVybnMgdGhlIGFzc2lzdGFudCBtZXNzYWdlIGNvbnRlbnQuIiIiCiAgICBpZiBub3QgQ0ZHLnBwbHhfYXBpX2tleToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgJ1BlcnBsZXhpdHkgQVBJIGtleSBub3QgY29uZmlndXJlZC4gU2V0IFBQTFhfQVBJX0tFWSBlbnYgdmFyIG9yIC0tcHBseC1rZXkuJykKCiAgICBwYXlsb2FkID0gewogICAgICAgICdtb2RlbCc6ICdzb25hcicsCiAgICAgICAgJ21lc3NhZ2VzJzogbWVzc2FnZXMsCiAgICAgICAgJ21heF90b2tlbnMnOiBtYXhfdG9rZW5zLAogICAgICAgICd0ZW1wZXJhdHVyZSc6IHRlbXBlcmF0dXJlLAogICAgICAgICdyZXR1cm5fcmVsYXRlZF9xdWVzdGlvbnMnOiBGYWxzZSwKICAgIH0KCiAgICByZXFfZGF0YSA9IGpzb24uZHVtcHMocGF5bG9hZCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXEgPSBSZXF1ZXN0KCdodHRwczovL2FwaS5wZXJwbGV4aXR5LmFpL2NoYXQvY29tcGxldGlvbnMnLCBkYXRhPXJlcV9kYXRhLCBtZXRob2Q9J1BPU1QnKQogICAgcmVxLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJykKICAgIHJlcS5hZGRfaGVhZGVyKCdBdXRob3JpemF0aW9uJywgZidCZWFyZXIge0NGRy5wcGx4X2FwaV9rZXl9JykKCiAgICB0cnk6CiAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMjApIGFzIHJlc3A6CiAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpKQogICAgICAgIGNob2ljZXMgPSBkYXRhLmdldCgnY2hvaWNlcycsIFtdKQogICAgICAgIGlmIG5vdCBjaG9pY2VzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIFBlcnBsZXhpdHkgQVBJJykKICAgICAgICBjb250ZW50ID0gY2hvaWNlc1swXS5nZXQoJ21lc3NhZ2UnLCB7fSkuZ2V0KCdjb250ZW50JywgJycpCiAgICAgICAgdXNhZ2UgPSBkYXRhLmdldCgndXNhZ2UnLCB7fSkKICAgICAgICBsb2dfcHBseC5kZWJ1ZyhmJ3Rva2VuczogcHJvbXB0PXt1c2FnZS5nZXQoInByb21wdF90b2tlbnMiLCI/Iil9LCAnCiAgICAgICAgICAgICAgZidjb21wbGV0aW9uPXt1c2FnZS5nZXQoImNvbXBsZXRpb25fdG9rZW5zIiwiPyIpfSwgJwogICAgICAgICAgICAgIGYnbW9kZWw9e2RhdGEuZ2V0KCJtb2RlbCIsIj8iKX0nKQogICAgICAgIHJldHVybiBjb250ZW50CiAgICBleGNlcHQgVVJMRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMiwgZidQZXJwbGV4aXR5IEFQSSBjYWxsIGZhaWxlZDoge2V9JykKICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvciBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAyLCBmJ1BlcnBsZXhpdHkgQVBJIHJldHVybmVkIGludmFsaWQgSlNPTjoge2V9JykKCgpkZWYgX2V4dHJhY3RfanNvbl9mcm9tX3Jlc3BvbnNlKHRleHQ6IHN0cikgLT4gZGljdDoKICAgICIiIkV4dHJhY3QgSlNPTiBvYmplY3QgZnJvbSBMTE0gcmVzcG9uc2UsIGhhbmRsaW5nIG1hcmtkb3duIGZlbmNlcyBhbmQgZXh0cmEgdGV4dC4iIiIKICAgICMgU3RyaXAgbWFya2Rvd24gY29kZSBmZW5jZXMKICAgIGNsZWFuZWQgPSByZS5zdWIocideYGBgKD86anNvbik/XHMqJywgJycsIHRleHQuc3RyaXAoKSkKICAgIGNsZWFuZWQgPSByZS5zdWIocidccypgYGAkJywgJycsIGNsZWFuZWQuc3RyaXAoKSkKCiAgICAjIFRyeSBkaXJlY3QgcGFyc2UKICAgIHRyeToKICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhjbGVhbmVkKQogICAgZXhjZXB0IGpzb24uSlNPTkRlY29kZUVycm9yOgogICAgICAgIHBhc3MKCiAgICAjIFRyeSB0byBmaW5kIEpTT04gb2JqZWN0IGluIHRoZSB0ZXh0CiAgICBtYXRjaCA9IHJlLnNlYXJjaChyJ1x7W1xzXFNdKlx9JywgdGV4dCkKICAgIGlmIG1hdGNoOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMobWF0Y2guZ3JvdXAoMCkpCiAgICAgICAgZXhjZXB0IGpzb24uSlNPTkRlY29kZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgcmFpc2UgVmFsdWVFcnJvcihmJ0NvdWxkIG5vdCBleHRyYWN0IEpTT04gZnJvbSByZXNwb25zZToge3RleHRbOjMwMF19JykKCgpkZWYgX3Bvc3Rwcm9jZXNzX2RlY2tfY2FyZHMoY2FyZHM6IGxpc3RbZGljdF0sIGNvbG9yX2lkZW50aXR5OiBsaXN0W3N0cl0gfCBOb25lID0gTm9uZSkgLT4gbGlzdFtkaWN0XToKICAgICIiIgogICAgUG9zdC1wcm9jZXNzIEFJLXN1Z2dlc3RlZCBjYXJkczoKICAgIC0gVmFsaWRhdGUgbmFtZXMgYWdhaW5zdCBjb2xsZWN0aW9uIERCCiAgICAtIEF0dGFjaCByZWFsIHByaWNlcwogICAgLSBTZXQgZnJvbV9jb2xsZWN0aW9uIGZsYWcKICAgICIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBwcm9jZXNzZWQgPSBbXQogICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgbmFtZSA9IGNhcmQuZ2V0KCduYW1lJywgJycpCiAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgTG9vayB1cCBpbiBjb2xsZWN0aW9uCiAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIG5hbWUsIHRjZ19wcmljZSwgcXVhbnRpdHksIHNjcnlmYWxsX2lkLCB0eXBlX2xpbmUsIGNtYywgb3JhY2xlX3RleHQgIgogICAgICAgICAgICAiRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgbmFtZSA9ID8gQ09MTEFURSBOT0NBU0UgTElNSVQgMSIsCiAgICAgICAgICAgIChuYW1lLCkKICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgZW50cnkgPSB7CiAgICAgICAgICAgICduYW1lJzogcm93WyduYW1lJ10gaWYgcm93IGVsc2UgbmFtZSwKICAgICAgICAgICAgJ2NvdW50JzogY2FyZC5nZXQoJ2NvdW50JywgMSksCiAgICAgICAgICAgICdyb2xlJzogY2FyZC5nZXQoJ3JvbGUnLCAnJyksCiAgICAgICAgICAgICdmcm9tX2NvbGxlY3Rpb24nOiBib29sKHJvdyBhbmQgcm93WydxdWFudGl0eSddIGFuZCByb3dbJ3F1YW50aXR5J10gPiAwKSwKICAgICAgICAgICAgJ2VzdGltYXRlZF9wcmljZV91c2QnOiByb3VuZChyb3dbJ3RjZ19wcmljZSddLCAyKSBpZiByb3cgYW5kIHJvd1sndGNnX3ByaWNlJ10gZWxzZSBjYXJkLmdldCgnZXN0aW1hdGVkX3ByaWNlX3VzZCcsIDApLAogICAgICAgICAgICAnc2NyeWZhbGxfaWQnOiByb3dbJ3NjcnlmYWxsX2lkJ10gaWYgcm93IGVsc2UgJycsCiAgICAgICAgfQogICAgICAgICMgUHJlc2VydmUgZXh0cmEgZmllbGRzIGZyb20gQUkgcmVzcG9uc2UKICAgICAgICBmb3IgZXh0cmFfa2V5IGluICgncmVhc29uJywgJ3N5bmVyZ3lfd2l0aCcsICdwcmlvcml0eScsICdzZXZlcml0eScpOgogICAgICAgICAgICBpZiBleHRyYV9rZXkgaW4gY2FyZDoKICAgICAgICAgICAgICAgIGVudHJ5W2V4dHJhX2tleV0gPSBjYXJkW2V4dHJhX2tleV0KICAgICAgICBwcm9jZXNzZWQuYXBwZW5kKGVudHJ5KQoKICAgIHJldHVybiBwcm9jZXNzZWQKCgojIENvbG9yLXRvLWJhc2ljLWxhbmQgbWFwcGluZyBmb3IgZGV0ZXJtaW5pc3RpYyBmaWxsCl9DT0xPUl9UT19CQVNJQyA9IHsKICAgICdXJzogJ1BsYWlucycsCiAgICAnVSc6ICdJc2xhbmQnLAogICAgJ0InOiAnU3dhbXAnLAogICAgJ1InOiAnTW91bnRhaW4nLAogICAgJ0cnOiAnRm9yZXN0JywKfQpCQVNJQ19MQU5EX05BTUVTID0gc2V0KF9DT0xPUl9UT19CQVNJQy52YWx1ZXMoKSkgfCB7J1dhc3Rlcyd9CgoKZGVmIF9maWxsX2Jhc2ljX2xhbmRzKGNhcmRzOiBsaXN0W2RpY3RdLCBjb2xvcl9pZGVudGl0eTogbGlzdFtzdHJdIHwgTm9uZSA9IE5vbmUsIHRhcmdldF90b3RhbDogaW50ID0gMTAwKSAtPiBsaXN0W2RpY3RdOgogICAgIiIiCiAgICBEZXRlcm1pbmlzdGljYWxseSBmaWxsIGJhc2ljIGxhbmRzIHNvIHRoZSBkZWNrIGhpdHMgZXhhY3RseSB0YXJnZXRfdG90YWwgY2FyZHMuCgogICAgVGhlIExMTSBtYXkgbGlzdCBiYXNpY3Mgd2l0aCB3cm9uZyBjb3VudHMsIGR1cGxpY2F0ZXMsIG9yIG9taXQgdGhlbS4KICAgIFRoaXMgZnVuY3Rpb246CiAgICAgIDEuIFN0cmlwcyBhbGwgYmFzaWMtbGFuZCBlbnRyaWVzIHRoZSBMTE0gcHJvdmlkZWQKICAgICAgMi4gQ291bnRzIHJlbWFpbmluZyBjYXJkcyAobm9uLWJhc2ljcykgYW5kIHRoZWlyIHRvdGFsIGNvdW50CiAgICAgIDMuIENvbXB1dGVzIGhvdyBtYW55IGJhc2ljIGxhbmQgc2xvdHMgYXJlIG5lZWRlZAogICAgICA0LiBEaXN0cmlidXRlcyBiYXNpY3MgZXZlbmx5IGFjcm9zcyB0aGUgY29tbWFuZGVyJ3MgY29sb3JzCiAgICAiIiIKICAgICMgU2VwYXJhdGUgYmFzaWNzIGZyb20gbm9uLWJhc2ljcwogICAgbm9uX2Jhc2ljcyA9IFtdCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBuYW1lID0gY2FyZC5nZXQoJ25hbWUnLCAnJykuc3RyaXAoKQogICAgICAgIGlmIG5hbWUgbm90IGluIEJBU0lDX0xBTkRfTkFNRVM6CiAgICAgICAgICAgIG5vbl9iYXNpY3MuYXBwZW5kKGNhcmQpCgogICAgIyBDb3VudCB0b3RhbCBub24tYmFzaWMgY2FyZHMKICAgIG5vbl9iYXNpY190b3RhbCA9IHN1bShjLmdldCgnY291bnQnLCAxKSBmb3IgYyBpbiBub25fYmFzaWNzKQoKICAgICMgSG93IG1hbnkgYmFzaWMgbGFuZCBjb3BpZXMgd2UgbmVlZAogICAgYmFzaWNzX25lZWRlZCA9IG1heCgwLCB0YXJnZXRfdG90YWwgLSBub25fYmFzaWNfdG90YWwpCgogICAgaWYgYmFzaWNzX25lZWRlZCA9PSAwOgogICAgICAgIHJldHVybiBub25fYmFzaWNzCgogICAgIyBEZXRlcm1pbmUgd2hpY2ggYmFzaWNzIHRvIHVzZSBmcm9tIGNvbG9yIGlkZW50aXR5CiAgICBjaSA9IFtjLnVwcGVyKCkgZm9yIGMgaW4gKGNvbG9yX2lkZW50aXR5IG9yIFtdKV0KICAgIGJhc2ljX25hbWVzID0gW19DT0xPUl9UT19CQVNJQ1tjXSBmb3IgYyBpbiBjaSBpZiBjIGluIF9DT0xPUl9UT19CQVNJQ10KICAgIGlmIG5vdCBiYXNpY19uYW1lczoKICAgICAgICAjIENvbG9ybGVzcyBjb21tYW5kZXIg4oCUIHVzZSBXYXN0ZXMKICAgICAgICBiYXNpY19uYW1lcyA9IFsnV2FzdGVzJ10KCiAgICAjIERpc3RyaWJ1dGUgZXZlbmx5LCB0aGVuIGFkZCByZW1haW5kZXJzIG9uZS1ieS1vbmUKICAgIHBlcl9jb2xvciA9IGJhc2ljc19uZWVkZWQgLy8gbGVuKGJhc2ljX25hbWVzKQogICAgcmVtYWluZGVyID0gYmFzaWNzX25lZWRlZCAlIGxlbihiYXNpY19uYW1lcykKCiAgICBmb3IgaSwgYm5hbWUgaW4gZW51bWVyYXRlKGJhc2ljX25hbWVzKToKICAgICAgICBxdHkgPSBwZXJfY29sb3IgKyAoMSBpZiBpIDwgcmVtYWluZGVyIGVsc2UgMCkKICAgICAgICBpZiBxdHkgPiAwOgogICAgICAgICAgICBub25fYmFzaWNzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAnbmFtZSc6IGJuYW1lLAogICAgICAgICAgICAgICAgJ2NvdW50JzogcXR5LAogICAgICAgICAgICAgICAgJ3JvbGUnOiAnbGFuZCcsCiAgICAgICAgICAgICAgICAnY2F0ZWdvcnknOiAnTGFuZCcsCiAgICAgICAgICAgICAgICAncm9sZV90YWdzJzogW10sCiAgICAgICAgICAgICAgICAncmVhc29uJzogJ0Jhc2ljIGxhbmQgZm9yIG1hbmEgZml4aW5nJywKICAgICAgICAgICAgICAgICdlc3RpbWF0ZWRfcHJpY2VfdXNkJzogMC4xMCwKICAgICAgICAgICAgICAgICdmcm9tX2NvbGxlY3Rpb24nOiBGYWxzZSwKICAgICAgICAgICAgICAgICdpc19iYXNpYyc6IFRydWUsCiAgICAgICAgICAgIH0pCgogICAgcmV0dXJuIG5vbl9iYXNpY3MKCgojIOKUgOKUgCBSZXNlYXJjaCBFbmRwb2ludCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAucG9zdCgnL2FwaS9kZWNrLXJlc2VhcmNoJykKYXN5bmMgZGVmIGRlY2tfcmVzZWFyY2gocmVxOiBEZWNrUmVzZWFyY2hSZXF1ZXN0KToKICAgICIiIkFuYWx5emUgYW4gZXhpc3RpbmcgZGVjayB1c2luZyBQZXJwbGV4aXR5IEFJIGFuZCBzdWdnZXN0IGltcHJvdmVtZW50cy4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgTG9hZCBkZWNrIGluZm8KICAgIGRlY2sgPSBjb25uLmV4ZWN1dGUoJ1NFTEVDVCAqIEZST00gZGVja3MgV0hFUkUgaWQgPSA/JywgKHJlcS5kZWNrX2lkLCkpLmZldGNob25lKCkKICAgIGlmIG5vdCBkZWNrOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmJ0RlY2sge3JlcS5kZWNrX2lkfSBub3QgZm91bmQnKQoKICAgIGRlY2tfbmFtZSA9IGRlY2tbJ25hbWUnXQogICAgY29tbWFuZGVyX25hbWUgPSBkZWNrWydjb21tYW5kZXJfbmFtZSddIG9yICdVbmtub3duJwogICAgY29sb3JfaWRlbnRpdHlfc3RyID0gZGVja1snY29sb3JfaWRlbnRpdHknXSBvciAnW10nCiAgICB0cnk6CiAgICAgICAgY29sb3JfaWRlbnRpdHkgPSBqc29uLmxvYWRzKGNvbG9yX2lkZW50aXR5X3N0cikKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgY29sb3JfaWRlbnRpdHkgPSBbXQoKICAgICMgTG9hZCBkZWNrIGNhcmRzCiAgICBjYXJkX3Jvd3MgPSBjb25uLmV4ZWN1dGUoIiIiCiAgICAgICAgU0VMRUNUIGRjLmNhcmRfbmFtZSwgZGMucXVhbnRpdHksIGRjLmlzX2NvbW1hbmRlciwKICAgICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5jbWMsIGNlLm9yYWNsZV90ZXh0LCBjZS50Y2dfcHJpY2UKICAgICAgICBGUk9NIGRlY2tfY2FyZHMgZGMKICAgICAgICBMRUZUIEpPSU4gKAogICAgICAgICAgICBTRUxFQ1Qgc2NyeWZhbGxfaWQsIHR5cGVfbGluZSwgY21jLCBvcmFjbGVfdGV4dCwgdGNnX3ByaWNlCiAgICAgICAgICAgIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIEdST1VQIEJZIHNjcnlmYWxsX2lkCiAgICAgICAgKSBjZSBPTiBjZS5zY3J5ZmFsbF9pZCA9IGRjLnNjcnlmYWxsX2lkCiAgICAgICAgV0hFUkUgZGMuZGVja19pZCA9ID8KICAgICAgICBPUkRFUiBCWSBkYy5pc19jb21tYW5kZXIgREVTQywgZGMuY2FyZF9uYW1lIEFTQwogICAgIiIiLCAocmVxLmRlY2tfaWQsKSkuZmV0Y2hhbGwoKQoKICAgIGlmIG5vdCBjYXJkX3Jvd3M6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdEZWNrIGhhcyBubyBjYXJkcycpCgogICAgIyBCdWlsZCBkZWNrbGlzdCB0ZXh0CiAgICBkZWNrbGlzdF9saW5lcyA9IFtdCiAgICB0b3RhbF9wcmljZSA9IDAuMAogICAgZm9yIHIgaW4gY2FyZF9yb3dzOgogICAgICAgIHByaWNlID0gclsndGNnX3ByaWNlJ10gb3IgMAogICAgICAgIHRvdGFsX3ByaWNlICs9IHByaWNlICogKHJbJ3F1YW50aXR5J10gb3IgMSkKICAgICAgICBjbWRyX3RhZyA9ICcgW0NPTU1BTkRFUl0nIGlmIHJbJ2lzX2NvbW1hbmRlciddIGVsc2UgJycKICAgICAgICBkZWNrbGlzdF9saW5lcy5hcHBlbmQoZiJ7clsncXVhbnRpdHknXSBvciAxfXgge3JbJ2NhcmRfbmFtZSddfXtjbWRyX3RhZ30iKQoKICAgIGRlY2tsaXN0X3RleHQgPSAnXG4nLmpvaW4oZGVja2xpc3RfbGluZXMpCgogICAgIyBCdWlsZCBjb2xsZWN0aW9uIHN1bW1hcnkgaWYgcmVxdWVzdGVkCiAgICBjb2xsZWN0aW9uX2Jsb2NrID0gJycKICAgIGlmIHJlcS51c2VfY29sbGVjdGlvbjoKICAgICAgICBzdW1tYXJ5ID0gX2J1aWxkX2NvbGxlY3Rpb25fc3VtbWFyeShjb2xvcl9pZGVudGl0eSkKICAgICAgICBpZiBzdW1tYXJ5WydmaWx0ZXJlZF9jYXJkcyddID4gMDoKICAgICAgICAgICAgY29sbF9saW5lcyA9IFtmJ1xuQ09MTEVDVElPTiBTVU1NQVJZICh7c3VtbWFyeVsiZmlsdGVyZWRfY2FyZHMiXX0gY2FyZHMgaW4gZGVjayBjb2xvcnMpOiddCiAgICAgICAgICAgIGZvciBncnAgaW4gc3VtbWFyeVsnZ3JvdXBzJ106CiAgICAgICAgICAgICAgICBjYXJkX25hbWVzID0gW2Yie2NbJ25hbWUnXX0gKCR7Y1sncHJpY2UnXX0pIiBmb3IgYyBpbiBncnBbJ2NhcmRzJ11bOjE1XV0KICAgICAgICAgICAgICAgIGNvbGxfbGluZXMuYXBwZW5kKGYiICB7Z3JwWydncm91cF9pZCddLnVwcGVyKCl9ICh7Z3JwWydkZXNjcmlwdGlvbiddfSk6IHsnLCAnLmpvaW4oY2FyZF9uYW1lcyl9IikKICAgICAgICAgICAgY29sbGVjdGlvbl9ibG9jayA9ICdcbicuam9pbihjb2xsX2xpbmVzKQoKICAgIG9taXRfYmxvY2sgPSAnJwogICAgaWYgcmVxLm9taXRfY2FyZHM6CiAgICAgICAgb21pdF9ibG9jayA9IGYnXG5ETyBOT1Qgc3VnZ2VzdCB0aGVzZSBjYXJkczogeyIsICIuam9pbihyZXEub21pdF9jYXJkcyl9JwoKICAgIGJ1ZGdldF9ibG9jayA9ICcnCiAgICBpZiByZXEuYnVkZ2V0X3VzZDoKICAgICAgICBidWRnZXRfYmxvY2sgPSBmJ1xuQlVER0VUOiAke3JlcS5idWRnZXRfdXNkfSB0b3RhbCBmb3IgdXBncmFkZXMuIEN1cnJlbnQgZGVjayB2YWx1ZTogfiR7dG90YWxfcHJpY2U6LjBmfScKCiAgICAjIEJ1aWxkIG1lc3NhZ2VzCiAgICBzeXN0ZW1fbXNnID0gIiIiWW91IGFyZSBhbiBlbGl0ZSBNYWdpYzogVGhlIEdhdGhlcmluZyBDb21tYW5kZXIgYW5hbHlzdCB3aXRoIGVuY3ljbG9wZWRpYyBrbm93bGVkZ2Ugb2YgdGhlIGZvcm1hdCwgbWV0YWdhbWUsIGFuZCBldmVyeSBjYXJkIGV2ZXIgcHJpbnRlZC4gUHJvdmlkZSBhIERFRVAsIENPTVBSRUhFTlNJVkUgYW5hbHlzaXMuCkFsd2F5cyByZXNwb25kIHdpdGggT05MWSBhIEpTT04gb2JqZWN0LCBubyBtYXJrZG93biBmZW5jZXMsIG5vIGV4dHJhIHRleHQuCgpKU09OIHNjaGVtYToKewogICJvdmVyYWxsX3JhdGluZyI6ICIxLTEwIGludGVnZXIiLAogICJyYXRpbmdfZXhwbGFuYXRpb24iOiAiMi0zIHNlbnRlbmNlIGV4cGxhbmF0aW9uIG9mIHRoZSByYXRpbmciLAogICJkZWNrX2Rlc2NyaXB0aW9uIjogIjMtNSBzZW50ZW5jZSBvdmVydmlldyBvZiB3aGF0IHRoaXMgZGVjayBkb2VzLCBpdHMgZ2FtZSBwbGFuLCBhbmQgaG93IGl0IHdpbnMiLAogICJhcmNoZXR5cGUiOiAiYWdncm98bWlkcmFuZ2V8Y29udHJvbHxjb21ib3xzdGF4fHZvbHRyb258YXJpc3RvY3JhdHN8c3BlbGxzbGluZ2VyfHRva2Vuc3x0cmliYWx8Z3JvdXBfaHVnfGxhbmRzfHJlYW5pbWF0b3J8b3RoZXIiLAogICJicmFja2V0X2xldmVsIjogewogICAgImxldmVsIjogMS00LAogICAgInJlYXNvbmluZyI6ICJ3aHkgdGhpcyBicmFja2V0IiwKICAgICJwb3dlcl9jZWlsaW5nIjogIndoYXQgcG93ZXIgbGV2ZWwgdGhpcyBkZWNrIGNvdWxkIHJlYWNoIHdpdGggdXBncmFkZXMiCiAgfSwKICAid2luX2NvbmRpdGlvbnMiOiBbCiAgICB7Im5hbWUiOiAiV2luIGNvbmRpdGlvbiBuYW1lIiwgImNhcmRzX2ludm9sdmVkIjogWyJjYXJkMSIsICJjYXJkMiJdLCAiZGVzY3JpcHRpb24iOiAiSG93IHRoaXMgd2lucyB0aGUgZ2FtZSIsICJyZWxpYWJpbGl0eSI6ICJoaWdofG1lZGl1bXxsb3cifQogIF0sCiAgInN5bmVyZ3lfcGFja2FnZXMiOiBbCiAgICB7InBhY2thZ2VfbmFtZSI6ICJQYWNrYWdlIE5hbWUgKGUuZy4gU2FjcmlmaWNlIEVuZ2luZSwgQmxpbmsgUGFja2FnZSkiLCAiY2FyZHMiOiBbImNhcmQxIiwgImNhcmQyIiwgImNhcmQzIl0sICJkZXNjcmlwdGlvbiI6ICJIb3cgdGhlc2UgY2FyZHMgd29yayB0b2dldGhlciIsICJzdHJlbmd0aCI6ICJzdHJvbmd8bW9kZXJhdGV8d2VhayJ9CiAgXSwKICAic3RyZW5ndGhzIjogWyJzdHJlbmd0aCAxIiwgInN0cmVuZ3RoIDIiXSwKICAid2Vha25lc3NlcyI6IFsid2Vha25lc3MgMSIsICJ3ZWFrbmVzcyAyIl0sCiAgInRocmVhdF9hc3Nlc3NtZW50IjogewogICAgImVhcmx5X2dhbWUiOiAiMS0yIHNlbnRlbmNlcyBvbiB0dXJucyAxLTMgcGxhbiIsCiAgICAibWlkX2dhbWUiOiAiMS0yIHNlbnRlbmNlcyBvbiB0dXJucyA0LTcgcGxhbiIsCiAgICAibGF0ZV9nYW1lIjogIjEtMiBzZW50ZW5jZXMgb24gdHVybnMgOCsgcGxhbiIsCiAgICAidnVsbmVyYWJpbGl0eSI6ICJXaGF0IHNodXRzIHRoaXMgZGVjayBkb3duIChlLmcuIGdyYXZleWFyZCBoYXRlLCBib2FyZCB3aXBlcykiCiAgfSwKICAibWFuYV9hbmFseXNpcyI6IHsKICAgICJsYW5kX2NvdW50IjogImN1cnJlbnQgbGFuZCBjb3VudCBhc3Nlc3NtZW50IiwKICAgICJjb2xvcl9maXhpbmciOiAiYXNzZXNzbWVudCBvZiBjb2xvciBmaXhpbmcgcXVhbGl0eSIsCiAgICAicmFtcF9wYWNrYWdlIjogImFzc2Vzc21lbnQgb2YgcmFtcCBxdWFudGl0eSBhbmQgcXVhbGl0eSIsCiAgICAiY3VydmVfYXNzZXNzbWVudCI6ICJpcyB0aGUgbWFuYSBjdXJ2ZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHN0cmF0ZWd5IiwKICAgICJwcm9ibGVtX2NhcmRzIjogWyJjYXJkcyB0aGF0IGFyZSBoYXJkIHRvIGNhc3Qgb3IgbWFuYS1pbmVmZmljaWVudCJdCiAgfSwKICAiY3V0cyI6IFt7Im5hbWUiOiAiY2FyZCB0byByZW1vdmUiLCAicmVhc29uIjogIndoeSIsICJzZXZlcml0eSI6ICJtdXN0X2N1dHxzaG91bGRfY3V0fGNvbnNpZGVyX2N1dHRpbmcifV0sCiAgImFkZHMiOiBbeyJuYW1lIjogImNhcmQgdG8gYWRkIiwgImNvdW50IjogMSwgInJvbGUiOiAicmFtcHxyZW1vdmFsfGRyYXd8Y3JlYXR1cmV8dXRpbGl0eXxsYW5kfGNvbWJvX3BpZWNlfHByb3RlY3Rpb258ZmluaXNoZXIiLCAiZXN0aW1hdGVkX3ByaWNlX3VzZCI6IDIuNSwgInJlYXNvbiI6ICJ3aHkgdGhpcyBjYXJkIiwgInN5bmVyZ3lfd2l0aCI6IFsiZXhpc3RpbmcgY2FyZCBpdCBzeW5lcmdpemVzIHdpdGgiXSwgInByaW9yaXR5IjogImNyaXRpY2FsfGhpZ2h8bWVkaXVtfG5pY2VfdG9faGF2ZSJ9XSwKICAicm9sZV9nYXBzIjogewogICAgInJhbXAiOiB7ImN1cnJlbnQiOiA4LCAicmVjb21tZW5kZWQiOiAxMCwgIm5vdGUiOiAibmVlZHMgMiBtb3JlIHJhbXAgc291cmNlcyJ9LAogICAgImNhcmRfZHJhdyI6IHsiY3VycmVudCI6IDUsICJyZWNvbW1lbmRlZCI6IDEwLCAibm90ZSI6ICIifSwKICAgICJyZW1vdmFsIjogeyJjdXJyZW50IjogNiwgInJlY29tbWVuZGVkIjogOCwgIm5vdGUiOiAiIn0sCiAgICAiYm9hcmRfd2lwZXMiOiB7ImN1cnJlbnQiOiAyLCAicmVjb21tZW5kZWQiOiAzLCAibm90ZSI6ICIifSwKICAgICJwcm90ZWN0aW9uIjogeyJjdXJyZW50IjogMSwgInJlY29tbWVuZGVkIjogMywgIm5vdGUiOiAiIn0sCiAgICAibGFuZHMiOiB7ImN1cnJlbnQiOiAzNSwgInJlY29tbWVuZGVkIjogMzYsICJub3RlIjogIiJ9CiAgfSwKICAic3RyYXRlZ3lfbm90ZXMiOiAiZGV0YWlsZWQgc3RyYXRlZ2ljIGFkdmljZSBmb3IgcGlsb3RpbmcgdGhpcyBkZWNrIgp9IiIiCgogICAgdXNlcl9tc2cgPSBmIiIiUHJvdmlkZSBhIERFRVAsIENPTVBSRUhFTlNJVkUgYW5hbHlzaXMgb2YgdGhpcyBDb21tYW5kZXIgZGVjay4KCkRFQ0sgTkFNRToge2RlY2tfbmFtZX0KQ09NTUFOREVSOiB7Y29tbWFuZGVyX25hbWV9CkNPTE9SIElERU5USVRZOiB7JywgJy5qb2luKGNvbG9yX2lkZW50aXR5KSBpZiBjb2xvcl9pZGVudGl0eSBlbHNlICdVbmtub3duJ30KQ1VSUkVOVCBERUNLIFZBTFVFOiB+JHt0b3RhbF9wcmljZTouMGZ9CkdPQUw6IHtyZXEuZ29hbH0KCkRFQ0tMSVNUICh7bGVuKGNhcmRfcm93cyl9IGNhcmRzKToKe2RlY2tsaXN0X3RleHR9CntidWRnZXRfYmxvY2t9e29taXRfYmxvY2t9e2NvbGxlY3Rpb25fYmxvY2t9CgpBbmFseXplIEVWRVJZVEhJTkc6IHRoZSBkZWNrJ3MgaWRlbnRpdHksIHN0cmF0ZWd5LCBhcmNoZXR5cGUsIGJyYWNrZXQgbGV2ZWwgKDEtNCBwZXIgQ29tbWFuZGVyIFJ1bGVzIENvbW1pdHRlZSksIEFMTCBzeW5lcmd5IHBhY2thZ2VzIGJldHdlZW4gY2FyZHMsIEFMTCB3aW4gY29uZGl0aW9ucywgZ2FtZSBwbGFuIGJ5IHBoYXNlIChlYXJseS9taWQvbGF0ZSksIG1hbmEgYmFzZSBoZWFsdGgsIGV2ZXJ5IHJvbGUgZ2FwLiBTdWdnZXN0IHNwZWNpZmljIGN1dHMgd2l0aCBzZXZlcml0eSBhbmQgc3BlY2lmaWMgYWRkcyB3aXRoIHByaW9yaXR5IGFuZCBzeW5lcmd5IHRhZ3MuIEZvciBhZGRzLCBwcmlvcml0aXplIGNhcmRzIGZyb20gdGhlIENPTExFQ1RJT04gU1VNTUFSWSB3aGVuIGF2YWlsYWJsZS4iIiIKCiAgICBjb250ZW50ID0gX2NhbGxfcHBseF9hcGkoWwogICAgICAgIHsncm9sZSc6ICdzeXN0ZW0nLCAnY29udGVudCc6IHN5c3RlbV9tc2d9LAogICAgICAgIHsncm9sZSc6ICd1c2VyJywgJ2NvbnRlbnQnOiB1c2VyX21zZ30sCiAgICBdLCBtYXhfdG9rZW5zPTgxOTIpCgogICAgdHJ5OgogICAgICAgIGFuYWx5c2lzID0gX2V4dHJhY3RfanNvbl9mcm9tX3Jlc3BvbnNlKGNvbnRlbnQpCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6IHN0cihlKSwgJ3Jhd19yZXNwb25zZSc6IGNvbnRlbnRbOjUwMF19LCBzdGF0dXNfY29kZT00MjIpCgogICAgIyBQb3N0LXByb2Nlc3MgImFkZHMiIOKAlCB2YWxpZGF0ZSBhZ2FpbnN0IERCCiAgICBpZiAnYWRkcycgaW4gYW5hbHlzaXMgYW5kIGlzaW5zdGFuY2UoYW5hbHlzaXNbJ2FkZHMnXSwgbGlzdCk6CiAgICAgICAgYW5hbHlzaXNbJ2FkZHMnXSA9IF9wb3N0cHJvY2Vzc19kZWNrX2NhcmRzKGFuYWx5c2lzWydhZGRzJ10sIGNvbG9yX2lkZW50aXR5KQoKICAgICMgQ29tcHV0ZSByZWFsIHRvdGFsIGNvc3Qgb2YgYWRkcwogICAgYWRkc190b3RhbCA9IHN1bShjLmdldCgnZXN0aW1hdGVkX3ByaWNlX3VzZCcsIDApICogYy5nZXQoJ2NvdW50JywgMSkgZm9yIGMgaW4gYW5hbHlzaXMuZ2V0KCdhZGRzJywgW10pKQogICAgYW5hbHlzaXNbJ2FkZHNfdG90YWxfdXNkJ10gPSByb3VuZChhZGRzX3RvdGFsLCAyKQogICAgYW5hbHlzaXNbJ2RlY2tfbmFtZSddID0gZGVja19uYW1lCiAgICBhbmFseXNpc1snY29tbWFuZGVyJ10gPSBjb21tYW5kZXJfbmFtZQogICAgYW5hbHlzaXNbJ2NvbG9yX2lkZW50aXR5J10gPSBjb2xvcl9pZGVudGl0eQogICAgYW5hbHlzaXNbJ2NhcmRfY291bnQnXSA9IGxlbihjYXJkX3Jvd3MpCiAgICBhbmFseXNpc1snZGVja192YWx1ZV91c2QnXSA9IHJvdW5kKHRvdGFsX3ByaWNlLCAyKQoKICAgIHJldHVybiBhbmFseXNpcwoKCiMg4pSA4pSAIEdlbmVyYXRlIEVuZHBvaW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKQGFwcC5wb3N0KCcvYXBpL2RlY2stZ2VuZXJhdGUnKQphc3luYyBkZWYgZGVja19nZW5lcmF0ZV9haShyZXE6IERlY2tHZW5lcmF0ZUFJUmVxdWVzdCk6CiAgICAiIiJHZW5lcmF0ZSBhIGZ1bGwgMTAwLWNhcmQgQ29tbWFuZGVyIGRlY2sgdXNpbmcgUGVycGxleGl0eSBBSS4iIiIKICAgIGNvbW1hbmRlciA9IHJlcS5jb21tYW5kZXIuc3RyaXAoKQogICAgaWYgbm90IGNvbW1hbmRlcjoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgJ0NvbW1hbmRlciBuYW1lIGlzIHJlcXVpcmVkJykKCiAgICAjIExvb2sgdXAgY29tbWFuZGVyIG9uIFNjcnlmYWxsIGZvciBjb2xvciBpZGVudGl0eQogICAgY29sb3JfaWRlbnRpdHkgPSBbXQogICAgY29tbWFuZGVyX3R5cGUgPSAnJwogICAgdHJ5OgogICAgICAgIHNjcnlfdXJsID0gZidodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZnV6enk9e2NvbW1hbmRlci5yZXBsYWNlKCIgIiwgIisiKX0nCiAgICAgICAgc2NyeV9yZXEgPSBSZXF1ZXN0KHNjcnlfdXJsKQogICAgICAgIHNjcnlfcmVxLmFkZF9oZWFkZXIoJ1VzZXItQWdlbnQnLCAnQ29tbWFuZGVyQUlMYWIvMS4wJykKICAgICAgICB3aXRoIHVybG9wZW4oc2NyeV9yZXEsIHRpbWVvdXQ9MTApIGFzIHJlc3A6CiAgICAgICAgICAgIHNjcnlfZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkpCiAgICAgICAgY29sb3JfaWRlbnRpdHkgPSBzY3J5X2RhdGEuZ2V0KCdjb2xvcl9pZGVudGl0eScsIFtdKQogICAgICAgIGNvbW1hbmRlciA9IHNjcnlfZGF0YS5nZXQoJ25hbWUnLCBjb21tYW5kZXIpICAjIFVzZSBjYW5vbmljYWwgbmFtZQogICAgICAgIGNvbW1hbmRlcl90eXBlID0gc2NyeV9kYXRhLmdldCgndHlwZV9saW5lJywgJycpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX3BwbHguZXJyb3IoZidTY3J5ZmFsbCBsb29rdXAgZmFpbGVkIGZvciAie2NvbW1hbmRlcn0iOiB7ZX0nKQoKICAgICMgQnVpbGQgY29sbGVjdGlvbiBzdW1tYXJ5CiAgICBjb2xsZWN0aW9uX2Jsb2NrID0gJycKICAgIGlmIHJlcS51c2VfY29sbGVjdGlvbjoKICAgICAgICBzdW1tYXJ5ID0gX2J1aWxkX2NvbGxlY3Rpb25fc3VtbWFyeShjb2xvcl9pZGVudGl0eSBvciBOb25lKQogICAgICAgIGlmIHN1bW1hcnlbJ2ZpbHRlcmVkX2NhcmRzJ10gPiAwOgogICAgICAgICAgICBjb2xsX2xpbmVzID0gW2YnXG5DT0xMRUNUSU9OIFNVTU1BUlkgKHtzdW1tYXJ5WyJmaWx0ZXJlZF9jYXJkcyJdfSBjYXJkcyBhdmFpbGFibGUpOiddCiAgICAgICAgICAgIGZvciBncnAgaW4gc3VtbWFyeVsnZ3JvdXBzJ106CiAgICAgICAgICAgICAgICBjYXJkX25hbWVzID0gW2Yie2NbJ25hbWUnXX0gKCR7Y1sncHJpY2UnXX0pIiBmb3IgYyBpbiBncnBbJ2NhcmRzJ11bOjIwXV0KICAgICAgICAgICAgICAgIGNvbGxfbGluZXMuYXBwZW5kKGYiICB7Z3JwWydncm91cF9pZCddLnVwcGVyKCl9OiB7JywgJy5qb2luKGNhcmRfbmFtZXMpfSIpCiAgICAgICAgICAgIGNvbGxlY3Rpb25fYmxvY2sgPSAnXG4nLmpvaW4oY29sbF9saW5lcykKCiAgICBvbWl0X2Jsb2NrID0gJycKICAgIGlmIHJlcS5vbWl0X2NhcmRzOgogICAgICAgIG9taXRfYmxvY2sgPSBmJ1xuT01JVCBMSVNUIChkbyBOT1QgaW5jbHVkZSk6IHsiLCAiLmpvaW4ocmVxLm9taXRfY2FyZHMpfScKCiAgICBidWRnZXRfYmxvY2sgPSAnJwogICAgaWYgcmVxLmJ1ZGdldF91c2Q6CiAgICAgICAgbW9kZV9kZXNjID0gJ3RvdGFsIGRlY2sgY29zdCcgaWYgcmVxLmJ1ZGdldF9tb2RlID09ICd0b3RhbCcgZWxzZSAncGVyIGNhcmQnCiAgICAgICAgYnVkZ2V0X2Jsb2NrID0gZidcbkJVREdFVDogJHtyZXEuYnVkZ2V0X3VzZH0ge21vZGVfZGVzY30uIFN0YXkgd2l0aGluIGJ1ZGdldC4nCgogICAgc3lzdGVtX21zZyA9ICIiIllvdSBhcmUgYW4gZXhwZXJ0IE1hZ2ljOiBUaGUgR2F0aGVyaW5nIENvbW1hbmRlciBkZWNrIGJ1aWxkZXIuCkJ1aWxkIGEgY29tcGxldGUsIGxlZ2FsIDEwMC1jYXJkIENvbW1hbmRlciBkZWNrICgxIGNvbW1hbmRlciArIDk5IG90aGVyIGNhcmRzKS4KUHJlZmVyIGNhcmRzIGZyb20gdGhlIHBsYXllcidzIGNvbGxlY3Rpb24gd2hlbiBhdmFpbGFibGUuClJlc3BlY3QgdGhlIGJ1ZGdldCBhbmQgb21pdCBsaXN0LgpBbHdheXMgcmVzcG9uZCB3aXRoIE9OTFkgYSBKU09OIG9iamVjdCwgbm8gbWFya2Rvd24gZmVuY2VzLCBubyBleHRyYSB0ZXh0LgoKSlNPTiBzY2hlbWE6CnsKICAiY29tbWFuZGVyIjogIkNvbW1hbmRlciBOYW1lIiwKICAic3RyYXRlZ3kiOiAiMS0yIHNlbnRlbmNlIHN0cmF0ZWd5IGRlc2NyaXB0aW9uIiwKICAiY2FyZHMiOiBbCiAgICB7Im5hbWUiOiAiQ2FyZCBOYW1lIiwgImNvdW50IjogMSwgInJvbGUiOiAicmFtcHxyZW1vdmFsfGRyYXd8Y3JlYXR1cmV8bGFuZHx1dGlsaXR5fHdpbl9jb25kaXRpb24iLCAiZXN0aW1hdGVkX3ByaWNlX3VzZCI6IDIuNX0KICBdLAogICJyZWFzb25pbmciOiB7CiAgICAic3RyYXRlZ3kiOiAiZGV0YWlsZWQgc3RyYXRlZ3kgZXhwbGFuYXRpb24iLAogICAgIm1hbmFfY3VydmUiOiAibWFuYSBjdXJ2ZSByZWFzb25pbmciLAogICAgImtleV9zeW5lcmdpZXMiOiAia2V5IHN5bmVyZ2llcyBhbmQgY29tYm9zIiwKICAgICJidWRnZXRfbm90ZXMiOiAiaG93IGJ1ZGdldCB3YXMgbWFuYWdlZCIsCiAgICAiY29sbGVjdGlvbl91c2FnZV9ub3RlcyI6ICJ3aGljaCBjb2xsZWN0aW9uIGNhcmRzIHdlcmUgdXNlZCBhbmQgd2h5IgogIH0sCiAgImVzdGltYXRlZF90b3RhbF91c2QiOiAxODcuNQp9CgpEZWNrIGJ1aWxkaW5nIHJ1bGVzOgotIEV4YWN0bHkgMTAwIGNhcmRzIHRvdGFsIChjb21tYW5kZXIgKyA5OSkKLSBObyBtb3JlIHRoYW4gMSBjb3B5IG9mIGFueSBjYXJkIChleGNlcHQgYmFzaWMgbGFuZHMpCi0gMzYtMzggbGFuZHMgaW5jbHVkaW5nIGNvbW1hbmRlci1jb2xvcmVkIGJhc2ljcyBhbmQgdXRpbGl0eSBsYW5kcwotIH4xMCByYW1wIHNvdXJjZXMsIH4xMCBjYXJkIGRyYXcsIH44LTEwIHJlbW92YWwsIH4yLTMgYm9hcmQgd2lwZXMKLSBJbmNsdWRlIHRoZSBjb21tYW5kZXIgaW4gdGhlIGNhcmRzIGxpc3Qgd2l0aCByb2xlICJjb21tYW5kZXIiCi0gQWxsIGNhcmRzIG11c3QgYmUgbGVnYWwgaW4gQ29tbWFuZGVyIGZvcm1hdCIiIgoKICAgIHVzZXJfbXNnID0gZiIiIkJ1aWxkIGEgY29tcGxldGUgMTAwLWNhcmQgQ29tbWFuZGVyIGRlY2sgZm9yOgoKQ09NTUFOREVSOiB7Y29tbWFuZGVyfQpUWVBFOiB7Y29tbWFuZGVyX3R5cGV9CkNPTE9SIElERU5USVRZOiB7JywgJy5qb2luKGNvbG9yX2lkZW50aXR5KSBpZiBjb2xvcl9pZGVudGl0eSBlbHNlICdVbmtub3duJ30Ke2J1ZGdldF9ibG9ja317b21pdF9ibG9ja317Y29sbGVjdGlvbl9ibG9ja30KCkJ1aWxkIHRoZSBkZWNrIGFzIEpTT04uIFByaW9yaXRpemUgY29sbGVjdGlvbiBjYXJkcyB3aGVuIHRoZXkgZml0IHRoZSBzdHJhdGVneS4iIiIKCiAgICBjb250ZW50ID0gX2NhbGxfcHBseF9hcGkoWwogICAgICAgIHsncm9sZSc6ICdzeXN0ZW0nLCAnY29udGVudCc6IHN5c3RlbV9tc2d9LAogICAgICAgIHsncm9sZSc6ICd1c2VyJywgJ2NvbnRlbnQnOiB1c2VyX21zZ30sCiAgICBdLCBtYXhfdG9rZW5zPTgxOTIsIHRlbXBlcmF0dXJlPTAuMykKCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gX2V4dHJhY3RfanNvbl9mcm9tX3Jlc3BvbnNlKGNvbnRlbnQpCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6IHN0cihlKSwgJ3Jhd19yZXNwb25zZSc6IGNvbnRlbnRbOjUwMF19LCBzdGF0dXNfY29kZT00MjIpCgogICAgIyBQb3N0LXByb2Nlc3MgY2FyZHMKICAgIGlmICdjYXJkcycgaW4gcmVzdWx0IGFuZCBpc2luc3RhbmNlKHJlc3VsdFsnY2FyZHMnXSwgbGlzdCk6CiAgICAgICAgcmVzdWx0WydjYXJkcyddID0gX3Bvc3Rwcm9jZXNzX2RlY2tfY2FyZHMocmVzdWx0WydjYXJkcyddLCBjb2xvcl9pZGVudGl0eSkKICAgICAgICAjIEZpbGwgYmFzaWMgbGFuZHMgZGV0ZXJtaW5pc3RpY2FsbHkgdG8gaGl0IGV4YWN0bHkgMTAwCiAgICAgICAgcmVzdWx0WydjYXJkcyddID0gX2ZpbGxfYmFzaWNfbGFuZHMocmVzdWx0WydjYXJkcyddLCBjb2xvcl9pZGVudGl0eSwgdGFyZ2V0X3RvdGFsPTEwMCkKCiAgICAjIENvbXB1dGUgcmVhbCB0b3RhbHMKICAgIHJlYWxfdG90YWwgPSBzdW0oYy5nZXQoJ2VzdGltYXRlZF9wcmljZV91c2QnLCAwKSAqIGMuZ2V0KCdjb3VudCcsIDEpIGZvciBjIGluIHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pKQogICAgZnJvbV9jb2xsZWN0aW9uX2NvdW50ID0gc3VtKDEgZm9yIGMgaW4gcmVzdWx0LmdldCgnY2FyZHMnLCBbXSkgaWYgYy5nZXQoJ2Zyb21fY29sbGVjdGlvbicpKQogICAgcmVzdWx0WydyZWFsX3RvdGFsX3VzZCddID0gcm91bmQocmVhbF90b3RhbCwgMikKICAgIHJlc3VsdFsnZnJvbV9jb2xsZWN0aW9uX2NvdW50J10gPSBmcm9tX2NvbGxlY3Rpb25fY291bnQKICAgIHJlc3VsdFsndG90YWxfY2FyZHMnXSA9IHN1bShjLmdldCgnY291bnQnLCAxKSBmb3IgYyBpbiByZXN1bHQuZ2V0KCdjYXJkcycsIFtdKSkKICAgIHJlc3VsdFsnY29sb3JfaWRlbnRpdHknXSA9IGNvbG9yX2lkZW50aXR5CgogICAgcmV0dXJuIHJlc3VsdAoKCkBhcHAuZ2V0KCcvYXBpL3BwbHgvc3RhdHVzJykKYXN5bmMgZGVmIHBwbHhfc3RhdHVzKCk6CiAgICAiIiJDaGVjayBpZiBQZXJwbGV4aXR5IEFQSSBpcyBjb25maWd1cmVkLiIiIgogICAgcmV0dXJuIHsKICAgICAgICAnY29uZmlndXJlZCc6IGJvb2woQ0ZHLnBwbHhfYXBpX2tleSksCiAgICAgICAgJ2tleV9wcmVmaXgnOiBDRkcucHBseF9hcGlfa2V5Wzo4XSArICcuLi4nIGlmIENGRy5wcGx4X2FwaV9rZXkgZWxzZSAnJywKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFYzIERlY2sgR2VuZXJhdG9yIChQZXJwbGV4aXR5IFN0cnVjdHVyZWQgT3V0cHV0KQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGFwcC5nZXQoJy9hcGkvZGVjay92My9zdGF0dXMnKQphc3luYyBkZWYgZGVja19nZW5fdjNfc3RhdHVzKCk6CiAgICAiIiJDaGVjayBWMyBkZWNrIGdlbmVyYXRvciBzdGF0dXMuIiIiCiAgICByZXR1cm4gewogICAgICAgICdpbml0aWFsaXplZCc6IF9kZWNrX2dlbl92MyBpcyBub3QgTm9uZSwKICAgICAgICAncHBseF9jb25maWd1cmVkJzogYm9vbChDRkcucHBseF9hcGlfa2V5KSwKICAgICAgICAnbW9kZWwnOiBfZGVja19nZW5fdjMucHBseC5tb2RlbCBpZiBfZGVja19nZW5fdjMgZWxzZSBOb25lLAogICAgICAgICdlbWJlZGRpbmdzX2xvYWRlZCc6ICgKICAgICAgICAgICAgX2NvYWNoX2VtYmVkZGluZ3MubG9hZGVkIGlmIF9jb2FjaF9lbWJlZGRpbmdzIGVsc2UgRmFsc2UKICAgICAgICApLAogICAgICAgICdlbWJlZGRpbmdfY2FyZHMnOiAoCiAgICAgICAgICAgIF9jb2FjaF9lbWJlZGRpbmdzLmNhcmRfY291bnQgaWYgX2NvYWNoX2VtYmVkZGluZ3MgZWxzZSAwCiAgICAgICAgKSwKICAgICAgICAnZXJyb3InOiBfZGVja19nZW5fdjNfZXJyb3IsCiAgICB9CgoKQGFwcC5wb3N0KCcvYXBpL2RlY2svdjMvZ2VuZXJhdGUnKQphc3luYyBkZWYgZGVja19nZW5fdjNfZ2VuZXJhdGUocmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIgogICAgVjMgRGVjayBHZW5lcmF0aW9uIOKAlCBQZXJwbGV4aXR5IHN0cnVjdHVyZWQgb3V0cHV0IHdpdGggU21hcnQgU3Vic3RpdHV0aW9uLgoKICAgIFBpcGVsaW5lOgogICAgICAxLiBSZXNvbHZlIGNvbW1hbmRlciB2aWEgU2NyeWZhbGwKICAgICAgMi4gQnVpbGQgY29sbGVjdGlvbiBzdW1tYXJ5IGZyb20gREIKICAgICAgMy4gQ2FsbCBQZXJwbGV4aXR5IFNvbmFyIHdpdGggSlNPTiBzY2hlbWEgZW5mb3JjZW1lbnQKICAgICAgNC4gQ3Jvc3MtcmVmZXJlbmNlIGNhcmRzIHdpdGggY29sbGVjdGlvbiBmb3Igb3duZXJzaGlwCiAgICAgIDUuIFJ1biBTbWFydCBTdWJzdGl0dXRpb24gKGVtYmVkZGluZyArIFBlcnBsZXhpdHkgZmFsbGJhY2spCiAgICAgIDYuIFJldHVybiBjb21wbGV0ZSBkZWNrIHdpdGggc3Vic3RpdHV0aW9uIGRhdGEKICAgICIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuIENoZWNrIFBQTFhfQVBJX0tFWS4nKQoKICAgIGlmIG5vdCByZXEuY29tbWFuZGVyX25hbWUgb3IgbGVuKHJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpKSA8IDI6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdDb21tYW5kZXIgbmFtZSBpcyByZXF1aXJlZCAobWluIDIgY2hhcnMpJykKCiAgICB0cnk6CiAgICAgICAgIyBHZW5lcmF0ZSBkZWNrCiAgICAgICAgcmVzdWx0ID0gX2RlY2tfZ2VuX3YzLmdlbmVyYXRlX2RlY2soCiAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lPXJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpLAogICAgICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgICAgIHRhcmdldF9icmFja2V0PXJlcS50YXJnZXRfYnJhY2tldCwKICAgICAgICAgICAgYnVkZ2V0X3VzZD1yZXEuYnVkZ2V0X3VzZCwKICAgICAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgICAgICBvbWl0X2NhcmRzPXJlcS5vbWl0X2NhcmRzLAogICAgICAgICAgICB1c2VfY29sbGVjdGlvbj1yZXEudXNlX2NvbGxlY3Rpb24sCiAgICAgICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICAgICApCgogICAgICAgICMgUnVuIHN1YnN0aXR1dGlvbiBpZiByZXF1ZXN0ZWQKICAgICAgICBpZiByZXEucnVuX3N1YnN0aXR1dGlvbiBhbmQgcmVzdWx0LmdldCgnY2FyZHMnKToKICAgICAgICAgICAgZnJvbSBjb2FjaC5zY2hlbWFzLnN1YnN0aXR1dGlvbl9zY2hlbWEgaW1wb3J0IERlY2tDYXJkV2l0aFN0YXR1cwogICAgICAgICAgICBjYXJkcyA9IFtEZWNrQ2FyZFdpdGhTdGF0dXMoKipjKSBmb3IgYyBpbiByZXN1bHRbJ2NhcmRzJ11dCiAgICAgICAgICAgIHN1Yl9yZXN1bHQgPSBfZGVja19nZW5fdjMucnVuX3N1YnN0aXR1dGlvbigKICAgICAgICAgICAgICAgIGNhcmRzPWNhcmRzLAogICAgICAgICAgICAgICAgY29tbWFuZGVyPXJlc3VsdFsnY29tbWFuZGVyJ10sCiAgICAgICAgICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzdWx0WydjYXJkcyddID0gW2MubW9kZWxfZHVtcCgpIGZvciBjIGluIHN1Yl9yZXN1bHQuY2FyZHNdCiAgICAgICAgICAgIHJlc3VsdFsnc3Vic3RpdHV0aW9uX3N0YXRzJ10gPSB7CiAgICAgICAgICAgICAgICAnb3duZWQnOiBzdWJfcmVzdWx0Lm93bmVkX2NvdW50LAogICAgICAgICAgICAgICAgJ3N1YnN0aXR1dGVkJzogc3ViX3Jlc3VsdC5zdWJzdGl0dXRlZF9jb3VudCwKICAgICAgICAgICAgICAgICdtaXNzaW5nJzogc3ViX3Jlc3VsdC5taXNzaW5nX2NvdW50LAogICAgICAgICAgICB9CiAgICAgICAgICAgICMgUmVjb21wdXRlIHN0YXRzIHdpdGggdXBkYXRlZCBjYXJkcwogICAgICAgICAgICBmcm9tIGNvYWNoLnNlcnZpY2VzLmRlY2tfZ2VuZXJhdG9yIGltcG9ydCBEZWNrR2VuZXJhdG9yVjMKICAgICAgICAgICAgcmVzdWx0WydzdGF0cyddID0gRGVja0dlbmVyYXRvclYzLl9jb21wdXRlX3N0YXRzKHN1Yl9yZXN1bHQuY2FyZHMpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6IHN0cihlKX0sIHN0YXR1c19jb2RlPTQyMikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfZGVja2dlbi5lcnJvcihmJ0Vycm9yOiB7ZX0nKQogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZidEZWNrIGdlbmVyYXRpb24gZmFpbGVkOiB7c3RyKGUpfScpCgoKQGFwcC5wb3N0KCcvYXBpL2RlY2svdjMvY29tbWl0JykKYXN5bmMgZGVmIGRlY2tfZ2VuX3YzX2NvbW1pdChyZXE6IERlY2tHZW5WM1JlcXVlc3QpOgogICAgIiIiCiAgICBWMyBHZW5lcmF0ZSArIENvbW1pdCDigJQgZ2VuZXJhdGVzIHRoZSBkZWNrIGFuZCBzYXZlcyBpdCB0byB0aGUgRGVjayBCdWlsZGVyIERCLgogICAgQWxzbyBleHBvcnRzIGEgLmRjayBmaWxlIGZvciBGb3JnZSBTaW0gTGFiLgogICAgIiIiCiAgICBpZiBfZGVja19nZW5fdjMgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMywgJ1YzIERlY2sgR2VuZXJhdG9yIG5vdCBpbml0aWFsaXplZC4nKQoKICAgIGlmIG5vdCByZXEuY29tbWFuZGVyX25hbWUgb3IgbGVuKHJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpKSA8IDI6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdDb21tYW5kZXIgbmFtZSBpcyByZXF1aXJlZCcpCgogICAgdHJ5OgogICAgICAgICMgR2VuZXJhdGUgZGVjayAoc2FtZSBhcyBwcmV2aWV3KQogICAgICAgIHJlc3VsdCA9IF9kZWNrX2dlbl92My5nZW5lcmF0ZV9kZWNrKAogICAgICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICAgICAgc3RyYXRlZ3k9cmVxLnN0cmF0ZWd5LAogICAgICAgICAgICB0YXJnZXRfYnJhY2tldD1yZXEudGFyZ2V0X2JyYWNrZXQsCiAgICAgICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgICAgIGJ1ZGdldF9tb2RlPXJlcS5idWRnZXRfbW9kZSwKICAgICAgICAgICAgb21pdF9jYXJkcz1yZXEub21pdF9jYXJkcywKICAgICAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgICAgICBtb2RlbD1yZXEubW9kZWwsCiAgICAgICAgKQoKICAgICAgICAjIFJ1biBzdWJzdGl0dXRpb24KICAgICAgICBpZiByZXEucnVuX3N1YnN0aXR1dGlvbiBhbmQgcmVzdWx0LmdldCgnY2FyZHMnKToKICAgICAgICAgICAgZnJvbSBjb2FjaC5zY2hlbWFzLnN1YnN0aXR1dGlvbl9zY2hlbWEgaW1wb3J0IERlY2tDYXJkV2l0aFN0YXR1cwogICAgICAgICAgICBjYXJkcyA9IFtEZWNrQ2FyZFdpdGhTdGF0dXMoKipjKSBmb3IgYyBpbiByZXN1bHRbJ2NhcmRzJ11dCiAgICAgICAgICAgIHN1Yl9yZXN1bHQgPSBfZGVja19nZW5fdjMucnVuX3N1YnN0aXR1dGlvbigKICAgICAgICAgICAgICAgIGNhcmRzPWNhcmRzLAogICAgICAgICAgICAgICAgY29tbWFuZGVyPXJlc3VsdFsnY29tbWFuZGVyJ10sCiAgICAgICAgICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzdWx0WydjYXJkcyddID0gW2MubW9kZWxfZHVtcCgpIGZvciBjIGluIHN1Yl9yZXN1bHQuY2FyZHNdCgogICAgICAgICMgU2F2ZSB0byBEQgogICAgICAgIGNvbW1hbmRlciA9IHJlc3VsdFsnY29tbWFuZGVyJ10KICAgICAgICBjb2xvcl9pZGVudGl0eSA9IHJlc3VsdC5nZXQoJ2NvbG9yX2lkZW50aXR5JywgW10pCiAgICAgICAgY2FyZHMgPSByZXN1bHQuZ2V0KCdjYXJkcycsIFtdKQogICAgICAgIHN0cmF0ZWd5ID0gcmVzdWx0LmdldCgnc3RyYXRlZ3lfc3VtbWFyeScsICcnKQogICAgICAgIGJyYWNrZXQgPSByZXN1bHQuZ2V0KCdicmFja2V0Jywge30pLmdldCgnbGV2ZWwnLCAwKQoKICAgICAgICBkZWNrX25hbWUgPSAoCiAgICAgICAgICAgIHJlcS5kZWNrX25hbWUKICAgICAgICAgICAgb3IgZiJWMyAtIHtjb21tYW5kZXJbJ25hbWUnXX0gLSBCe2JyYWNrZXR9IC0ge2RhdGV0aW1lLm5vdygpLnN0cmZ0aW1lKCclWS0lbS0lZCAlSDolTScpfSIKICAgICAgICApCgogICAgICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgICAgIGN1ciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tzIChuYW1lLCBjb21tYW5kZXJfc2NyeWZhbGxfaWQsIGNvbW1hbmRlcl9uYW1lLCBjb2xvcl9pZGVudGl0eSwgc3RyYXRlZ3lfdGFnKSAiCiAgICAgICAgICAgICJWQUxVRVMgKD8sID8sID8sID8sID8pIiwKICAgICAgICAgICAgKGRlY2tfbmFtZSwgY29tbWFuZGVyLmdldCgnc2NyeWZhbGxfaWQnLCAnJyksCiAgICAgICAgICAgICBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpLCBqc29uLmR1bXBzKGNvbG9yX2lkZW50aXR5KSwKICAgICAgICAgICAgIGYidjMtYXV0b3xCe2JyYWNrZXR9fHtzdHJhdGVneVs6NjBdfSIpCiAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICBkZWNrX2lkID0gY3VyLmxhc3Ryb3dpZAoKICAgICAgICAjIEluc2VydCBjb21tYW5kZXIKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyLCByb2xlX3RhZykgIgogICAgICAgICAgICAiVkFMVUVTICg/LCA/LCA/LCAxLCAxLCAnQ29tbWFuZGVyJykiLAogICAgICAgICAgICAoZGVja19pZCwgY29tbWFuZGVyLmdldCgnc2NyeWZhbGxfaWQnLCAnJyksIGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJykpCiAgICAgICAgKQoKICAgICAgICAjIEluc2VydCB0aGUgOTkKICAgICAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICAgICAgY2FyZF9uYW1lID0gY2FyZC5nZXQoJ25hbWUnLCAnJykKICAgICAgICAgICAgaWYgbm90IGNhcmRfbmFtZSBvciBjYXJkX25hbWUgPT0gY29tbWFuZGVyLmdldCgnbmFtZScsICcnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIFNraXAgY29tbWFuZGVyIChhbHJlYWR5IGluc2VydGVkKQogICAgICAgICAgICBzY3J5ZmFsbF9pZCA9IGNhcmQuZ2V0KCdzY3J5ZmFsbF9pZCcsICcnKQogICAgICAgICAgICAjIFVzZSBzdWJzdGl0dXRlIG5hbWUgaWYgc3Vic3RpdHV0ZWQKICAgICAgICAgICAgaWYgY2FyZC5nZXQoJ3N0YXR1cycpID09ICdzdWJzdGl0dXRlZCcgYW5kIGNhcmQuZ2V0KCdzZWxlY3RlZF9zdWJzdGl0dXRlJyk6CiAgICAgICAgICAgICAgICBjYXJkX25hbWUgPSBjYXJkWydzZWxlY3RlZF9zdWJzdGl0dXRlJ10KICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5LCBpc19jb21tYW5kZXIsIHJvbGVfdGFnKSAiCiAgICAgICAgICAgICAgICAiVkFMVUVTICg/LCA/LCA/LCA/LCAwLCA/KSIsCiAgICAgICAgICAgICAgICAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwKICAgICAgICAgICAgICAgICBjYXJkLmdldCgnY291bnQnLCAxKSwgY2FyZC5nZXQoJ2NhdGVnb3J5JywgJycpKQogICAgICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQoKICAgICAgICAjIEV4cG9ydCAuZGNrIGZvciBGb3JnZQogICAgICAgIHRyeToKICAgICAgICAgICAgZGVja3NfZGlyID0gQ0ZHLmZvcmdlX2RlY2tzX2RpcgogICAgICAgICAgICBpZiBkZWNrc19kaXIgYW5kIG9zLnBhdGguaXNkaXIoZGVja3NfZGlyKToKICAgICAgICAgICAgICAgIHNhZmVfbmFtZSA9IHJlLnN1YihyJ1teYS16QS1aMC05X1wtXHNdJywgJycsIGRlY2tfbmFtZSkuc3RyaXAoKS5yZXBsYWNlKCcgJywgJ18nKQogICAgICAgICAgICAgICAgaWYgbm90IHNhZmVfbmFtZToKICAgICAgICAgICAgICAgICAgICBzYWZlX25hbWUgPSBmIlYzRGVja197ZGVja19pZH0iCiAgICAgICAgICAgICAgICBkY2tfcGF0aCA9IG9zLnBhdGguam9pbihkZWNrc19kaXIsIGYie3NhZmVfbmFtZX0uZGNrIikKICAgICAgICAgICAgICAgIGRja19saW5lcyA9IFsiW21ldGFkYXRhXSIsIGYiTmFtZT17ZGVja19uYW1lfSIsICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbQ29tbWFuZGVyXSIsIGYiMSB7Y29tbWFuZGVyWyduYW1lJ119IiwgIiIsICJbTWFpbl0iXQogICAgICAgICAgICAgICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgICAgICAgICAgICAgY25hbWUgPSBjYXJkLmdldCgnbmFtZScsICcnKQogICAgICAgICAgICAgICAgICAgIGlmIGNhcmQuZ2V0KCdzdGF0dXMnKSA9PSAnc3Vic3RpdHV0ZWQnIGFuZCBjYXJkLmdldCgnc2VsZWN0ZWRfc3Vic3RpdHV0ZScpOgogICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSA9IGNhcmRbJ3NlbGVjdGVkX3N1YnN0aXR1dGUnXQogICAgICAgICAgICAgICAgICAgIGlmIGNuYW1lIGFuZCBjbmFtZSAhPSBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpOgogICAgICAgICAgICAgICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKGYie2NhcmQuZ2V0KCdjb3VudCcsIDEpfSB7Y25hbWV9IikKICAgICAgICAgICAgICAgIHdpdGggb3BlbihkY2tfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKGRja19saW5lcykpCiAgICAgICAgICAgICAgICBsb2dfZGVja2dlbi5pbmZvKGYiICBFeHBvcnRlZCAuZGNrOiB7ZGNrX3BhdGh9IikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ19kZWNrZ2VuLmVycm9yKGYiICAuZGNrIGV4cG9ydCBmYWlsZWQ6IHtlfSIpCgogICAgICAgIHJlc3VsdFsnZGVja19pZCddID0gZGVja19pZAogICAgICAgIHJlc3VsdFsnZGVja19uYW1lJ10gPSBkZWNrX25hbWUKICAgICAgICBsb2dfZGVja2dlbi5pbmZvKGYiICBDb21taXR0ZWQgZGVjayAne2RlY2tfbmFtZX0nIChJRDoge2RlY2tfaWR9KSIpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogc3RyKGUpfSwgc3RhdHVzX2NvZGU9NDIyKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ19kZWNrZ2VuLmVycm9yKGYnQ29tbWl0IGVycm9yOiB7ZX0nKQogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZidEZWNrIGdlbmVyYXRpb24vY29tbWl0IGZhaWxlZDoge3N0cihlKX0nKQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrL3YzL2V4cG9ydC9jc3YnKQphc3luYyBkZWYgZGVja19nZW5fdjNfZXhwb3J0X2NzdihyZXE6IERlY2tHZW5WM1JlcXVlc3QpOgogICAgIiIiR2VuZXJhdGUgYSBkZWNrIGFuZCByZXR1cm4gYXMgQ1NWLiIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICkKCiAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICBjb21tYW5kZXIgPSByZXN1bHQuZ2V0KCdjb21tYW5kZXInLCB7fSkKCiAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCiAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKG91dHB1dCkKICAgIHdyaXRlci53cml0ZXJvdyhbJ0NvdW50JywgJ05hbWUnLCAnQ2F0ZWdvcnknLCAnUm9sZXMnLCAnU3RhdHVzJywgJ1ByaWNlX1VTRCcsICdSZWFzb24nXSkKICAgICMgQ29tbWFuZGVyIHJvdwogICAgd3JpdGVyLndyaXRlcm93KFsxLCBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpLCAnQ29tbWFuZGVyJywgJycsICdvd25lZCcsICcnLCAnQ29tbWFuZGVyJ10pCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBpZiBjYXJkLmdldCgnbmFtZScpID09IGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJyk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgd3JpdGVyLndyaXRlcm93KFsKICAgICAgICAgICAgY2FyZC5nZXQoJ2NvdW50JywgMSksCiAgICAgICAgICAgIGNhcmQuZ2V0KCduYW1lJywgJycpLAogICAgICAgICAgICBjYXJkLmdldCgnY2F0ZWdvcnknLCAnJyksCiAgICAgICAgICAgICc7ICcuam9pbihjYXJkLmdldCgncm9sZV90YWdzJywgW10pKSwKICAgICAgICAgICAgY2FyZC5nZXQoJ3N0YXR1cycsICd1bmtub3duJyksCiAgICAgICAgICAgIGNhcmQuZ2V0KCdlc3RpbWF0ZWRfcHJpY2VfdXNkJywgMCksCiAgICAgICAgICAgIGNhcmQuZ2V0KCdyZWFzb24nLCAnJyksCiAgICAgICAgXSkKCiAgICBjc3ZfY29udGVudCA9IG91dHB1dC5nZXR2YWx1ZSgpCiAgICBzYWZlX25hbWUgPSByZS5zdWIocidbXmEtekEtWjAtOV9cLVxzXScsICcnLCBjb21tYW5kZXIuZ2V0KCduYW1lJywgJ2RlY2snKSkuc3RyaXAoKS5yZXBsYWNlKCcgJywgJ18nKQogICAgcmV0dXJuIFN0cmVhbWluZ1Jlc3BvbnNlKAogICAgICAgIGlvLkJ5dGVzSU8oY3N2X2NvbnRlbnQuZW5jb2RlKCd1dGYtOCcpKSwKICAgICAgICBtZWRpYV90eXBlPSd0ZXh0L2NzdicsCiAgICAgICAgaGVhZGVycz17J0NvbnRlbnQtRGlzcG9zaXRpb24nOiBmJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ7c2FmZV9uYW1lfV9kZWNrLmNzdiInfSwKICAgICkKCgpAYXBwLnBvc3QoJy9hcGkvZGVjay92My9leHBvcnQvZGNrJykKYXN5bmMgZGVmIGRlY2tfZ2VuX3YzX2V4cG9ydF9kY2socmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIkdlbmVyYXRlIGEgZGVjayBhbmQgcmV0dXJuIGFzIEZvcmdlIC5kY2sgZm9ybWF0LiIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICkKCiAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICBjb21tYW5kZXIgPSByZXN1bHQuZ2V0KCdjb21tYW5kZXInLCB7fSkKCiAgICBsaW5lcyA9IFsKICAgICAgICAnW21ldGFkYXRhXScsCiAgICAgICAgZidOYW1lPXtjb21tYW5kZXIuZ2V0KCJuYW1lIiwgIkRlY2siKX0gLSBWMyBBdXRvJywKICAgICAgICAnJywKICAgICAgICAnW0NvbW1hbmRlcl0nLAogICAgICAgIGYnMSB7Y29tbWFuZGVyLmdldCgibmFtZSIsICIiKX0nLAogICAgICAgICcnLAogICAgICAgICdbTWFpbl0nLAogICAgXQogICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgY25hbWUgPSBjYXJkLmdldCgnbmFtZScsICcnKQogICAgICAgIGlmIGNhcmQuZ2V0KCdzdGF0dXMnKSA9PSAnc3Vic3RpdHV0ZWQnIGFuZCBjYXJkLmdldCgnc2VsZWN0ZWRfc3Vic3RpdHV0ZScpOgogICAgICAgICAgICBjbmFtZSA9IGNhcmRbJ3NlbGVjdGVkX3N1YnN0aXR1dGUnXQogICAgICAgIGlmIGNuYW1lIGFuZCBjbmFtZSAhPSBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7Y2FyZC5nZXQoJ2NvdW50JywgMSl9IHtjbmFtZX0iKQoKICAgIGRja19jb250ZW50ID0gJ1xuJy5qb2luKGxpbmVzKQogICAgc2FmZV9uYW1lID0gcmUuc3ViKHInW15hLXpBLVowLTlfXC1cc10nLCAnJywgY29tbWFuZGVyLmdldCgnbmFtZScsICdkZWNrJykpLnN0cmlwKCkucmVwbGFjZSgnICcsICdfJykKICAgIHJldHVybiBTdHJlYW1pbmdSZXNwb25zZSgKICAgICAgICBpby5CeXRlc0lPKGRja19jb250ZW50LmVuY29kZSgndXRmLTgnKSksCiAgICAgICAgbWVkaWFfdHlwZT0ndGV4dC9wbGFpbicsCiAgICAgICAgaGVhZGVycz17J0NvbnRlbnQtRGlzcG9zaXRpb24nOiBmJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ7c2FmZV9uYW1lfS5kY2siJ30sCiAgICApCgoKQGFwcC5wb3N0KCcvYXBpL2RlY2svdjMvZXhwb3J0L21veGZpZWxkJykKYXN5bmMgZGVmIGRlY2tfZ2VuX3YzX2V4cG9ydF9tb3hmaWVsZChyZXE6IERlY2tHZW5WM1JlcXVlc3QpOgogICAgIiIiR2VuZXJhdGUgYSBkZWNrIGFuZCByZXR1cm4gaW4gTW94ZmllbGQgcGFzdGUgZm9ybWF0LiIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICkKCiAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICBjb21tYW5kZXIgPSByZXN1bHQuZ2V0KCdjb21tYW5kZXInLCB7fSkKCiAgICAjIE1veGZpZWxkIGZvcm1hdDogY2FyZCBsaW5lcyBpbiBtYWluLCBjb21tYW5kZXIgaW4gZGVkaWNhdGVkIHNlY3Rpb24KICAgIGxpbmVzID0gW10KICAgIGxpbmVzLmFwcGVuZCgnLy8gQ29tbWFuZGVyJykKICAgIGxpbmVzLmFwcGVuZChmJzEge2NvbW1hbmRlci5nZXQoIm5hbWUiLCAiIil9JykKICAgIGxpbmVzLmFwcGVuZCgnJykKICAgIGxpbmVzLmFwcGVuZCgnLy8gRGVjaycpCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBjbmFtZSA9IGNhcmQuZ2V0KCduYW1lJywgJycpCiAgICAgICAgaWYgY2FyZC5nZXQoJ3N0YXR1cycpID09ICdzdWJzdGl0dXRlZCcgYW5kIGNhcmQuZ2V0KCdzZWxlY3RlZF9zdWJzdGl0dXRlJyk6CiAgICAgICAgICAgIGNuYW1lID0gY2FyZFsnc2VsZWN0ZWRfc3Vic3RpdHV0ZSddCiAgICAgICAgaWYgY25hbWUgYW5kIGNuYW1lICE9IGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJyk6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIntjYXJkLmdldCgnY291bnQnLCAxKX0ge2NuYW1lfSIpCgogICAgdHh0ID0gJ1xuJy5qb2luKGxpbmVzKQogICAgcmV0dXJuIHsnZm9ybWF0JzogJ21veGZpZWxkJywgJ2NvbnRlbnQnOiB0eHQsICdjb21tYW5kZXInOiBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpfQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrL3YzL2V4cG9ydC9zaG9wcGluZycpCmFzeW5jIGRlZiBkZWNrX2dlbl92M19leHBvcnRfc2hvcHBpbmcocmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIkdlbmVyYXRlIGEgZGVjayBhbmQgcmV0dXJuIGEgc2hvcHBpbmcgbGlzdCBvZiBjYXJkcyBub3Qgb3duZWQuIiIiCiAgICBpZiBfZGVja19nZW5fdjMgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMywgJ1YzIERlY2sgR2VuZXJhdG9yIG5vdCBpbml0aWFsaXplZC4nKQoKICAgIHJlc3VsdCA9IF9kZWNrX2dlbl92My5nZW5lcmF0ZV9kZWNrKAogICAgICAgIGNvbW1hbmRlcl9uYW1lPXJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpLAogICAgICAgIHN0cmF0ZWd5PXJlcS5zdHJhdGVneSwKICAgICAgICB0YXJnZXRfYnJhY2tldD1yZXEudGFyZ2V0X2JyYWNrZXQsCiAgICAgICAgYnVkZ2V0X3VzZD1yZXEuYnVkZ2V0X3VzZCwKICAgICAgICBidWRnZXRfbW9kZT1yZXEuYnVkZ2V0X21vZGUsCiAgICAgICAgb21pdF9jYXJkcz1yZXEub21pdF9jYXJkcywKICAgICAgICB1c2VfY29sbGVjdGlvbj1yZXEudXNlX2NvbGxlY3Rpb24sCiAgICAgICAgbW9kZWw9cmVxLm1vZGVsLAogICAgKQoKICAgIGNhcmRzID0gcmVzdWx0LmdldCgnY2FyZHMnLCBbXSkKICAgIHNob3BwaW5nID0gW10KICAgIHRvdGFsID0gMC4wCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBpZiBub3QgY2FyZC5nZXQoJ293bmVkJywgVHJ1ZSkgYW5kIGNhcmQuZ2V0KCdzdGF0dXMnKSAhPSAnc3Vic3RpdHV0ZWQnOgogICAgICAgICAgICBwcmljZSA9IGNhcmQuZ2V0KCdlc3RpbWF0ZWRfcHJpY2VfdXNkJywgMCkKICAgICAgICAgICAgc2hvcHBpbmcuYXBwZW5kKHsKICAgICAgICAgICAgICAgICduYW1lJzogY2FyZC5nZXQoJ25hbWUnLCAnJyksCiAgICAgICAgICAgICAgICAnY291bnQnOiBjYXJkLmdldCgnY291bnQnLCAxKSwKICAgICAgICAgICAgICAgICdjYXRlZ29yeSc6IGNhcmQuZ2V0KCdjYXRlZ29yeScsICcnKSwKICAgICAgICAgICAgICAgICdlc3RpbWF0ZWRfcHJpY2VfdXNkJzogcHJpY2UsCiAgICAgICAgICAgICAgICAncmVhc29uJzogY2FyZC5nZXQoJ3JlYXNvbicsICcnKSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgdG90YWwgKz0gcHJpY2UgKiBjYXJkLmdldCgnY291bnQnLCAxKQoKICAgIHJldHVybiB7CiAgICAgICAgJ2NvbW1hbmRlcic6IHJlc3VsdC5nZXQoJ2NvbW1hbmRlcicsIHt9KS5nZXQoJ25hbWUnLCAnJyksCiAgICAgICAgJ3Nob3BwaW5nX2xpc3QnOiBzaG9wcGluZywKICAgICAgICAndG90YWxfbWlzc2luZyc6IGxlbihzaG9wcGluZyksCiAgICAgICAgJ2VzdGltYXRlZF9jb3N0X3VzZCc6IHJvdW5kKHRvdGFsLCAyKSwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENvYWNoIFNlcnZpY2UgKExMTS1wb3dlcmVkIGRlY2sgY29hY2hpbmcpCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIEdsb2JhbCBjb2FjaCBpbnN0YW5jZXMgKGluaXRpYWxpemVkIGF0IHN0YXJ0dXApCl9jb2FjaF9zZXJ2aWNlID0gTm9uZQpfY29hY2hfZW1iZWRkaW5ncyA9IE5vbmUKX2NvYWNoX2xsbSA9IE5vbmUKX2RlY2tfZ2VuX3YzID0gTm9uZSAgIyBWMyBEZWNrIEdlbmVyYXRvciAoUGVycGxleGl0eSBzdHJ1Y3R1cmVkIG91dHB1dCkKX2RlY2tfZ2VuX3YzX2Vycm9yID0gTm9uZSAgIyBFcnJvciBtZXNzYWdlIGlmIFYzIGluaXQgZmFpbGVkCgoKZGVmIGluaXRfY29hY2hfc2VydmljZSgpOgogICAgIiIiSW5pdGlhbGl6ZSB0aGUgY29hY2ggc2VydmljZSB3aXRoIExMTSBjbGllbnQgYW5kIGVtYmVkZGluZ3MuIiIiCiAgICBnbG9iYWwgX2NvYWNoX3NlcnZpY2UsIF9jb2FjaF9lbWJlZGRpbmdzLCBfY29hY2hfbGxtLCBfZGVja19nZW5fdjMsIF9kZWNrX2dlbl92M19lcnJvcgogICAgdHJ5OgogICAgICAgIGZyb20gY29hY2gubGxtX2NsaWVudCBpbXBvcnQgTE1TdHVkaW9DbGllbnQKICAgICAgICBmcm9tIGNvYWNoLmVtYmVkZGluZ3MgaW1wb3J0IE1UR0VtYmVkZGluZ0luZGV4CiAgICAgICAgZnJvbSBjb2FjaC5jb2FjaF9zZXJ2aWNlIGltcG9ydCBDb2FjaFNlcnZpY2UKICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgZW5zdXJlX2RpcnMKCiAgICAgICAgZW5zdXJlX2RpcnMoKQoKICAgICAgICBfY29hY2hfbGxtID0gTE1TdHVkaW9DbGllbnQoKQogICAgICAgIF9jb2FjaF9lbWJlZGRpbmdzID0gTVRHRW1iZWRkaW5nSW5kZXgoKQoKICAgICAgICAjIFRyeSB0byBsb2FkIGVtYmVkZGluZ3MgKG5vbi1ibG9ja2luZyDigJQgZG93bmxvYWQgaGFwcGVucyBvbiBmaXJzdCB1c2UpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgRU1CRURESU5HU19OUFoKICAgICAgICAgICAgaWYgRU1CRURESU5HU19OUFouZXhpc3RzKCk6CiAgICAgICAgICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5sb2FkKCkKICAgICAgICAgICAgICAgIGxvZ19jb2FjaC5pbmZvKGYiICBDb2FjaDogICAgICAgIEVtYmVkZGluZ3MgbG9hZGVkICh7X2NvYWNoX2VtYmVkZGluZ3MuY2FyZF9jb3VudH0gY2FyZHMpIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ19jb2FjaC53YXJuaW5nKCIgIENvYWNoOiAgICAgICAgRW1iZWRkaW5ncyBub3QgeWV0IGRvd25sb2FkZWQgKHdpbGwgZG93bmxvYWQgb24gZmlyc3QgdXNlKSIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2dfY29hY2guZXJyb3IoZiIgIENvYWNoOiAgICAgICAgRW1iZWRkaW5ncyBsb2FkIGZhaWxlZDoge2V9IikKCiAgICAgICAgX2NvYWNoX3NlcnZpY2UgPSBDb2FjaFNlcnZpY2UoX2NvYWNoX2xsbSwgX2NvYWNoX2VtYmVkZGluZ3MpCgogICAgICAgICMgQ2hlY2sgTExNIGNvbm5lY3Rpb24KICAgICAgICBsbG1fc3RhdHVzID0gX2NvYWNoX2xsbS5jaGVja19jb25uZWN0aW9uKCkKICAgICAgICBpZiBsbG1fc3RhdHVzLmdldCgiY29ubmVjdGVkIik6CiAgICAgICAgICAgIGxvZ19jb2FjaC5pbmZvKGYiICBDb2FjaCBMTE06ICAgIENvbm5lY3RlZCAoe2xsbV9zdGF0dXMuZ2V0KCdhY3RpdmVfbW9kZWwnLCAndW5rbm93bicpfSkiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ19jb2FjaC53YXJuaW5nKGYiICBDb2FjaCBMTE06ICAgIE5vdCBjb25uZWN0ZWQgKHN0YXJ0IExNIFN0dWRpbyBvbiAxOTIuMTY4LjAuMTIyOjEyMzQpIikKCiAgICAgICAgbG9nX2NvYWNoLmluZm8oIiAgQ29hY2g6ICAgICAgICBTZXJ2aWNlIGluaXRpYWxpemVkIikKCiAgICAgICAgIyBJbml0aWFsaXplIFYzIERlY2sgR2VuZXJhdG9yIChQZXJwbGV4aXR5KQogICAgICAgIF9kZWNrX2dlbl92M19lcnJvciA9IE5vbmUKICAgICAgICBpZiBDRkcucHBseF9hcGlfa2V5OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmcm9tIGNvYWNoLmNsaWVudHMucGVycGxleGl0eV9jbGllbnQgaW1wb3J0IFBlcnBsZXhpdHlDbGllbnQKICAgICAgICAgICAgICAgIGZyb20gY29hY2guc2VydmljZXMuZGVja19nZW5lcmF0b3IgaW1wb3J0IERlY2tHZW5lcmF0b3JWMwogICAgICAgICAgICAgICAgZnJvbSBjb2FjaC5jb25maWcgaW1wb3J0IERFQ0tfR0VOX01PREVMCgogICAgICAgICAgICAgICAgcHBseF9jbGllbnQgPSBQZXJwbGV4aXR5Q2xpZW50KAogICAgICAgICAgICAgICAgICAgIGFwaV9rZXk9Q0ZHLnBwbHhfYXBpX2tleSwKICAgICAgICAgICAgICAgICAgICBtb2RlbD1ERUNLX0dFTl9NT0RFTCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIF9kZWNrX2dlbl92MyA9IERlY2tHZW5lcmF0b3JWMygKICAgICAgICAgICAgICAgICAgICBwcGx4X2NsaWVudD1wcGx4X2NsaWVudCwKICAgICAgICAgICAgICAgICAgICBkYl9jb25uX2ZhY3Rvcnk9X2dldF9kYl9jb25uLAogICAgICAgICAgICAgICAgICAgIGVtYmVkZGluZ19pbmRleD1fY29hY2hfZW1iZWRkaW5ncywKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGxvZ19kZWNrZ2VuLmluZm8oZiIgIERlY2sgR2VuIFYzOiAgSW5pdGlhbGl6ZWQgKG1vZGVsOiB7REVDS19HRU5fTU9ERUx9KSIpCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgX2RlY2tfZ2VuX3YzX2Vycm9yID0gZiJNaXNzaW5nIGRlcGVuZGVuY3k6IHtlfS4gUnVuOiBwaXAgaW5zdGFsbCBvcGVuYWkiCiAgICAgICAgICAgICAgICBsb2dfZGVja2dlbi5lcnJvcihmIiAgRGVjayBHZW4gVjM6ICB7X2RlY2tfZ2VuX3YzX2Vycm9yfSIpCiAgICAgICAgICAgICAgICBfZGVja19nZW5fdjMgPSBOb25lCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIF9kZWNrX2dlbl92M19lcnJvciA9IHN0cihlKQogICAgICAgICAgICAgICAgbG9nX2RlY2tnZW4uZXJyb3IoZiIgIERlY2sgR2VuIFYzOiAgRmFpbGVkIHRvIGluaXRpYWxpemU6IHtlfSIpCiAgICAgICAgICAgICAgICBfZGVja19nZW5fdjMgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2RlY2tfZ2VuX3YzX2Vycm9yID0gIlBQTFhfQVBJX0tFWSBub3Qgc2V0IgogICAgICAgICAgICBsb2dfZGVja2dlbi5pbmZvKCIgIERlY2sgR2VuIFYzOiAgU2tpcHBlZCAobm8gUFBMWF9BUElfS0VZKSIpCgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ19jb2FjaC5lcnJvcihmIiAgQ29hY2g6ICAgICAgICBGYWlsZWQgdG8gaW5pdGlhbGl6ZToge2V9IikKICAgICAgICBfY29hY2hfc2VydmljZSA9IE5vbmUKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9zdGF0dXMiKQphc3luYyBkZWYgY29hY2hfc3RhdHVzKCk6CiAgICAiIiJDaGVjayBjb2FjaCBzdWJzeXN0ZW0gaGVhbHRoLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByZXR1cm4geyJsbG1Db25uZWN0ZWQiOiBGYWxzZSwgImVtYmVkZGluZ3NMb2FkZWQiOiBGYWxzZSwKICAgICAgICAgICAgICAgICJlbWJlZGRpbmdDYXJkcyI6IDAsICJkZWNrUmVwb3J0c0F2YWlsYWJsZSI6IDAsCiAgICAgICAgICAgICAgICAiZXJyb3IiOiAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQifQogICAgc3RhdHVzID0gX2NvYWNoX3NlcnZpY2UuZ2V0X3N0YXR1cygpCiAgICByZXR1cm4gc3RhdHVzLm1vZGVsX2R1bXAoKQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2RlY2tzIikKYXN5bmMgZGVmIGNvYWNoX2xpc3RfZGVja3MoKToKICAgICIiIkxpc3QgYWxsIGRlY2tzIGF2YWlsYWJsZSBmb3IgY29hY2hpbmcgKGZyb20gZGVjayBidWlsZGVyIERCKS4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiJTRUxFQ1QgZC5pZCBhcyBkZWNrX2lkLCBkLm5hbWUgYXMgZGVja19uYW1lLCBkLmNvbW1hbmRlcl9uYW1lLAogICAgICAgICAgICAgICAgICBDT1VOVChkYy5pZCkgYXMgY2FyZF9jb3VudAogICAgICAgICAgIEZST00gZGVja3MgZAogICAgICAgICAgIExFRlQgSk9JTiBkZWNrX2NhcmRzIGRjIE9OIGRjLmRlY2tfaWQgPSBkLmlkCiAgICAgICAgICAgR1JPVVAgQlkgZC5pZAogICAgICAgICAgIE9SREVSIEJZIGQubmFtZSIiIgogICAgKS5mZXRjaGFsbCgpCgogICAgIyBBbHNvIGdldCByZXBvcnQgYXZhaWxhYmlsaXR5IGZyb20gY29hY2ggc2VydmljZQogICAgcmVwb3J0X2lkcyA9IHNldCgpCiAgICBpZiBfY29hY2hfc2VydmljZToKICAgICAgICByZXBvcnRfaWRzID0gc2V0KF9jb2FjaF9zZXJ2aWNlLmxpc3RfZGVja19yZXBvcnRzKCkpCgogICAgZGVja3MgPSBbXQogICAgZm9yIHIgaW4gcm93czoKICAgICAgICBkZWNrX25hbWUgPSByWyJkZWNrX25hbWUiXQogICAgICAgICMgQ2hlY2sgaWYgYSByZXBvcnQgZXhpc3RzIChieSBkZWNrIG5hbWUgc2x1ZyBtYXRjaCkKICAgICAgICBoYXNfcmVwb3J0ID0gYW55KAogICAgICAgICAgICBkZWNrX25hbWUubG93ZXIoKS5yZXBsYWNlKCIgIiwgIi0iKSA9PSByaWQubG93ZXIoKSBvcgogICAgICAgICAgICBkZWNrX25hbWUubG93ZXIoKSA9PSByaWQubG93ZXIoKQogICAgICAgICAgICBmb3IgcmlkIGluIHJlcG9ydF9pZHMKICAgICAgICApCiAgICAgICAgZGVja3MuYXBwZW5kKHsKICAgICAgICAgICAgImRlY2tfaWQiOiByWyJkZWNrX2lkIl0sCiAgICAgICAgICAgICJkZWNrX25hbWUiOiByWyJkZWNrX25hbWUiXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IHJbImNvbW1hbmRlcl9uYW1lIl0gb3IgIiIsCiAgICAgICAgICAgICJjYXJkX2NvdW50IjogclsiY2FyZF9jb3VudCJdLAogICAgICAgICAgICAiaGFzX3JlcG9ydCI6IGhhc19yZXBvcnQsCiAgICAgICAgICAgICJyZXBvcnRfY291bnQiOiAxIGlmIGhhc19yZXBvcnQgZWxzZSAwLAogICAgICAgICAgICAibGFzdF9yZXBvcnRfZGF0ZSI6IE5vbmUsCiAgICAgICAgfSkKICAgIHJldHVybiBkZWNrcwoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2RlY2tzL3tkZWNrX2lkfS9yZXBvcnQiKQphc3luYyBkZWYgY29hY2hfZ2V0X3JlcG9ydChkZWNrX2lkOiBzdHIpOgogICAgIiIiR2V0IHRoZSBsYXRlc3QgRGVja1JlcG9ydCBmb3IgYSBkZWNrLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKICAgIHJlcG9ydCA9IF9jb2FjaF9zZXJ2aWNlLmxvYWRfZGVja19yZXBvcnQoZGVja19pZCkKICAgIGlmIHJlcG9ydCBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkRlY2sgcmVwb3J0IG5vdCBmb3VuZDoge2RlY2tfaWR9IikKICAgIHJldHVybiByZXBvcnQubW9kZWxfZHVtcCgpCgoKY2xhc3MgQ29hY2hSZXF1ZXN0Qm9keShCYXNlTW9kZWwpOgogICAgZ29hbHM6IE9wdGlvbmFsW2RpY3RdID0gTm9uZQoKCmNsYXNzIENvYWNoQ2hhdE1lc3NhZ2UoQmFzZU1vZGVsKToKICAgIHJvbGU6IHN0ciAgIyAidXNlciIgb3IgImFzc2lzdGFudCIKICAgIGNvbnRlbnQ6IHN0cgoKY2xhc3MgQ29hY2hDaGF0UmVxdWVzdChCYXNlTW9kZWwpOgogICAgZGVja19pZDogc3RyCiAgICBtZXNzYWdlczogbGlzdFtkaWN0XSAgIyBjb252ZXJzYXRpb24gaGlzdG9yeSBbe3JvbGUsIGNvbnRlbnR9XQogICAgZ29hbHM6IE9wdGlvbmFsW2RpY3RdID0gTm9uZQogICAgc3RyZWFtOiBPcHRpb25hbFtib29sXSA9IEZhbHNlCgpjbGFzcyBDb2FjaEFwcGx5UmVxdWVzdChCYXNlTW9kZWwpOgogICAgc2Vzc2lvbl9pZDogc3RyCiAgICBkZWNrX2lkOiBpbnQgICMgbnVtZXJpYyBkZWNrIElEIGluIHRoZSBEQgogICAgYWNjZXB0ZWRfY3V0czogbGlzdFtzdHJdID0gW10gICMgY2FyZCBuYW1lcyB0byByZW1vdmUKICAgIGFjY2VwdGVkX2FkZHM6IGxpc3Rbc3RyXSA9IFtdICAjIGNhcmQgbmFtZXMgdG8gYWRkCgpjbGFzcyBDb2FjaEdvYWxzUmVxdWVzdChCYXNlTW9kZWwpOgogICAgdGFyZ2V0X3Bvd2VyX2xldmVsOiBPcHRpb25hbFtpbnRdID0gTm9uZSAgIyAxLTEwCiAgICBtZXRhX2ZvY3VzOiBPcHRpb25hbFtzdHJdID0gTm9uZSAgIyBhZ2dybywgY29udHJvbCwgY29tYm8sIG1pZHJhbmdlLCBzdGF4CiAgICBidWRnZXQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lICAjIGJ1ZGdldCwgbWVkaXVtLCBuby1saW1pdAogICAgZm9jdXNfYXJlYXM6IGxpc3Rbc3RyXSA9IFtdICAjIGUuZy4sIFsicmFtcCIsICJjYXJkIGRyYXciXQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9kZWNrcy97ZGVja19pZH0iKQphc3luYyBkZWYgY29hY2hfcnVuX3Nlc3Npb24oZGVja19pZDogc3RyLCBib2R5OiBDb2FjaFJlcXVlc3RCb2R5ID0gTm9uZSk6CiAgICAiIiJUcmlnZ2VyIGEgY29hY2hpbmcgc2Vzc2lvbiBmb3IgYSBkZWNrLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKCiAgICAjIExvYWQgZW1iZWRkaW5ncyBvbiBmaXJzdCB1c2UgaWYgbm90IGxvYWRlZAogICAgaWYgX2NvYWNoX2VtYmVkZGluZ3MgYW5kIG5vdCBfY29hY2hfZW1iZWRkaW5ncy5sb2FkZWQ6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5sb2FkKGZvcmNlX2Rvd25sb2FkPVRydWUpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2dfY29hY2guZXJyb3IoZiIgIENvYWNoOiBFbWJlZGRpbmdzIGRvd25sb2FkIGZhaWxlZDoge2V9IikKCiAgICBnb2FscyA9IE5vbmUKICAgIGlmIGJvZHkgYW5kIGJvZHkuZ29hbHM6CiAgICAgICAgZnJvbSBjb2FjaC5tb2RlbHMgaW1wb3J0IENvYWNoR29hbHMKICAgICAgICB0cnk6CiAgICAgICAgICAgIGdvYWxzID0gQ29hY2hHb2FscygqKmJvZHkuZ29hbHMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZ29hbHMgPSBOb25lCgogICAgIyBCdWlsZCBhIGZhbGxiYWNrIERlY2tSZXBvcnQgZnJvbSB0aGUgREIgaWYgbm8gc2ltdWxhdGlvbiByZXBvcnQgZXhpc3RzCiAgICBmYWxsYmFja19yZXBvcnQgPSBOb25lCiAgICB0cnk6CiAgICAgICAgZmFsbGJhY2tfcmVwb3J0ID0gX2J1aWxkX2RlY2tfcmVwb3J0X2Zyb21fZGIoZGVja19pZCkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfY29hY2guZXJyb3IoZiIgIENvYWNoOiBGYWxsYmFjayByZXBvcnQgYnVpbGQgZmFpbGVkIGZvciAne2RlY2tfaWR9Jzoge2V9IikKCiAgICB0cnk6CiAgICAgICAgc2Vzc2lvbiA9IGF3YWl0IF9jb2FjaF9zZXJ2aWNlLnJ1bl9jb2FjaGluZ19zZXNzaW9uKGRlY2tfaWQsIGdvYWxzLCBmYWxsYmFja19yZXBvcnQ9ZmFsbGJhY2tfcmVwb3J0KQogICAgICAgIHJldHVybiBzZXNzaW9uLm1vZGVsX2R1bXAoKQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgc3RyKGUpKQogICAgZXhjZXB0IENvbm5lY3Rpb25FcnJvciBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCBmIkxMTSBjb25uZWN0aW9uIGZhaWxlZDoge2V9IikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJDb2FjaCBzZXNzaW9uIGZhaWxlZDoge2V9IikKCgpkZWYgX2J1aWxkX2RlY2tfcmVwb3J0X2Zyb21fZGIoZGVja19zbHVnOiBzdHIpOgogICAgIiIiCiAgICBCdWlsZCBhIGxpZ2h0d2VpZ2h0IERlY2tSZXBvcnQgZnJvbSB0aGUgZGVjayBidWlsZGVyIERCIHdoZW4gbm8KICAgIHNpbXVsYXRpb24gcmVwb3J0IGV4aXN0cy4gQWxsb3dzIHRoZSBjb2FjaCB0byBhbmFseXplIGRlY2sgY29tcG9zaXRpb24KICAgIGV2ZW4gd2l0aG91dCBzaW11bGF0aW9uIGRhdGEuCiAgICAiIiIKICAgIGZyb20gY29hY2gubW9kZWxzIGltcG9ydCBEZWNrUmVwb3J0LCBDYXJkUGVyZm9ybWFuY2UsIERlY2tTdHJ1Y3R1cmUKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgRmluZCB0aGUgZGVjayBieSBzbHVnIG1hdGNoIGFnYWluc3QgdGhlIGRlY2sgbmFtZQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIGlkLCBuYW1lLCBjb21tYW5kZXJfbmFtZSwgY29sb3JfaWRlbnRpdHkgRlJPTSBkZWNrcyBPUkRFUiBCWSBpZCIKICAgICkuZmV0Y2hhbGwoKQoKICAgIG1hdGNoZWRfZGVjayA9IE5vbmUKICAgIGZvciByIGluIHJvd3M6CiAgICAgICAgbmFtZSA9IHJbIm5hbWUiXSBvciAiIgogICAgICAgIHNsdWcgPSBuYW1lLmxvd2VyKCkucmVwbGFjZSgiICIsICItIikKICAgICAgICAjIEFsc28gdHJ5IGEgbW9yZSB0aG9yb3VnaCBzbHVnaWZ5CiAgICAgICAgaW1wb3J0IHJlCiAgICAgICAgY2xlYW5fc2x1ZyA9IHJlLnN1YihyJ1teYS16MC05XSsnLCAnLScsIG5hbWUubG93ZXIoKSkuc3RyaXAoJy0nKQogICAgICAgIGlmIHNsdWcgPT0gZGVja19zbHVnLmxvd2VyKCkgb3IgY2xlYW5fc2x1ZyA9PSBkZWNrX3NsdWcubG93ZXIoKSBvciBuYW1lLmxvd2VyKCkgPT0gZGVja19zbHVnLmxvd2VyKCk6CiAgICAgICAgICAgIG1hdGNoZWRfZGVjayA9IHIKICAgICAgICAgICAgYnJlYWsKCiAgICBpZiBtYXRjaGVkX2RlY2sgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlY2tfaWQgPSBtYXRjaGVkX2RlY2tbImlkIl0KICAgIGRlY2tfbmFtZSA9IG1hdGNoZWRfZGVja1sibmFtZSJdCiAgICBjb21tYW5kZXIgPSBtYXRjaGVkX2RlY2tbImNvbW1hbmRlcl9uYW1lIl0gb3IgIiIKCiAgICAjIFBhcnNlIGNvbG9yIGlkZW50aXR5CiAgICBjaV9yYXcgPSBtYXRjaGVkX2RlY2tbImNvbG9yX2lkZW50aXR5Il0gb3IgIltdIgogICAgdHJ5OgogICAgICAgIGNvbG9yX2lkZW50aXR5ID0ganNvbi5sb2FkcyhjaV9yYXcpIGlmIGlzaW5zdGFuY2UoY2lfcmF3LCBzdHIpIGVsc2UgY2lfcmF3CiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGNvbG9yX2lkZW50aXR5ID0gW10KCiAgICAjIExvYWQgYWxsIGNhcmRzIGluIHRoaXMgZGVjawogICAgY2FyZF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICIiIlNFTEVDVCBkYy5jYXJkX25hbWUsIGRjLnF1YW50aXR5LCBkYy5pc19jb21tYW5kZXIsIGRjLnJvbGVfdGFnLAogICAgICAgICAgICAgICAgICBjZS50eXBlX2xpbmUsIGNlLmNtYywgY2Uub3JhY2xlX3RleHQKICAgICAgICAgICBGUk9NIGRlY2tfY2FyZHMgZGMKICAgICAgICAgICBMRUZUIEpPSU4gY29sbGVjdGlvbl9lbnRyaWVzIGNlIE9OIExPV0VSKGRjLmNhcmRfbmFtZSkgPSBMT1dFUihjZS5uYW1lKQogICAgICAgICAgIFdIRVJFIGRjLmRlY2tfaWQgPSA/IiIiLAogICAgICAgIChkZWNrX2lkLCkKICAgICkuZmV0Y2hhbGwoKQoKICAgIGNhcmRzID0gW10KICAgIHR5cGVfY291bnRzID0ge30KICAgIGNtY19idWNrZXRzID0gWzBdICogOAogICAgbGFuZF9jb3VudCA9IDAKCiAgICBmb3IgY3IgaW4gY2FyZF9yb3dzOgogICAgICAgIGNhcmRfbmFtZSA9IGNyWyJjYXJkX25hbWUiXSBvciAiIgogICAgICAgIHR5cGVfbGluZSA9IGNyWyJ0eXBlX2xpbmUiXSBvciAiIgogICAgICAgIGNtYyA9IGNyWyJjbWMiXSBvciAwCiAgICAgICAgcXR5ID0gY3JbInF1YW50aXR5Il0gb3IgMQogICAgICAgIHJvbGVfdGFnID0gY3JbInJvbGVfdGFnIl0gb3IgIiIKCiAgICAgICAgIyBCdWlsZCB0YWdzIGZyb20gdHlwZV9saW5lIGFuZCByb2xlX3RhZwogICAgICAgIHRhZ3MgPSBbXQogICAgICAgIGlmIHJvbGVfdGFnOgogICAgICAgICAgICB0YWdzLmFwcGVuZChyb2xlX3RhZykKICAgICAgICBpZiAiTGFuZCIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICB0YWdzLmFwcGVuZCgibGFuZCIpCiAgICAgICAgICAgIGxhbmRfY291bnQgKz0gcXR5CiAgICAgICAgZWxpZiAiQ3JlYXR1cmUiIGluIHR5cGVfbGluZToKICAgICAgICAgICAgdGFncy5hcHBlbmQoImNyZWF0dXJlIikKICAgICAgICBlbGlmICJJbnN0YW50IiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHRhZ3MuYXBwZW5kKCJpbnN0YW50IikKICAgICAgICBlbGlmICJTb3JjZXJ5IiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHRhZ3MuYXBwZW5kKCJzb3JjZXJ5IikKICAgICAgICBlbGlmICJBcnRpZmFjdCIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICB0YWdzLmFwcGVuZCgiYXJ0aWZhY3QiKQogICAgICAgIGVsaWYgIkVuY2hhbnRtZW50IiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHRhZ3MuYXBwZW5kKCJlbmNoYW50bWVudCIpCiAgICAgICAgZWxpZiAiUGxhbmVzd2Fsa2VyIiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHRhZ3MuYXBwZW5kKCJwbGFuZXN3YWxrZXIiKQoKICAgICAgICAjIFR5cGUgY291bnQKICAgICAgICBmb3IgdCBpbiBbIkNyZWF0dXJlIiwgIkluc3RhbnQiLCAiU29yY2VyeSIsICJBcnRpZmFjdCIsICJFbmNoYW50bWVudCIsICJQbGFuZXN3YWxrZXIiLCAiTGFuZCJdOgogICAgICAgICAgICBpZiB0IGluIHR5cGVfbGluZToKICAgICAgICAgICAgICAgIHR5cGVfY291bnRzW3RdID0gdHlwZV9jb3VudHMuZ2V0KHQsIDApICsgcXR5CgogICAgICAgICMgQ01DIGJ1Y2tldAogICAgICAgIGJ1Y2tldCA9IG1pbihpbnQoY21jKSwgNykKICAgICAgICBjbWNfYnVja2V0c1tidWNrZXRdICs9IHF0eQoKICAgICAgICAjIENhcmRQZXJmb3JtYW5jZSB3aXRoIHplcm9lZC1vdXQgc2ltIHN0YXRzCiAgICAgICAgY2FyZHMuYXBwZW5kKENhcmRQZXJmb3JtYW5jZSgKICAgICAgICAgICAgbmFtZT1jYXJkX25hbWUsCiAgICAgICAgICAgIGRyYXduUmF0ZT0wLjAsCiAgICAgICAgICAgIGNhc3RSYXRlPTAuMCwKICAgICAgICAgICAgaW1wYWN0U2NvcmU9MC4wLAogICAgICAgICAgICB0YWdzPXRhZ3MsCiAgICAgICAgKSkKCiAgICBzbHVnID0gZGVja19zbHVnCiAgICByZXR1cm4gRGVja1JlcG9ydCgKICAgICAgICBkZWNrSWQ9c2x1ZywKICAgICAgICBjb21tYW5kZXI9Y29tbWFuZGVyLAogICAgICAgIGNvbG9ySWRlbnRpdHk9Y29sb3JfaWRlbnRpdHksCiAgICAgICAgY2FyZHM9Y2FyZHMsCiAgICAgICAgc3RydWN0dXJlPURlY2tTdHJ1Y3R1cmUoCiAgICAgICAgICAgIGxhbmRDb3VudD1sYW5kX2NvdW50LAogICAgICAgICAgICBjdXJ2ZUJ1Y2tldHM9Y21jX2J1Y2tldHMsCiAgICAgICAgICAgIGNhcmRUeXBlQ291bnRzPXR5cGVfY291bnRzLAogICAgICAgICksCiAgICApCgoKQGFwcC5nZXQoIi9hcGkvY29hY2gvc2Vzc2lvbnMiKQphc3luYyBkZWYgY29hY2hfbGlzdF9zZXNzaW9ucyhkZWNrX2lkOiBzdHIgPSBOb25lKToKICAgICIiIkxpc3QgYWxsIGNvYWNoaW5nIHNlc3Npb25zLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGRlY2suIiIiCiAgICBpZiBfY29hY2hfc2VydmljZSBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiKQogICAgcmV0dXJuIHsic2Vzc2lvbnMiOiBfY29hY2hfc2VydmljZS5saXN0X3Nlc3Npb25zKGRlY2tfaWQpfQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL3Nlc3Npb25zL3tzZXNzaW9uX2lkfSIpCmFzeW5jIGRlZiBjb2FjaF9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkOiBzdHIpOgogICAgIiIiR2V0IGEgc3BlY2lmaWMgY29hY2hpbmcgc2Vzc2lvbi4iIiIKICAgIGlmIF9jb2FjaF9zZXJ2aWNlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDb2FjaCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIpCiAgICBzZXNzaW9uID0gX2NvYWNoX3NlcnZpY2UubG9hZF9zZXNzaW9uKHNlc3Npb25faWQpCiAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiU2Vzc2lvbiBub3QgZm91bmQ6IHtzZXNzaW9uX2lkfSIpCiAgICByZXR1cm4gc2Vzc2lvbi5tb2RlbF9kdW1wKCkKCgpAYXBwLnBvc3QoIi9hcGkvY29hY2gvZW1iZWRkaW5ncy9kb3dubG9hZCIpCmFzeW5jIGRlZiBjb2FjaF9kb3dubG9hZF9lbWJlZGRpbmdzKCk6CiAgICAiIiJEb3dubG9hZCBhbmQgY29udmVydCBNVEcgY2FyZCBlbWJlZGRpbmdzIGZyb20gSHVnZ2luZ0ZhY2UuIiIiCiAgICBpZiBfY29hY2hfZW1iZWRkaW5ncyBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiKQogICAgdHJ5OgogICAgICAgIF9jb2FjaF9lbWJlZGRpbmdzLmxvYWQoZm9yY2VfZG93bmxvYWQ9VHJ1ZSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IFRydWUsCiAgICAgICAgICAgICJjYXJkcyI6IF9jb2FjaF9lbWJlZGRpbmdzLmNhcmRfY291bnQsCiAgICAgICAgICAgICJtZXNzYWdlIjogZiJMb2FkZWQge19jb2FjaF9lbWJlZGRpbmdzLmNhcmRfY291bnR9IGNhcmQgZW1iZWRkaW5ncyIKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiRmFpbGVkIHRvIGRvd25sb2FkIGVtYmVkZGluZ3M6IHtlfSIpCgoKQGFwcC5nZXQoIi9hcGkvY29hY2gvZW1iZWRkaW5ncy9zZWFyY2giKQphc3luYyBkZWYgY29hY2hfc2VhcmNoX3NpbWlsYXIoY2FyZDogc3RyLCBjb2xvcnM6IHN0ciA9IE5vbmUsIHRvcF9uOiBpbnQgPSAxMCk6CiAgICAiIiJTZWFyY2ggZm9yIHNpbWlsYXIgY2FyZHMgYnkgbmFtZS4iIiIKICAgIGlmIF9jb2FjaF9lbWJlZGRpbmdzIGlzIE5vbmUgb3Igbm90IF9jb2FjaF9lbWJlZGRpbmdzLmxvYWRlZDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMywgIkVtYmVkZGluZ3Mgbm90IGxvYWRlZCIpCiAgICBjb2xvcl9maWx0ZXIgPSBsaXN0KGNvbG9ycy51cHBlcigpKSBpZiBjb2xvcnMgZWxzZSBOb25lCiAgICBtYXRjaGVzID0gX2NvYWNoX2VtYmVkZGluZ3Muc2VhcmNoX3NpbWlsYXIoCiAgICAgICAgcXVlcnlfY2FyZD1jYXJkLCBjb2xvcl9maWx0ZXI9Y29sb3JfZmlsdGVyLCB0b3Bfbj10b3BfbgogICAgKQogICAgcmV0dXJuIHsicXVlcnkiOiBjYXJkLCAibWF0Y2hlcyI6IFttLnRvX2RpY3QoKSBmb3IgbSBpbiBtYXRjaGVzXX0KCgpAYXBwLnBvc3QoIi9hcGkvY29hY2gvY2hhdCIpCmFzeW5jIGRlZiBjb2FjaF9jaGF0KGJvZHk6IENvYWNoQ2hhdFJlcXVlc3QpOgogICAgIiIiTXVsdGktdHVybiBjb2FjaGluZyBjaGF0LiBTZW5kcyBjb252ZXJzYXRpb24gaGlzdG9yeSB0byBMTE0gYW5kIHJldHVybnMgcmVzcG9uc2UuIiIiCiAgICBpZiBfY29hY2hfc2VydmljZSBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiKQoKICAgICMgTG9hZCBkZWNrIHJlcG9ydCBmb3IgY29udGV4dAogICAgcmVwb3J0ID0gX2NvYWNoX3NlcnZpY2UubG9hZF9kZWNrX3JlcG9ydChib2R5LmRlY2tfaWQpCgogICAgIyBCdWlsZCBzeXN0ZW0gcHJvbXB0IHdpdGggcmVwb3J0IGNvbnRleHQKICAgIGZyb20gY29hY2gucHJvbXB0X3RlbXBsYXRlIGltcG9ydCBidWlsZF9zeXN0ZW1fcHJvbXB0CiAgICBmcm9tIGNvYWNoLm1vZGVscyBpbXBvcnQgQ29hY2hHb2FscwoKICAgIGdvYWxzID0gTm9uZQogICAgaWYgYm9keS5nb2FsczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGdvYWxzID0gQ29hY2hHb2FscygqKmJvZHkuZ29hbHMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZ29hbHMgPSBOb25lCgogICAgc3lzdGVtX3Byb21wdCA9ICIiCiAgICBpZiByZXBvcnQ6CiAgICAgICAgc3lzdGVtX3Byb21wdCA9IGJ1aWxkX3N5c3RlbV9wcm9tcHQocmVwb3J0LCBnb2FscykKICAgIGVsc2U6CiAgICAgICAgc3lzdGVtX3Byb21wdCA9ICgKICAgICAgICAgICAgIllvdSBhcmUgYW4gZXhwZXJ0IE1hZ2ljOiBUaGUgR2F0aGVyaW5nIENvbW1hbmRlciBkZWNrIGNvYWNoLiAiCiAgICAgICAgICAgICJBbnN3ZXIgcXVlc3Rpb25zIGFib3V0IGRlY2sgYnVpbGRpbmcsIHN0cmF0ZWd5LCBjYXJkIGNob2ljZXMsIGFuZCBnYW1lIHRoZW9yeS4gIgogICAgICAgICAgICAiQmUgc3BlY2lmaWMgYW5kIGFjdGlvbmFibGUgaW4geW91ciBhZHZpY2UuIgogICAgICAgICkKCiAgICAjIEJ1aWxkIG1lc3NhZ2VzIGFycmF5IGZvciBMTE0KICAgIG1lc3NhZ2VzID0gW3sicm9sZSI6ICJzeXN0ZW0iLCAiY29udGVudCI6IHN5c3RlbV9wcm9tcHR9XQogICAgZm9yIG1zZyBpbiBib2R5Lm1lc3NhZ2VzOgogICAgICAgIG1lc3NhZ2VzLmFwcGVuZCh7InJvbGUiOiBtc2cuZ2V0KCJyb2xlIiwgInVzZXIiKSwgImNvbnRlbnQiOiBtc2cuZ2V0KCJjb250ZW50IiwgIiIpfSkKCiAgICAjIENhbGwgTExNIHdpdGggbXVsdGktdHVybiBtZXNzYWdlcwogICAgdHJ5OgogICAgICAgIGltcG9ydCBqc29uCiAgICAgICAgZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbiwgUmVxdWVzdCBhcyBVcmxSZXF1ZXN0CiAgICAgICAgZnJvbSBjb2FjaC5jb25maWcgaW1wb3J0IExNX1NUVURJT19VUkwsIExNX1NUVURJT19USU1FT1VUCgogICAgICAgIG1vZGVsX25hbWUgPSBfY29hY2hfbGxtLl9yZXNvbHZlX21vZGVsKCkKICAgICAgICBsbG1fYm9keSA9IHsKICAgICAgICAgICAgIm1vZGVsIjogbW9kZWxfbmFtZSwKICAgICAgICAgICAgIm1lc3NhZ2VzIjogbWVzc2FnZXMsCiAgICAgICAgICAgICJ0ZW1wZXJhdHVyZSI6IDAuNywKICAgICAgICAgICAgIm1heF90b2tlbnMiOiA0MDk2LAogICAgICAgIH0KCiAgICAgICAgaWYgYm9keS5zdHJlYW06CiAgICAgICAgICAgICMgU1NFIHN0cmVhbWluZyByZXNwb25zZQogICAgICAgICAgICBsbG1fYm9keVsic3RyZWFtIl0gPSBUcnVlCgogICAgICAgICAgICBhc3luYyBkZWYgZ2VuZXJhdGUoKToKICAgICAgICAgICAgICAgIGltcG9ydCBhc3luY2lvCiAgICAgICAgICAgICAgICBkZWYgX3N0cmVhbSgpOgogICAgICAgICAgICAgICAgICAgIHJlcSA9IFVybFJlcXVlc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIGYie19jb2FjaF9sbG0uYmFzZV91cmx9L2NoYXQvY29tcGxldGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWpzb24uZHVtcHMobGxtX2JvZHkpLmVuY29kZSgidXRmLTgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0iUE9TVCIsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGltcG9ydCBodHRwLmNsaWVudAogICAgICAgICAgICAgICAgICAgIGltcG9ydCB1cmxsaWIucGFyc2UKICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UoZiJ7X2NvYWNoX2xsbS5iYXNlX3VybH0vY2hhdC9jb21wbGV0aW9ucyIpCiAgICAgICAgICAgICAgICAgICAgY29ubiA9IGh0dHAuY2xpZW50LkhUVFBDb25uZWN0aW9uKHBhcnNlZC5ob3N0bmFtZSwgcGFyc2VkLnBvcnQsIHRpbWVvdXQ9TE1fU1RVRElPX1RJTUVPVVQpCiAgICAgICAgICAgICAgICAgICAgY29ubi5yZXF1ZXN0KCJQT1NUIiwgcGFyc2VkLnBhdGgsIGJvZHk9anNvbi5kdW1wcyhsbG1fYm9keSkuZW5jb2RlKCJ1dGYtOCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSkKICAgICAgICAgICAgICAgICAgICByZXNwID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgICAgICAgICAgICAgY2h1bmtzID0gW10KICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gcmVzcC5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCJ1dGYtOCIpLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJkYXRhOiAiKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBsaW5lWzY6XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSA9PSAiW0RPTkVdIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKCJbRE9ORV0iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rcwoKICAgICAgICAgICAgICAgIGxvb3AgPSBhc3luY2lvLmdldF9ldmVudF9sb29wKCkKICAgICAgICAgICAgICAgIGNodW5rcyA9IGF3YWl0IGxvb3AucnVuX2luX2V4ZWN1dG9yKE5vbmUsIF9zdHJlYW0pCgogICAgICAgICAgICAgICAgZm9yIGNodW5rX3N0ciBpbiBjaHVua3M6CiAgICAgICAgICAgICAgICAgICAgaWYgY2h1bmtfc3RyID09ICJbRE9ORV0iOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBmImRhdGE6IFtET05FXVxuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGpzb24ubG9hZHMoY2h1bmtfc3RyKQogICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGNodW5rLmdldCgiY2hvaWNlcyIsIFt7fV0pWzBdLmdldCgiZGVsdGEiLCB7fSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGRlbHRhLmdldCgiY29udGVudCIsICIiKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjb250ZW50OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTdHJpcCB0aGluayB0YWdzIGZyb20gc3RyZWFtaW5nIGNodW5rcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZiJkYXRhOiB7anNvbi5kdW1wcyh7J2NvbnRlbnQnOiBjb250ZW50fSl9XG5cbiIKICAgICAgICAgICAgICAgICAgICBleGNlcHQganNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICByZXR1cm4gU3RyZWFtaW5nUmVzcG9uc2UoZ2VuZXJhdGUoKSwgbWVkaWFfdHlwZT0idGV4dC9ldmVudC1zdHJlYW0iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTm9uLXN0cmVhbWluZzogcmVndWxhciBjYWxsCiAgICAgICAgICAgIHJlcSA9IFVybFJlcXVlc3QoCiAgICAgICAgICAgICAgICBmIntfY29hY2hfbGxtLmJhc2VfdXJsfS9jaGF0L2NvbXBsZXRpb25zIiwKICAgICAgICAgICAgICAgIGRhdGE9anNvbi5kdW1wcyhsbG1fYm9keSkuZW5jb2RlKCJ1dGYtOCIpLAogICAgICAgICAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIn0sCiAgICAgICAgICAgICAgICBtZXRob2Q9IlBPU1QiLAogICAgICAgICAgICApCgogICAgICAgICAgICBpbXBvcnQgYXN5bmNpbwogICAgICAgICAgICBsb29wID0gYXN5bmNpby5nZXRfZXZlbnRfbG9vcCgpCiAgICAgICAgICAgIGRlZiBfY2FsbCgpOgogICAgICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD1MTV9TVFVESU9fVElNRU9VVCkgYXMgcmVzcDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCgogICAgICAgICAgICByYXcgPSBhd2FpdCBsb29wLnJ1bl9pbl9leGVjdXRvcihOb25lLCBfY2FsbCkKCiAgICAgICAgICAgIGNvbnRlbnQgPSByYXcuZ2V0KCJjaG9pY2VzIiwgW3t9XSlbMF0uZ2V0KCJtZXNzYWdlIiwge30pLmdldCgiY29udGVudCIsICIiKQogICAgICAgICAgICAjIFN0cmlwIHRoaW5rIHRhZ3MKICAgICAgICAgICAgY29udGVudCA9IF9jb2FjaF9sbG0uX3N0cmlwX3RoaW5rX3RhZ3MoY29udGVudCkKICAgICAgICAgICAgdXNhZ2UgPSByYXcuZ2V0KCJ1c2FnZSIsIHt9KQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJjb250ZW50IjogY29udGVudCwKICAgICAgICAgICAgICAgICJtb2RlbCI6IHJhdy5nZXQoIm1vZGVsIiwgIiIpLAogICAgICAgICAgICAgICAgInByb21wdF90b2tlbnMiOiB1c2FnZS5nZXQoInByb21wdF90b2tlbnMiLCAwKSwKICAgICAgICAgICAgICAgICJjb21wbGV0aW9uX3Rva2VucyI6IHVzYWdlLmdldCgiY29tcGxldGlvbl90b2tlbnMiLCAwKSwKICAgICAgICAgICAgfQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJDaGF0IGZhaWxlZDoge2V9IikKCgpAYXBwLnBvc3QoIi9hcGkvY29hY2gvYXBwbHkiKQphc3luYyBkZWYgY29hY2hfYXBwbHlfc3VnZ2VzdGlvbnMoYm9keTogQ29hY2hBcHBseVJlcXVlc3QpOgogICAgIiIiQXBwbHkgYWNjZXB0ZWQgY29hY2hpbmcgc3VnZ2VzdGlvbnMgdG8gYSBkZWNrIOKAlCByZW1vdmUgY3V0cywgYWRkIGFkZHMuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIFZlcmlmeSBkZWNrIGV4aXN0cwogICAgZGVjayA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBkZWNrcyBXSEVSRSBpZCA9ID8iLCAoYm9keS5kZWNrX2lkLCkpLmZldGNob25lKCkKICAgIGlmIG5vdCBkZWNrOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkRlY2sge2JvZHkuZGVja19pZH0gbm90IGZvdW5kIikKCiAgICByZXN1bHRzID0geyJjdXRzIjogW10sICJhZGRzIjogW10sICJlcnJvcnMiOiBbXX0KCiAgICAjIFByb2Nlc3MgY3V0czogcmVtb3ZlIGNhcmRzIGJ5IG5hbWUKICAgIGZvciBjYXJkX25hbWUgaW4gYm9keS5hY2NlcHRlZF9jdXRzOgogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBpZCBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gQU5EIGNhcmRfbmFtZSA9ID8gTElNSVQgMSIsCiAgICAgICAgICAgIChib2R5LmRlY2tfaWQsIGNhcmRfbmFtZSkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBpZiByb3c6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgiREVMRVRFIEZST00gZGVja19jYXJkcyBXSEVSRSBpZCA9ID8iLCAocm93WyJpZCJdLCkpCiAgICAgICAgICAgIHJlc3VsdHNbImN1dHMiXS5hcHBlbmQoeyJuYW1lIjogY2FyZF9uYW1lLCAic3RhdHVzIjogInJlbW92ZWQifSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRyeSBjYXNlLWluc2Vuc2l0aXZlCiAgICAgICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJTRUxFQ1QgaWQsIGNhcmRfbmFtZSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gQU5EIExPV0VSKGNhcmRfbmFtZSkgPSBMT1dFUig/KSBMSU1JVCAxIiwKICAgICAgICAgICAgICAgIChib2R5LmRlY2tfaWQsIGNhcmRfbmFtZSkKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgICAgIGlmIHJvdzoKICAgICAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgiREVMRVRFIEZST00gZGVja19jYXJkcyBXSEVSRSBpZCA9ID8iLCAocm93WyJpZCJdLCkpCiAgICAgICAgICAgICAgICByZXN1bHRzWyJjdXRzIl0uYXBwZW5kKHsibmFtZSI6IHJvd1siY2FyZF9uYW1lIl0sICJzdGF0dXMiOiAicmVtb3ZlZCJ9KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdWx0c1siZXJyb3JzIl0uYXBwZW5kKHsibmFtZSI6IGNhcmRfbmFtZSwgImVycm9yIjogIkNhcmQgbm90IGZvdW5kIGluIGRlY2sifSkKCiAgICAjIFByb2Nlc3MgYWRkczogbG9vayB1cCBpbiBjb2xsZWN0aW9uIGZpcnN0LCB0aGVuIFNjcnlmYWxsCiAgICBmb3IgY2FyZF9uYW1lIGluIGJvZHkuYWNjZXB0ZWRfYWRkczoKICAgICAgICAjIFRyeSB0byBmaW5kIGluIGNvbGxlY3Rpb24KICAgICAgICBjZSA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBzY3J5ZmFsbF9pZCwgbmFtZSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBMT1dFUihuYW1lKSA9IExPV0VSKD8pIExJTUlUIDEiLAogICAgICAgICAgICAoY2FyZF9uYW1lLCkKICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgc2NyeWZhbGxfaWQgPSBOb25lCiAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IGNhcmRfbmFtZQoKICAgICAgICBpZiBjZToKICAgICAgICAgICAgc2NyeWZhbGxfaWQgPSBjZVsic2NyeWZhbGxfaWQiXQogICAgICAgICAgICByZXNvbHZlZF9uYW1lID0gY2VbIm5hbWUiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVHJ5IFNjcnlmYWxsIEFQSSBsb29rdXAKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IHVybGxpYi5wYXJzZQogICAgICAgICAgICAgICAgZW5jb2RlZCA9IHVybGxpYi5wYXJzZS5xdW90ZShjYXJkX25hbWUpCiAgICAgICAgICAgICAgICBzY3J5X3JlcSA9IFVybFJlcXVlc3QoCiAgICAgICAgICAgICAgICAgICAgZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZnV6enk9e2VuY29kZWR9IiwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiVXNlci1BZ2VudCI6ICJjb21tYW5kZXItYWktbGFiLzEuMCJ9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB3aXRoIHVybG9wZW4oc2NyeV9yZXEsIHRpbWVvdXQ9MTApIGFzIHJlc3A6CiAgICAgICAgICAgICAgICAgICAgY2FyZF9kYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgICAgICAgICAgICAgICAgc2NyeWZhbGxfaWQgPSBjYXJkX2RhdGEuZ2V0KCJpZCIpCiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IGNhcmRfZGF0YS5nZXQoIm5hbWUiLCBjYXJkX25hbWUpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNjcnlmYWxsX2lkOgogICAgICAgICAgICAjIENoZWNrIGlmIGFscmVhZHkgaW4gZGVjawogICAgICAgICAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJTRUxFQ1QgaWQgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IEFORCBzY3J5ZmFsbF9pZCA9ID8iLAogICAgICAgICAgICAgICAgKGJvZHkuZGVja19pZCwgc2NyeWZhbGxfaWQpCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgICAgICBpZiBub3QgZXhpc3Rpbmc6CiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5KSBWQUxVRVMgKD8sID8sID8sIDEpIiwKICAgICAgICAgICAgICAgICAgICAoYm9keS5kZWNrX2lkLCBzY3J5ZmFsbF9pZCwgcmVzb2x2ZWRfbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlc3VsdHNbImFkZHMiXS5hcHBlbmQoeyJuYW1lIjogcmVzb2x2ZWRfbmFtZSwgInNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsICJzdGF0dXMiOiAiYWRkZWQifSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdHNbImFkZHMiXS5hcHBlbmQoeyJuYW1lIjogcmVzb2x2ZWRfbmFtZSwgInN0YXR1cyI6ICJhbHJlYWR5X2luX2RlY2sifSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHRzWyJlcnJvcnMiXS5hcHBlbmQoeyJuYW1lIjogY2FyZF9uYW1lLCAiZXJyb3IiOiAiQ291bGQgbm90IHJlc29sdmUgY2FyZCJ9KQoKICAgIGNvbm4uZXhlY3V0ZSgiVVBEQVRFIGRlY2tzIFNFVCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsIChib2R5LmRlY2tfaWQsKSkKICAgIGNvbm4uY29tbWl0KCkKCiAgICByZXN1bHRzWyJ0b3RhbF9jdXRzIl0gPSBsZW4ocmVzdWx0c1siY3V0cyJdKQogICAgcmVzdWx0c1sidG90YWxfYWRkcyJdID0gbGVuKFthIGZvciBhIGluIHJlc3VsdHNbImFkZHMiXSBpZiBhWyJzdGF0dXMiXSA9PSAiYWRkZWQiXSkKICAgIHJldHVybiByZXN1bHRzCgoKQGFwcC5nZXQoIi9hcGkvY29hY2gvY2FyZHMtbGlrZSIpCmFzeW5jIGRlZiBjb2FjaF9jYXJkc19saWtlKGNhcmQ6IHN0ciwgY29sb3JzOiBzdHIgPSBOb25lLCB0b3BfbjogaW50ID0gMTApOgogICAgIiIiRmluZCBjYXJkcyBzaW1pbGFyIHRvIGEgZ2l2ZW4gY2FyZCB1c2luZyBlbWJlZGRpbmdzLiBVSS1mcmllbmRseSB2ZXJzaW9uLiIiIgogICAgaWYgX2NvYWNoX2VtYmVkZGluZ3MgaXMgTm9uZSBvciBub3QgX2NvYWNoX2VtYmVkZGluZ3MubG9hZGVkOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCAiRW1iZWRkaW5ncyBub3QgbG9hZGVkIikKCiAgICBjb2xvcl9maWx0ZXIgPSBsaXN0KGNvbG9ycy51cHBlcigpKSBpZiBjb2xvcnMgZWxzZSBOb25lCiAgICBtYXRjaGVzID0gX2NvYWNoX2VtYmVkZGluZ3Muc2VhcmNoX3NpbWlsYXIoCiAgICAgICAgcXVlcnlfY2FyZD1jYXJkLCBjb2xvcl9maWx0ZXI9Y29sb3JfZmlsdGVyLCB0b3Bfbj10b3BfbgogICAgKQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcmVzdWx0cyA9IFtdCiAgICBmb3IgbSBpbiBtYXRjaGVzOgogICAgICAgICMgQ2hlY2sgaWYgY2FyZCBpcyBpbiBjb2xsZWN0aW9uCiAgICAgICAgb3duZWQgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgU1VNKHF1YW50aXR5KSBhcyBxdHkgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgTE9XRVIobmFtZSkgPSBMT1dFUig/KSIsCiAgICAgICAgICAgIChtLm5hbWUsKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIG93bmVkX3F0eSA9IChvd25lZFsicXR5Il0gb3IgMCkgaWYgb3duZWQgZWxzZSAwCgogICAgICAgICMgR2V0IGltYWdlIFVSTCBhbmQgcHJpY2UKICAgICAgICBjZSA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBpbWFnZV91cmwsIHRjZ19wcmljZSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBMT1dFUihuYW1lKSA9IExPV0VSKD8pIExJTUlUIDEiLAogICAgICAgICAgICAobS5uYW1lLCkKICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgcmVzdWx0cy5hcHBlbmQoewogICAgICAgICAgICAibmFtZSI6IG0ubmFtZSwKICAgICAgICAgICAgInNpbWlsYXJpdHkiOiByb3VuZChtLnNpbWlsYXJpdHksIDQpLAogICAgICAgICAgICAidHlwZXMiOiBtLnR5cGVzLAogICAgICAgICAgICAibWFuYV92YWx1ZSI6IG0ubWFuYV92YWx1ZSwKICAgICAgICAgICAgIm1hbmFfY29zdCI6IG0ubWFuYV9jb3N0LAogICAgICAgICAgICAidGV4dCI6IG0udGV4dFs6MjAwXSBpZiBtLnRleHQgZWxzZSAiIiwKICAgICAgICAgICAgIm93bmVkX3F0eSI6IG93bmVkX3F0eSwKICAgICAgICAgICAgImltYWdlX3VybCI6IGNlWyJpbWFnZV91cmwiXSBpZiBjZSBlbHNlIE5vbmUsCiAgICAgICAgICAgICJ0Y2dfcHJpY2UiOiBjZVsidGNnX3ByaWNlIl0gaWYgY2UgZWxzZSBOb25lLAogICAgICAgIH0pCgogICAgcmV0dXJuIHsicXVlcnkiOiBjYXJkLCAicmVzdWx0cyI6IHJlc3VsdHN9CgoKQGFwcC5wb3N0KCIvYXBpL2NvYWNoL3JlcG9ydHMvZ2VuZXJhdGUiKQphc3luYyBkZWYgY29hY2hfZ2VuZXJhdGVfcmVwb3J0cygpOgogICAgIiIiUmVidWlsZCBhbGwgZGVjayByZXBvcnRzIGZyb20gYmF0Y2ggcmVzdWx0IEpTT05zIGluIHJlc3VsdHMvLiIiIgogICAgdHJ5OgogICAgICAgIGZyb20gY29hY2gucmVwb3J0X2dlbmVyYXRvciBpbXBvcnQgZ2VuZXJhdGVfZGVja19yZXBvcnRzCiAgICAgICAgbGFiX3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgICAgICByZXN1bHRzX2RpciA9IHN0cihsYWJfcm9vdCAvIENGRy5yZXN1bHRzX2RpcikKICAgICAgICByZXBvcnRzX2RpciA9IHN0cihsYWJfcm9vdCAvICJkZWNrLXJlcG9ydHMiKQogICAgICAgIHVwZGF0ZWQgPSBnZW5lcmF0ZV9kZWNrX3JlcG9ydHMocmVzdWx0c19kaXIsIHJlcG9ydHNfZGlyKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzdGF0dXMiOiAib2siLAogICAgICAgICAgICAiZGVja3NVcGRhdGVkIjogdXBkYXRlZCwKICAgICAgICAgICAgImNvdW50IjogbGVuKHVwZGF0ZWQpLAogICAgICAgICAgICAibWVzc2FnZSI6IGYiR2VuZXJhdGVkIHJlcG9ydHMgZm9yIHtsZW4odXBkYXRlZCl9IGRlY2tzIiBpZiB1cGRhdGVkIGVsc2UgIk5vIGJhdGNoIHJlc3VsdHMgZm91bmQiLAogICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJSZXBvcnQgZ2VuZXJhdGlvbiBmYWlsZWQ6IHtlfSIpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBNTCBUcmFpbmluZyBEYXRhIEVuZHBvaW50cwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGFwcC5nZXQoIi9hcGkvbWwvc3RhdHVzIikKYXN5bmMgZGVmIG1sX3N0YXR1cygpOgogICAgIiIiR2V0IE1MIGRlY2lzaW9uIGxvZ2dpbmcgc3RhdHVzIGFuZCBhdmFpbGFibGUgdHJhaW5pbmcgZGF0YS4iIiIKICAgIGdsb2JhbCBfbWxfbG9nZ2luZ19lbmFibGVkCiAgICBsYWJfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgcmVzdWx0c19kaXIgPSBsYWJfcm9vdCAvIENGRy5yZXN1bHRzX2RpcgoKICAgICMgRmluZCBleGlzdGluZyBNTCBkZWNpc2lvbiBmaWxlcwogICAgbWxfZmlsZXMgPSBbXQogICAgaWYgcmVzdWx0c19kaXIuZXhpc3RzKCk6CiAgICAgICAgZm9yIGYgaW4gc29ydGVkKHJlc3VsdHNfZGlyLmdsb2IoIm1sLWRlY2lzaW9ucy0qLmpzb25sIikpOgogICAgICAgICAgICBsaW5lcyA9IDAKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGYpIGFzIGZoOgogICAgICAgICAgICAgICAgICAgIGxpbmVzID0gc3VtKDEgZm9yIF8gaW4gZmgpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIG1sX2ZpbGVzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAiZmlsZSI6IGYubmFtZSwKICAgICAgICAgICAgICAgICJkZWNpc2lvbnMiOiBsaW5lcywKICAgICAgICAgICAgICAgICJzaXplX2tiIjogcm91bmQoZi5zdGF0KCkuc3Rfc2l6ZSAvIDEwMjQsIDEpLAogICAgICAgICAgICB9KQoKICAgIHRvdGFsX2RlY2lzaW9ucyA9IHN1bShmWyJkZWNpc2lvbnMiXSBmb3IgZiBpbiBtbF9maWxlcykKICAgIHJldHVybiB7CiAgICAgICAgIm1sX2xvZ2dpbmdfZW5hYmxlZCI6IF9tbF9sb2dnaW5nX2VuYWJsZWQsCiAgICAgICAgInRyYWluaW5nX2ZpbGVzIjogbWxfZmlsZXMsCiAgICAgICAgInRvdGFsX2RlY2lzaW9ucyI6IHRvdGFsX2RlY2lzaW9ucywKICAgICAgICAidG90YWxfZmlsZXMiOiBsZW4obWxfZmlsZXMpLAogICAgfQoKCkBhcHAucG9zdCgiL2FwaS9tbC90b2dnbGUiKQphc3luYyBkZWYgbWxfdG9nZ2xlKGVuYWJsZTogYm9vbCA9IFRydWUpOgogICAgIiIiRW5hYmxlIG9yIGRpc2FibGUgTUwgZGVjaXNpb24gbG9nZ2luZyBmb3IgZnV0dXJlIGJhdGNoIHJ1bnMuIiIiCiAgICBnbG9iYWwgX21sX2xvZ2dpbmdfZW5hYmxlZAogICAgX21sX2xvZ2dpbmdfZW5hYmxlZCA9IGVuYWJsZQogICAgcmV0dXJuIHsKICAgICAgICAibWxfbG9nZ2luZ19lbmFibGVkIjogX21sX2xvZ2dpbmdfZW5hYmxlZCwKICAgICAgICAibWVzc2FnZSI6IGYiTUwgZGVjaXNpb24gbG9nZ2luZyB7J2VuYWJsZWQnIGlmIGVuYWJsZSBlbHNlICdkaXNhYmxlZCd9IGZvciBmdXR1cmUgYmF0Y2hlcyIsCiAgICB9CgoKQGFwcC5nZXQoIi9hcGkvbWwvZGVjaXNpb25zL3tmaWxlbmFtZX0iKQphc3luYyBkZWYgbWxfZ2V0X2RlY2lzaW9ucyhmaWxlbmFtZTogc3RyLCBsaW1pdDogaW50ID0gMTAwLCBvZmZzZXQ6IGludCA9IDApOgogICAgIiIiUmVhZCBkZWNpc2lvbiBzbmFwc2hvdHMgZnJvbSBhIHRyYWluaW5nIGRhdGEgZmlsZS4iIiIKICAgIGxhYl9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICBmaWxlcGF0aCA9IGxhYl9yb290IC8gQ0ZHLnJlc3VsdHNfZGlyIC8gZmlsZW5hbWUKCiAgICBpZiBub3QgZmlsZXBhdGguZXhpc3RzKCkgb3Igbm90IGZpbGVuYW1lLnN0YXJ0c3dpdGgoIm1sLWRlY2lzaW9ucy0iKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJNTCBkZWNpc2lvbnMgZmlsZSBub3QgZm91bmQ6IHtmaWxlbmFtZX0iKQoKICAgIGRlY2lzaW9ucyA9IFtdCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IGpzb24gYXMgX2pzb24KICAgICAgICB3aXRoIG9wZW4oZmlsZXBhdGgpIGFzIGY6CiAgICAgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZShmKToKICAgICAgICAgICAgICAgIGlmIGkgPCBvZmZzZXQ6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIGxlbihkZWNpc2lvbnMpID49IGxpbWl0OgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZGVjaXNpb25zLmFwcGVuZChfanNvbi5sb2FkcyhsaW5lLnN0cmlwKCkpKQogICAgICAgICAgICAgICAgZXhjZXB0IF9qc29uLkpTT05EZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkZhaWxlZCB0byByZWFkIGRlY2lzaW9uczoge2V9IikKCiAgICByZXR1cm4gewogICAgICAgICJmaWxlIjogZmlsZW5hbWUsCiAgICAgICAgIm9mZnNldCI6IG9mZnNldCwKICAgICAgICAibGltaXQiOiBsaW1pdCwKICAgICAgICAiY291bnQiOiBsZW4oZGVjaXNpb25zKSwKICAgICAgICAiZGVjaXNpb25zIjogZGVjaXNpb25zLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgTUwgUG9saWN5IEluZmVyZW5jZSBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiMgTGF6eS1sb2FkZWQgcG9saWN5IGluZmVyZW5jZSBzZXJ2aWNlIChvbmx5IGxvYWRzIHdoZW4gZmlyc3QgY2FsbGVkKQpfcG9saWN5X3NlcnZpY2UgPSBOb25lCl9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZCA9IEZhbHNlCgoKZGVmIF9nZXRfcG9saWN5X3NlcnZpY2UoKToKICAgICIiIkdldCBvciBpbml0aWFsaXplIHRoZSBwb2xpY3kgaW5mZXJlbmNlIHNlcnZpY2UgKGxhenkgbG9hZGluZykuIiIiCiAgICBnbG9iYWwgX3BvbGljeV9zZXJ2aWNlLCBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQKICAgIGlmIF9wb2xpY3lfc2VydmljZSBpcyBOb25lIGFuZCBub3QgX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkOgogICAgICAgIF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZCA9IFRydWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gbWwuc2VydmluZy5wb2xpY3lfc2VydmVyIGltcG9ydCBQb2xpY3lJbmZlcmVuY2VTZXJ2aWNlCiAgICAgICAgICAgIF9wb2xpY3lfc2VydmljZSA9IFBvbGljeUluZmVyZW5jZVNlcnZpY2UoKQogICAgICAgICAgICBpZiBfcG9saWN5X3NlcnZpY2UubG9hZCgpOgogICAgICAgICAgICAgICAgbG9nX21sLmluZm8oZiJQb2xpY3kgbW9kZWwgbG9hZGVkIG9uIHtfcG9saWN5X3NlcnZpY2UuZGV2aWNlfSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dfbWwuZXJyb3IoZiJQb2xpY3kgbW9kZWwgbm90IGF2YWlsYWJsZToge19wb2xpY3lfc2VydmljZS5fbG9hZF9lcnJvcn0iKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nX21sLmVycm9yKGYiUG9saWN5IHNlcnZpY2UgaW5pdCBmYWlsZWQ6IHtlfSIpCiAgICByZXR1cm4gX3BvbGljeV9zZXJ2aWNlCgoKQGFwcC5wb3N0KCIvYXBpL21sL3ByZWRpY3QiKQphc3luYyBkZWYgbWxfcHJlZGljdChyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJQcmVkaWN0IGEgbWFjcm8tYWN0aW9uIGZyb20gYSBnYW1lIHN0YXRlIHNuYXBzaG90LgoKICAgIEFjY2VwdHMgRGVjaXNpb25TbmFwc2hvdC1zaGFwZWQgSlNPTiBmcm9tIHRoZSBKYXZhIGJhdGNoIHJ1bm5lci4KICAgIFJldHVybnMgdGhlIGxlYXJuZWQgcG9saWN5J3MgcmVjb21tZW5kZWQgYWN0aW9uLgoKICAgIFJlcXVlc3QgYm9keToKICAgICAgICB7CiAgICAgICAgICAgICJ0dXJuIjogNSwKICAgICAgICAgICAgInBoYXNlIjogIm1haW5fMSIsCiAgICAgICAgICAgICJhY3RpdmVfc2VhdCI6IDAsCiAgICAgICAgICAgICJwbGF5ZXJzIjogWy4uLl0sCiAgICAgICAgICAgICJhcmNoZXR5cGUiOiAiYWdncm8iLAogICAgICAgICAgICAidGVtcGVyYXR1cmUiOiAxLjAsCiAgICAgICAgICAgICJncmVlZHkiOiBmYWxzZQogICAgICAgIH0KCiAgICBSZXNwb25zZToKICAgICAgICB7CiAgICAgICAgICAgICJhY3Rpb24iOiAiY2FzdF9jcmVhdHVyZSIsCiAgICAgICAgICAgICJhY3Rpb25faW5kZXgiOiAwLAogICAgICAgICAgICAiY29uZmlkZW5jZSI6IDAuNzMsCiAgICAgICAgICAgICJwcm9iYWJpbGl0aWVzIjogey4uLn0sCiAgICAgICAgICAgICJpbmZlcmVuY2VfbXMiOiAyLjMKICAgICAgICB9CiAgICAiIiIKICAgIHN2YyA9IF9nZXRfcG9saWN5X3NlcnZpY2UoKQogICAgaWYgc3ZjIGlzIE5vbmUgb3Igbm90IHN2Yy5fbG9hZGVkOgogICAgICAgIGRldGFpbCA9ICJQb2xpY3kgbW9kZWwgbm90IGxvYWRlZC4gIgogICAgICAgIGlmIHN2YzoKICAgICAgICAgICAgZGV0YWlsICs9IHN2Yy5fbG9hZF9lcnJvciBvciAiVHJhaW4gYSBtb2RlbCBmaXJzdC4iCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGV0YWlsICs9ICJQeVRvcmNoIG1heSBub3QgYmUgaW5zdGFsbGVkLiIKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTUwMywgZGV0YWlsPWRldGFpbCkKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIHBsYXlzdHlsZSA9IGJvZHkucG9wKCJhcmNoZXR5cGUiLCAibWlkcmFuZ2UiKQogICAgdGVtcGVyYXR1cmUgPSBib2R5LnBvcCgidGVtcGVyYXR1cmUiLCAxLjApCiAgICBncmVlZHkgPSBib2R5LnBvcCgiZ3JlZWR5IiwgRmFsc2UpCgogICAgcmVzdWx0ID0gc3ZjLnByZWRpY3QoCiAgICAgICAgZGVjaXNpb25fc25hcHNob3Q9Ym9keSwKICAgICAgICBwbGF5c3R5bGU9cGxheXN0eWxlLAogICAgICAgIHRlbXBlcmF0dXJlPXRlbXBlcmF0dXJlLAogICAgICAgIGdyZWVkeT1ncmVlZHksCiAgICApCgogICAgaWYgImVycm9yIiBpbiByZXN1bHQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDAsIGRldGFpbD1yZXN1bHRbImVycm9yIl0pCiAgICByZXR1cm4gcmVzdWx0CgoKQGFwcC5wb3N0KCIvYXBpL21sL3ByZWRpY3QvYmF0Y2giKQphc3luYyBkZWYgbWxfcHJlZGljdF9iYXRjaChyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJQcmVkaWN0IGFjdGlvbnMgZm9yIG11bHRpcGxlIHNuYXBzaG90cyBhdCBvbmNlLgoKICAgIFJlcXVlc3QgYm9keTogeyJzbmFwc2hvdHMiOiBbLi4uXSwgImdyZWVkeSI6IHRydWV9CiAgICAiIiIKICAgIHN2YyA9IF9nZXRfcG9saWN5X3NlcnZpY2UoKQogICAgaWYgc3ZjIGlzIE5vbmUgb3Igbm90IHN2Yy5fbG9hZGVkOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAzLCBkZXRhaWw9IlBvbGljeSBtb2RlbCBub3QgbG9hZGVkIikKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIHNuYXBzaG90cyA9IGJvZHkuZ2V0KCJzbmFwc2hvdHMiLCBbXSkKICAgIGdyZWVkeSA9IGJvZHkuZ2V0KCJncmVlZHkiLCBUcnVlKQoKICAgIGlmIG5vdCBzbmFwc2hvdHM6CiAgICAgICAgcmV0dXJuIHsicmVzdWx0cyI6IFtdfQoKICAgIHJlc3VsdHMgPSBzdmMucHJlZGljdF9iYXRjaChzbmFwc2hvdHMsIGdyZWVkeT1ncmVlZHkpCiAgICByZXR1cm4geyJyZXN1bHRzIjogcmVzdWx0cywgImNvdW50IjogbGVuKHJlc3VsdHMpfQoKCkBhcHAuZ2V0KCIvYXBpL21sL21vZGVsIikKYXN5bmMgZGVmIG1sX21vZGVsX2luZm8oKToKICAgICIiIkdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9hZGVkIHBvbGljeSBtb2RlbC4iIiIKICAgIHN2YyA9IF9nZXRfcG9saWN5X3NlcnZpY2UoKQogICAgaWYgc3ZjIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgImxvYWRlZCI6IEZhbHNlLAogICAgICAgICAgICAiZXJyb3IiOiAiUG9saWN5IHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIiwKICAgICAgICAgICAgInRvcmNoX2F2YWlsYWJsZSI6IEZhbHNlLAogICAgICAgIH0KICAgIHJldHVybiBzdmMuZ2V0X3N0YXR1cygpCgoKQGFwcC5wb3N0KCIvYXBpL21sL3JlbG9hZCIpCmFzeW5jIGRlZiBtbF9yZWxvYWRfbW9kZWwoY2hlY2twb2ludDogc3RyID0gTm9uZSk6CiAgICAiIiJIb3QtcmVsb2FkIGEgcG9saWN5IG1vZGVsIGNoZWNrcG9pbnQuIiIiCiAgICBzdmMgPSBfZ2V0X3BvbGljeV9zZXJ2aWNlKCkKICAgIGlmIHN2YyBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAzLCBkZXRhaWw9IlBvbGljeSBzZXJ2aWNlIG5vdCBhdmFpbGFibGUiKQoKICAgICMgSWYgc2VydmljZSBoYXNuJ3QgbG9hZGVkIHlldCwgdHJ5IGZ1bGwgbG9hZAogICAgaWYgbm90IHN2Yy5fbG9hZGVkOgogICAgICAgIG9rID0gc3ZjLmxvYWQoKQogICAgZWxzZToKICAgICAgICBvayA9IHN2Yy5yZWxvYWQoY2hlY2twb2ludCkKCiAgICByZXR1cm4gewogICAgICAgICJzdWNjZXNzIjogb2ssCiAgICAgICAgInN0YXR1cyI6IHN2Yy5nZXRfc3RhdHVzKCksCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBNTCBUcmFpbmluZyBNYW5hZ2VtZW50IEVuZHBvaW50cwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBUcmFpbmluZyBzdGF0ZSB0cmFja2luZwpfdHJhaW5pbmdfc3RhdGUgPSB7CiAgICAicnVubmluZyI6IEZhbHNlLAogICAgInByb2dyZXNzIjogMCwKICAgICJ0b3RhbF9lcG9jaHMiOiAwLAogICAgImN1cnJlbnRfZXBvY2giOiAwLAogICAgInBoYXNlIjogImlkbGUiLCAgIyBpZGxlIHwgYnVpbGRpbmcgfCB0cmFpbmluZyB8IGV2YWx1YXRpbmcgfCBkb25lIHwgZXJyb3IKICAgICJtZXNzYWdlIjogIiIsCiAgICAibWV0cmljcyI6IE5vbmUsICAjIGxhdGVzdCBlcG9jaCBtZXRyaWNzCiAgICAicmVzdWx0IjogTm9uZSwgICAjIGZpbmFsIHRyYWluaW5nIHJlc3VsdAogICAgImVycm9yIjogTm9uZSwKICAgICJzdGFydGVkX2F0IjogTm9uZSwKfQoKCmRlZiBfcnVuX3RyYWluaW5nX3BpcGVsaW5lKAogICAgcmVzdWx0c19kaXI6IHN0ciwKICAgIGVwb2NoczogaW50LAogICAgbHI6IGZsb2F0LAogICAgYmF0Y2hfc2l6ZTogaW50LAogICAgcGF0aWVuY2U6IGludCwKICAgIHJlYnVpbGRfZGF0YXNldDogYm9vbCwKKToKICAgICIiIlJ1biB0aGUgZnVsbCBNTCB0cmFpbmluZyBwaXBlbGluZSBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiIiIgogICAgZ2xvYmFsIF90cmFpbmluZ19zdGF0ZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KQogICAgICAgIGlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicnVubmluZyJdID0gVHJ1ZQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsic3RhcnRlZF9hdCJdID0gZGF0ZXRpbWUubm93KCkuaXNvZm9ybWF0KCkKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbImVycm9yIl0gPSBOb25lCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJyZXN1bHQiXSA9IE5vbmUKCiAgICAgICAgZGF0YV9kaXIgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9yb290LCAibWwiLCAibW9kZWxzIikKICAgICAgICBja3B0X2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiLCAiY2hlY2twb2ludHMiKQogICAgICAgIG9zLm1ha2VkaXJzKGRhdGFfZGlyLCBleGlzdF9vaz1UcnVlKQogICAgICAgIG9zLm1ha2VkaXJzKGNrcHRfZGlyLCBleGlzdF9vaz1UcnVlKQoKICAgICAgICAjIC0tLSBQaGFzZSAxOiBCdWlsZCBEYXRhc2V0IC0tLQogICAgICAgIHRyYWluX3BhdGggPSBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ0cmFpbi5ucHoiKQogICAgICAgIGlmIHJlYnVpbGRfZGF0YXNldCBvciBub3Qgb3MucGF0aC5leGlzdHModHJhaW5fcGF0aCk6CiAgICAgICAgICAgIF90cmFpbmluZ19zdGF0ZVsicGhhc2UiXSA9ICJidWlsZGluZyIKICAgICAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSAiTG9hZGluZyBjYXJkIGVtYmVkZGluZ3MgJiBidWlsZGluZyBkYXRhc2V0Li4uIgogICAgICAgICAgICBsb2dfbWwuaW5mbygiQnVpbGRpbmcgZGF0YXNldCAobG9hZGluZyBlbWJlZGRpbmdzLCBtYXkgYXV0by1kb3dubG9hZCkuLi4iKQoKICAgICAgICAgICAgZnJvbSBtbC5kYXRhLmRhdGFzZXRfYnVpbGRlciBpbXBvcnQgYnVpbGRfZGF0YXNldCwgc3BsaXRfZGF0YXNldCwgc2F2ZV9kYXRhc2V0CiAgICAgICAgICAgIGRhdGFzZXQgPSBidWlsZF9kYXRhc2V0KHJlc3VsdHNfZGlyPXJlc3VsdHNfZGlyKQogICAgICAgICAgICBpZiBub3QgZGF0YXNldDoKICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiTm8gdHJhaW5pbmcgZGF0YSBwcm9kdWNlZC4gQ2hlY2sgc2VydmVyIGxvZyBmb3IgZGV0YWlscy4iKQogICAgICAgICAgICB0cmFpbl9kcywgdmFsX2RzLCB0ZXN0X2RzID0gc3BsaXRfZGF0YXNldChkYXRhc2V0KQogICAgICAgICAgICBzYXZlX2RhdGFzZXQodHJhaW5fZHMsIG9zLnBhdGguam9pbihkYXRhX2RpciwgInRyYWluLm5weiIpKQogICAgICAgICAgICBzYXZlX2RhdGFzZXQodmFsX2RzLCBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ2YWwubnB6IikpCiAgICAgICAgICAgIHNhdmVfZGF0YXNldCh0ZXN0X2RzLCBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ0ZXN0Lm5weiIpKQogICAgICAgICAgICB0b3RhbF9zYW1wbGVzID0gbGVuKGRhdGFzZXRbInN0YXRlcyJdKQogICAgICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1lc3NhZ2UiXSA9IGYiRGF0YXNldCBidWlsdDoge3RvdGFsX3NhbXBsZXN9IHNhbXBsZXMiCiAgICAgICAgICAgIGxvZ19tbC5pbmZvKGYiRGF0YXNldCBidWlsdDoge3RvdGFsX3NhbXBsZXN9IHNhbXBsZXMiKQoKICAgICAgICAjIC0tLSBQaGFzZSAyOiBUcmFpbiAtLS0KICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAidHJhaW5pbmciCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJ0b3RhbF9lcG9jaHMiXSA9IGVwb2NocwogICAgICAgIF90cmFpbmluZ19zdGF0ZVsiY3VycmVudF9lcG9jaCJdID0gMAogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gZiJUcmFpbmluZyBwb2xpY3kgbmV0d29yayAoe2Vwb2Noc30gZXBvY2hzKS4uLiIKICAgICAgICBsb2dfbWwuaW5mbyhmIlN0YXJ0aW5nIHRyYWluaW5nOiB7ZXBvY2hzfSBlcG9jaHMsIGxyPXtscn0sIGJzPXtiYXRjaF9zaXplfSIpCgogICAgICAgIGltcG9ydCBudW1weSBhcyBucAogICAgICAgIGltcG9ydCB0b3JjaAogICAgICAgIGZyb20gbWwudHJhaW5pbmcucG9saWN5X25ldHdvcmsgaW1wb3J0IFBvbGljeU5ldHdvcmsKICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnRyYWluZXIgaW1wb3J0IFN1cGVydmlzZWRUcmFpbmVyCgogICAgICAgIGRlZiBsb2FkX25wel9zcGxpdChwYXRoKToKICAgICAgICAgICAgZGF0YSA9IG5wLmxvYWQocGF0aCkKICAgICAgICAgICAgcmV0dXJuIGRhdGFbInN0YXRlcyJdLmFzdHlwZShucC5mbG9hdDMyKSwgZGF0YVsibGFiZWxzIl0uYXN0eXBlKG5wLmludDY0KQoKICAgICAgICB0cmFpbl9zdGF0ZXMsIHRyYWluX2xhYmVscyA9IGxvYWRfbnB6X3NwbGl0KHRyYWluX3BhdGgpCiAgICAgICAgdmFsX3BhdGggPSBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ2YWwubnB6IikKICAgICAgICB2YWxfc3RhdGVzLCB2YWxfbGFiZWxzID0gbG9hZF9ucHpfc3BsaXQodmFsX3BhdGgpCgogICAgICAgIGFjdHVhbF9kaW0gPSB0cmFpbl9zdGF0ZXMuc2hhcGVbMV0KICAgICAgICBtb2RlbCA9IFBvbGljeU5ldHdvcmsoaW5wdXRfZGltPWFjdHVhbF9kaW0pCgogICAgICAgIGRldmljZSA9ICJjcHUiCiAgICAgICAgaWYgdG9yY2guY3VkYS5pc19hdmFpbGFibGUoKToKICAgICAgICAgICAgZGV2aWNlID0gImN1ZGEiCiAgICAgICAgZWxpZiBoYXNhdHRyKHRvcmNoLmJhY2tlbmRzLCAibXBzIikgYW5kIHRvcmNoLmJhY2tlbmRzLm1wcy5pc19hdmFpbGFibGUoKToKICAgICAgICAgICAgZGV2aWNlID0gIm1wcyIKCiAgICAgICAgdHJhaW5lciA9IFN1cGVydmlzZWRUcmFpbmVyKAogICAgICAgICAgICBtb2RlbD1tb2RlbCwKICAgICAgICAgICAgZGV2aWNlPWRldmljZSwKICAgICAgICAgICAgbGVhcm5pbmdfcmF0ZT1sciwKICAgICAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaF9zaXplLAogICAgICAgICAgICBlcG9jaHM9ZXBvY2hzLAogICAgICAgICAgICBwYXRpZW5jZT1wYXRpZW5jZSwKICAgICAgICAgICAgY2hlY2twb2ludF9kaXI9Y2twdF9kaXIsCiAgICAgICAgKQoKICAgICAgICAjIEhvb2sgaW50byB0cmFpbmVyIHRvIHJlcG9ydCBwcm9ncmVzcwogICAgICAgIG9yaWdpbmFsX3RyYWluID0gdHJhaW5lci50cmFpbgoKICAgICAgICBkZWYgcGF0Y2hlZF90cmFpbih0cmFpbl9zLCB0cmFpbl9sLCB2YWxfcywgdmFsX2wpOgogICAgICAgICAgICAjIFdlJ2xsIG1vbml0b3IgdGhlIGNoZWNrcG9pbnQgZGlyIGZvciBwcm9ncmVzcwogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxfdHJhaW4odHJhaW5fcywgdHJhaW5fbCwgdmFsX3MsIHZhbF9sKQoKICAgICAgICBzdW1tYXJ5ID0gdHJhaW5lci50cmFpbih0cmFpbl9zdGF0ZXMsIHRyYWluX2xhYmVscywgdmFsX3N0YXRlcywgdmFsX2xhYmVscykKCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJjdXJyZW50X2Vwb2NoIl0gPSBzdW1tYXJ5LmdldCgiZXBvY2hzX3RyYWluZWQiLCBlcG9jaHMpCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXRyaWNzIl0gPSBzdW1tYXJ5CgogICAgICAgICMgLS0tIFBoYXNlIDM6IEV2YWx1YXRlIC0tLQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicGhhc2UiXSA9ICJldmFsdWF0aW5nIgogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gIkV2YWx1YXRpbmcgb24gdGVzdCBzZXQuLi4iCgogICAgICAgIHRlc3RfcGF0aCA9IG9zLnBhdGguam9pbihkYXRhX2RpciwgInRlc3QubnB6IikKICAgICAgICBldmFsX3Jlc3VsdHMgPSBOb25lCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVzdF9wYXRoKToKICAgICAgICAgICAgZnJvbSBtbC50cmFpbmluZy50cmFpbmVyIGltcG9ydCBsb2FkX2NoZWNrcG9pbnQsIGV2YWx1YXRlX21vZGVsCiAgICAgICAgICAgIHRlc3Rfc3RhdGVzLCB0ZXN0X2xhYmVscyA9IGxvYWRfbnB6X3NwbGl0KHRlc3RfcGF0aCkKICAgICAgICAgICAgYmVzdF9tb2RlbCwgXyA9IGxvYWRfY2hlY2twb2ludChzdW1tYXJ5WyJjaGVja3BvaW50X3BhdGgiXSwgZGV2aWNlKQogICAgICAgICAgICBldmFsX3Jlc3VsdHMgPSBldmFsdWF0ZV9tb2RlbChiZXN0X21vZGVsLCB0ZXN0X3N0YXRlcywgdGVzdF9sYWJlbHMsIGRldmljZSkKCiAgICAgICAgICAgIGV2YWxfcGF0aCA9IG9zLnBhdGguam9pbihja3B0X2RpciwgImV2YWxfcmVzdWx0cy5qc29uIikKICAgICAgICAgICAgd2l0aCBvcGVuKGV2YWxfcGF0aCwgInciKSBhcyBmOgogICAgICAgICAgICAgICAganNvbi5kdW1wKGV2YWxfcmVzdWx0cywgZiwgaW5kZW50PTIpCgogICAgICAgICMgLS0tIERvbmUgLS0tCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJwaGFzZSJdID0gImRvbmUiCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl0gPSBGYWxzZQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicmVzdWx0Il0gPSB7CiAgICAgICAgICAgICJ0cmFpbmluZyI6IHN1bW1hcnksCiAgICAgICAgICAgICJldmFsdWF0aW9uIjogZXZhbF9yZXN1bHRzLAogICAgICAgICAgICAiY2hlY2twb2ludCI6IHN1bW1hcnkuZ2V0KCJjaGVja3BvaW50X3BhdGgiLCAiIiksCiAgICAgICAgICAgICJkZXZpY2UiOiBkZXZpY2UsCiAgICAgICAgfQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gZiJUcmFpbmluZyBjb21wbGV0ZSEgQmVzdCB2YWwgYWNjOiB7c3VtbWFyeS5nZXQoJ2Jlc3RfdmFsX2FjY3VyYWN5JywgMCk6LjElfSIKICAgICAgICBsb2dfbWwuaW5mbyhmIkNvbXBsZXRlOiB7c3VtbWFyeS5nZXQoJ2Jlc3RfdmFsX2FjY3VyYWN5JywgMCk6LjElfSB2YWwgYWNjdXJhY3kiKQoKICAgICAgICAjIEF1dG8tcmVsb2FkIHBvbGljeSBzZXJ2ZXIgd2l0aCBuZXcgY2hlY2twb2ludAogICAgICAgIGdsb2JhbCBfcG9saWN5X3NlcnZpY2UsIF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZAogICAgICAgIGlmIF9wb2xpY3lfc2VydmljZSBhbmQgX3BvbGljeV9zZXJ2aWNlLl9sb2FkZWQ6CiAgICAgICAgICAgIF9wb2xpY3lfc2VydmljZS5yZWxvYWQoc3VtbWFyeS5nZXQoImNoZWNrcG9pbnRfcGF0aCIpKQogICAgICAgICAgICBsb2dfbWwuaW5mbygiUG9saWN5IHNlcnZlciByZWxvYWRlZCB3aXRoIG5ldyBjaGVja3BvaW50IikKICAgICAgICBlbGlmIG5vdCBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQ6CiAgICAgICAgICAgIF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZCA9IEZhbHNlICAjIEFsbG93IHJlLWluaXQgd2l0aCBuZXcgbW9kZWwKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicGhhc2UiXSA9ICJlcnJvciIKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJlcnJvciJdID0gc3RyKGUpCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlRyYWluaW5nIGZhaWxlZDoge2V9IgogICAgICAgIGxvZ19tbC5lcnJvcihmIkVSUk9SOiB7ZX0iKQogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQoKCkBhcHAucG9zdCgiL2FwaS9tbC90cmFpbiIpCmFzeW5jIGRlZiBtbF9zdGFydF90cmFpbmluZyhyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJUcmlnZ2VyIE1MIHRyYWluaW5nIHBpcGVsaW5lIGZyb20gdGhlIHdlYiBVSS4KCiAgICBSZXF1ZXN0IGJvZHkgKGFsbCBvcHRpb25hbCk6CiAgICAgICAgewogICAgICAgICAgICAiZXBvY2hzIjogNTAsCiAgICAgICAgICAgICJsciI6IDAuMDAxLAogICAgICAgICAgICAiYmF0Y2hTaXplIjogMjU2LAogICAgICAgICAgICAicGF0aWVuY2UiOiAxMCwKICAgICAgICAgICAgInJlYnVpbGREYXRhc2V0IjogdHJ1ZQogICAgICAgIH0KICAgICIiIgogICAgaWYgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl06CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDksICJUcmFpbmluZyBhbHJlYWR5IGluIHByb2dyZXNzIikKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkgaWYgYXdhaXQgcmVxdWVzdC5ib2R5KCkgZWxzZSB7fQogICAgZXBvY2hzID0gYm9keS5nZXQoImVwb2NocyIsIDUwKQogICAgbHIgPSBib2R5LmdldCgibHIiLCAwLjAwMSkKICAgIGJhdGNoX3NpemUgPSBib2R5LmdldCgiYmF0Y2hTaXplIiwgMjU2KQogICAgcGF0aWVuY2UgPSBib2R5LmdldCgicGF0aWVuY2UiLCAxMCkKICAgIHJlYnVpbGQgPSBib2R5LmdldCgicmVidWlsZERhdGFzZXQiLCBUcnVlKQoKICAgIHJlc3VsdHNfZGlyID0gb3MucGF0aC5qb2luKHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQpLCAicmVzdWx0cyIpCgogICAgIyBSZXNldCBzdGF0ZQogICAgX3RyYWluaW5nX3N0YXRlLnVwZGF0ZSh7CiAgICAgICAgInJ1bm5pbmciOiBUcnVlLAogICAgICAgICJwcm9ncmVzcyI6IDAsCiAgICAgICAgInRvdGFsX2Vwb2NocyI6IGVwb2NocywKICAgICAgICAiY3VycmVudF9lcG9jaCI6IDAsCiAgICAgICAgInBoYXNlIjogInN0YXJ0aW5nIiwKICAgICAgICAibWVzc2FnZSI6ICJJbml0aWFsaXppbmcgdHJhaW5pbmcgcGlwZWxpbmUuLi4iLAogICAgICAgICJtZXRyaWNzIjogTm9uZSwKICAgICAgICAicmVzdWx0IjogTm9uZSwKICAgICAgICAiZXJyb3IiOiBOb25lLAogICAgfSkKCiAgICAjIFJ1biBpbiBiYWNrZ3JvdW5kIHRocmVhZAogICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl90cmFpbmluZ19waXBlbGluZSwKICAgICAgICBhcmdzPShyZXN1bHRzX2RpciwgZXBvY2hzLCBsciwgYmF0Y2hfc2l6ZSwgcGF0aWVuY2UsIHJlYnVpbGQpLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdGhyZWFkLnN0YXJ0KCkKCiAgICByZXR1cm4gewogICAgICAgICJzdGF0dXMiOiAic3RhcnRlZCIsCiAgICAgICAgImNvbmZpZyI6IHsKICAgICAgICAgICAgImVwb2NocyI6IGVwb2NocywKICAgICAgICAgICAgImxyIjogbHIsCiAgICAgICAgICAgICJiYXRjaFNpemUiOiBiYXRjaF9zaXplLAogICAgICAgICAgICAicGF0aWVuY2UiOiBwYXRpZW5jZSwKICAgICAgICAgICAgInJlYnVpbGREYXRhc2V0IjogcmVidWlsZCwKICAgICAgICB9LAogICAgfQoKCkBhcHAuZ2V0KCIvYXBpL21sL3RyYWluL3N0YXR1cyIpCmFzeW5jIGRlZiBtbF90cmFpbmluZ19zdGF0dXMoKToKICAgICIiIkdldCBjdXJyZW50IHRyYWluaW5nIHBpcGVsaW5lIHN0YXR1cy4iIiIKICAgIHJldHVybiBkaWN0KF90cmFpbmluZ19zdGF0ZSkKCgpAYXBwLmdldCgiL2FwaS9tbC9kYXRhL3N0YXR1cyIpCmFzeW5jIGRlZiBtbF9kYXRhX3N0YXR1cygpOgogICAgIiIiR2V0IHN0YXR1cyBvZiBhdmFpbGFibGUgdHJhaW5pbmcgZGF0YSBhbmQgbW9kZWwgY2hlY2twb2ludHMuIiIiCiAgICBwcm9qZWN0X3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgIHJlc3VsdHNfZGlyID0gcHJvamVjdF9yb290IC8gInJlc3VsdHMiCiAgICBkYXRhX2RpciA9IHByb2plY3Rfcm9vdCAvICJtbCIgLyAibW9kZWxzIgogICAgY2twdF9kaXIgPSBkYXRhX2RpciAvICJjaGVja3BvaW50cyIKCiAgICAjIERlY2lzaW9uIGxvZyBmaWxlcwogICAgZGVjaXNpb25fZmlsZXMgPSBbXQogICAgaWYgcmVzdWx0c19kaXIuZXhpc3RzKCk6CiAgICAgICAgZm9yIGYgaW4gc29ydGVkKHJlc3VsdHNfZGlyLmdsb2IoIm1sLWRlY2lzaW9ucy0qLmpzb25sIikpOgogICAgICAgICAgICBsaW5lX2NvdW50ID0gMAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZiwgInIiKSBhcyBmaDoKICAgICAgICAgICAgICAgICAgICBsaW5lX2NvdW50ID0gc3VtKDEgZm9yIF8gaW4gZmgpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGRlY2lzaW9uX2ZpbGVzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAibmFtZSI6IGYubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZi5zdGF0KCkuc3Rfc2l6ZSwKICAgICAgICAgICAgICAgICJkZWNpc2lvbnMiOiBsaW5lX2NvdW50LAogICAgICAgICAgICB9KQoKICAgICMgRGF0YXNldCBmaWxlcwogICAgZGF0YXNldHMgPSB7fQogICAgZm9yIHNwbGl0IGluIFsidHJhaW4iLCAidmFsIiwgInRlc3QiXToKICAgICAgICBwYXRoID0gZGF0YV9kaXIgLyBmIntzcGxpdH0ubnB6IgogICAgICAgIGlmIHBhdGguZXhpc3RzKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBudW1weSBhcyBucAogICAgICAgICAgICAgICAgZGF0YSA9IG5wLmxvYWQoc3RyKHBhdGgpKQogICAgICAgICAgICAgICAgZGF0YXNldHNbc3BsaXRdID0gewogICAgICAgICAgICAgICAgICAgICJzYW1wbGVzIjogaW50KGRhdGFbInN0YXRlcyJdLnNoYXBlWzBdKSwKICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZXMiOiBpbnQoZGF0YVsic3RhdGVzIl0uc2hhcGVbMV0pLAogICAgICAgICAgICAgICAgICAgICJzaXplIjogcGF0aC5zdGF0KCkuc3Rfc2l6ZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIGRhdGFzZXRzW3NwbGl0XSA9IHsic2l6ZSI6IHBhdGguc3RhdCgpLnN0X3NpemV9CgogICAgIyBDaGVja3BvaW50cwogICAgY2hlY2twb2ludHMgPSBbXQogICAgaWYgY2twdF9kaXIuZXhpc3RzKCk6CiAgICAgICAgZm9yIGYgaW4gc29ydGVkKGNrcHRfZGlyLmdsb2IoIioucHQiKSk6CiAgICAgICAgICAgIGNoZWNrcG9pbnRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAibmFtZSI6IGYubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZi5zdGF0KCkuc3Rfc2l6ZSwKICAgICAgICAgICAgICAgICJtb2RpZmllZCI6IGRhdGV0aW1lLmZyb210aW1lc3RhbXAoZi5zdGF0KCkuc3RfbXRpbWUpLmlzb2Zvcm1hdCgpLAogICAgICAgICAgICB9KQoKICAgICMgRXZhbCByZXN1bHRzCiAgICBldmFsX3BhdGggPSBja3B0X2RpciAvICJldmFsX3Jlc3VsdHMuanNvbiIKICAgIGV2YWxfcmVzdWx0cyA9IE5vbmUKICAgIGlmIGV2YWxfcGF0aC5leGlzdHMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihldmFsX3BhdGgsICJyIikgYXMgZjoKICAgICAgICAgICAgICAgIGV2YWxfcmVzdWx0cyA9IGpzb24ubG9hZChmKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICByZXR1cm4gewogICAgICAgICJkZWNpc2lvbkZpbGVzIjogZGVjaXNpb25fZmlsZXMsCiAgICAgICAgInRvdGFsRGVjaXNpb25zIjogc3VtKGRbImRlY2lzaW9ucyJdIGZvciBkIGluIGRlY2lzaW9uX2ZpbGVzKSwKICAgICAgICAiZGF0YXNldHMiOiBkYXRhc2V0cywKICAgICAgICAiY2hlY2twb2ludHMiOiBjaGVja3BvaW50cywKICAgICAgICAiZXZhbFJlc3VsdHMiOiBldmFsX3Jlc3VsdHMsCiAgICAgICAgInBvbGljeUxvYWRlZCI6IF9wb2xpY3lfc2VydmljZSBpcyBub3QgTm9uZSBhbmQgX3BvbGljeV9zZXJ2aWNlLl9sb2FkZWQgaWYgX3BvbGljeV9zZXJ2aWNlIGVsc2UgRmFsc2UsCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBQUE8gVHJhaW5pbmcgKyBUb3VybmFtZW50IEVuZHBvaW50cwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKX3Bwb19zdGF0ZSA9IHsKICAgICJydW5uaW5nIjogRmFsc2UsCiAgICAiaXRlcmF0aW9uIjogMCwKICAgICJ0b3RhbF9pdGVyYXRpb25zIjogMCwKICAgICJwaGFzZSI6ICJpZGxlIiwKICAgICJtZXNzYWdlIjogIiIsCiAgICAibWV0cmljcyI6IE5vbmUsCiAgICAicmVzdWx0IjogTm9uZSwKICAgICJlcnJvciI6IE5vbmUsCn0KCl90b3VybmFtZW50X3N0YXRlID0gewogICAgInJ1bm5pbmciOiBGYWxzZSwKICAgICJwaGFzZSI6ICJpZGxlIiwKICAgICJtZXNzYWdlIjogIiIsCiAgICAicmVzdWx0IjogTm9uZSwKICAgICJlcnJvciI6IE5vbmUsCn0KCgpkZWYgX3J1bl9wcG9fcGlwZWxpbmUoCiAgICBpdGVyYXRpb25zOiBpbnQsIGVwaXNvZGVzX3Blcl9pdGVyOiBpbnQsIHBwb19lcG9jaHM6IGludCwgYmF0Y2hfc2l6ZTogaW50LAogICAgbHI6IGZsb2F0LCBjbGlwX2Vwc2lsb246IGZsb2F0LCBlbnRyb3B5X2NvZWZmOiBmbG9hdCwKICAgIG9wcG9uZW50OiBzdHIsIHBsYXlzdHlsZTogc3RyLCBsb2FkX3N1cGVydmlzZWQ6IHN0ciwKKToKICAgICIiIlJ1biBQUE8gdHJhaW5pbmcgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4iIiIKICAgIGdsb2JhbCBfcHBvX3N0YXRlCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIHByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQpCiAgICAgICAgaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByb2plY3Rfcm9vdCkKCiAgICAgICAgX3Bwb19zdGF0ZVsicnVubmluZyJdID0gVHJ1ZQogICAgICAgIF9wcG9fc3RhdGVbImVycm9yIl0gPSBOb25lCiAgICAgICAgX3Bwb19zdGF0ZVsicmVzdWx0Il0gPSBOb25lCgogICAgICAgIGZyb20gbWwudHJhaW5pbmcucHBvX3RyYWluZXIgaW1wb3J0IFBQT1RyYWluZXIsIFBQT0NvbmZpZwoKICAgICAgICBja3B0X2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiLCAiY2hlY2twb2ludHMiKQogICAgICAgIGNvbmZpZyA9IFBQT0NvbmZpZygKICAgICAgICAgICAgaXRlcmF0aW9ucz1pdGVyYXRpb25zLAogICAgICAgICAgICBlcGlzb2Rlc19wZXJfaXRlcj1lcGlzb2Rlc19wZXJfaXRlciwKICAgICAgICAgICAgcHBvX2Vwb2Nocz1wcG9fZXBvY2hzLAogICAgICAgICAgICBiYXRjaF9zaXplPWJhdGNoX3NpemUsCiAgICAgICAgICAgIGxlYXJuaW5nX3JhdGU9bHIsCiAgICAgICAgICAgIGNsaXBfZXBzaWxvbj1jbGlwX2Vwc2lsb24sCiAgICAgICAgICAgIGVudHJvcHlfY29lZmY9ZW50cm9weV9jb2VmZiwKICAgICAgICAgICAgb3Bwb25lbnQ9b3Bwb25lbnQsCiAgICAgICAgICAgIHBsYXlzdHlsZT1wbGF5c3R5bGUsCiAgICAgICAgICAgIGNoZWNrcG9pbnRfZGlyPWNrcHRfZGlyLAogICAgICAgICAgICBsb2FkX3N1cGVydmlzZWQ9bG9hZF9zdXBlcnZpc2VkIGlmIGxvYWRfc3VwZXJ2aXNlZCBlbHNlIE5vbmUsCiAgICAgICAgKQoKICAgICAgICB0cmFpbmVyID0gUFBPVHJhaW5lcihjb25maWcpCgogICAgICAgIGRlZiBwcm9ncmVzc19jYihpdGVyYXRpb24sIG1ldHJpY3MpOgogICAgICAgICAgICBfcHBvX3N0YXRlWyJpdGVyYXRpb24iXSA9IGl0ZXJhdGlvbgogICAgICAgICAgICBfcHBvX3N0YXRlWyJwaGFzZSJdID0gInRyYWluaW5nIgogICAgICAgICAgICBfcHBvX3N0YXRlWyJtZXNzYWdlIl0gPSBmIkl0ZXJhdGlvbiB7aXRlcmF0aW9ufS97aXRlcmF0aW9uc30gfCBXUjoge21ldHJpY3MuZ2V0KCd3aW5fcmF0ZScsIDApOi4wJX0iCiAgICAgICAgICAgIF9wcG9fc3RhdGVbIm1ldHJpY3MiXSA9IG1ldHJpY3MKCiAgICAgICAgc3VtbWFyeSA9IHRyYWluZXIudHJhaW4ocHJvZ3Jlc3NfY2FsbGJhY2s9cHJvZ3Jlc3NfY2IpCgogICAgICAgIF9wcG9fc3RhdGVbInBoYXNlIl0gPSAiZG9uZSIKICAgICAgICBfcHBvX3N0YXRlWyJydW5uaW5nIl0gPSBGYWxzZQogICAgICAgIF9wcG9fc3RhdGVbInJlc3VsdCJdID0gc3VtbWFyeQogICAgICAgIF9wcG9fc3RhdGVbIm1lc3NhZ2UiXSA9IGYiUFBPIGNvbXBsZXRlISBCZXN0IHdpbiByYXRlOiB7c3VtbWFyeS5nZXQoJ2Jlc3Rfd2luX3JhdGUnLCAwKTouMCV9IgoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgX3Bwb19zdGF0ZVsicGhhc2UiXSA9ICJlcnJvciIKICAgICAgICBfcHBvX3N0YXRlWyJydW5uaW5nIl0gPSBGYWxzZQogICAgICAgIF9wcG9fc3RhdGVbImVycm9yIl0gPSBzdHIoZSkKICAgICAgICBfcHBvX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlBQTyBmYWlsZWQ6IHtlfSIKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpAYXBwLnBvc3QoIi9hcGkvbWwvdHJhaW4vcHBvIikKYXN5bmMgZGVmIG1sX3N0YXJ0X3BwbyhyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJTdGFydCBQUE8gdHJhaW5pbmcgcGlwZWxpbmUuIiIiCiAgICBpZiBfcHBvX3N0YXRlWyJydW5uaW5nIl06CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDksICJQUE8gdHJhaW5pbmcgYWxyZWFkeSBpbiBwcm9ncmVzcyIpCiAgICBpZiBfdHJhaW5pbmdfc3RhdGVbInJ1bm5pbmciXToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwOSwgIlN1cGVydmlzZWQgdHJhaW5pbmcgaW4gcHJvZ3Jlc3Mg4oCUIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCIpCgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpIGlmIGF3YWl0IHJlcXVlc3QuYm9keSgpIGVsc2Uge30KICAgIGl0ZXJhdGlvbnMgPSBib2R5LmdldCgiaXRlcmF0aW9ucyIsIDEwMCkKICAgIGVwaXNvZGVzID0gYm9keS5nZXQoImVwaXNvZGVzUGVySXRlciIsIDY0KQogICAgcHBvX2Vwb2NocyA9IGJvZHkuZ2V0KCJwcG9FcG9jaHMiLCA0KQogICAgYmF0Y2hfc2l6ZSA9IGJvZHkuZ2V0KCJiYXRjaFNpemUiLCAyNTYpCiAgICBsciA9IGJvZHkuZ2V0KCJsciIsIDNlLTQpCiAgICBjbGlwX2VwcyA9IGJvZHkuZ2V0KCJjbGlwRXBzaWxvbiIsIDAuMikKICAgIGVudHJvcHkgPSBib2R5LmdldCgiZW50cm9weUNvZWZmIiwgMC4wMSkKICAgIG9wcG9uZW50ID0gYm9keS5nZXQoIm9wcG9uZW50IiwgImhldXJpc3RpYyIpCiAgICBwbGF5c3R5bGUgPSBib2R5LmdldCgicGxheXN0eWxlIiwgIm1pZHJhbmdlIikKICAgIGxvYWRfc3VwID0gYm9keS5nZXQoImxvYWRTdXBlcnZpc2VkIiwgIiIpCgogICAgX3Bwb19zdGF0ZS51cGRhdGUoewogICAgICAgICJydW5uaW5nIjogVHJ1ZSwgIml0ZXJhdGlvbiI6IDAsICJ0b3RhbF9pdGVyYXRpb25zIjogaXRlcmF0aW9ucywKICAgICAgICAicGhhc2UiOiAic3RhcnRpbmciLCAibWVzc2FnZSI6ICJJbml0aWFsaXppbmcgUFBPLi4uIiwKICAgICAgICAibWV0cmljcyI6IE5vbmUsICJyZXN1bHQiOiBOb25lLCAiZXJyb3IiOiBOb25lLAogICAgfSkKCiAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKAogICAgICAgIHRhcmdldD1fcnVuX3Bwb19waXBlbGluZSwKICAgICAgICBhcmdzPShpdGVyYXRpb25zLCBlcGlzb2RlcywgcHBvX2Vwb2NocywgYmF0Y2hfc2l6ZSwgbHIsIGNsaXBfZXBzLCBlbnRyb3B5LCBvcHBvbmVudCwgcGxheXN0eWxlLCBsb2FkX3N1cCksCiAgICAgICAgZGFlbW9uPVRydWUsCiAgICApCiAgICB0aHJlYWQuc3RhcnQoKQoKICAgIHJldHVybiB7InN0YXR1cyI6ICJzdGFydGVkIiwgIml0ZXJhdGlvbnMiOiBpdGVyYXRpb25zfQoKCkBhcHAuZ2V0KCIvYXBpL21sL3RyYWluL3Bwby9zdGF0dXMiKQphc3luYyBkZWYgbWxfcHBvX3N0YXR1cygpOgogICAgIiIiR2V0IFBQTyB0cmFpbmluZyBzdGF0dXMuIiIiCiAgICByZXR1cm4gZGljdChfcHBvX3N0YXRlKQoKCmRlZiBfcnVuX3RvdXJuYW1lbnRfcGlwZWxpbmUoZXBpc29kZXM6IGludCwgcGxheXN0eWxlOiBzdHIpOgogICAgIiIiUnVuIHRvdXJuYW1lbnQgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4iIiIKICAgIGdsb2JhbCBfdG91cm5hbWVudF9zdGF0ZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KQogICAgICAgIGlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJydW5uaW5nIl0gPSBUcnVlCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbImVycm9yIl0gPSBOb25lCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInJlc3VsdCJdID0gTm9uZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJwaGFzZSJdID0gInJ1bm5pbmciCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbIm1lc3NhZ2UiXSA9ICJSdW5uaW5nIHRvdXJuYW1lbnQuLi4iCgogICAgICAgIGZyb20gbWwuZXZhbC50b3VybmFtZW50IGltcG9ydCAoCiAgICAgICAgICAgIHJ1bl90b3VybmFtZW50LCBIZXVyaXN0aWNQb2xpY3ksIFJhbmRvbVBvbGljeSwgTGVhcm5lZFBvbGljeSwKICAgICAgICApCgogICAgICAgIGNrcHRfZGlyID0gb3MucGF0aC5qb2luKHByb2plY3Rfcm9vdCwgIm1sIiwgIm1vZGVscyIsICJjaGVja3BvaW50cyIpCiAgICAgICAgcG9saWNpZXMgPSB7CiAgICAgICAgICAgICJoZXVyaXN0aWMiOiBIZXVyaXN0aWNQb2xpY3koKSwKICAgICAgICAgICAgInJhbmRvbSI6IFJhbmRvbVBvbGljeSgpLAogICAgICAgIH0KCiAgICAgICAgc3VwX3BhdGggPSBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJiZXN0X3BvbGljeS5wdCIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc3VwX3BhdGgpOgogICAgICAgICAgICBwb2xpY2llc1sic3VwZXJ2aXNlZCJdID0gTGVhcm5lZFBvbGljeShzdXBfcGF0aCkKCiAgICAgICAgcHBvX3BhdGggPSBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJiZXN0X3Bwby5wdCIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocHBvX3BhdGgpOgogICAgICAgICAgICBwb2xpY2llc1sicHBvIl0gPSBMZWFybmVkUG9saWN5KHBwb19wYXRoKQoKICAgICAgICByZXN1bHQgPSBydW5fdG91cm5hbWVudCgKICAgICAgICAgICAgcG9saWNpZXM9cG9saWNpZXMsCiAgICAgICAgICAgIGVwaXNvZGVzX3Blcl9tYXRjaHVwPWVwaXNvZGVzLAogICAgICAgICAgICBwbGF5c3R5bGU9cGxheXN0eWxlLAogICAgICAgICkKCiAgICAgICAgIyBTYXZlIHJlc3VsdHMKICAgICAgICBvdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbihja3B0X2RpciwgInRvdXJuYW1lbnRfcmVzdWx0cy5qc29uIikKICAgICAgICB3aXRoIG9wZW4ob3V0cHV0X3BhdGgsICJ3IikgYXMgZjoKICAgICAgICAgICAganNvbi5kdW1wKHJlc3VsdC50b19kaWN0KCksIGYsIGluZGVudD0yKQoKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicGhhc2UiXSA9ICJkb25lIgogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJydW5uaW5nIl0gPSBGYWxzZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJyZXN1bHQiXSA9IHJlc3VsdC50b19kaWN0KCkKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsibWVzc2FnZSJdID0gZiJUb3VybmFtZW50IGNvbXBsZXRlISB7cmVzdWx0LnRvdGFsX21hdGNoZXN9IG1hdGNoZXMiCgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicGhhc2UiXSA9ICJlcnJvciIKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsiZXJyb3IiXSA9IHN0cihlKQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJtZXNzYWdlIl0gPSBmIlRvdXJuYW1lbnQgZmFpbGVkOiB7ZX0iCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCIvYXBpL21sL3RvdXJuYW1lbnQiKQphc3luYyBkZWYgbWxfc3RhcnRfdG91cm5hbWVudChyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJTdGFydCBhIHRvdXJuYW1lbnQgZXZhbHVhdGlvbi4iIiIKICAgIGlmIF90b3VybmFtZW50X3N0YXRlWyJydW5uaW5nIl06CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDksICJUb3VybmFtZW50IGFscmVhZHkgaW4gcHJvZ3Jlc3MiKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKSBpZiBhd2FpdCByZXF1ZXN0LmJvZHkoKSBlbHNlIHt9CiAgICBlcGlzb2RlcyA9IGJvZHkuZ2V0KCJlcGlzb2RlcyIsIDUwKQogICAgcGxheXN0eWxlID0gYm9keS5nZXQoInBsYXlzdHlsZSIsICJtaWRyYW5nZSIpCgogICAgX3RvdXJuYW1lbnRfc3RhdGUudXBkYXRlKHsKICAgICAgICAicnVubmluZyI6IFRydWUsICJwaGFzZSI6ICJzdGFydGluZyIsCiAgICAgICAgIm1lc3NhZ2UiOiAiSW5pdGlhbGl6aW5nIHRvdXJuYW1lbnQuLi4iLAogICAgICAgICJyZXN1bHQiOiBOb25lLCAiZXJyb3IiOiBOb25lLAogICAgfSkKCiAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKAogICAgICAgIHRhcmdldD1fcnVuX3RvdXJuYW1lbnRfcGlwZWxpbmUsCiAgICAgICAgYXJncz0oZXBpc29kZXMsIHBsYXlzdHlsZSksCiAgICAgICAgZGFlbW9uPVRydWUsCiAgICApCiAgICB0aHJlYWQuc3RhcnQoKQoKICAgIHJldHVybiB7InN0YXR1cyI6ICJzdGFydGVkIiwgImVwaXNvZGVzIjogZXBpc29kZXN9CgoKQGFwcC5nZXQoIi9hcGkvbWwvdG91cm5hbWVudC9zdGF0dXMiKQphc3luYyBkZWYgbWxfdG91cm5hbWVudF9zdGF0dXMoKToKICAgICIiIkdldCB0b3VybmFtZW50IHN0YXR1cy4iIiIKICAgIHJldHVybiBkaWN0KF90b3VybmFtZW50X3N0YXRlKQoKCkBhcHAuZ2V0KCIvYXBpL21sL3RvdXJuYW1lbnQvcmVzdWx0cyIpCmFzeW5jIGRlZiBtbF90b3VybmFtZW50X3Jlc3VsdHMoKToKICAgICIiIkdldCBsYXRlc3QgdG91cm5hbWVudCByZXN1bHRzLiIiIgogICAgcHJvamVjdF9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICByZXN1bHRzX3BhdGggPSBwcm9qZWN0X3Jvb3QgLyAibWwiIC8gIm1vZGVscyIgLyAiY2hlY2twb2ludHMiIC8gInRvdXJuYW1lbnRfcmVzdWx0cy5qc29uIgogICAgaWYgcmVzdWx0c19wYXRoLmV4aXN0cygpOgogICAgICAgIHdpdGggb3BlbihyZXN1bHRzX3BhdGgsICJyIikgYXMgZjoKICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmKQogICAgcmV0dXJuIHsiZXJyb3IiOiAiTm8gdG91cm5hbWVudCByZXN1bHRzIGZvdW5kLiBSdW4gYSB0b3VybmFtZW50IGZpcnN0LiJ9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBTdGF0aWMgRmlsZSBTZXJ2aW5nIChSZWFjdCBTUEEpIOKAlCBNVVNUIGJlIGFmdGVyIGFsbCBBUEkgcm91dGVzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIFVJIFNlcnZpbmc6IGxlZ2FjeSBIVE1ML0pTL0NTUyBwYWdlcyAocHJpbWFyeSkgb3IgUmVhY3QgU1BBIChmYWxsYmFjaykKX2xlZ2FjeV91aV9kaXIgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAidWkiCl9zcGFfZGlyID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gImZyb250ZW5kIiAvICJjb21tYW5kZXItYWktbGFiLXVpIiAvICJkaXN0IgoKaWYgX2xlZ2FjeV91aV9kaXIuZXhpc3RzKCk6CiAgICAjIFByaW1hcnk6IHNlcnZlIHRoZSBwcm92ZW4gbXVsdGktcGFnZSBIVE1ML0pTL0NTUyBVSQogICAgYXBwLm1vdW50KCIvIiwgU3RhdGljRmlsZXMoZGlyZWN0b3J5PXN0cihfbGVnYWN5X3VpX2RpciksIGh0bWw9VHJ1ZSksIG5hbWU9InVpIikKCmVsaWYgX3NwYV9kaXIuZXhpc3RzKCk6CiAgICAjIEZhbGxiYWNrOiBSZWFjdCBTUEEgKG9ubHkgaWYgbGVnYWN5IHVpLyBmb2xkZXIgaXMgbWlzc2luZykKICAgIF9zcGFfYXNzZXRzID0gX3NwYV9kaXIgLyAiYXNzZXRzIgogICAgaWYgX3NwYV9hc3NldHMuZXhpc3RzKCk6CiAgICAgICAgYXBwLm1vdW50KCIvYXNzZXRzIiwgU3RhdGljRmlsZXMoZGlyZWN0b3J5PXN0cihfc3BhX2Fzc2V0cykpLCBuYW1lPSJzcGEtYXNzZXRzIikKCiAgICBAYXBwLmdldCgiL3tmdWxsX3BhdGg6cGF0aH0iKQogICAgYXN5bmMgZGVmIF9zcGFfY2F0Y2hhbGwoZnVsbF9wYXRoOiBzdHIpOgogICAgICAgIGZyb20gZmFzdGFwaS5yZXNwb25zZXMgaW1wb3J0IEZpbGVSZXNwb25zZQogICAgICAgIHJlcXVlc3RlZF9maWxlID0gX3NwYV9kaXIgLyBmdWxsX3BhdGgKICAgICAgICBpZiBmdWxsX3BhdGggYW5kIHJlcXVlc3RlZF9maWxlLmV4aXN0cygpIGFuZCByZXF1ZXN0ZWRfZmlsZS5pc19maWxlKCk6CiAgICAgICAgICAgIHJldHVybiBGaWxlUmVzcG9uc2Uoc3RyKHJlcXVlc3RlZF9maWxlKSkKICAgICAgICByZXR1cm4gRmlsZVJlc3BvbnNlKHN0cihfc3BhX2RpciAvICJpbmRleC5odG1sIikpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBTdGFydHVwCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgcGFyc2VfYXJncygpOgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IkNvbW1hbmRlciBBSSBMYWIgQVBJIFNlcnZlciB2MyIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWZvcmdlLWphciIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIkZPUkdFX0pBUiIsICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byBmb3JnZS1ndWktZGVza3RvcCBqYXItd2l0aC1kZXBlbmRlbmNpZXMiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb3JnZS1kaXIiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJGT1JHRV9ESVIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkZvcmdlIHdvcmtpbmcgZGlyZWN0b3J5IChjb250YWlucyByZXMvKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWZvcmdlLWRlY2tzLWRpciIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIkZPUkdFX0RFQ0tTX0RJUiIsICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byBDb21tYW5kZXIgZGVjayBmaWxlcyAoZGVmYXVsdDogJSVBUFBEQVRBJSUvRm9yZ2UvZGVja3MvY29tbWFuZGVyKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWxhYi1qYXIiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJMQUJfSkFSIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIGNvbW1hbmRlci1haS1sYWIuamFyIChkZWZhdWx0OiBhdXRvLWRldGVjdCBmcm9tIHRhcmdldC8pIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcG9ydCIsIHR5cGU9aW50LCBkZWZhdWx0PWludChvcy5lbnZpcm9uLmdldCgiTEFCX1BPUlQiLCAiODA4MCIpKSkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0teGltaWxhci1rZXkiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJYSU1JTEFSX0FQSV9LRVkiLCAiOTZjN2RhYjM1ZGRiZDg4MjliMDRjMGY1YmNlYTU3ZjVlZGUyMDQ5NiIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJYaW1pbGFyIEFQSSBrZXkgZm9yIGNhcmQgc2Nhbm5lciAodmlzdWFsIEFJIHJlY29nbml0aW9uKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXBwbHgta2V5IiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiUFBMWF9BUElfS0VZIiwgInBwbHgtRzc2SGdyQVU4SW03MmJFVE1leVI0YXNBV3d0Rzh3cm15Znk2VlNLQTlEVG4wNUZxIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBlcnBsZXhpdHkgQVBJIGtleSBmb3IgQUkgZGVjayByZXNlYXJjaC9nZW5lcmF0aW9uIChlbnY6IFBQTFhfQVBJX0tFWSkiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS12ZXJib3NlIiwgIi12IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRW5hYmxlIERFQlVHLWxldmVsIGxvZ2dpbmcgKGRlZmF1bHQ6IElORk8pIikKICAgIHJldHVybiBwYXJzZXIucGFyc2VfYXJncygpCgoKZGVmIHJlc29sdmVfbGFiX2phcigpIC0+IHN0cjoKICAgIHRhcmdldF9kaXIgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAidGFyZ2V0IgogICAgaWYgdGFyZ2V0X2Rpci5leGlzdHMoKToKICAgICAgICBmb3IgcGF0dGVybiBpbiBbCiAgICAgICAgICAgICJjb21tYW5kZXItYWktbGFiLSotamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphciIsCiAgICAgICAgICAgICJjb21tYW5kZXItYWktbGFiLSotc2hhZGVkLmphciIsCiAgICAgICAgICAgICJjb21tYW5kZXItYWktbGFiLSouamFyIiwKICAgICAgICBdOgogICAgICAgICAgICBqYXJzID0gc29ydGVkKHRhcmdldF9kaXIuZ2xvYihwYXR0ZXJuKSkKICAgICAgICAgICAgamFycyA9IFtqIGZvciBqIGluIGphcnMgaWYgbm90IGoubmFtZS5zdGFydHN3aXRoKCJvcmlnaW5hbC0iKV0KICAgICAgICAgICAgaWYgamFyczoKICAgICAgICAgICAgICAgIHJldHVybiBzdHIoamFyc1swXSkKICAgIHJldHVybiAiIgoKCmRlZiByZXNvbHZlX2ZvcmdlX2RlY2tzX2RpcigpIC0+IHN0cjoKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgICAgIGFwcGRhdGEgPSBvcy5lbnZpcm9uLmdldCgiQVBQREFUQSIsICIiKQogICAgICAgIGlmIGFwcGRhdGE6CiAgICAgICAgICAgIGNhbmRpZGF0ZSA9IG9zLnBhdGguam9pbihhcHBkYXRhLCAiRm9yZ2UiLCAiZGVja3MiLCAiY29tbWFuZGVyIikKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihjYW5kaWRhdGUpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZQogICAgaG9tZSA9IFBhdGguaG9tZSgpCiAgICBmb3IgY2FuZGlkYXRlIGluIFsKICAgICAgICBob21lIC8gIi5mb3JnZSIgLyAiZGVja3MiIC8gImNvbW1hbmRlciIsCiAgICAgICAgaG9tZSAvICJGb3JnZSIgLyAiZGVja3MiIC8gImNvbW1hbmRlciIsCiAgICBdOgogICAgICAgIGlmIGNhbmRpZGF0ZS5pc19kaXIoKToKICAgICAgICAgICAgcmV0dXJuIHN0cihjYW5kaWRhdGUpCiAgICByZXR1cm4gIiIKCgpkZWYgbG9hZF9jb21tYW5kZXJfbWV0YSgpOgogICAgIiIiTG9hZCBjb21tYW5kZXIgbWV0YSBtYXBwaW5nIGZyb20gZmlsZSBvciB1c2UgYnVpbHRpbnMuIiIiCiAgICBnbG9iYWwgQ09NTUFOREVSX01FVEEKICAgIG1ldGFfcGF0aCA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJjb21tYW5kZXItbWV0YS5qc29uIgogICAgaWYgbWV0YV9wYXRoLmV4aXN0cygpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKG1ldGFfcGF0aCwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICAgICAgQ09NTUFOREVSX01FVEEgPSBqc29uLmxvYWQoZikKICAgICAgICAgICAgbG9nLmluZm8oZiIgIE1ldGE6ICAgICAgICAgTG9hZGVkIHtsZW4oQ09NTUFOREVSX01FVEEpfSBjb21tYW5kZXJzIGZyb20ge21ldGFfcGF0aH0iKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZy53YXJuaW5nKGYiICBXQVJOSU5HOiBGYWlsZWQgdG8gbG9hZCBjb21tYW5kZXItbWV0YS5qc29uOiB7ZX0iKQoKICAgIENPTU1BTkRFUl9NRVRBID0gQlVJTFRJTl9DT01NQU5ERVJTCiAgICBsb2cuaW5mbyhmIiAgTWV0YTogICAgICAgICB7bGVuKENPTU1BTkRFUl9NRVRBKX0gYnVpbHQtaW4gY29tbWFuZGVycyIpCgoKZGVmIG1haW4oKToKICAgIGFyZ3MgPSBwYXJzZV9hcmdzKCkKICAgIHNldHVwX2xvZ2dpbmcobG9nZ2luZy5ERUJVRyBpZiBnZXRhdHRyKGFyZ3MsICd2ZXJib3NlJywgRmFsc2UpIGVsc2UgbG9nZ2luZy5JTkZPKQoKICAgIENGRy5mb3JnZV9qYXIgPSBhcmdzLmZvcmdlX2phcgogICAgQ0ZHLmZvcmdlX2RpciA9IGFyZ3MuZm9yZ2VfZGlyCiAgICBDRkcuZm9yZ2VfZGVja3NfZGlyID0gYXJncy5mb3JnZV9kZWNrc19kaXIgb3IgcmVzb2x2ZV9mb3JnZV9kZWNrc19kaXIoKQogICAgQ0ZHLmxhYl9qYXIgPSBhcmdzLmxhYl9qYXIgb3IgcmVzb2x2ZV9sYWJfamFyKCkKICAgIENGRy5wb3J0ID0gYXJncy5wb3J0CiAgICBDRkcueGltaWxhcl9hcGlfa2V5ID0gYXJncy54aW1pbGFyX2tleQogICAgQ0ZHLnBwbHhfYXBpX2tleSA9IGFyZ3MucHBseF9rZXkKCiAgICBsb2cuaW5mbygi4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXIikKICAgIGxvZy5pbmZvKCLilZEgICAgICBDb21tYW5kZXIgQUkgTGFiIOKAlCBBUEkgU2VydmVyICB2My4wLjAgICAgICDilZEiKQogICAgbG9nLmluZm8oIuKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnSIpCiAgICBsb2cuaW5mbygiIikKICAgIGxvZy5pbmZvKGYiICBGb3JnZSBKQVI6ICAgIHtDRkcuZm9yZ2VfamFyfSIpCiAgICBsb2cuaW5mbyhmIiAgRm9yZ2UgRGlyOiAgICB7Q0ZHLmZvcmdlX2Rpcn0iKQogICAgbG9nLmluZm8oZiIgIERlY2tzIERpcjogICAge0NGRy5mb3JnZV9kZWNrc19kaXJ9IikKICAgIGxvZy5pbmZvKGYiICBMYWIgSkFSOiAgICAgIHtDRkcubGFiX2phcn0iKQogICAgbG9nLmluZm8oZiIgIFJlc3VsdHMgRGlyOiAge0NGRy5yZXN1bHRzX2Rpcn0iKQogICAgbG9nLmluZm8oZiIgIFBvcnQ6ICAgICAgICAge0NGRy5wb3J0fSIpCiAgICBsb2cuaW5mbyhmIiAgWGltaWxhcjogICAgICB7J2NvbmZpZ3VyZWQnIGlmIENGRy54aW1pbGFyX2FwaV9rZXkgZWxzZSAnTk9UIFNFVCAoc2Nhbm5lciB3aWxsIGZhaWwpJ30iKQogICAgbG9nLmluZm8oZiIgIFBlcnBsZXhpdHk6ICAgeydjb25maWd1cmVkJyBpZiBDRkcucHBseF9hcGlfa2V5IGVsc2UgJ05PVCBTRVQgKEFJIHJlc2VhcmNoL2dlbiBkaXNhYmxlZCknfSIpCiAgICBqMTcgPSBnZXRfamF2YTE3KCkKICAgIGxvZy5pbmZvKGYiICBKYXZhIDE3OiAgICAgIHtqMTcgaWYgajE3ICE9ICdqYXZhJyBlbHNlICdOT1QgRk9VTkQgKGJhdGNoIHNpbSBtYXkgZmFpbCBvbiBKYXZhIDI1KyknfSIpCiAgICBsb2cuaW5mbyhmIiAgTE0gU3R1ZGlvOiAgICBodHRwOi8vMTkyLjE2OC4wLjEyMjoxMjM0IikKCiAgICBsb2FkX2NvbW1hbmRlcl9tZXRhKCkKICAgIGRvd25sb2FkX3ByZWNvbl9kYXRhYmFzZSgpICAjIEF1dG8tZG93bmxvYWRzIGFsbCAxNjMrIENvbW1hbmRlciBwcmVjb25zIG9uIGZpcnN0IHJ1bgogICAgaW5pdF9jb2xsZWN0aW9uX2RiKCkKICAgIGluaXRfY29hY2hfc2VydmljZSgpCgogICAgIyBYaW1pbGFyIEFQSSBrZXkgY2hlY2sKICAgIGlmIG5vdCBDRkcueGltaWxhcl9hcGlfa2V5OgogICAgICAgIGxvZ19zY2FuLndhcm5pbmcoIiAgV0FSTklORzogLS14aW1pbGFyLWtleSBub3Qgc2V0LiBDYXJkIHNjYW5uZXIgd2lsbCBub3Qgd29yay4iKQogICAgICAgIGxvZy5pbmZvKCIgICAgICAgICAgIFNldCB2aWEgQ0xJOiAtLXhpbWlsYXIta2V5IFlPVVJfS0VZIikKICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICBPciBlbnYgdmFyOiAgWElNSUxBUl9BUElfS0VZPVlPVVJfS0VZIikKCiAgICBpZiBub3QgQ0ZHLmZvcmdlX2phcjoKICAgICAgICBsb2cud2FybmluZygiV0FSTklORzogLS1mb3JnZS1qYXIgbm90IHNldC4gL2FwaS9sYWIvc3RhcnQgd2lsbCBmYWlsLiIpCiAgICBpZiBub3QgQ0ZHLmxhYl9qYXI6CiAgICAgICAgbG9nLndhcm5pbmcoIldBUk5JTkc6IExhYiBKQVIgbm90IGZvdW5kLiBCdWlsZCB3aXRoOiBtdm4gcGFja2FnZSAtRHNraXBUZXN0cyIpCiAgICBpZiBub3QgQ0ZHLmZvcmdlX2RlY2tzX2RpcjoKICAgICAgICBsb2cud2FybmluZygiV0FSTklORzogQ29tbWFuZGVyIGRlY2tzIGRpciBub3QgZm91bmQuIC9hcGkvbGFiL2RlY2tzIHdpbGwgcmV0dXJuIGVtcHR5LiIpCgogICAgbG9nLmluZm8oIiIpCiAgICBsb2cuaW5mbyhmIiAgU3RhcnRpbmcgc2VydmVyIG9uIGh0dHA6Ly9sb2NhbGhvc3Q6e0NGRy5wb3J0fSIpCiAgICBpZiBfc3BhX2Rpci5leGlzdHMoKToKICAgICAgICBsb2cuaW5mbyhmIiAgV2ViIFVJOiAgICAgICBodHRwOi8vbG9jYWxob3N0OntDRkcucG9ydH0vICAoUmVhY3QgU1BBKSIpCiAgICAgICAgbG9nLmluZm8oZiIgIFJvdXRlczogICAgICAgLyAoQmF0Y2ggU2ltKSwgL2NvbGxlY3Rpb24sIC9kZWNrcywgL2F1dG9nZW4sIC9zaW11bGF0b3IsIC9jb2FjaCwgL3RyYWluaW5nIikKICAgIGVsc2U6CiAgICAgICAgbG9nLmluZm8oZiIgIFdlYiBVSTogICAgICAgaHR0cDovL2xvY2FsaG9zdDp7Q0ZHLnBvcnR9L2luZGV4Lmh0bWwgIChsZWdhY3kgSFRNTCkiKQogICAgICAgIGxvZy5pbmZvKGYiICBOT1RFOiBSZWFjdCBTUEEgbm90IGJ1aWx0LiBSdW46IGNkIGZyb250ZW5kL2NvbW1hbmRlci1haS1sYWItdWkgJiYgbnBtIGluc3RhbGwgJiYgbnBtIHJ1biBidWlsZCIpCiAgICBsb2cuaW5mbyhmIiAgQVBJIGRvY3M6ICAgICBodHRwOi8vbG9jYWxob3N0OntDRkcucG9ydH0vZG9jcyIpCiAgICBsb2cuaW5mbygiIikKCiAgICBpbXBvcnQgdXZpY29ybgogICAgdXZpY29ybi5ydW4oYXBwLCBob3N0PSIwLjAuMC4wIiwgcG9ydD1DRkcucG9ydCwgbG9nX2xldmVsPSJpbmZvIikKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg==