Fix coach deck dropdown: wrong column name d.commander → d.commander_name

The decks table has 'commander_name' not 'commander'. The SQL query
was throwing OperationalError which the frontend silently caught,
resulting in an empty dropdown.
This commit is contained in:
KoalaTrapLord committed 2026-03-12 14:55:46 +00:00
1 parent 44bc86b665
commit 26e554b359
2 files changed
+26 -26

No files matched your search

+24 -24
View File
@@ -538,7 +538,7 @@ Install-B64 -R 'frontend\commander-ai-lab-ui\tsconfig.node.json' -B $b
$b = 'aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZScKaW1wb3J0IHJlYWN0IGZyb20gJ0B2aXRlanMvcGx1Z2luLXJlYWN0JwppbXBvcnQgdGFpbHdpbmRjc3MgZnJvbSAnQHRhaWx3aW5kY3NzL3ZpdGUnCgpleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoewogIHBsdWdpbnM6IFtyZWFjdCgpLCB0YWlsd2luZGNzcygpXSwKICBzZXJ2ZXI6IHsKICAgIHBvcnQ6IDUxNzMsCiAgICBwcm94eTogewogICAgICAnL2FwaSc6IHsKICAgICAgICB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjgwODAnLAogICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSwKICAgICAgfSwKICAgIH0sCiAgfSwKICBidWlsZDogewogICAgb3V0RGlyOiAnZGlzdCcsCiAgICBzb3VyY2VtYXA6IGZhbHNlLAogICAgcm9sbHVwT3B0aW9uczogewogICAgICBvdXRwdXQ6IHsKICAgICAgICBtYW51YWxDaHVua3M6IHsKICAgICAgICAgIHJlY2hhcnRzOiBbJ3JlY2hhcnRzJ10sCiAgICAgICAgICByZWFjdDogWydyZWFjdCcsICdyZWFjdC1kb20nLCAncmVhY3Qtcm91dGVyLWRvbSddLAogICAgICAgIH0sCiAgICAgIH0sCiAgICB9LAogIH0sCn0pCg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\vite.config.ts' -B $b
# lab_api.py (322,143 bytes)
# lab_api.py (322,153 bytes)
$b = 'IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKQ29tbWFuZGVyIEFJIExhYiDigJQgRmFzdEFQSSBCYWNrZW5kIHYzCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKdjMgYWRkczoKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC91cmwgICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gQXJjaGlkZWt0L0VESFJFQyBVUkwKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC90ZXh0ICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gY2FyZCBsaXN0IHRleHQKICBHRVQgIC9hcGkvbGFiL21ldGEvY29tbWFuZGVycyAg4oCUIExpc3QgYXZhaWxhYmxlIGNvbW1hbmRlcnMgaW4gbWV0YSBtYXBwaW5nCiAgR0VUICAvYXBpL2xhYi9tZXRhL3NlYXJjaCAgICAgIOKAlCBTZWFyY2ggY29tbWFuZGVycyBieSBuYW1lCiAgUE9TVCAvYXBpL2xhYi9tZXRhL2ZldGNoICAgICAgIOKAlCBGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIGZvciBhIGNvbW1hbmRlcgogIFBPU1QgL2FwaS9sYWIvc3RhcnQgICAgICAgICAgICDigJQgRXh0ZW5kZWQ6IGFjY2VwdHMgaW1wb3J0ZWQgZGVjayBwcm9maWxlcwoKUnVucyBvbiBwb3J0IDgwODAgYnkgZGVmYXVsdC4gU2VydmVzIHRoZSB3ZWIgVUkgc3RhdGljIGZpbGVzIGF0IC8uCiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBhc3luY2lvCmltcG9ydCBjc3YKaW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNxbGl0ZTMKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB0aW1lCmltcG9ydCB1dWlkCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwKZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbiwgUmVxdWVzdApmcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgVVJMRXJyb3IKCnRyeToKICAgIGZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbiwgQmFja2dyb3VuZFRhc2tzLCBSZXF1ZXN0IGFzIEZhc3RBUElSZXF1ZXN0CiAgICBmcm9tIGZhc3RhcGkubWlkZGxld2FyZS5jb3JzIGltcG9ydCBDT1JTTWlkZGxld2FyZQogICAgZnJvbSBmYXN0YXBpLnJlc3BvbnNlcyBpbXBvcnQgRmlsZVJlc3BvbnNlLCBKU09OUmVzcG9uc2UsIFN0cmVhbWluZ1Jlc3BvbnNlCiAgICBmcm9tIGZhc3RhcGkuc3RhdGljZmlsZXMgaW1wb3J0IFN0YXRpY0ZpbGVzCiAgICBmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcHJpbnQoIkVSUk9SOiBGYXN0QVBJIG5vdCBpbnN0YWxsZWQuIFJ1bjogcGlwIGluc3RhbGwgZmFzdGFwaSB1dmljb3JuIikKICAgIHN5cy5leGl0KDEpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb25maWd1cmF0aW9uCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBDb25maWc6CiAgICAiIiJSdW50aW1lIGNvbmZpZ3VyYXRpb24g4oCUIHNldCB2aWEgQ0xJIGFyZ3Mgb3IgZW52IHZhcnMuIiIiCiAgICBmb3JnZV9qYXI6IHN0ciA9ICIiCiAgICBmb3JnZV9kaXI6IHN0ciA9ICIiCiAgICBmb3JnZV9kZWNrc19kaXI6IHN0ciA9ICIiCiAgICBsYWJfamFyOiBzdHIgPSAiIgogICAgcmVzdWx0c19kaXI6IHN0ciA9ICJyZXN1bHRzIgogICAgcG9ydDogaW50ID0gODA4MAogICAgeGltaWxhcl9hcGlfa2V5OiBzdHIgPSAiIgogICAgcHBseF9hcGlfa2V5OiBzdHIgPSAiIiAgIyBQZXJwbGV4aXR5IEFQSSBrZXkgZm9yIGRlY2sgcmVzZWFyY2gvZ2VuZXJhdGlvbgoKQ0ZHID0gQ29uZmlnKCkKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEFwcCBTZXR1cAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKYXBwID0gRmFzdEFQSSh0aXRsZT0iQ29tbWFuZGVyIEFJIExhYiBBUEkiLCB2ZXJzaW9uPSIzLjAuMCIpCgphcHAuYWRkX21pZGRsZXdhcmUoCiAgICBDT1JTTWlkZGxld2FyZSwKICAgIGFsbG93X29yaWdpbnM9WyIqIl0sCiAgICBhbGxvd19tZXRob2RzPVsiKiJdLAogICAgYWxsb3dfaGVhZGVycz1bIioiXSwKKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgSW4tTWVtb3J5IFN0YXRlCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBCYXRjaFN0YXRlOgogICAgIiIiVHJhY2tzIGEgcnVubmluZyBvciBjb21wbGV0ZWQgYmF0Y2guIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgYmF0Y2hfaWQ6IHN0ciwgdG90YWxfZ2FtZXM6IGludCwgdGhyZWFkczogaW50KToKICAgICAgICBzZWxmLmJhdGNoX2lkID0gYmF0Y2hfaWQKICAgICAgICBzZWxmLnRvdGFsX2dhbWVzID0gdG90YWxfZ2FtZXMKICAgICAgICBzZWxmLnRocmVhZHMgPSB0aHJlYWRzCiAgICAgICAgc2VsZi5jb21wbGV0ZWRfZ2FtZXMgPSAwCiAgICAgICAgc2VsZi5ydW5uaW5nID0gVHJ1ZQogICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IGRhdGV0aW1lLm5vdygpCiAgICAgICAgc2VsZi5lbGFwc2VkX21zID0gMAogICAgICAgIHNlbGYucmVzdWx0X3BhdGg6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICAgICAgc2VsZi5lcnJvcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUKICAgICAgICBzZWxmLnByb2Nlc3M6IE9wdGlvbmFsW3N1YnByb2Nlc3MuUG9wZW5dID0gTm9uZQogICAgICAgIHNlbGYubG9nX2xpbmVzOiBsaXN0ID0gW10KICAgICAgICAjIHYyNCAoSXNzdWUgIzUpOiBSZWFsLXRpbWUgdGhyb3VnaHB1dCB0cmFja2luZwogICAgICAgIHNlbGYuc2ltc19wZXJfc2VjOiBmbG9hdCA9IDAuMAoKYWN0aXZlX2JhdGNoZXM6IGRpY3Rbc3RyLCBCYXRjaFN0YXRlXSA9IHt9CgojIENvbW1hbmRlciBtZXRhIG1hcHBpbmcgKGxvYWRlZCBhdCBzdGFydHVwKQpDT01NQU5ERVJfTUVUQTogZGljdCA9IHt9CgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFJlcXVlc3QgLyBSZXNwb25zZSBNb2RlbHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmNsYXNzIFN0YXJ0UmVxdWVzdChCYXNlTW9kZWwpOgogICAgZGVja3M6IGxpc3Rbc3RyXSAgICAgICAgICAgIyBFeGFjdGx5IDMgZGVjayBuYW1lcwogICAgbnVtR2FtZXM6IGludCA9IDEwMAogICAgdGhyZWFkczogaW50ID0gNAogICAgc2VlZDogT3B0aW9u' +
'YWxbaW50XSA9IE5vbmUKICAgIGNsb2NrOiBpbnQgPSAxMjAKICAgICMgdjM6IE9wdGlvbmFsIHNvdXJjZSBtZXRhZGF0YSBwZXIgZGVjawogICAgZGVja1NvdXJjZXM6IE9wdGlvbmFsW2xpc3RbT3B0aW9uYWxbZGljdF1dXSA9IE5vbmUgICMgW3tzb3VyY2UsIHNvdXJjZVVybCwgY29tbWFuZGVyLCBhcmNoZXR5cGV9XQogICAgIyB2ODogTGVhcm5lZCBwb2xpY3kgc3VwcG9ydAogICAgdXNlTGVhcm5lZFBvbGljeTogYm9vbCA9IEZhbHNlCiAgICBwb2xpY3lTdHlsZTogc3RyID0gIm1pZHJhbmdlIgogICAgcG9saWN5R3JlZWR5OiBib29sID0gRmFsc2UKICAgICMgdjI0IChJc3N1ZXMgIzQvIzUpOiBQZXJmb3JtYW5jZSBzZXR0aW5ncwogICAgYWlTaW1wbGlmaWVkOiBib29sID0gRmFsc2UgICAgICAgICAjIFVzZSBmYXN0ZXIgQUkgcHJvZmlsZQogICAgYWlUaGlua1RpbWVNczogaW50ID0gLTEgICAgICAgICAgICAjIENhcCBBSSB0aGluayB0aW1lICgtMSB1bmxpbWl0ZWQpCiAgICBtYXhRdWV1ZURlcHRoOiBpbnQgPSAtMSAgICAgICAgICAgICMgQmFja3ByZXNzdXJlIGxpbWl0ICgtMSB1bmxpbWl0ZWQpCgpjbGFzcyBTdGFydFJlc3BvbnNlKEJhc2VNb2RlbCk6CiAgICBiYXRjaElkOiBzdHIKICAgIHN0YXR1czogc3RyID0gInN0YXJ0ZWQiCiAgICBtZXNzYWdlOiBzdHIgPSAiIgoKY2xhc3MgU3RhdHVzUmVzcG9uc2UoQmFzZU1vZGVsKToKICAgIGJhdGNoSWQ6IHN0ciA9ICIiCiAgICBydW5uaW5nOiBib29sID0gRmFsc2UKICAgIGNvbXBsZXRlZDogaW50ID0gMAogICAgdG90YWw6IGludCA9IDAKICAgIHRocmVhZHM6IGludCA9IDAKICAgIGVsYXBzZWRNczogaW50ID0gMAogICAgZXJyb3I6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICBzaW1zUGVyU2VjOiBmbG9hdCA9IDAuMAogICAgIyBSZWFjdCBTUEEgYWxpYXNlcyAoc2FtZSBkYXRhLCBleHBlY3RlZCBmaWVsZCBuYW1lcykKICAgIHJ1bl9pZDogc3RyID0gIiIKICAgIGdhbWVzX2NvbXBsZXRlZDogaW50ID0gMAogICAgdG90YWxfZ2FtZXM6IGludCA9IDAKICAgIGN1cnJlbnRfZGVja3M6IGxpc3QgPSBbXQoKY2xhc3MgRGVja0luZm8oQmFzZU1vZGVsKToKICAgIG5hbWU6IHN0cgogICAgZmlsZW5hbWU6IHN0cgoKY2xhc3MgSW1wb3J0VXJsUmVxdWVzdChCYXNlTW9kZWwpOgogICAgdXJsOiBzdHIKCmNsYXNzIEltcG9ydFRleHRSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICB0ZXh0OiBzdHIKICAgIGNvbW1hbmRlcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUKCmNsYXNzIE1ldGFGZXRjaFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGNvbW1hbmRlcjogc3RyCgoKIyDilIDilIAgRGVjayBCdWlsZGVyIE1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmNsYXNzIENyZWF0ZURlY2tSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBuYW1lOiBzdHIKICAgIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZDogT3B0aW9uYWxbc3RyXSA9ICIiCiAgICBjb21tYW5kZXJfbmFtZTogT3B0aW9uYWxbc3RyXSA9ICIiCiAgICBjb2xvcl9pZGVudGl0eTogT3B0aW9uYWxbbGlzdF0gPSBbXQogICAgc3RyYXRlZ3lfdGFnOiBPcHRpb25hbFtzdHJdID0gIiIKCgpjbGFzcyBVcGRhdGVEZWNrUmVxdWVzdChCYXNlTW9kZWwpOgogICAgbmFtZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUKICAgIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUKICAgIGNvbW1hbmRlcl9uYW1lOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgY29sb3JfaWRlbnRpdHk6IE9wdGlvbmFsW2xpc3RdID0gTm9uZQogICAgc3RyYXRlZ3lfdGFnOiBPcHRpb25hbFtzdHJdID0gTm9uZQoKCmNsYXNzIEFkZERlY2tDYXJkUmVxdWVzdChCYXNlTW9kZWwpOgogICAgc2NyeWZhbGxfaWQ6IHN0cgogICAgY2FyZF9uYW1lOiBPcHRpb25hbFtzdHJdID0gIiIKICAgIHF1YW50aXR5OiBPcHRpb25hbFtpbnRdID0gMQogICAgaXNfY29tbWFuZGVyOiBPcHRpb25hbFtpbnRdID0gMAogICAgcm9sZV90YWc6IE9wdGlvbmFsW3N0cl0gPSAiIgoKCmNsYXNzIFBhdGNoRGVja0NhcmRSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBxdWFudGl0eTogT3B0aW9uYWxbaW50XSA9IE5vbmUKICAgIHJvbGVfdGFnOiBPcHRpb25hbFtzdHJdID0gTm9uZQoKCmNsYXNzIEJ1bGtBZGRSZXF1ZXN0KEJh' +
@@ -660,29 +660,29 @@ $b = 'IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKQ29tbWFuZGVyIEFJIExhYiDigJQgRmFzdEFQSS
'ZXR1cm4gaW4gTW94ZmllbGQgcGFzdGUgZm9ybWF0LiIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICkKCiAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICBjb21tYW5kZXIgPSByZXN1bHQuZ2V0KCdjb21tYW5kZXInLCB7fSkKCiAgICAjIE1veGZpZWxkIGZvcm1hdDogY2FyZCBsaW5lcyBpbiBtYWluLCBjb21tYW5kZXIgaW4gZGVkaWNhdGVkIHNlY3Rpb24KICAgIGxpbmVzID0gW10KICAgIGxpbmVzLmFwcGVuZCgnLy8gQ29tbWFuZGVyJykKICAgIGxpbmVzLmFwcGVuZChmJzEge2NvbW1hbmRlci5nZXQoIm5hbWUiLCAiIil9JykKICAgIGxpbmVzLmFwcGVuZCgnJykKICAgIGxpbmVzLmFwcGVuZCgnLy8gRGVjaycpCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBjbmFtZSA9IGNhcmQuZ2V0KCduYW1lJywgJycpCiAgICAgICAgaWYgY2FyZC5nZXQoJ3N0YXR1cycpID09ICdzdWJzdGl0dXRlZCcgYW5kIGNhcmQuZ2V0KCdzZWxlY3RlZF9zdWJzdGl0dXRlJyk6CiAgICAgICAgICAgIGNuYW1lID0gY2FyZFsnc2VsZWN0ZWRfc3Vic3RpdHV0ZSddCiAgICAgICAgaWYgY25hbWUgYW5kIGNuYW1lICE9IGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJyk6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIntjYXJkLmdldCgnY291bnQnLCAxKX0ge2NuYW1lfSIpCgogICAgdHh0ID0gJ1xuJy5qb2luKGxpbmVzKQogICAgcmV0dXJuIHsnZm9ybWF0JzogJ21veGZpZWxkJywgJ2NvbnRlbnQnOiB0eHQsICdjb21tYW5kZXInOiBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpfQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrL3YzL2V4cG9ydC9zaG9wcGluZycpCmFzeW5jIGRlZiBkZWNrX2dlbl92M19leHBvcnRfc2hvcHBpbmcocmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIkdlbmVyYXRlIGEgZGVjayBhbmQgcmV0dXJuIGEgc2hvcHBpbmcgbGlzdCBvZiBjYXJkcyBub3Qgb3duZWQuIiIiCiAgICBpZiBfZGVja19nZW5fdjMgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMywgJ1YzIERlY2sgR2VuZXJhdG9yIG5vdCBpbml0aWFsaXplZC4nKQoKICAgIHJlc3VsdCA9IF9kZWNrX2dlbl92My5nZW5lcmF0ZV9kZWNrKAogICAgICAgIGNvbW1hbmRlcl9uYW1lPXJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpLAogICAgICAgIHN0cmF0ZWd5PXJlcS5zdHJhdGVneSwKICAgICAgICB0YXJnZXRfYnJhY2tldD1yZXEudGFyZ2V0X2JyYWNrZXQsCiAgICAgICAgYnVkZ2V0X3VzZD1yZXEuYnVkZ2V0X3VzZCwKICAgICAgICBidWRnZXRfbW9kZT1yZXEuYnVkZ2V0X21vZGUsCiAgICAgICAgb21pdF9jYXJkcz1yZXEub21pdF9jYXJkcywKICAgICAgICB1c2VfY29sbGVjdGlvbj1yZXEudXNlX2NvbGxlY3Rpb24sCiAgICAgICAgbW9kZWw9cmVxLm1vZGVsLAogICAgKQoKICAgIGNhcmRzID0gcmVzdWx0LmdldCgnY2FyZHMnLCBbXSkKICAgIHNob3BwaW5nID0gW10KICAgIHRvdGFsID0gMC4wCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBpZiBub3QgY2FyZC5nZXQoJ293bmVkJywgVHJ1ZSkgYW5kIGNhcmQuZ2V0KCdzdGF0dXMnKSAhPSAnc3Vic3RpdHV0ZWQnOgogICAgICAgICAgICBwcmljZSA9IGNhcmQuZ2V0KCdlc3RpbWF0ZWRfcHJpY2VfdXNkJywgMCkKICAgICAgICAgICAgc2hvcHBpbmcuYXBwZW5kKHsKICAgICAgICAgICAgICAgICduYW1lJzogY2FyZC5nZXQoJ25hbWUnLCAnJyksCiAgICAgICAgICAgICAgICAnY291bnQnOiBjYXJkLmdldCgnY291bnQnLCAxKSwKICAgICAgICAgICAgICAgICdjYXRlZ29yeSc6IGNhcmQuZ2V0KCdjYXRlZ29yeScsICcnKSwKICAg' +
'ICAgICAgICAgICAgICdlc3RpbWF0ZWRfcHJpY2VfdXNkJzogcHJpY2UsCiAgICAgICAgICAgICAgICAncmVhc29uJzogY2FyZC5nZXQoJ3JlYXNvbicsICcnKSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgdG90YWwgKz0gcHJpY2UgKiBjYXJkLmdldCgnY291bnQnLCAxKQoKICAgIHJldHVybiB7CiAgICAgICAgJ2NvbW1hbmRlcic6IHJlc3VsdC5nZXQoJ2NvbW1hbmRlcicsIHt9KS5nZXQoJ25hbWUnLCAnJyksCiAgICAgICAgJ3Nob3BwaW5nX2xpc3QnOiBzaG9wcGluZywKICAgICAgICAndG90YWxfbWlzc2luZyc6IGxlbihzaG9wcGluZyksCiAgICAgICAgJ2VzdGltYXRlZF9jb3N0X3VzZCc6IHJvdW5kKHRvdGFsLCAyKSwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENvYWNoIFNlcnZpY2UgKExMTS1wb3dlcmVkIGRlY2sgY29hY2hpbmcpCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIEdsb2JhbCBjb2FjaCBpbnN0YW5jZXMgKGluaXRpYWxpemVkIGF0IHN0YXJ0dXApCl9jb2FjaF9zZXJ2aWNlID0gTm9uZQpfY29hY2hfZW1iZWRkaW5ncyA9IE5vbmUKX2NvYWNoX2xsbSA9IE5vbmUKX2RlY2tfZ2VuX3YzID0gTm9uZSAgIyBWMyBEZWNrIEdlbmVyYXRvciAoUGVycGxleGl0eSBzdHJ1Y3R1cmVkIG91dHB1dCkKX2RlY2tfZ2VuX3YzX2Vycm9yID0gTm9uZSAgIyBFcnJvciBtZXNzYWdlIGlmIFYzIGluaXQgZmFpbGVkCgoKZGVmIGluaXRfY29hY2hfc2VydmljZSgpOgogICAgIiIiSW5pdGlhbGl6ZSB0aGUgY29hY2ggc2VydmljZSB3aXRoIExMTSBjbGllbnQgYW5kIGVtYmVkZGluZ3MuIiIiCiAgICBnbG9iYWwgX2NvYWNoX3NlcnZpY2UsIF9jb2FjaF9lbWJlZGRpbmdzLCBfY29hY2hfbGxtLCBfZGVja19nZW5fdjMsIF9kZWNrX2dlbl92M19lcnJvcgogICAgdHJ5OgogICAgICAgIGZyb20gY29hY2gubGxtX2NsaWVudCBpbXBvcnQgTE1TdHVkaW9DbGllbnQKICAgICAgICBmcm9tIGNvYWNoLmVtYmVkZGluZ3MgaW1wb3J0IE1UR0VtYmVkZGluZ0luZGV4CiAgICAgICAgZnJvbSBjb2FjaC5jb2FjaF9zZXJ2aWNlIGltcG9ydCBDb2FjaFNlcnZpY2UKICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgZW5zdXJlX2RpcnMKCiAgICAgICAgZW5zdXJlX2RpcnMoKQoKICAgICAgICBfY29hY2hfbGxtID0gTE1TdHVkaW9DbGllbnQoKQogICAgICAgIF9jb2FjaF9lbWJlZGRpbmdzID0gTVRHRW1iZWRkaW5nSW5kZXgoKQoKICAgICAgICAjIFRyeSB0byBsb2FkIGVtYmVkZGluZ3MgKG5vbi1ibG9ja2luZyDigJQgZG93bmxvYWQgaGFwcGVucyBvbiBmaXJzdCB1c2UpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgRU1CRURESU5HU19OUFoKICAgICAgICAgICAgaWYgRU1CRURESU5HU19OUFouZXhpc3RzKCk6CiAgICAgICAgICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5sb2FkKCkKICAgICAgICAgICAgICAgIHByaW50KGYiICBDb2FjaDogICAgICAgIEVtYmVkZGluZ3MgbG9hZGVkICh7X2NvYWNoX2VtYmVkZGluZ3MuY2FyZF9jb3VudH0gY2FyZHMpIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KCIgIENvYWNoOiAgICAgICAgRW1iZWRkaW5ncyBub3QgeWV0IGRvd25sb2FkZWQgKHdpbGwgZG93bmxvYWQgb24gZmlyc3QgdXNlKSIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIiAgQ29hY2g6ICAgICAgICBFbWJlZGRpbmdzIGxvYWQgZmFpbGVkOiB7ZX0iKQoKICAgICAgICBfY29hY2hfc2VydmljZSA9IENvYWNoU2VydmljZShfY29hY2hfbGxtLCBfY29hY2hfZW1iZWRkaW5ncykKCiAgICAgICAgIyBDaGVjayBMTE0gY29ubmVjdGlvbgogICAgICAgIGxsbV9zdGF0dXMgPSBfY29hY2hfbGxtLmNoZWNrX2Nvbm5lY3Rpb24oKQog' +
'ICAgICAgIGlmIGxsbV9zdGF0dXMuZ2V0KCJjb25uZWN0ZWQiKToKICAgICAgICAgICAgcHJpbnQoZiIgIENvYWNoIExMTTogICAgQ29ubmVjdGVkICh7bGxtX3N0YXR1cy5nZXQoJ2FjdGl2ZV9tb2RlbCcsICd1bmtub3duJyl9KSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoZiIgIENvYWNoIExMTTogICAgTm90IGNvbm5lY3RlZCAoc3RhcnQgTE0gU3R1ZGlvIG9uIDE5Mi4xNjguMC4xMjI6MTIzNCkiKQoKICAgICAgICBwcmludCgiICBDb2FjaDogICAgICAgIFNlcnZpY2UgaW5pdGlhbGl6ZWQiKQoKICAgICAgICAjIEluaXRpYWxpemUgVjMgRGVjayBHZW5lcmF0b3IgKFBlcnBsZXhpdHkpCiAgICAgICAgX2RlY2tfZ2VuX3YzX2Vycm9yID0gTm9uZQogICAgICAgIGlmIENGRy5wcGx4X2FwaV9rZXk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZyb20gY29hY2guY2xpZW50cy5wZXJwbGV4aXR5X2NsaWVudCBpbXBvcnQgUGVycGxleGl0eUNsaWVudAogICAgICAgICAgICAgICAgZnJvbSBjb2FjaC5zZXJ2aWNlcy5kZWNrX2dlbmVyYXRvciBpbXBvcnQgRGVja0dlbmVyYXRvclYzCiAgICAgICAgICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgREVDS19HRU5fTU9ERUwKCiAgICAgICAgICAgICAgICBwcGx4X2NsaWVudCA9IFBlcnBsZXhpdHlDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgYXBpX2tleT1DRkcucHBseF9hcGlfa2V5LAogICAgICAgICAgICAgICAgICAgIG1vZGVsPURFQ0tfR0VOX01PREVMLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgX2RlY2tfZ2VuX3YzID0gRGVja0dlbmVyYXRvclYzKAogICAgICAgICAgICAgICAgICAgIHBwbHhfY2xpZW50PXBwbHhfY2xpZW50LAogICAgICAgICAgICAgICAgICAgIGRiX2Nvbm5fZmFjdG9yeT1fZ2V0X2RiX2Nvbm4sCiAgICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nX2luZGV4PV9jb2FjaF9lbWJlZGRpbmdzLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcHJpbnQoZiIgIERlY2sgR2VuIFYzOiAgSW5pdGlhbGl6ZWQgKG1vZGVsOiB7REVDS19HRU5fTU9ERUx9KSIpCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgX2RlY2tfZ2VuX3YzX2Vycm9yID0gZiJNaXNzaW5nIGRlcGVuZGVuY3k6IHtlfS4gUnVuOiBwaXAgaW5zdGFsbCBvcGVuYWkiCiAgICAgICAgICAgICAgICBwcmludChmIiAgRGVjayBHZW4gVjM6ICB7X2RlY2tfZ2VuX3YzX2Vycm9yfSIpCiAgICAgICAgICAgICAgICBfZGVja19nZW5fdjMgPSBOb25lCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIF9kZWNrX2dlbl92M19lcnJvciA9IHN0cihlKQogICAgICAgICAgICAgICAgcHJpbnQoZiIgIERlY2sgR2VuIFYzOiAgRmFpbGVkIHRvIGluaXRpYWxpemU6IHtlfSIpCiAgICAgICAgICAgICAgICBfZGVja19nZW5fdjMgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2RlY2tfZ2VuX3YzX2Vycm9yID0gIlBQTFhfQVBJX0tFWSBub3Qgc2V0IgogICAgICAgICAgICBwcmludCgiICBEZWNrIEdlbiBWMzogIFNraXBwZWQgKG5vIFBQTFhfQVBJX0tFWSkiKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIiAgQ29hY2g6ICAgICAgICBGYWlsZWQgdG8gaW5pdGlhbGl6ZToge2V9IikKICAgICAgICBfY29hY2hfc2VydmljZSA9IE5vbmUKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9zdGF0dXMiKQphc3luYyBkZWYgY29hY2hfc3RhdHVzKCk6CiAgICAiIiJDaGVjayBjb2FjaCBzdWJzeXN0ZW0gaGVhbHRoLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByZXR1cm4geyJsbG1Db25uZWN0ZWQiOiBGYWxzZSwgImVtYmVkZGluZ3NMb2FkZWQiOiBGYWxzZSwKICAgICAgICAgICAgICAgICJlbWJlZGRpbmdDYXJkcyI6IDAsICJkZWNrUmVwb3J0c0F2YWlsYWJsZSI6IDAsCiAgICAgICAgICAgICAgICAiZXJyb3IiOiAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQifQogICAgc3RhdHVzID0gX2NvYWNoX3NlcnZpY2UuZ2V0X3N0YXR1cygpCiAgICByZXR1cm4gc3RhdHVzLm1vZGVsX2R1bXAoKQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2RlY2tzIikKYXN5bmMgZGVmIGNvYWNoX2xpc3RfZGVja3MoKToKICAgICIiIkxpc3QgYWxsIGRlY2tzIGF2YWlsYWJsZSBmb3IgY29hY2hpbmcgKGZyb20gZGVjayBi' +
'dWlsZGVyIERCKS4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiJTRUxFQ1QgZC5pZCBhcyBkZWNrX2lkLCBkLm5hbWUgYXMgZGVja19uYW1lLCBkLmNvbW1hbmRlciwKICAgICAgICAgICAgICAgICAgQ09VTlQoZGMuaWQpIGFzIGNhcmRfY291bnQKICAgICAgICAgICBGUk9NIGRlY2tzIGQKICAgICAgICAgICBMRUZUIEpPSU4gZGVja19jYXJkcyBkYyBPTiBkYy5kZWNrX2lkID0gZC5pZAogICAgICAgICAgIEdST1VQIEJZIGQuaWQKICAgICAgICAgICBPUkRFUiBCWSBkLm5hbWUiIiIKICAgICkuZmV0Y2hhbGwoKQoKICAgICMgQWxzbyBnZXQgcmVwb3J0IGF2YWlsYWJpbGl0eSBmcm9tIGNvYWNoIHNlcnZpY2UKICAgIHJlcG9ydF9pZHMgPSBzZXQoKQogICAgaWYgX2NvYWNoX3NlcnZpY2U6CiAgICAgICAgcmVwb3J0X2lkcyA9IHNldChfY29hY2hfc2VydmljZS5saXN0X2RlY2tfcmVwb3J0cygpKQoKICAgIGRlY2tzID0gW10KICAgIGZvciByIGluIHJvd3M6CiAgICAgICAgZGVja19uYW1lID0gclsiZGVja19uYW1lIl0KICAgICAgICAjIENoZWNrIGlmIGEgcmVwb3J0IGV4aXN0cyAoYnkgZGVjayBuYW1lIHNsdWcgbWF0Y2gpCiAgICAgICAgaGFzX3JlcG9ydCA9IGFueSgKICAgICAgICAgICAgZGVja19uYW1lLmxvd2VyKCkucmVwbGFjZSgiICIsICItIikgPT0gcmlkLmxvd2VyKCkgb3IKICAgICAgICAgICAgZGVja19uYW1lLmxvd2VyKCkgPT0gcmlkLmxvd2VyKCkKICAgICAgICAgICAgZm9yIHJpZCBpbiByZXBvcnRfaWRzCiAgICAgICAgKQogICAgICAgIGRlY2tzLmFwcGVuZCh7CiAgICAgICAgICAgICJkZWNrX2lkIjogclsiZGVja19pZCJdLAogICAgICAgICAgICAiZGVja19uYW1lIjogclsiZGVja19uYW1lIl0sCiAgICAgICAgICAgICJjb21tYW5kZXIiOiByWyJjb21tYW5kZXIiXSBvciAiIiwKICAgICAgICAgICAgImNhcmRfY291bnQiOiByWyJjYXJkX2NvdW50Il0sCiAgICAgICAgICAgICJoYXNfcmVwb3J0IjogaGFzX3JlcG9ydCwKICAgICAgICAgICAgInJlcG9ydF9jb3VudCI6IDEgaWYgaGFzX3JlcG9ydCBlbHNlIDAsCiAgICAgICAgICAgICJsYXN0X3JlcG9ydF9kYXRlIjogTm9uZSwKICAgICAgICB9KQogICAgcmV0dXJuIGRlY2tzCgoKQGFwcC5nZXQoIi9hcGkvY29hY2gvZGVja3Mve2RlY2tfaWR9L3JlcG9ydCIpCmFzeW5jIGRlZiBjb2FjaF9nZXRfcmVwb3J0KGRlY2tfaWQ6IHN0cik6CiAgICAiIiJHZXQgdGhlIGxhdGVzdCBEZWNrUmVwb3J0IGZvciBhIGRlY2suIiIiCiAgICBpZiBfY29hY2hfc2VydmljZSBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiKQogICAgcmVwb3J0ID0gX2NvYWNoX3NlcnZpY2UubG9hZF9kZWNrX3JlcG9ydChkZWNrX2lkKQogICAgaWYgcmVwb3J0IGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiRGVjayByZXBvcnQgbm90IGZvdW5kOiB7ZGVja19pZH0iKQogICAgcmV0dXJuIHJlcG9ydC5tb2RlbF9kdW1wKCkKCgpjbGFzcyBDb2FjaFJlcXVlc3RCb2R5KEJhc2VNb2RlbCk6CiAgICBnb2FsczogT3B0aW9uYWxbZGljdF0gPSBOb25lCgoKY2xhc3MgQ29hY2hDaGF0TWVzc2FnZShCYXNlTW9kZWwpOgogICAgcm9sZTogc3RyICAjICJ1c2VyIiBvciAiYXNzaXN0YW50IgogICAgY29udGVudDogc3RyCgpjbGFzcyBDb2FjaENoYXRSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBkZWNrX2lkOiBzdHIKICAgIG1lc3NhZ2VzOiBsaXN0W2RpY3RdICAjIGNvbnZlcnNhdGlvbiBoaXN0b3J5IFt7cm9sZSwgY29udGVudH1dCiAgICBnb2FsczogT3B0aW9uYWxbZGljdF0gPSBOb25lCiAgICBzdHJlYW06IE9wdGlvbmFsW2Jvb2xdID0gRmFsc2UKCmNsYXNzIENvYWNoQXBwbHlSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBzZXNzaW9uX2lkOiBzdHIKICAgIGRlY2tfaWQ6IGludCAgIyBudW1lcmljIGRlY2sgSUQgaW4gdGhlIERCCiAgICBhY2NlcHRlZF9jdXRzOiBsaXN0W3N0cl0gPSBbXSAgIyBjYXJkIG5hbWVzIHRvIHJlbW92ZQogICAgYWNjZXB0ZWRfYWRkczogbGlzdFtzdHJdID0gW10gICMgY2FyZCBuYW1lcyB0byBhZGQKCmNsYXNzIENvYWNoR29hbHNSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICB0YXJnZXRfcG93ZXJfbGV2ZWw6IE9wdGlvbmFsW2ludF0gPSBOb25lICAjIDEtMTAKICAgIG1ldGFfZm9jdXM6IE9wdGlvbmFsW3N0' +
'cl0gPSBOb25lICAjIGFnZ3JvLCBjb250cm9sLCBjb21ibywgbWlkcmFuZ2UsIHN0YXgKICAgIGJ1ZGdldDogT3B0aW9uYWxbc3RyXSA9IE5vbmUgICMgYnVkZ2V0LCBtZWRpdW0sIG5vLWxpbWl0CiAgICBmb2N1c19hcmVhczogbGlzdFtzdHJdID0gW10gICMgZS5nLiwgWyJyYW1wIiwgImNhcmQgZHJhdyJdCgoKQGFwcC5wb3N0KCIvYXBpL2NvYWNoL2RlY2tzL3tkZWNrX2lkfSIpCmFzeW5jIGRlZiBjb2FjaF9ydW5fc2Vzc2lvbihkZWNrX2lkOiBzdHIsIGJvZHk6IENvYWNoUmVxdWVzdEJvZHkgPSBOb25lKToKICAgICIiIlRyaWdnZXIgYSBjb2FjaGluZyBzZXNzaW9uIGZvciBhIGRlY2suIiIiCiAgICBpZiBfY29hY2hfc2VydmljZSBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiKQoKICAgICMgTG9hZCBlbWJlZGRpbmdzIG9uIGZpcnN0IHVzZSBpZiBub3QgbG9hZGVkCiAgICBpZiBfY29hY2hfZW1iZWRkaW5ncyBhbmQgbm90IF9jb2FjaF9lbWJlZGRpbmdzLmxvYWRlZDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9jb2FjaF9lbWJlZGRpbmdzLmxvYWQoZm9yY2VfZG93bmxvYWQ9VHJ1ZSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiICBDb2FjaDogRW1iZWRkaW5ncyBkb3dubG9hZCBmYWlsZWQ6IHtlfSIpCgogICAgZ29hbHMgPSBOb25lCiAgICBpZiBib2R5IGFuZCBib2R5LmdvYWxzOgogICAgICAgIGZyb20gY29hY2gubW9kZWxzIGltcG9ydCBDb2FjaEdvYWxzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBnb2FscyA9IENvYWNoR29hbHMoKipib2R5LmdvYWxzKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGdvYWxzID0gTm9uZQoKICAgIHRyeToKICAgICAgICBzZXNzaW9uID0gYXdhaXQgX2NvYWNoX3NlcnZpY2UucnVuX2NvYWNoaW5nX3Nlc3Npb24oZGVja19pZCwgZ29hbHMpCiAgICAgICAgcmV0dXJuIHNlc3Npb24ubW9kZWxfZHVtcCgpCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBzdHIoZSkpCiAgICBleGNlcHQgQ29ubmVjdGlvbkVycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsIGYiTExNIGNvbm5lY3Rpb24gZmFpbGVkOiB7ZX0iKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkNvYWNoIHNlc3Npb24gZmFpbGVkOiB7ZX0iKQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL3Nlc3Npb25zIikKYXN5bmMgZGVmIGNvYWNoX2xpc3Rfc2Vzc2lvbnMoZGVja19pZDogc3RyID0gTm9uZSk6CiAgICAiIiJMaXN0IGFsbCBjb2FjaGluZyBzZXNzaW9ucywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBkZWNrLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKICAgIHJldHVybiB7InNlc3Npb25zIjogX2NvYWNoX3NlcnZpY2UubGlzdF9zZXNzaW9ucyhkZWNrX2lkKX0KCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9zZXNzaW9ucy97c2Vzc2lvbl9pZH0iKQphc3luYyBkZWYgY29hY2hfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZDogc3RyKToKICAgICIiIkdldCBhIHNwZWNpZmljIGNvYWNoaW5nIHNlc3Npb24uIiIiCiAgICBpZiBfY29hY2hfc2VydmljZSBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiKQogICAgc2Vzc2lvbiA9IF9jb2FjaF9zZXJ2aWNlLmxvYWRfc2Vzc2lvbihzZXNzaW9uX2lkKQogICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIlNlc3Npb24gbm90IGZvdW5kOiB7c2Vzc2lvbl9pZH0iKQogICAgcmV0dXJuIHNlc3Npb24ubW9kZWxfZHVtcCgpCgoKQGFwcC5wb3N0KCIvYXBpL2NvYWNoL2VtYmVkZGluZ3MvZG93bmxvYWQiKQphc3luYyBkZWYgY29hY2hfZG93bmxvYWRfZW1iZWRkaW5ncygpOgogICAgIiIiRG93bmxvYWQgYW5kIGNvbnZlcnQgTVRHIGNhcmQgZW1iZWRkaW5ncyBmcm9tIEh1Z2dpbmdGYWNlLiIiIgogICAgaWYgX2NvYWNoX2VtYmVkZGluZ3MgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90' +
'IGluaXRpYWxpemVkIikKICAgIHRyeToKICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5sb2FkKGZvcmNlX2Rvd25sb2FkPVRydWUpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInN1Y2Nlc3MiOiBUcnVlLAogICAgICAgICAgICAiY2FyZHMiOiBfY29hY2hfZW1iZWRkaW5ncy5jYXJkX2NvdW50LAogICAgICAgICAgICAibWVzc2FnZSI6IGYiTG9hZGVkIHtfY29hY2hfZW1iZWRkaW5ncy5jYXJkX2NvdW50fSBjYXJkIGVtYmVkZGluZ3MiCiAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkZhaWxlZCB0byBkb3dubG9hZCBlbWJlZGRpbmdzOiB7ZX0iKQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2VtYmVkZGluZ3Mvc2VhcmNoIikKYXN5bmMgZGVmIGNvYWNoX3NlYXJjaF9zaW1pbGFyKGNhcmQ6IHN0ciwgY29sb3JzOiBzdHIgPSBOb25lLCB0b3BfbjogaW50ID0gMTApOgogICAgIiIiU2VhcmNoIGZvciBzaW1pbGFyIGNhcmRzIGJ5IG5hbWUuIiIiCiAgICBpZiBfY29hY2hfZW1iZWRkaW5ncyBpcyBOb25lIG9yIG5vdCBfY29hY2hfZW1iZWRkaW5ncy5sb2FkZWQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICJFbWJlZGRpbmdzIG5vdCBsb2FkZWQiKQogICAgY29sb3JfZmlsdGVyID0gbGlzdChjb2xvcnMudXBwZXIoKSkgaWYgY29sb3JzIGVsc2UgTm9uZQogICAgbWF0Y2hlcyA9IF9jb2FjaF9lbWJlZGRpbmdzLnNlYXJjaF9zaW1pbGFyKAogICAgICAgIHF1ZXJ5X2NhcmQ9Y2FyZCwgY29sb3JfZmlsdGVyPWNvbG9yX2ZpbHRlciwgdG9wX249dG9wX24KICAgICkKICAgIHJldHVybiB7InF1ZXJ5IjogY2FyZCwgIm1hdGNoZXMiOiBbbS50b19kaWN0KCkgZm9yIG0gaW4gbWF0Y2hlc119CgoKQGFwcC5wb3N0KCIvYXBpL2NvYWNoL2NoYXQiKQphc3luYyBkZWYgY29hY2hfY2hhdChib2R5OiBDb2FjaENoYXRSZXF1ZXN0KToKICAgICIiIk11bHRpLXR1cm4gY29hY2hpbmcgY2hhdC4gU2VuZHMgY29udmVyc2F0aW9uIGhpc3RvcnkgdG8gTExNIGFuZCByZXR1cm5zIHJlc3BvbnNlLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKCiAgICAjIExvYWQgZGVjayByZXBvcnQgZm9yIGNvbnRleHQKICAgIHJlcG9ydCA9IF9jb2FjaF9zZXJ2aWNlLmxvYWRfZGVja19yZXBvcnQoYm9keS5kZWNrX2lkKQoKICAgICMgQnVpbGQgc3lzdGVtIHByb21wdCB3aXRoIHJlcG9ydCBjb250ZXh0CiAgICBmcm9tIGNvYWNoLnByb21wdF90ZW1wbGF0ZSBpbXBvcnQgYnVpbGRfc3lzdGVtX3Byb21wdAogICAgZnJvbSBjb2FjaC5tb2RlbHMgaW1wb3J0IENvYWNoR29hbHMKCiAgICBnb2FscyA9IE5vbmUKICAgIGlmIGJvZHkuZ29hbHM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBnb2FscyA9IENvYWNoR29hbHMoKipib2R5LmdvYWxzKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGdvYWxzID0gTm9uZQoKICAgIHN5c3RlbV9wcm9tcHQgPSAiIgogICAgaWYgcmVwb3J0OgogICAgICAgIHN5c3RlbV9wcm9tcHQgPSBidWlsZF9zeXN0ZW1fcHJvbXB0KHJlcG9ydCwgZ29hbHMpCiAgICBlbHNlOgogICAgICAgIHN5c3RlbV9wcm9tcHQgPSAoCiAgICAgICAgICAgICJZb3UgYXJlIGFuIGV4cGVydCBNYWdpYzogVGhlIEdhdGhlcmluZyBDb21tYW5kZXIgZGVjayBjb2FjaC4gIgogICAgICAgICAgICAiQW5zd2VyIHF1ZXN0aW9ucyBhYm91dCBkZWNrIGJ1aWxkaW5nLCBzdHJhdGVneSwgY2FyZCBjaG9pY2VzLCBhbmQgZ2FtZSB0aGVvcnkuICIKICAgICAgICAgICAgIkJlIHNwZWNpZmljIGFuZCBhY3Rpb25hYmxlIGluIHlvdXIgYWR2aWNlLiIKICAgICAgICApCgogICAgIyBCdWlsZCBtZXNzYWdlcyBhcnJheSBmb3IgTExNCiAgICBtZXNzYWdlcyA9IFt7InJvbGUiOiAic3lzdGVtIiwgImNvbnRlbnQiOiBzeXN0ZW1fcHJvbXB0fV0KICAgIGZvciBtc2cgaW4gYm9keS5tZXNzYWdlczoKICAgICAgICBtZXNzYWdlcy5hcHBlbmQoeyJyb2xlIjogbXNnLmdldCgicm9sZSIsICJ1c2VyIiksICJjb250ZW50IjogbXNnLmdldCgiY29udGVudCIsICIiKX0pCgogICAgIyBDYWxsIExMTSB3aXRoIG11bHRpLXR1cm4gbWVzc2FnZXMKICAgIHRyeToKICAgICAgICBpbXBvcnQganNvbgogICAgICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0' +
'IHVybG9wZW4sIFJlcXVlc3QgYXMgVXJsUmVxdWVzdAogICAgICAgIGZyb20gY29hY2guY29uZmlnIGltcG9ydCBMTV9TVFVESU9fVVJMLCBMTV9TVFVESU9fVElNRU9VVAoKICAgICAgICBtb2RlbF9uYW1lID0gX2NvYWNoX2xsbS5fcmVzb2x2ZV9tb2RlbCgpCiAgICAgICAgbGxtX2JvZHkgPSB7CiAgICAgICAgICAgICJtb2RlbCI6IG1vZGVsX25hbWUsCiAgICAgICAgICAgICJtZXNzYWdlcyI6IG1lc3NhZ2VzLAogICAgICAgICAgICAidGVtcGVyYXR1cmUiOiAwLjcsCiAgICAgICAgICAgICJtYXhfdG9rZW5zIjogNDA5NiwKICAgICAgICB9CgogICAgICAgIGlmIGJvZHkuc3RyZWFtOgogICAgICAgICAgICAjIFNTRSBzdHJlYW1pbmcgcmVzcG9uc2UKICAgICAgICAgICAgbGxtX2JvZHlbInN0cmVhbSJdID0gVHJ1ZQoKICAgICAgICAgICAgYXN5bmMgZGVmIGdlbmVyYXRlKCk6CiAgICAgICAgICAgICAgICBpbXBvcnQgYXN5bmNpbwogICAgICAgICAgICAgICAgZGVmIF9zdHJlYW0oKToKICAgICAgICAgICAgICAgICAgICByZXEgPSBVcmxSZXF1ZXN0KAogICAgICAgICAgICAgICAgICAgICAgICBmIntfY29hY2hfbGxtLmJhc2VfdXJsfS9jaGF0L2NvbXBsZXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1qc29uLmR1bXBzKGxsbV9ib2R5KS5lbmNvZGUoInV0Zi04IiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IlBPU1QiLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgaHR0cC5jbGllbnQKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdXJsbGliLnBhcnNlCiAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGYie19jb2FjaF9sbG0uYmFzZV91cmx9L2NoYXQvY29tcGxldGlvbnMiKQogICAgICAgICAgICAgICAgICAgIGNvbm4gPSBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbihwYXJzZWQuaG9zdG5hbWUsIHBhcnNlZC5wb3J0LCB0aW1lb3V0PUxNX1NUVURJT19USU1FT1VUKQogICAgICAgICAgICAgICAgICAgIGNvbm4ucmVxdWVzdCgiUE9TVCIsIHBhcnNlZC5wYXRoLCBib2R5PWpzb24uZHVtcHMobGxtX2JvZHkpLmVuY29kZSgidXRmLTgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIn0pCiAgICAgICAgICAgICAgICAgICAgcmVzcCA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJlc3AucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmRlY29kZSgidXRmLTgiKS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiZGF0YTogIik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbGluZVs2Ol0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgPT0gIltET05FXSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgiW0RPTkVdIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChkYXRhKQogICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjaHVua3MKCiAgICAgICAgICAgICAgICBsb29wID0gYXN5bmNpby5nZXRfZXZlbnRfbG9vcCgpCiAgICAgICAgICAgICAgICBjaHVua3MgPSBhd2FpdCBsb29wLnJ1bl9pbl9leGVjdXRvcihOb25lLCBfc3RyZWFtKQoKICAgICAgICAgICAgICAgIGZvciBjaHVua19zdHIgaW4gY2h1bmtzOgogICAgICAgICAgICAgICAgICAgIGlmIGNodW5rX3N0ciA9PSAiW0RPTkVdIjoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZiJkYXRhOiBbRE9ORV1cblxuIgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgY2h1' +
'bmsgPSBqc29uLmxvYWRzKGNodW5rX3N0cikKICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBjaHVuay5nZXQoImNob2ljZXMiLCBbe31dKVswXS5nZXQoImRlbHRhIiwge30pCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBkZWx0YS5nZXQoImNvbnRlbnQiLCAiIikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU3RyaXAgdGhpbmsgdGFncyBmcm9tIHN0cmVhbWluZyBjaHVua3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGYiZGF0YToge2pzb24uZHVtcHMoeydjb250ZW50JzogY29udGVudH0pfVxuXG4iCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGpzb24uSlNPTkRlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgcmV0dXJuIFN0cmVhbWluZ1Jlc3BvbnNlKGdlbmVyYXRlKCksIG1lZGlhX3R5cGU9InRleHQvZXZlbnQtc3RyZWFtIikKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE5vbi1zdHJlYW1pbmc6IHJlZ3VsYXIgY2FsbAogICAgICAgICAgICByZXEgPSBVcmxSZXF1ZXN0KAogICAgICAgICAgICAgICAgZiJ7X2NvYWNoX2xsbS5iYXNlX3VybH0vY2hhdC9jb21wbGV0aW9ucyIsCiAgICAgICAgICAgICAgICBkYXRhPWpzb24uZHVtcHMobGxtX2JvZHkpLmVuY29kZSgidXRmLTgiKSwKICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICAgICAgICAgbWV0aG9kPSJQT1NUIiwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaW1wb3J0IGFzeW5jaW8KICAgICAgICAgICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKQogICAgICAgICAgICBkZWYgX2NhbGwoKToKICAgICAgICAgICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9TE1fU1RVRElPX1RJTUVPVVQpIGFzIHJlc3A6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICAgICAgICAgICAgcmF3ID0gYXdhaXQgbG9vcC5ydW5faW5fZXhlY3V0b3IoTm9uZSwgX2NhbGwpCgogICAgICAgICAgICBjb250ZW50ID0gcmF3LmdldCgiY2hvaWNlcyIsIFt7fV0pWzBdLmdldCgibWVzc2FnZSIsIHt9KS5nZXQoImNvbnRlbnQiLCAiIikKICAgICAgICAgICAgIyBTdHJpcCB0aGluayB0YWdzCiAgICAgICAgICAgIGNvbnRlbnQgPSBfY29hY2hfbGxtLl9zdHJpcF90aGlua190YWdzKGNvbnRlbnQpCiAgICAgICAgICAgIHVzYWdlID0gcmF3LmdldCgidXNhZ2UiLCB7fSkKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAiY29udGVudCI6IGNvbnRlbnQsCiAgICAgICAgICAgICAgICAibW9kZWwiOiByYXcuZ2V0KCJtb2RlbCIsICIiKSwKICAgICAgICAgICAgICAgICJwcm9tcHRfdG9rZW5zIjogdXNhZ2UuZ2V0KCJwcm9tcHRfdG9rZW5zIiwgMCksCiAgICAgICAgICAgICAgICAiY29tcGxldGlvbl90b2tlbnMiOiB1c2FnZS5nZXQoImNvbXBsZXRpb25fdG9rZW5zIiwgMCksCiAgICAgICAgICAgIH0KCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiQ2hhdCBmYWlsZWQ6IHtlfSIpCgoKQGFwcC5wb3N0KCIvYXBpL2NvYWNoL2FwcGx5IikKYXN5bmMgZGVmIGNvYWNoX2FwcGx5X3N1Z2dlc3Rpb25zKGJvZHk6IENvYWNoQXBwbHlSZXF1ZXN0KToKICAgICIiIkFwcGx5IGFjY2VwdGVkIGNvYWNoaW5nIHN1Z2dlc3Rpb25zIHRvIGEgZGVjayDigJQgcmVtb3ZlIGN1dHMsIGFkZCBhZGRzLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgIyBWZXJpZnkgZGVjayBleGlzdHMKICAgIGRlY2sgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gZGVja3MgV0hFUkUgaWQgPSA/IiwgKGJvZHkuZGVja19pZCwpKS5mZXRjaG9uZSgpCiAgICBpZiBub3QgZGVjazoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJEZWNrIHtib2R5LmRlY2tfaWR9IG5vdCBmb3VuZCIpCgogICAgcmVzdWx0cyA9IHsiY3V0cyI6IFtdLCAiYWRkcyI6IFtdLCAiZXJyb3JzIjogW119CgogICAgIyBQcm9jZXNzIGN1dHM6IHJlbW92ZSBjYXJkcyBieSBuYW1lCiAgICBmb3IgY2FyZF9uYW1lIGluIGJvZHkuYWNjZXB0ZWRfY3V0czoKICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAg' +
'ICAgICJTRUxFQ1QgaWQgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IEFORCBjYXJkX25hbWUgPSA/IExJTUlUIDEiLAogICAgICAgICAgICAoYm9keS5kZWNrX2lkLCBjYXJkX25hbWUpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgaWYgcm93OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IiwgKHJvd1siaWQiXSwpKQogICAgICAgICAgICByZXN1bHRzWyJjdXRzIl0uYXBwZW5kKHsibmFtZSI6IGNhcmRfbmFtZSwgInN0YXR1cyI6ICJyZW1vdmVkIn0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUcnkgY2FzZS1pbnNlbnNpdGl2ZQogICAgICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiU0VMRUNUIGlkLCBjYXJkX25hbWUgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IEFORCBMT1dFUihjYXJkX25hbWUpID0gTE9XRVIoPykgTElNSVQgMSIsCiAgICAgICAgICAgICAgICAoYm9keS5kZWNrX2lkLCBjYXJkX25hbWUpCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgICAgICBpZiByb3c6CiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IiwgKHJvd1siaWQiXSwpKQogICAgICAgICAgICAgICAgcmVzdWx0c1siY3V0cyJdLmFwcGVuZCh7Im5hbWUiOiByb3dbImNhcmRfbmFtZSJdLCAic3RhdHVzIjogInJlbW92ZWQifSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdHNbImVycm9ycyJdLmFwcGVuZCh7Im5hbWUiOiBjYXJkX25hbWUsICJlcnJvciI6ICJDYXJkIG5vdCBmb3VuZCBpbiBkZWNrIn0pCgogICAgIyBQcm9jZXNzIGFkZHM6IGxvb2sgdXAgaW4gY29sbGVjdGlvbiBmaXJzdCwgdGhlbiBTY3J5ZmFsbAogICAgZm9yIGNhcmRfbmFtZSBpbiBib2R5LmFjY2VwdGVkX2FkZHM6CiAgICAgICAgIyBUcnkgdG8gZmluZCBpbiBjb2xsZWN0aW9uCiAgICAgICAgY2UgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1Qgc2NyeWZhbGxfaWQsIG5hbWUgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgTE9XRVIobmFtZSkgPSBMT1dFUig/KSBMSU1JVCAxIiwKICAgICAgICAgICAgKGNhcmRfbmFtZSwpCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIHNjcnlmYWxsX2lkID0gTm9uZQogICAgICAgIHJlc29sdmVkX25hbWUgPSBjYXJkX25hbWUKCiAgICAgICAgaWYgY2U6CiAgICAgICAgICAgIHNjcnlmYWxsX2lkID0gY2VbInNjcnlmYWxsX2lkIl0KICAgICAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IGNlWyJuYW1lIl0KICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRyeSBTY3J5ZmFsbCBBUEkgbG9va3VwCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCB1cmxsaWIucGFyc2UKICAgICAgICAgICAgICAgIGVuY29kZWQgPSB1cmxsaWIucGFyc2UucXVvdGUoY2FyZF9uYW1lKQogICAgICAgICAgICAgICAgc2NyeV9yZXEgPSBVcmxSZXF1ZXN0KAogICAgICAgICAgICAgICAgICAgIGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL25hbWVkP2Z1enp5PXtlbmNvZGVkfSIsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IlVzZXItQWdlbnQiOiAiY29tbWFuZGVyLWFpLWxhYi8xLjAifQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHNjcnlfcmVxLCB0aW1lb3V0PTEwKSBhcyByZXNwOgogICAgICAgICAgICAgICAgICAgIGNhcmRfZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgICAgICAgICAgICAgIHNjcnlmYWxsX2lkID0gY2FyZF9kYXRhLmdldCgiaWQiKQogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkX25hbWUgPSBjYXJkX2RhdGEuZ2V0KCJuYW1lIiwgY2FyZF9uYW1lKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzY3J5ZmFsbF9pZDoKICAgICAgICAgICAgIyBDaGVjayBpZiBhbHJlYWR5IGluIGRlY2sKICAgICAgICAgICAgZXhpc3RpbmcgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiU0VMRUNUIGlkIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgc2NyeWZhbGxfaWQgPSA/IiwKICAgICAgICAgICAgICAgIChib2R5LmRlY2tfaWQsIHNjcnlmYWxsX2lkKQogICAg' +
'ICAgICAgICApLmZldGNob25lKCkKICAgICAgICAgICAgaWYgbm90IGV4aXN0aW5nOgogICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSkgVkFMVUVTICg/LCA/LCA/LCAxKSIsCiAgICAgICAgICAgICAgICAgICAgKGJvZHkuZGVja19pZCwgc2NyeWZhbGxfaWQsIHJlc29sdmVkX25hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXN1bHRzWyJhZGRzIl0uYXBwZW5kKHsibmFtZSI6IHJlc29sdmVkX25hbWUsICJzY3J5ZmFsbF9pZCI6IHNjcnlmYWxsX2lkLCAic3RhdHVzIjogImFkZGVkIn0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN1bHRzWyJhZGRzIl0uYXBwZW5kKHsibmFtZSI6IHJlc29sdmVkX25hbWUsICJzdGF0dXMiOiAiYWxyZWFkeV9pbl9kZWNrIn0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0c1siZXJyb3JzIl0uYXBwZW5kKHsibmFtZSI6IGNhcmRfbmFtZSwgImVycm9yIjogIkNvdWxkIG5vdCByZXNvbHZlIGNhcmQifSkKCiAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoYm9keS5kZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCgogICAgcmVzdWx0c1sidG90YWxfY3V0cyJdID0gbGVuKHJlc3VsdHNbImN1dHMiXSkKICAgIHJlc3VsdHNbInRvdGFsX2FkZHMiXSA9IGxlbihbYSBmb3IgYSBpbiByZXN1bHRzWyJhZGRzIl0gaWYgYVsic3RhdHVzIl0gPT0gImFkZGVkIl0pCiAgICByZXR1cm4gcmVzdWx0cwoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2NhcmRzLWxpa2UiKQphc3luYyBkZWYgY29hY2hfY2FyZHNfbGlrZShjYXJkOiBzdHIsIGNvbG9yczogc3RyID0gTm9uZSwgdG9wX246IGludCA9IDEwKToKICAgICIiIkZpbmQgY2FyZHMgc2ltaWxhciB0byBhIGdpdmVuIGNhcmQgdXNpbmcgZW1iZWRkaW5ncy4gVUktZnJpZW5kbHkgdmVyc2lvbi4iIiIKICAgIGlmIF9jb2FjaF9lbWJlZGRpbmdzIGlzIE5vbmUgb3Igbm90IF9jb2FjaF9lbWJlZGRpbmdzLmxvYWRlZDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMywgIkVtYmVkZGluZ3Mgbm90IGxvYWRlZCIpCgogICAgY29sb3JfZmlsdGVyID0gbGlzdChjb2xvcnMudXBwZXIoKSkgaWYgY29sb3JzIGVsc2UgTm9uZQogICAgbWF0Y2hlcyA9IF9jb2FjaF9lbWJlZGRpbmdzLnNlYXJjaF9zaW1pbGFyKAogICAgICAgIHF1ZXJ5X2NhcmQ9Y2FyZCwgY29sb3JfZmlsdGVyPWNvbG9yX2ZpbHRlciwgdG9wX249dG9wX24KICAgICkKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJlc3VsdHMgPSBbXQogICAgZm9yIG0gaW4gbWF0Y2hlczoKICAgICAgICAjIENoZWNrIGlmIGNhcmQgaXMgaW4gY29sbGVjdGlvbgogICAgICAgIG93bmVkID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIFNVTShxdWFudGl0eSkgYXMgcXR5IEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIExPV0VSKG5hbWUpID0gTE9XRVIoPykiLAogICAgICAgICAgICAobS5uYW1lLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBvd25lZF9xdHkgPSAob3duZWRbInF0eSJdIG9yIDApIGlmIG93bmVkIGVsc2UgMAoKICAgICAgICAjIEdldCBpbWFnZSBVUkwgYW5kIHByaWNlCiAgICAgICAgY2UgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgaW1hZ2VfdXJsLCB0Y2dfcHJpY2UgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgTE9XRVIobmFtZSkgPSBMT1dFUig/KSBMSU1JVCAxIiwKICAgICAgICAgICAgKG0ubmFtZSwpCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgIm5hbWUiOiBtLm5hbWUsCiAgICAgICAgICAgICJzaW1pbGFyaXR5Ijogcm91bmQobS5zaW1pbGFyaXR5LCA0KSwKICAgICAgICAgICAgInR5cGVzIjogbS50eXBlcywKICAgICAgICAgICAgIm1hbmFfdmFsdWUiOiBtLm1hbmFfdmFsdWUsCiAgICAgICAgICAgICJtYW5hX2Nvc3QiOiBtLm1hbmFfY29zdCwKICAgICAgICAgICAgInRleHQiOiBtLnRleHRbOjIwMF0gaWYgbS50ZXh0IGVsc2UgIiIsCiAgICAgICAgICAgICJvd25lZF9xdHkiOiBvd25lZF9xdHksCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBjZVsiaW1hZ2VfdXJs' +
'Il0gaWYgY2UgZWxzZSBOb25lLAogICAgICAgICAgICAidGNnX3ByaWNlIjogY2VbInRjZ19wcmljZSJdIGlmIGNlIGVsc2UgTm9uZSwKICAgICAgICB9KQoKICAgIHJldHVybiB7InF1ZXJ5IjogY2FyZCwgInJlc3VsdHMiOiByZXN1bHRzfQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9yZXBvcnRzL2dlbmVyYXRlIikKYXN5bmMgZGVmIGNvYWNoX2dlbmVyYXRlX3JlcG9ydHMoKToKICAgICIiIlJlYnVpbGQgYWxsIGRlY2sgcmVwb3J0cyBmcm9tIGJhdGNoIHJlc3VsdCBKU09OcyBpbiByZXN1bHRzLy4iIiIKICAgIHRyeToKICAgICAgICBmcm9tIGNvYWNoLnJlcG9ydF9nZW5lcmF0b3IgaW1wb3J0IGdlbmVyYXRlX2RlY2tfcmVwb3J0cwogICAgICAgIGxhYl9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICAgICAgcmVzdWx0c19kaXIgPSBzdHIobGFiX3Jvb3QgLyBDRkcucmVzdWx0c19kaXIpCiAgICAgICAgcmVwb3J0c19kaXIgPSBzdHIobGFiX3Jvb3QgLyAiZGVjay1yZXBvcnRzIikKICAgICAgICB1cGRhdGVkID0gZ2VuZXJhdGVfZGVja19yZXBvcnRzKHJlc3VsdHNfZGlyLCByZXBvcnRzX2RpcikKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3RhdHVzIjogIm9rIiwKICAgICAgICAgICAgImRlY2tzVXBkYXRlZCI6IHVwZGF0ZWQsCiAgICAgICAgICAgICJjb3VudCI6IGxlbih1cGRhdGVkKSwKICAgICAgICAgICAgIm1lc3NhZ2UiOiBmIkdlbmVyYXRlZCByZXBvcnRzIGZvciB7bGVuKHVwZGF0ZWQpfSBkZWNrcyIgaWYgdXBkYXRlZCBlbHNlICJObyBiYXRjaCByZXN1bHRzIGZvdW5kIiwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiUmVwb3J0IGdlbmVyYXRpb24gZmFpbGVkOiB7ZX0iKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgTUwgVHJhaW5pbmcgRGF0YSBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBhcHAuZ2V0KCIvYXBpL21sL3N0YXR1cyIpCmFzeW5jIGRlZiBtbF9zdGF0dXMoKToKICAgICIiIkdldCBNTCBkZWNpc2lvbiBsb2dnaW5nIHN0YXR1cyBhbmQgYXZhaWxhYmxlIHRyYWluaW5nIGRhdGEuIiIiCiAgICBnbG9iYWwgX21sX2xvZ2dpbmdfZW5hYmxlZAogICAgbGFiX3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgIHJlc3VsdHNfZGlyID0gbGFiX3Jvb3QgLyBDRkcucmVzdWx0c19kaXIKCiAgICAjIEZpbmQgZXhpc3RpbmcgTUwgZGVjaXNpb24gZmlsZXMKICAgIG1sX2ZpbGVzID0gW10KICAgIGlmIHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChyZXN1bHRzX2Rpci5nbG9iKCJtbC1kZWNpc2lvbnMtKi5qc29ubCIpKToKICAgICAgICAgICAgbGluZXMgPSAwCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihmKSBhcyBmaDoKICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IHN1bSgxIGZvciBfIGluIGZoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBtbF9maWxlcy5hcHBlbmQoewogICAgICAgICAgICAgICAgImZpbGUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAiZGVjaXNpb25zIjogbGluZXMsCiAgICAgICAgICAgICAgICAic2l6ZV9rYiI6IHJvdW5kKGYuc3RhdCgpLnN0X3NpemUgLyAxMDI0LCAxKSwKICAgICAgICAgICAgfSkKCiAgICB0b3RhbF9kZWNpc2lvbnMgPSBzdW0oZlsiZGVjaXNpb25zIl0gZm9yIGYgaW4gbWxfZmlsZXMpCiAgICByZXR1cm4gewogICAgICAgICJtbF9sb2dnaW5nX2VuYWJsZWQiOiBfbWxfbG9nZ2luZ19lbmFibGVkLAogICAgICAgICJ0cmFpbmluZ19maWxlcyI6IG1sX2ZpbGVzLAogICAgICAgICJ0b3RhbF9kZWNpc2lvbnMiOiB0b3RhbF9kZWNp' +
'c2lvbnMsCiAgICAgICAgInRvdGFsX2ZpbGVzIjogbGVuKG1sX2ZpbGVzKSwKICAgIH0KCgpAYXBwLnBvc3QoIi9hcGkvbWwvdG9nZ2xlIikKYXN5bmMgZGVmIG1sX3RvZ2dsZShlbmFibGU6IGJvb2wgPSBUcnVlKToKICAgICIiIkVuYWJsZSBvciBkaXNhYmxlIE1MIGRlY2lzaW9uIGxvZ2dpbmcgZm9yIGZ1dHVyZSBiYXRjaCBydW5zLiIiIgogICAgZ2xvYmFsIF9tbF9sb2dnaW5nX2VuYWJsZWQKICAgIF9tbF9sb2dnaW5nX2VuYWJsZWQgPSBlbmFibGUKICAgIHJldHVybiB7CiAgICAgICAgIm1sX2xvZ2dpbmdfZW5hYmxlZCI6IF9tbF9sb2dnaW5nX2VuYWJsZWQsCiAgICAgICAgIm1lc3NhZ2UiOiBmIk1MIGRlY2lzaW9uIGxvZ2dpbmcgeydlbmFibGVkJyBpZiBlbmFibGUgZWxzZSAnZGlzYWJsZWQnfSBmb3IgZnV0dXJlIGJhdGNoZXMiLAogICAgfQoKCkBhcHAuZ2V0KCIvYXBpL21sL2RlY2lzaW9ucy97ZmlsZW5hbWV9IikKYXN5bmMgZGVmIG1sX2dldF9kZWNpc2lvbnMoZmlsZW5hbWU6IHN0ciwgbGltaXQ6IGludCA9IDEwMCwgb2Zmc2V0OiBpbnQgPSAwKToKICAgICIiIlJlYWQgZGVjaXNpb24gc25hcHNob3RzIGZyb20gYSB0cmFpbmluZyBkYXRhIGZpbGUuIiIiCiAgICBsYWJfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgZmlsZXBhdGggPSBsYWJfcm9vdCAvIENGRy5yZXN1bHRzX2RpciAvIGZpbGVuYW1lCgogICAgaWYgbm90IGZpbGVwYXRoLmV4aXN0cygpIG9yIG5vdCBmaWxlbmFtZS5zdGFydHN3aXRoKCJtbC1kZWNpc2lvbnMtIik6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiTUwgZGVjaXNpb25zIGZpbGUgbm90IGZvdW5kOiB7ZmlsZW5hbWV9IikKCiAgICBkZWNpc2lvbnMgPSBbXQogICAgdHJ5OgogICAgICAgIGltcG9ydCBqc29uIGFzIF9qc29uCiAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoKSBhcyBmOgogICAgICAgICAgICBmb3IgaSwgbGluZSBpbiBlbnVtZXJhdGUoZik6CiAgICAgICAgICAgICAgICBpZiBpIDwgb2Zmc2V0OgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBsZW4oZGVjaXNpb25zKSA+PSBsaW1pdDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRlY2lzaW9ucy5hcHBlbmQoX2pzb24ubG9hZHMobGluZS5zdHJpcCgpKSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBfanNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGYWlsZWQgdG8gcmVhZCBkZWNpc2lvbnM6IHtlfSIpCgogICAgcmV0dXJuIHsKICAgICAgICAiZmlsZSI6IGZpbGVuYW1lLAogICAgICAgICJvZmZzZXQiOiBvZmZzZXQsCiAgICAgICAgImxpbWl0IjogbGltaXQsCiAgICAgICAgImNvdW50IjogbGVuKGRlY2lzaW9ucyksCiAgICAgICAgImRlY2lzaW9ucyI6IGRlY2lzaW9ucywKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1MIFBvbGljeSBJbmZlcmVuY2UgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIExhenktbG9hZGVkIHBvbGljeSBpbmZlcmVuY2Ugc2VydmljZSAob25seSBsb2FkcyB3aGVuIGZpcnN0IGNhbGxlZCkKX3BvbGljeV9zZXJ2aWNlID0gTm9uZQpfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQgPSBGYWxzZQoKCmRlZiBfZ2V0X3BvbGljeV9zZXJ2aWNlKCk6CiAgICAiIiJHZXQgb3IgaW5pdGlhbGl6ZSB0aGUgcG9saWN5IGluZmVyZW5jZSBzZXJ2aWNlIChsYXp5IGxvYWRpbmcpLiIiIgogICAgZ2xvYmFsIF9wb2xpY3lfc2VydmljZSwgX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkCiAgICBpZiBfcG9saWN5' +
'X3NlcnZpY2UgaXMgTm9uZSBhbmQgbm90IF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZDoKICAgICAgICBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQgPSBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIG1sLnNlcnZpbmcucG9saWN5X3NlcnZlciBpbXBvcnQgUG9saWN5SW5mZXJlbmNlU2VydmljZQogICAgICAgICAgICBfcG9saWN5X3NlcnZpY2UgPSBQb2xpY3lJbmZlcmVuY2VTZXJ2aWNlKCkKICAgICAgICAgICAgaWYgX3BvbGljeV9zZXJ2aWNlLmxvYWQoKToKICAgICAgICAgICAgICAgIHByaW50KGYiW01MXSBQb2xpY3kgbW9kZWwgbG9hZGVkIG9uIHtfcG9saWN5X3NlcnZpY2UuZGV2aWNlfSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludChmIltNTF0gUG9saWN5IG1vZGVsIG5vdCBhdmFpbGFibGU6IHtfcG9saWN5X3NlcnZpY2UuX2xvYWRfZXJyb3J9IikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiW01MXSBQb2xpY3kgc2VydmljZSBpbml0IGZhaWxlZDoge2V9IikKICAgIHJldHVybiBfcG9saWN5X3NlcnZpY2UKCgpAYXBwLnBvc3QoIi9hcGkvbWwvcHJlZGljdCIpCmFzeW5jIGRlZiBtbF9wcmVkaWN0KHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlByZWRpY3QgYSBtYWNyby1hY3Rpb24gZnJvbSBhIGdhbWUgc3RhdGUgc25hcHNob3QuCgogICAgQWNjZXB0cyBEZWNpc2lvblNuYXBzaG90LXNoYXBlZCBKU09OIGZyb20gdGhlIEphdmEgYmF0Y2ggcnVubmVyLgogICAgUmV0dXJucyB0aGUgbGVhcm5lZCBwb2xpY3kncyByZWNvbW1lbmRlZCBhY3Rpb24uCgogICAgUmVxdWVzdCBib2R5OgogICAgICAgIHsKICAgICAgICAgICAgInR1cm4iOiA1LAogICAgICAgICAgICAicGhhc2UiOiAibWFpbl8xIiwKICAgICAgICAgICAgImFjdGl2ZV9zZWF0IjogMCwKICAgICAgICAgICAgInBsYXllcnMiOiBbLi4uXSwKICAgICAgICAgICAgImFyY2hldHlwZSI6ICJhZ2dybyIsCiAgICAgICAgICAgICJ0ZW1wZXJhdHVyZSI6IDEuMCwKICAgICAgICAgICAgImdyZWVkeSI6IGZhbHNlCiAgICAgICAgfQoKICAgIFJlc3BvbnNlOgogICAgICAgIHsKICAgICAgICAgICAgImFjdGlvbiI6ICJjYXN0X2NyZWF0dXJlIiwKICAgICAgICAgICAgImFjdGlvbl9pbmRleCI6IDAsCiAgICAgICAgICAgICJjb25maWRlbmNlIjogMC43MywKICAgICAgICAgICAgInByb2JhYmlsaXRpZXMiOiB7Li4ufSwKICAgICAgICAgICAgImluZmVyZW5jZV9tcyI6IDIuMwogICAgICAgIH0KICAgICIiIgogICAgc3ZjID0gX2dldF9wb2xpY3lfc2VydmljZSgpCiAgICBpZiBzdmMgaXMgTm9uZSBvciBub3Qgc3ZjLl9sb2FkZWQ6CiAgICAgICAgZGV0YWlsID0gIlBvbGljeSBtb2RlbCBub3QgbG9hZGVkLiAiCiAgICAgICAgaWYgc3ZjOgogICAgICAgICAgICBkZXRhaWwgKz0gc3ZjLl9sb2FkX2Vycm9yIG9yICJUcmFpbiBhIG1vZGVsIGZpcnN0LiIKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZXRhaWwgKz0gIlB5VG9yY2ggbWF5IG5vdCBiZSBpbnN0YWxsZWQuIgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAzLCBkZXRhaWw9ZGV0YWlsKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgcGxheXN0eWxlID0gYm9keS5wb3AoImFyY2hldHlwZSIsICJtaWRyYW5nZSIpCiAgICB0ZW1wZXJhdHVyZSA9IGJvZHkucG9wKCJ0ZW1wZXJhdHVyZSIsIDEuMCkKICAgIGdyZWVkeSA9IGJvZHkucG9wKCJncmVlZHkiLCBGYWxzZSkKCiAgICByZXN1bHQgPSBzdmMucHJlZGljdCgKICAgICAgICBkZWNpc2lvbl9zbmFwc2hvdD1ib2R5LAogICAgICAgIHBsYXlzdHlsZT1wbGF5c3R5bGUsCiAgICAgICAgdGVtcGVyYXR1cmU9dGVtcGVyYXR1cmUsCiAgICAgICAgZ3JlZWR5PWdyZWVkeSwKICAgICkKCiAgICBpZiAiZXJyb3IiIGluIHJlc3VsdDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTUwMCwgZGV0YWlsPXJlc3VsdFsiZXJyb3IiXSkKICAgIHJldHVybiByZXN1bHQKCgpAYXBwLnBvc3QoIi9hcGkvbWwvcHJlZGljdC9iYXRjaCIpCmFzeW5jIGRlZiBtbF9wcmVkaWN0X2JhdGNoKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlByZWRpY3QgYWN0aW9ucyBmb3IgbXVsdGlwbGUgc25hcHNob3RzIGF0IG9uY2UuCgogICAgUmVxdWVzdCBib2R5OiB7InNuYXBzaG90cyI6IFsuLi5dLCAiZ3Jl' +
'ZWR5IjogdHJ1ZX0KICAgICIiIgogICAgc3ZjID0gX2dldF9wb2xpY3lfc2VydmljZSgpCiAgICBpZiBzdmMgaXMgTm9uZSBvciBub3Qgc3ZjLl9sb2FkZWQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD0iUG9saWN5IG1vZGVsIG5vdCBsb2FkZWQiKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgc25hcHNob3RzID0gYm9keS5nZXQoInNuYXBzaG90cyIsIFtdKQogICAgZ3JlZWR5ID0gYm9keS5nZXQoImdyZWVkeSIsIFRydWUpCgogICAgaWYgbm90IHNuYXBzaG90czoKICAgICAgICByZXR1cm4geyJyZXN1bHRzIjogW119CgogICAgcmVzdWx0cyA9IHN2Yy5wcmVkaWN0X2JhdGNoKHNuYXBzaG90cywgZ3JlZWR5PWdyZWVkeSkKICAgIHJldHVybiB7InJlc3VsdHMiOiByZXN1bHRzLCAiY291bnQiOiBsZW4ocmVzdWx0cyl9CgoKQGFwcC5nZXQoIi9hcGkvbWwvbW9kZWwiKQphc3luYyBkZWYgbWxfbW9kZWxfaW5mbygpOgogICAgIiIiR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2FkZWQgcG9saWN5IG1vZGVsLiIiIgogICAgc3ZjID0gX2dldF9wb2xpY3lfc2VydmljZSgpCiAgICBpZiBzdmMgaXMgTm9uZToKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAibG9hZGVkIjogRmFsc2UsCiAgICAgICAgICAgICJlcnJvciI6ICJQb2xpY3kgc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiLAogICAgICAgICAgICAidG9yY2hfYXZhaWxhYmxlIjogRmFsc2UsCiAgICAgICAgfQogICAgcmV0dXJuIHN2Yy5nZXRfc3RhdHVzKCkKCgpAYXBwLnBvc3QoIi9hcGkvbWwvcmVsb2FkIikKYXN5bmMgZGVmIG1sX3JlbG9hZF9tb2RlbChjaGVja3BvaW50OiBzdHIgPSBOb25lKToKICAgICIiIkhvdC1yZWxvYWQgYSBwb2xpY3kgbW9kZWwgY2hlY2twb2ludC4iIiIKICAgIHN2YyA9IF9nZXRfcG9saWN5X3NlcnZpY2UoKQogICAgaWYgc3ZjIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD0iUG9saWN5IHNlcnZpY2Ugbm90IGF2YWlsYWJsZSIpCgogICAgIyBJZiBzZXJ2aWNlIGhhc24ndCBsb2FkZWQgeWV0LCB0cnkgZnVsbCBsb2FkCiAgICBpZiBub3Qgc3ZjLl9sb2FkZWQ6CiAgICAgICAgb2sgPSBzdmMubG9hZCgpCiAgICBlbHNlOgogICAgICAgIG9rID0gc3ZjLnJlbG9hZChjaGVja3BvaW50KQoKICAgIHJldHVybiB7CiAgICAgICAgInN1Y2Nlc3MiOiBvaywKICAgICAgICAic3RhdHVzIjogc3ZjLmdldF9zdGF0dXMoKSwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1MIFRyYWluaW5nIE1hbmFnZW1lbnQgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIFRyYWluaW5nIHN0YXRlIHRyYWNraW5nCl90cmFpbmluZ19zdGF0ZSA9IHsKICAgICJydW5uaW5nIjogRmFsc2UsCiAgICAicHJvZ3Jlc3MiOiAwLAogICAgInRvdGFsX2Vwb2NocyI6IDAsCiAgICAiY3VycmVudF9lcG9jaCI6IDAsCiAgICAicGhhc2UiOiAiaWRsZSIsICAjIGlkbGUgfCBidWlsZGluZyB8IHRyYWluaW5nIHwgZXZhbHVhdGluZyB8IGRvbmUgfCBlcnJvcgogICAgIm1lc3NhZ2UiOiAiIiwKICAgICJtZXRyaWNzIjogTm9uZSwgICMgbGF0ZXN0IGVwb2NoIG1ldHJpY3MKICAgICJyZXN1bHQiOiBOb25lLCAgICMgZmluYWwgdHJhaW5pbmcgcmVzdWx0CiAgICAiZXJyb3IiOiBOb25lLAogICAgInN0YXJ0ZWRfYXQiOiBOb25lLAp9CgoKZGVmIF9ydW5fdHJhaW5pbmdfcGlwZWxpbmUoCiAgICByZXN1bHRzX2Rpcjogc3RyLAogICAgZXBvY2hzOiBpbnQsCiAgICBscjogZmxvYXQsCiAgICBiYXRjaF9zaXplOiBpbnQsCiAgICBwYXRpZW5jZTogaW50LAogICAgcmVidWlsZF9kYXRhc2V0OiBib29sLAopOgogICAgIiIiUnVuIHRoZSBmdWxsIE1MIHRyYWluaW5n' +
'IHBpcGVsaW5lIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIiIiCiAgICBnbG9iYWwgX3RyYWluaW5nX3N0YXRlCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIHByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQpCiAgICAgICAgaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByb2plY3Rfcm9vdCkKCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl0gPSBUcnVlCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJzdGFydGVkX2F0Il0gPSBkYXRldGltZS5ub3coKS5pc29mb3JtYXQoKQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsiZXJyb3IiXSA9IE5vbmUKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInJlc3VsdCJdID0gTm9uZQoKICAgICAgICBkYXRhX2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiKQogICAgICAgIGNrcHRfZGlyID0gb3MucGF0aC5qb2luKHByb2plY3Rfcm9vdCwgIm1sIiwgIm1vZGVscyIsICJjaGVja3BvaW50cyIpCiAgICAgICAgb3MubWFrZWRpcnMoZGF0YV9kaXIsIGV4aXN0X29rPVRydWUpCiAgICAgICAgb3MubWFrZWRpcnMoY2twdF9kaXIsIGV4aXN0X29rPVRydWUpCgogICAgICAgICMgLS0tIFBoYXNlIDE6IEJ1aWxkIERhdGFzZXQgLS0tCiAgICAgICAgdHJhaW5fcGF0aCA9IG9zLnBhdGguam9pbihkYXRhX2RpciwgInRyYWluLm5weiIpCiAgICAgICAgaWYgcmVidWlsZF9kYXRhc2V0IG9yIG5vdCBvcy5wYXRoLmV4aXN0cyh0cmFpbl9wYXRoKToKICAgICAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJwaGFzZSJdID0gImJ1aWxkaW5nIgogICAgICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1lc3NhZ2UiXSA9ICJMb2FkaW5nIGNhcmQgZW1iZWRkaW5ncyAmIGJ1aWxkaW5nIGRhdGFzZXQuLi4iCiAgICAgICAgICAgIHByaW50KCJbTUwgVHJhaW5dIEJ1aWxkaW5nIGRhdGFzZXQgKGxvYWRpbmcgZW1iZWRkaW5ncywgbWF5IGF1dG8tZG93bmxvYWQpLi4uIikKCiAgICAgICAgICAgIGZyb20gbWwuZGF0YS5kYXRhc2V0X2J1aWxkZXIgaW1wb3J0IGJ1aWxkX2RhdGFzZXQsIHNwbGl0X2RhdGFzZXQsIHNhdmVfZGF0YXNldAogICAgICAgICAgICBkYXRhc2V0ID0gYnVpbGRfZGF0YXNldChyZXN1bHRzX2Rpcj1yZXN1bHRzX2RpcikKICAgICAgICAgICAgaWYgbm90IGRhdGFzZXQ6CiAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIk5vIHRyYWluaW5nIGRhdGEgcHJvZHVjZWQuIENoZWNrIHNlcnZlciBsb2cgZm9yIGRldGFpbHMuIikKICAgICAgICAgICAgdHJhaW5fZHMsIHZhbF9kcywgdGVzdF9kcyA9IHNwbGl0X2RhdGFzZXQoZGF0YXNldCkKICAgICAgICAgICAgc2F2ZV9kYXRhc2V0KHRyYWluX2RzLCBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ0cmFpbi5ucHoiKSkKICAgICAgICAgICAgc2F2ZV9kYXRhc2V0KHZhbF9kcywgb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidmFsLm5weiIpKQogICAgICAgICAgICBzYXZlX2RhdGFzZXQodGVzdF9kcywgb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidGVzdC5ucHoiKSkKICAgICAgICAgICAgdG90YWxfc2FtcGxlcyA9IGxlbihkYXRhc2V0WyJzdGF0ZXMiXSkKICAgICAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSBmIkRhdGFzZXQgYnVpbHQ6IHt0b3RhbF9zYW1wbGVzfSBzYW1wbGVzIgogICAgICAgICAgICBwcmludChmIltNTCBUcmFpbl0gRGF0YXNldCBidWlsdDoge3RvdGFsX3NhbXBsZXN9IHNhbXBsZXMiKQoKICAgICAgICAjIC0tLSBQaGFzZSAyOiBUcmFpbiAtLS0KICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAidHJhaW5pbmciCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJ0b3RhbF9lcG9jaHMiXSA9IGVwb2NocwogICAgICAgIF90cmFpbmluZ19zdGF0ZVsiY3VycmVudF9lcG9jaCJdID0gMAogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gZiJUcmFpbmluZyBwb2xpY3kgbmV0d29yayAoe2Vwb2Noc30gZXBvY2hzKS4uLiIKICAgICAgICBwcmludChmIltNTCBUcmFpbl0gU3RhcnRpbmcgdHJhaW5pbmc6IHtlcG9jaHN9IGVwb2NocywgbHI9e2xyfSwgYnM9e2JhdGNoX3NpemV9IikKCiAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICAgICAgaW1wb3J0IHRvcmNoCiAgICAgICAgZnJvbSBtbC50cmFpbmluZy5wb2xpY3lfbmV0d29yayBpbXBvcnQgUG9saWN5TmV0' +
'd29yawogICAgICAgIGZyb20gbWwudHJhaW5pbmcudHJhaW5lciBpbXBvcnQgU3VwZXJ2aXNlZFRyYWluZXIKCiAgICAgICAgZGVmIGxvYWRfbnB6X3NwbGl0KHBhdGgpOgogICAgICAgICAgICBkYXRhID0gbnAubG9hZChwYXRoKQogICAgICAgICAgICByZXR1cm4gZGF0YVsic3RhdGVzIl0uYXN0eXBlKG5wLmZsb2F0MzIpLCBkYXRhWyJsYWJlbHMiXS5hc3R5cGUobnAuaW50NjQpCgogICAgICAgIHRyYWluX3N0YXRlcywgdHJhaW5fbGFiZWxzID0gbG9hZF9ucHpfc3BsaXQodHJhaW5fcGF0aCkKICAgICAgICB2YWxfcGF0aCA9IG9zLnBhdGguam9pbihkYXRhX2RpciwgInZhbC5ucHoiKQogICAgICAgIHZhbF9zdGF0ZXMsIHZhbF9sYWJlbHMgPSBsb2FkX25wel9zcGxpdCh2YWxfcGF0aCkKCiAgICAgICAgYWN0dWFsX2RpbSA9IHRyYWluX3N0YXRlcy5zaGFwZVsxXQogICAgICAgIG1vZGVsID0gUG9saWN5TmV0d29yayhpbnB1dF9kaW09YWN0dWFsX2RpbSkKCiAgICAgICAgZGV2aWNlID0gImNwdSIKICAgICAgICBpZiB0b3JjaC5jdWRhLmlzX2F2YWlsYWJsZSgpOgogICAgICAgICAgICBkZXZpY2UgPSAiY3VkYSIKICAgICAgICBlbGlmIGhhc2F0dHIodG9yY2guYmFja2VuZHMsICJtcHMiKSBhbmQgdG9yY2guYmFja2VuZHMubXBzLmlzX2F2YWlsYWJsZSgpOgogICAgICAgICAgICBkZXZpY2UgPSAibXBzIgoKICAgICAgICB0cmFpbmVyID0gU3VwZXJ2aXNlZFRyYWluZXIoCiAgICAgICAgICAgIG1vZGVsPW1vZGVsLAogICAgICAgICAgICBkZXZpY2U9ZGV2aWNlLAogICAgICAgICAgICBsZWFybmluZ19yYXRlPWxyLAogICAgICAgICAgICBiYXRjaF9zaXplPWJhdGNoX3NpemUsCiAgICAgICAgICAgIGVwb2Nocz1lcG9jaHMsCiAgICAgICAgICAgIHBhdGllbmNlPXBhdGllbmNlLAogICAgICAgICAgICBjaGVja3BvaW50X2Rpcj1ja3B0X2RpciwKICAgICAgICApCgogICAgICAgICMgSG9vayBpbnRvIHRyYWluZXIgdG8gcmVwb3J0IHByb2dyZXNzCiAgICAgICAgb3JpZ2luYWxfdHJhaW4gPSB0cmFpbmVyLnRyYWluCgogICAgICAgIGRlZiBwYXRjaGVkX3RyYWluKHRyYWluX3MsIHRyYWluX2wsIHZhbF9zLCB2YWxfbCk6CiAgICAgICAgICAgICMgV2UnbGwgbW9uaXRvciB0aGUgY2hlY2twb2ludCBkaXIgZm9yIHByb2dyZXNzCiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbF90cmFpbih0cmFpbl9zLCB0cmFpbl9sLCB2YWxfcywgdmFsX2wpCgogICAgICAgIHN1bW1hcnkgPSB0cmFpbmVyLnRyYWluKHRyYWluX3N0YXRlcywgdHJhaW5fbGFiZWxzLCB2YWxfc3RhdGVzLCB2YWxfbGFiZWxzKQoKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbImN1cnJlbnRfZXBvY2giXSA9IHN1bW1hcnkuZ2V0KCJlcG9jaHNfdHJhaW5lZCIsIGVwb2NocykKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1ldHJpY3MiXSA9IHN1bW1hcnkKCiAgICAgICAgIyAtLS0gUGhhc2UgMzogRXZhbHVhdGUgLS0tCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJwaGFzZSJdID0gImV2YWx1YXRpbmciCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSAiRXZhbHVhdGluZyBvbiB0ZXN0IHNldC4uLiIKCiAgICAgICAgdGVzdF9wYXRoID0gb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidGVzdC5ucHoiKQogICAgICAgIGV2YWxfcmVzdWx0cyA9IE5vbmUKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0ZXN0X3BhdGgpOgogICAgICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnRyYWluZXIgaW1wb3J0IGxvYWRfY2hlY2twb2ludCwgZXZhbHVhdGVfbW9kZWwKICAgICAgICAgICAgdGVzdF9zdGF0ZXMsIHRlc3RfbGFiZWxzID0gbG9hZF9ucHpfc3BsaXQodGVzdF9wYXRoKQogICAgICAgICAgICBiZXN0X21vZGVsLCBfID0gbG9hZF9jaGVja3BvaW50KHN1bW1hcnlbImNoZWNrcG9pbnRfcGF0aCJdLCBkZXZpY2UpCiAgICAgICAgICAgIGV2YWxfcmVzdWx0cyA9IGV2YWx1YXRlX21vZGVsKGJlc3RfbW9kZWwsIHRlc3Rfc3RhdGVzLCB0ZXN0X2xhYmVscywgZGV2aWNlKQoKICAgICAgICAgICAgZXZhbF9wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiZXZhbF9yZXN1bHRzLmpzb24iKQogICAgICAgICAgICB3aXRoIG9wZW4oZXZhbF9wYXRoLCAidyIpIGFzIGY6CiAgICAgICAgICAgICAgICBqc29uLmR1bXAoZXZhbF9yZXN1bHRzLCBmLCBpbmRlbnQ9MikKCiAgICAgICAgIyAtLS0gRG9uZSAtLS0KICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAiZG9uZSIKICAg' +
'ICAgICBfdHJhaW5pbmdfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJyZXN1bHQiXSA9IHsKICAgICAgICAgICAgInRyYWluaW5nIjogc3VtbWFyeSwKICAgICAgICAgICAgImV2YWx1YXRpb24iOiBldmFsX3Jlc3VsdHMsCiAgICAgICAgICAgICJjaGVja3BvaW50Ijogc3VtbWFyeS5nZXQoImNoZWNrcG9pbnRfcGF0aCIsICIiKSwKICAgICAgICAgICAgImRldmljZSI6IGRldmljZSwKICAgICAgICB9CiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlRyYWluaW5nIGNvbXBsZXRlISBCZXN0IHZhbCBhY2M6IHtzdW1tYXJ5LmdldCgnYmVzdF92YWxfYWNjdXJhY3knLCAwKTouMSV9IgogICAgICAgIHByaW50KGYiW01MIFRyYWluXSBDb21wbGV0ZToge3N1bW1hcnkuZ2V0KCdiZXN0X3ZhbF9hY2N1cmFjeScsIDApOi4xJX0gdmFsIGFjY3VyYWN5IikKCiAgICAgICAgIyBBdXRvLXJlbG9hZCBwb2xpY3kgc2VydmVyIHdpdGggbmV3IGNoZWNrcG9pbnQKICAgICAgICBnbG9iYWwgX3BvbGljeV9zZXJ2aWNlLCBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQKICAgICAgICBpZiBfcG9saWN5X3NlcnZpY2UgYW5kIF9wb2xpY3lfc2VydmljZS5fbG9hZGVkOgogICAgICAgICAgICBfcG9saWN5X3NlcnZpY2UucmVsb2FkKHN1bW1hcnkuZ2V0KCJjaGVja3BvaW50X3BhdGgiKSkKICAgICAgICAgICAgcHJpbnQoIltNTCBUcmFpbl0gUG9saWN5IHNlcnZlciByZWxvYWRlZCB3aXRoIG5ldyBjaGVja3BvaW50IikKICAgICAgICBlbGlmIG5vdCBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQ6CiAgICAgICAgICAgIF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZCA9IEZhbHNlICAjIEFsbG93IHJlLWluaXQgd2l0aCBuZXcgbW9kZWwKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicGhhc2UiXSA9ICJlcnJvciIKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJlcnJvciJdID0gc3RyKGUpCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlRyYWluaW5nIGZhaWxlZDoge2V9IgogICAgICAgIHByaW50KGYiW01MIFRyYWluXSBFUlJPUjoge2V9IikKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpAYXBwLnBvc3QoIi9hcGkvbWwvdHJhaW4iKQphc3luYyBkZWYgbWxfc3RhcnRfdHJhaW5pbmcocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiVHJpZ2dlciBNTCB0cmFpbmluZyBwaXBlbGluZSBmcm9tIHRoZSB3ZWIgVUkuCgogICAgUmVxdWVzdCBib2R5IChhbGwgb3B0aW9uYWwpOgogICAgICAgIHsKICAgICAgICAgICAgImVwb2NocyI6IDUwLAogICAgICAgICAgICAibHIiOiAwLjAwMSwKICAgICAgICAgICAgImJhdGNoU2l6ZSI6IDI1NiwKICAgICAgICAgICAgInBhdGllbmNlIjogMTAsCiAgICAgICAgICAgICJyZWJ1aWxkRGF0YXNldCI6IHRydWUKICAgICAgICB9CiAgICAiIiIKICAgIGlmIF90cmFpbmluZ19zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiVHJhaW5pbmcgYWxyZWFkeSBpbiBwcm9ncmVzcyIpCgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpIGlmIGF3YWl0IHJlcXVlc3QuYm9keSgpIGVsc2Uge30KICAgIGVwb2NocyA9IGJvZHkuZ2V0KCJlcG9jaHMiLCA1MCkKICAgIGxyID0gYm9keS5nZXQoImxyIiwgMC4wMDEpCiAgICBiYXRjaF9zaXplID0gYm9keS5nZXQoImJhdGNoU2l6ZSIsIDI1NikKICAgIHBhdGllbmNlID0gYm9keS5nZXQoInBhdGllbmNlIiwgMTApCiAgICByZWJ1aWxkID0gYm9keS5nZXQoInJlYnVpbGREYXRhc2V0IiwgVHJ1ZSkKCiAgICByZXN1bHRzX2RpciA9IG9zLnBhdGguam9pbihzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KSwgInJlc3VsdHMiKQoKICAgICMgUmVzZXQgc3RhdGUKICAgIF90cmFpbmluZ19zdGF0ZS51cGRhdGUoewogICAgICAgICJydW5uaW5nIjogVHJ1ZSwKICAgICAgICAicHJvZ3Jlc3MiOiAwLAogICAgICAgICJ0b3RhbF9lcG9jaHMiOiBlcG9jaHMsCiAgICAgICAgImN1cnJlbnRfZXBvY2giOiAwLAogICAgICAgICJwaGFzZSI6ICJzdGFydGluZyIsCiAgICAgICAgIm1lc3NhZ2UiOiAiSW5pdGlhbGl6aW5nIHRyYWluaW5nIHBpcGVsaW5lLi4uIiwKICAgICAgICAi' +
'bWV0cmljcyI6IE5vbmUsCiAgICAgICAgInJlc3VsdCI6IE5vbmUsCiAgICAgICAgImVycm9yIjogTm9uZSwKICAgIH0pCgogICAgIyBSdW4gaW4gYmFja2dyb3VuZCB0aHJlYWQKICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoCiAgICAgICAgdGFyZ2V0PV9ydW5fdHJhaW5pbmdfcGlwZWxpbmUsCiAgICAgICAgYXJncz0ocmVzdWx0c19kaXIsIGVwb2NocywgbHIsIGJhdGNoX3NpemUsIHBhdGllbmNlLCByZWJ1aWxkKSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkKICAgIHRocmVhZC5zdGFydCgpCgogICAgcmV0dXJuIHsKICAgICAgICAic3RhdHVzIjogInN0YXJ0ZWQiLAogICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICJlcG9jaHMiOiBlcG9jaHMsCiAgICAgICAgICAgICJsciI6IGxyLAogICAgICAgICAgICAiYmF0Y2hTaXplIjogYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgInBhdGllbmNlIjogcGF0aWVuY2UsCiAgICAgICAgICAgICJyZWJ1aWxkRGF0YXNldCI6IHJlYnVpbGQsCiAgICAgICAgfSwKICAgIH0KCgpAYXBwLmdldCgiL2FwaS9tbC90cmFpbi9zdGF0dXMiKQphc3luYyBkZWYgbWxfdHJhaW5pbmdfc3RhdHVzKCk6CiAgICAiIiJHZXQgY3VycmVudCB0cmFpbmluZyBwaXBlbGluZSBzdGF0dXMuIiIiCiAgICByZXR1cm4gZGljdChfdHJhaW5pbmdfc3RhdGUpCgoKQGFwcC5nZXQoIi9hcGkvbWwvZGF0YS9zdGF0dXMiKQphc3luYyBkZWYgbWxfZGF0YV9zdGF0dXMoKToKICAgICIiIkdldCBzdGF0dXMgb2YgYXZhaWxhYmxlIHRyYWluaW5nIGRhdGEgYW5kIG1vZGVsIGNoZWNrcG9pbnRzLiIiIgogICAgcHJvamVjdF9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICByZXN1bHRzX2RpciA9IHByb2plY3Rfcm9vdCAvICJyZXN1bHRzIgogICAgZGF0YV9kaXIgPSBwcm9qZWN0X3Jvb3QgLyAibWwiIC8gIm1vZGVscyIKICAgIGNrcHRfZGlyID0gZGF0YV9kaXIgLyAiY2hlY2twb2ludHMiCgogICAgIyBEZWNpc2lvbiBsb2cgZmlsZXMKICAgIGRlY2lzaW9uX2ZpbGVzID0gW10KICAgIGlmIHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChyZXN1bHRzX2Rpci5nbG9iKCJtbC1kZWNpc2lvbnMtKi5qc29ubCIpKToKICAgICAgICAgICAgbGluZV9jb3VudCA9IDAKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGYsICJyIikgYXMgZmg6CiAgICAgICAgICAgICAgICAgICAgbGluZV9jb3VudCA9IHN1bSgxIGZvciBfIGluIGZoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkZWNpc2lvbl9maWxlcy5hcHBlbmQoewogICAgICAgICAgICAgICAgIm5hbWUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGYuc3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICAiZGVjaXNpb25zIjogbGluZV9jb3VudCwKICAgICAgICAgICAgfSkKCiAgICAjIERhdGFzZXQgZmlsZXMKICAgIGRhdGFzZXRzID0ge30KICAgIGZvciBzcGxpdCBpbiBbInRyYWluIiwgInZhbCIsICJ0ZXN0Il06CiAgICAgICAgcGF0aCA9IGRhdGFfZGlyIC8gZiJ7c3BsaXR9Lm5weiIKICAgICAgICBpZiBwYXRoLmV4aXN0cygpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgbnVtcHkgYXMgbnAKICAgICAgICAgICAgICAgIGRhdGEgPSBucC5sb2FkKHN0cihwYXRoKSkKICAgICAgICAgICAgICAgIGRhdGFzZXRzW3NwbGl0XSA9IHsKICAgICAgICAgICAgICAgICAgICAic2FtcGxlcyI6IGludChkYXRhWyJzdGF0ZXMiXS5zaGFwZVswXSksCiAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVzIjogaW50KGRhdGFbInN0YXRlcyJdLnNoYXBlWzFdKSwKICAgICAgICAgICAgICAgICAgICAic2l6ZSI6IHBhdGguc3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBkYXRhc2V0c1tzcGxpdF0gPSB7InNpemUiOiBwYXRoLnN0YXQoKS5zdF9zaXplfQoKICAgICMgQ2hlY2twb2ludHMKICAgIGNoZWNrcG9pbnRzID0gW10KICAgIGlmIGNrcHRfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChja3B0X2Rpci5nbG9iKCIqLnB0IikpOgogICAgICAgICAgICBjaGVja3BvaW50cy5hcHBlbmQoewogICAgICAgICAgICAgICAgIm5hbWUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGYu' +
'c3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICAibW9kaWZpZWQiOiBkYXRldGltZS5mcm9tdGltZXN0YW1wKGYuc3RhdCgpLnN0X210aW1lKS5pc29mb3JtYXQoKSwKICAgICAgICAgICAgfSkKCiAgICAjIEV2YWwgcmVzdWx0cwogICAgZXZhbF9wYXRoID0gY2twdF9kaXIgLyAiZXZhbF9yZXN1bHRzLmpzb24iCiAgICBldmFsX3Jlc3VsdHMgPSBOb25lCiAgICBpZiBldmFsX3BhdGguZXhpc3RzKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZXZhbF9wYXRoLCAiciIpIGFzIGY6CiAgICAgICAgICAgICAgICBldmFsX3Jlc3VsdHMgPSBqc29uLmxvYWQoZikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgcmV0dXJuIHsKICAgICAgICAiZGVjaXNpb25GaWxlcyI6IGRlY2lzaW9uX2ZpbGVzLAogICAgICAgICJ0b3RhbERlY2lzaW9ucyI6IHN1bShkWyJkZWNpc2lvbnMiXSBmb3IgZCBpbiBkZWNpc2lvbl9maWxlcyksCiAgICAgICAgImRhdGFzZXRzIjogZGF0YXNldHMsCiAgICAgICAgImNoZWNrcG9pbnRzIjogY2hlY2twb2ludHMsCiAgICAgICAgImV2YWxSZXN1bHRzIjogZXZhbF9yZXN1bHRzLAogICAgICAgICJwb2xpY3lMb2FkZWQiOiBfcG9saWN5X3NlcnZpY2UgaXMgbm90IE5vbmUgYW5kIF9wb2xpY3lfc2VydmljZS5fbG9hZGVkIGlmIF9wb2xpY3lfc2VydmljZSBlbHNlIEZhbHNlLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUFBPIFRyYWluaW5nICsgVG91cm5hbWVudCBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCl9wcG9fc3RhdGUgPSB7CiAgICAicnVubmluZyI6IEZhbHNlLAogICAgIml0ZXJhdGlvbiI6IDAsCiAgICAidG90YWxfaXRlcmF0aW9ucyI6IDAsCiAgICAicGhhc2UiOiAiaWRsZSIsCiAgICAibWVzc2FnZSI6ICIiLAogICAgIm1ldHJpY3MiOiBOb25lLAogICAgInJlc3VsdCI6IE5vbmUsCiAgICAiZXJyb3IiOiBOb25lLAp9CgpfdG91cm5hbWVudF9zdGF0ZSA9IHsKICAgICJydW5uaW5nIjogRmFsc2UsCiAgICAicGhhc2UiOiAiaWRsZSIsCiAgICAibWVzc2FnZSI6ICIiLAogICAgInJlc3VsdCI6IE5vbmUsCiAgICAiZXJyb3IiOiBOb25lLAp9CgoKZGVmIF9ydW5fcHBvX3BpcGVsaW5lKAogICAgaXRlcmF0aW9uczogaW50LCBlcGlzb2Rlc19wZXJfaXRlcjogaW50LCBwcG9fZXBvY2hzOiBpbnQsIGJhdGNoX3NpemU6IGludCwKICAgIGxyOiBmbG9hdCwgY2xpcF9lcHNpbG9uOiBmbG9hdCwgZW50cm9weV9jb2VmZjogZmxvYXQsCiAgICBvcHBvbmVudDogc3RyLCBwbGF5c3R5bGU6IHN0ciwgbG9hZF9zdXBlcnZpc2VkOiBzdHIsCik6CiAgICAiIiJSdW4gUFBPIHRyYWluaW5nIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIiIiCiAgICBnbG9iYWwgX3Bwb19zdGF0ZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KQogICAgICAgIGlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgogICAgICAgIF9wcG9fc3RhdGVbInJ1bm5pbmciXSA9IFRydWUKICAgICAgICBfcHBvX3N0YXRlWyJlcnJvciJdID0gTm9uZQogICAgICAgIF9wcG9fc3RhdGVbInJlc3VsdCJdID0gTm9uZQoKICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnBwb190cmFpbmVyIGltcG9ydCBQUE9UcmFpbmVyLCBQUE9Db25maWcKCiAgICAgICAgY2twdF9kaXIgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9yb290LCAibWwiLCAibW9kZWxzIiwgImNoZWNrcG9pbnRzIikKICAgICAgICBjb25maWcgPSBQUE9Db25maWcoCiAgICAgICAgICAgIGl0ZXJhdGlvbnM9aXRlcmF0aW9ucywKICAgICAgICAgICAgZXBpc29kZXNf' +
'cGVyX2l0ZXI9ZXBpc29kZXNfcGVyX2l0ZXIsCiAgICAgICAgICAgIHBwb19lcG9jaHM9cHBvX2Vwb2NocywKICAgICAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaF9zaXplLAogICAgICAgICAgICBsZWFybmluZ19yYXRlPWxyLAogICAgICAgICAgICBjbGlwX2Vwc2lsb249Y2xpcF9lcHNpbG9uLAogICAgICAgICAgICBlbnRyb3B5X2NvZWZmPWVudHJvcHlfY29lZmYsCiAgICAgICAgICAgIG9wcG9uZW50PW9wcG9uZW50LAogICAgICAgICAgICBwbGF5c3R5bGU9cGxheXN0eWxlLAogICAgICAgICAgICBjaGVja3BvaW50X2Rpcj1ja3B0X2RpciwKICAgICAgICAgICAgbG9hZF9zdXBlcnZpc2VkPWxvYWRfc3VwZXJ2aXNlZCBpZiBsb2FkX3N1cGVydmlzZWQgZWxzZSBOb25lLAogICAgICAgICkKCiAgICAgICAgdHJhaW5lciA9IFBQT1RyYWluZXIoY29uZmlnKQoKICAgICAgICBkZWYgcHJvZ3Jlc3NfY2IoaXRlcmF0aW9uLCBtZXRyaWNzKToKICAgICAgICAgICAgX3Bwb19zdGF0ZVsiaXRlcmF0aW9uIl0gPSBpdGVyYXRpb24KICAgICAgICAgICAgX3Bwb19zdGF0ZVsicGhhc2UiXSA9ICJ0cmFpbmluZyIKICAgICAgICAgICAgX3Bwb19zdGF0ZVsibWVzc2FnZSJdID0gZiJJdGVyYXRpb24ge2l0ZXJhdGlvbn0ve2l0ZXJhdGlvbnN9IHwgV1I6IHttZXRyaWNzLmdldCgnd2luX3JhdGUnLCAwKTouMCV9IgogICAgICAgICAgICBfcHBvX3N0YXRlWyJtZXRyaWNzIl0gPSBtZXRyaWNzCgogICAgICAgIHN1bW1hcnkgPSB0cmFpbmVyLnRyYWluKHByb2dyZXNzX2NhbGxiYWNrPXByb2dyZXNzX2NiKQoKICAgICAgICBfcHBvX3N0YXRlWyJwaGFzZSJdID0gImRvbmUiCiAgICAgICAgX3Bwb19zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfcHBvX3N0YXRlWyJyZXN1bHQiXSA9IHN1bW1hcnkKICAgICAgICBfcHBvX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlBQTyBjb21wbGV0ZSEgQmVzdCB3aW4gcmF0ZToge3N1bW1hcnkuZ2V0KCdiZXN0X3dpbl9yYXRlJywgMCk6LjAlfSIKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIF9wcG9fc3RhdGVbInBoYXNlIl0gPSAiZXJyb3IiCiAgICAgICAgX3Bwb19zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfcHBvX3N0YXRlWyJlcnJvciJdID0gc3RyKGUpCiAgICAgICAgX3Bwb19zdGF0ZVsibWVzc2FnZSJdID0gZiJQUE8gZmFpbGVkOiB7ZX0iCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCIvYXBpL21sL3RyYWluL3BwbyIpCmFzeW5jIGRlZiBtbF9zdGFydF9wcG8ocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgUFBPIHRyYWluaW5nIHBpcGVsaW5lLiIiIgogICAgaWYgX3Bwb19zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiUFBPIHRyYWluaW5nIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKQogICAgaWYgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl06CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDksICJTdXBlcnZpc2VkIHRyYWluaW5nIGluIHByb2dyZXNzIOKAlCB3YWl0IGZvciBpdCB0byBmaW5pc2giKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKSBpZiBhd2FpdCByZXF1ZXN0LmJvZHkoKSBlbHNlIHt9CiAgICBpdGVyYXRpb25zID0gYm9keS5nZXQoIml0ZXJhdGlvbnMiLCAxMDApCiAgICBlcGlzb2RlcyA9IGJvZHkuZ2V0KCJlcGlzb2Rlc1Blckl0ZXIiLCA2NCkKICAgIHBwb19lcG9jaHMgPSBib2R5LmdldCgicHBvRXBvY2hzIiwgNCkKICAgIGJhdGNoX3NpemUgPSBib2R5LmdldCgiYmF0Y2hTaXplIiwgMjU2KQogICAgbHIgPSBib2R5LmdldCgibHIiLCAzZS00KQogICAgY2xpcF9lcHMgPSBib2R5LmdldCgiY2xpcEVwc2lsb24iLCAwLjIpCiAgICBlbnRyb3B5ID0gYm9keS5nZXQoImVudHJvcHlDb2VmZiIsIDAuMDEpCiAgICBvcHBvbmVudCA9IGJvZHkuZ2V0KCJvcHBvbmVudCIsICJoZXVyaXN0aWMiKQogICAgcGxheXN0eWxlID0gYm9keS5nZXQoInBsYXlzdHlsZSIsICJtaWRyYW5nZSIpCiAgICBsb2FkX3N1cCA9IGJvZHkuZ2V0KCJsb2FkU3VwZXJ2aXNlZCIsICIiKQoKICAgIF9wcG9fc3RhdGUudXBkYXRlKHsKICAgICAgICAicnVubmluZyI6IFRydWUsICJpdGVyYXRpb24iOiAwLCAidG90YWxfaXRlcmF0aW9ucyI6IGl0ZXJhdGlvbnMsCiAgICAgICAgInBoYXNlIjogInN0YXJ0aW5nIiwgIm1lc3NhZ2UiOiAi' +
'SW5pdGlhbGl6aW5nIFBQTy4uLiIsCiAgICAgICAgIm1ldHJpY3MiOiBOb25lLCAicmVzdWx0IjogTm9uZSwgImVycm9yIjogTm9uZSwKICAgIH0pCgogICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl9wcG9fcGlwZWxpbmUsCiAgICAgICAgYXJncz0oaXRlcmF0aW9ucywgZXBpc29kZXMsIHBwb19lcG9jaHMsIGJhdGNoX3NpemUsIGxyLCBjbGlwX2VwcywgZW50cm9weSwgb3Bwb25lbnQsIHBsYXlzdHlsZSwgbG9hZF9zdXApLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdGhyZWFkLnN0YXJ0KCkKCiAgICByZXR1cm4geyJzdGF0dXMiOiAic3RhcnRlZCIsICJpdGVyYXRpb25zIjogaXRlcmF0aW9uc30KCgpAYXBwLmdldCgiL2FwaS9tbC90cmFpbi9wcG8vc3RhdHVzIikKYXN5bmMgZGVmIG1sX3Bwb19zdGF0dXMoKToKICAgICIiIkdldCBQUE8gdHJhaW5pbmcgc3RhdHVzLiIiIgogICAgcmV0dXJuIGRpY3QoX3Bwb19zdGF0ZSkKCgpkZWYgX3J1bl90b3VybmFtZW50X3BpcGVsaW5lKGVwaXNvZGVzOiBpbnQsIHBsYXlzdHlsZTogc3RyKToKICAgICIiIlJ1biB0b3VybmFtZW50IGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIiIiCiAgICBnbG9iYWwgX3RvdXJuYW1lbnRfc3RhdGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgcHJvamVjdF9yb290ID0gc3RyKFBhdGgoX19maWxlX18pLnBhcmVudCkKICAgICAgICBpZiBwcm9qZWN0X3Jvb3Qgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9yb290KQoKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdID0gVHJ1ZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJlcnJvciJdID0gTm9uZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJyZXN1bHQiXSA9IE5vbmUKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicGhhc2UiXSA9ICJydW5uaW5nIgogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJtZXNzYWdlIl0gPSAiUnVubmluZyB0b3VybmFtZW50Li4uIgoKICAgICAgICBmcm9tIG1sLmV2YWwudG91cm5hbWVudCBpbXBvcnQgKAogICAgICAgICAgICBydW5fdG91cm5hbWVudCwgSGV1cmlzdGljUG9saWN5LCBSYW5kb21Qb2xpY3ksIExlYXJuZWRQb2xpY3ksCiAgICAgICAgKQoKICAgICAgICBja3B0X2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiLCAiY2hlY2twb2ludHMiKQogICAgICAgIHBvbGljaWVzID0gewogICAgICAgICAgICAiaGV1cmlzdGljIjogSGV1cmlzdGljUG9saWN5KCksCiAgICAgICAgICAgICJyYW5kb20iOiBSYW5kb21Qb2xpY3koKSwKICAgICAgICB9CgogICAgICAgIHN1cF9wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiYmVzdF9wb2xpY3kucHQiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHN1cF9wYXRoKToKICAgICAgICAgICAgcG9saWNpZXNbInN1cGVydmlzZWQiXSA9IExlYXJuZWRQb2xpY3koc3VwX3BhdGgpCgogICAgICAgIHBwb19wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiYmVzdF9wcG8ucHQiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBwb19wYXRoKToKICAgICAgICAgICAgcG9saWNpZXNbInBwbyJdID0gTGVhcm5lZFBvbGljeShwcG9fcGF0aCkKCiAgICAgICAgcmVzdWx0ID0gcnVuX3RvdXJuYW1lbnQoCiAgICAgICAgICAgIHBvbGljaWVzPXBvbGljaWVzLAogICAgICAgICAgICBlcGlzb2Rlc19wZXJfbWF0Y2h1cD1lcGlzb2RlcywKICAgICAgICAgICAgcGxheXN0eWxlPXBsYXlzdHlsZSwKICAgICAgICApCgogICAgICAgICMgU2F2ZSByZXN1bHRzCiAgICAgICAgb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJ0b3VybmFtZW50X3Jlc3VsdHMuanNvbiIpCiAgICAgICAgd2l0aCBvcGVuKG91dHB1dF9wYXRoLCAidyIpIGFzIGY6CiAgICAgICAgICAgIGpzb24uZHVtcChyZXN1bHQudG9fZGljdCgpLCBmLCBpbmRlbnQ9MikKCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInBoYXNlIl0gPSAiZG9uZSIKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicmVzdWx0Il0gPSByZXN1bHQudG9fZGljdCgpCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbIm1lc3NhZ2UiXSA9IGYiVG91cm5hbWVudCBjb21wbGV0ZSEge3Jlc3VsdC50b3RhbF9tYXRjaGVzfSBtYXRjaGVz' +
'IgoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInBoYXNlIl0gPSAiZXJyb3IiCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbImVycm9yIl0gPSBzdHIoZSkKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsibWVzc2FnZSJdID0gZiJUb3VybmFtZW50IGZhaWxlZDoge2V9IgogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQoKCkBhcHAucG9zdCgiL2FwaS9tbC90b3VybmFtZW50IikKYXN5bmMgZGVmIG1sX3N0YXJ0X3RvdXJuYW1lbnQocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgYSB0b3VybmFtZW50IGV2YWx1YXRpb24uIiIiCiAgICBpZiBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiVG91cm5hbWVudCBhbHJlYWR5IGluIHByb2dyZXNzIikKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkgaWYgYXdhaXQgcmVxdWVzdC5ib2R5KCkgZWxzZSB7fQogICAgZXBpc29kZXMgPSBib2R5LmdldCgiZXBpc29kZXMiLCA1MCkKICAgIHBsYXlzdHlsZSA9IGJvZHkuZ2V0KCJwbGF5c3R5bGUiLCAibWlkcmFuZ2UiKQoKICAgIF90b3VybmFtZW50X3N0YXRlLnVwZGF0ZSh7CiAgICAgICAgInJ1bm5pbmciOiBUcnVlLCAicGhhc2UiOiAic3RhcnRpbmciLAogICAgICAgICJtZXNzYWdlIjogIkluaXRpYWxpemluZyB0b3VybmFtZW50Li4uIiwKICAgICAgICAicmVzdWx0IjogTm9uZSwgImVycm9yIjogTm9uZSwKICAgIH0pCgogICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl90b3VybmFtZW50X3BpcGVsaW5lLAogICAgICAgIGFyZ3M9KGVwaXNvZGVzLCBwbGF5c3R5bGUpLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdGhyZWFkLnN0YXJ0KCkKCiAgICByZXR1cm4geyJzdGF0dXMiOiAic3RhcnRlZCIsICJlcGlzb2RlcyI6IGVwaXNvZGVzfQoKCkBhcHAuZ2V0KCIvYXBpL21sL3RvdXJuYW1lbnQvc3RhdHVzIikKYXN5bmMgZGVmIG1sX3RvdXJuYW1lbnRfc3RhdHVzKCk6CiAgICAiIiJHZXQgdG91cm5hbWVudCBzdGF0dXMuIiIiCiAgICByZXR1cm4gZGljdChfdG91cm5hbWVudF9zdGF0ZSkKCgpAYXBwLmdldCgiL2FwaS9tbC90b3VybmFtZW50L3Jlc3VsdHMiKQphc3luYyBkZWYgbWxfdG91cm5hbWVudF9yZXN1bHRzKCk6CiAgICAiIiJHZXQgbGF0ZXN0IHRvdXJuYW1lbnQgcmVzdWx0cy4iIiIKICAgIHByb2plY3Rfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgcmVzdWx0c19wYXRoID0gcHJvamVjdF9yb290IC8gIm1sIiAvICJtb2RlbHMiIC8gImNoZWNrcG9pbnRzIiAvICJ0b3VybmFtZW50X3Jlc3VsdHMuanNvbiIKICAgIGlmIHJlc3VsdHNfcGF0aC5leGlzdHMoKToKICAgICAgICB3aXRoIG9wZW4ocmVzdWx0c19wYXRoLCAiciIpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWQoZikKICAgIHJldHVybiB7ImVycm9yIjogIk5vIHRvdXJuYW1lbnQgcmVzdWx0cyBmb3VuZC4gUnVuIGEgdG91cm5hbWVudCBmaXJzdC4ifQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgU3RhdGljIEZpbGUgU2VydmluZyAoUmVhY3QgU1BBKSDigJQgTVVTVCBiZSBhZnRlciBhbGwgQVBJIHJvdXRlcwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBVSSBTZXJ2aW5nOiBsZWdhY3kgSFRNTC9KUy9DU1MgcGFnZXMgKHByaW1hcnkpIG9yIFJlYWN0IFNQQSAoZmFsbGJhY2spCl9sZWdhY3lfdWlfZGlyID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gInVpIgpfc3BhX2RpciA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJmcm9udGVuZCIgLyAi' +
'Y29tbWFuZGVyLWFpLWxhYi11aSIgLyAiZGlzdCIKCmlmIF9sZWdhY3lfdWlfZGlyLmV4aXN0cygpOgogICAgIyBQcmltYXJ5OiBzZXJ2ZSB0aGUgcHJvdmVuIG11bHRpLXBhZ2UgSFRNTC9KUy9DU1MgVUkKICAgIGFwcC5tb3VudCgiLyIsIFN0YXRpY0ZpbGVzKGRpcmVjdG9yeT1zdHIoX2xlZ2FjeV91aV9kaXIpLCBodG1sPVRydWUpLCBuYW1lPSJ1aSIpCgplbGlmIF9zcGFfZGlyLmV4aXN0cygpOgogICAgIyBGYWxsYmFjazogUmVhY3QgU1BBIChvbmx5IGlmIGxlZ2FjeSB1aS8gZm9sZGVyIGlzIG1pc3NpbmcpCiAgICBfc3BhX2Fzc2V0cyA9IF9zcGFfZGlyIC8gImFzc2V0cyIKICAgIGlmIF9zcGFfYXNzZXRzLmV4aXN0cygpOgogICAgICAgIGFwcC5tb3VudCgiL2Fzc2V0cyIsIFN0YXRpY0ZpbGVzKGRpcmVjdG9yeT1zdHIoX3NwYV9hc3NldHMpKSwgbmFtZT0ic3BhLWFzc2V0cyIpCgogICAgQGFwcC5nZXQoIi97ZnVsbF9wYXRoOnBhdGh9IikKICAgIGFzeW5jIGRlZiBfc3BhX2NhdGNoYWxsKGZ1bGxfcGF0aDogc3RyKToKICAgICAgICBmcm9tIGZhc3RhcGkucmVzcG9uc2VzIGltcG9ydCBGaWxlUmVzcG9uc2UKICAgICAgICByZXF1ZXN0ZWRfZmlsZSA9IF9zcGFfZGlyIC8gZnVsbF9wYXRoCiAgICAgICAgaWYgZnVsbF9wYXRoIGFuZCByZXF1ZXN0ZWRfZmlsZS5leGlzdHMoKSBhbmQgcmVxdWVzdGVkX2ZpbGUuaXNfZmlsZSgpOgogICAgICAgICAgICByZXR1cm4gRmlsZVJlc3BvbnNlKHN0cihyZXF1ZXN0ZWRfZmlsZSkpCiAgICAgICAgcmV0dXJuIEZpbGVSZXNwb25zZShzdHIoX3NwYV9kaXIgLyAiaW5kZXguaHRtbCIpKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgU3RhcnR1cAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZGVmIHBhcnNlX2FyZ3MoKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJDb21tYW5kZXIgQUkgTGFiIEFQSSBTZXJ2ZXIgdjMiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb3JnZS1qYXIiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJGT1JHRV9KQVIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gZm9yZ2UtZ3VpLWRlc2t0b3AgamFyLXdpdGgtZGVwZW5kZW5jaWVzIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZm9yZ2UtZGlyIiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiRk9SR0VfRElSIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJGb3JnZSB3b3JraW5nIGRpcmVjdG9yeSAoY29udGFpbnMgcmVzLykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb3JnZS1kZWNrcy1kaXIiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJGT1JHRV9ERUNLU19ESVIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gQ29tbWFuZGVyIGRlY2sgZmlsZXMgKGRlZmF1bHQ6ICUlQVBQREFUQSUlL0ZvcmdlL2RlY2tzL2NvbW1hbmRlcikiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1sYWItamFyIiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiTEFCX0pBUiIsICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byBjb21tYW5kZXItYWktbGFiLmphciAoZGVmYXVsdDogYXV0by1kZXRlY3QgZnJvbSB0YXJnZXQvKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXBvcnQiLCB0eXBlPWludCwgZGVmYXVsdD1pbnQob3MuZW52aXJvbi5nZXQoIkxBQl9QT1JUIiwgIjgwODAiKSkpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXhpbWlsYXIta2V5IiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiWElNSUxBUl9BUElfS0VZIiwgIjk2YzdkYWIzNWRkYmQ4ODI5YjA0YzBmNWJjZWE1N2Y1ZWRlMjA0OTYiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iWGltaWxhciBB' +
'UEkga2V5IGZvciBjYXJkIHNjYW5uZXIgKHZpc3VhbCBBSSByZWNvZ25pdGlvbikiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wcGx4LWtleSIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIlBQTFhfQVBJX0tFWSIsICJwcGx4LUc3NkhnckFVOEltNzJiRVRNZXlSNGFzQVd3dEc4d3JteWZ5NlZTS0E5RFRuMDVGcSIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQZXJwbGV4aXR5IEFQSSBrZXkgZm9yIEFJIGRlY2sgcmVzZWFyY2gvZ2VuZXJhdGlvbiAoZW52OiBQUExYX0FQSV9LRVkpIikKICAgIHJldHVybiBwYXJzZXIucGFyc2VfYXJncygpCgoKZGVmIHJlc29sdmVfbGFiX2phcigpIC0+IHN0cjoKICAgIHRhcmdldF9kaXIgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAidGFyZ2V0IgogICAgaWYgdGFyZ2V0X2Rpci5leGlzdHMoKToKICAgICAgICBmb3IgcGF0dGVybiBpbiBbCiAgICAgICAgICAgICJjb21tYW5kZXItYWktbGFiLSotamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphciIsCiAgICAgICAgICAgICJjb21tYW5kZXItYWktbGFiLSotc2hhZGVkLmphciIsCiAgICAgICAgICAgICJjb21tYW5kZXItYWktbGFiLSouamFyIiwKICAgICAgICBdOgogICAgICAgICAgICBqYXJzID0gc29ydGVkKHRhcmdldF9kaXIuZ2xvYihwYXR0ZXJuKSkKICAgICAgICAgICAgamFycyA9IFtqIGZvciBqIGluIGphcnMgaWYgbm90IGoubmFtZS5zdGFydHN3aXRoKCJvcmlnaW5hbC0iKV0KICAgICAgICAgICAgaWYgamFyczoKICAgICAgICAgICAgICAgIHJldHVybiBzdHIoamFyc1swXSkKICAgIHJldHVybiAiIgoKCmRlZiByZXNvbHZlX2ZvcmdlX2RlY2tzX2RpcigpIC0+IHN0cjoKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgICAgIGFwcGRhdGEgPSBvcy5lbnZpcm9uLmdldCgiQVBQREFUQSIsICIiKQogICAgICAgIGlmIGFwcGRhdGE6CiAgICAgICAgICAgIGNhbmRpZGF0ZSA9IG9zLnBhdGguam9pbihhcHBkYXRhLCAiRm9yZ2UiLCAiZGVja3MiLCAiY29tbWFuZGVyIikKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihjYW5kaWRhdGUpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZQogICAgaG9tZSA9IFBhdGguaG9tZSgpCiAgICBmb3IgY2FuZGlkYXRlIGluIFsKICAgICAgICBob21lIC8gIi5mb3JnZSIgLyAiZGVja3MiIC8gImNvbW1hbmRlciIsCiAgICAgICAgaG9tZSAvICJGb3JnZSIgLyAiZGVja3MiIC8gImNvbW1hbmRlciIsCiAgICBdOgogICAgICAgIGlmIGNhbmRpZGF0ZS5pc19kaXIoKToKICAgICAgICAgICAgcmV0dXJuIHN0cihjYW5kaWRhdGUpCiAgICByZXR1cm4gIiIKCgpkZWYgbG9hZF9jb21tYW5kZXJfbWV0YSgpOgogICAgIiIiTG9hZCBjb21tYW5kZXIgbWV0YSBtYXBwaW5nIGZyb20gZmlsZSBvciB1c2UgYnVpbHRpbnMuIiIiCiAgICBnbG9iYWwgQ09NTUFOREVSX01FVEEKICAgIG1ldGFfcGF0aCA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJjb21tYW5kZXItbWV0YS5qc29uIgogICAgaWYgbWV0YV9wYXRoLmV4aXN0cygpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKG1ldGFfcGF0aCwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICAgICAgQ09NTUFOREVSX01FVEEgPSBqc29uLmxvYWQoZikKICAgICAgICAgICAgcHJpbnQoZiIgIE1ldGE6ICAgICAgICAgTG9hZGVkIHtsZW4oQ09NTUFOREVSX01FVEEpfSBjb21tYW5kZXJzIGZyb20ge21ldGFfcGF0aH0iKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiICBXQVJOSU5HOiBGYWlsZWQgdG8gbG9hZCBjb21tYW5kZXItbWV0YS5qc29uOiB7ZX0iKQoKICAgIENPTU1BTkRFUl9NRVRBID0gQlVJTFRJTl9DT01NQU5ERVJTCiAgICBwcmludChmIiAgTWV0YTogICAgICAgICB7bGVuKENPTU1BTkRFUl9NRVRBKX0gYnVpbHQtaW4gY29tbWFuZGVycyIpCgoKZGVmIG1haW4oKToKICAgIGFyZ3MgPSBwYXJzZV9hcmdzKCkKCiAgICBDRkcuZm9yZ2VfamFyID0gYXJncy5mb3JnZV9qYXIKICAgIENGRy5mb3JnZV9kaXIgPSBhcmdzLmZvcmdlX2RpcgogICAgQ0ZHLmZvcmdlX2RlY2tzX2RpciA9IGFyZ3MuZm9yZ2VfZGVja3NfZGlyIG9yIHJlc29sdmVfZm9yZ2VfZGVja3NfZGlyKCkKICAgIENGRy5sYWJfamFyID0gYXJncy5sYWJfamFyIG9yIHJlc29sdmVfbGFiX2phcigpCiAgICBDRkcucG9ydCA9IGFyZ3MucG9ydAog' +
'ICAgQ0ZHLnhpbWlsYXJfYXBpX2tleSA9IGFyZ3MueGltaWxhcl9rZXkKICAgIENGRy5wcGx4X2FwaV9rZXkgPSBhcmdzLnBwbHhfa2V5CgogICAgcHJpbnQoIuKVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVlyIpCiAgICBwcmludCgi4pWRICAgICAgQ29tbWFuZGVyIEFJIExhYiDigJQgQVBJIFNlcnZlciAgdjMuMC4wICAgICAg4pWRIikKICAgIHByaW50KCLilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0iKQogICAgcHJpbnQoKQogICAgcHJpbnQoZiIgIEZvcmdlIEpBUjogICAge0NGRy5mb3JnZV9qYXJ9IikKICAgIHByaW50KGYiICBGb3JnZSBEaXI6ICAgIHtDRkcuZm9yZ2VfZGlyfSIpCiAgICBwcmludChmIiAgRGVja3MgRGlyOiAgICB7Q0ZHLmZvcmdlX2RlY2tzX2Rpcn0iKQogICAgcHJpbnQoZiIgIExhYiBKQVI6ICAgICAge0NGRy5sYWJfamFyfSIpCiAgICBwcmludChmIiAgUmVzdWx0cyBEaXI6ICB7Q0ZHLnJlc3VsdHNfZGlyfSIpCiAgICBwcmludChmIiAgUG9ydDogICAgICAgICB7Q0ZHLnBvcnR9IikKICAgIHByaW50KGYiICBYaW1pbGFyOiAgICAgIHsnY29uZmlndXJlZCcgaWYgQ0ZHLnhpbWlsYXJfYXBpX2tleSBlbHNlICdOT1QgU0VUIChzY2FubmVyIHdpbGwgZmFpbCknfSIpCiAgICBwcmludChmIiAgUGVycGxleGl0eTogICB7J2NvbmZpZ3VyZWQnIGlmIENGRy5wcGx4X2FwaV9rZXkgZWxzZSAnTk9UIFNFVCAoQUkgcmVzZWFyY2gvZ2VuIGRpc2FibGVkKSd9IikKICAgIGoxNyA9IGdldF9qYXZhMTcoKQogICAgcHJpbnQoZiIgIEphdmEgMTc6ICAgICAge2oxNyBpZiBqMTcgIT0gJ2phdmEnIGVsc2UgJ05PVCBGT1VORCAoYmF0Y2ggc2ltIG1heSBmYWlsIG9uIEphdmEgMjUrKSd9IikKICAgIHByaW50KGYiICBMTSBTdHVkaW86ICAgIGh0dHA6Ly8xOTIuMTY4LjAuMTIyOjEyMzQiKQoKICAgIGxvYWRfY29tbWFuZGVyX21ldGEoKQogICAgZG93bmxvYWRfcHJlY29uX2RhdGFiYXNlKCkgICMgQXV0by1kb3dubG9hZHMgYWxsIDE2MysgQ29tbWFuZGVyIHByZWNvbnMgb24gZmlyc3QgcnVuCiAgICBpbml0X2NvbGxlY3Rpb25fZGIoKQogICAgaW5pdF9jb2FjaF9zZXJ2aWNlKCkKCiAgICAjIFhpbWlsYXIgQVBJIGtleSBjaGVjawogICAgaWYgbm90IENGRy54aW1pbGFyX2FwaV9rZXk6CiAgICAgICAgcHJpbnQoIiAgV0FSTklORzogLS14aW1pbGFyLWtleSBub3Qgc2V0LiBDYXJkIHNjYW5uZXIgd2lsbCBub3Qgd29yay4iKQogICAgICAgIHByaW50KCIgICAgICAgICAgIFNldCB2aWEgQ0xJOiAtLXhpbWlsYXIta2V5IFlPVVJfS0VZIikKICAgICAgICBwcmludCgiICAgICAgICAgICBPciBlbnYgdmFyOiAgWElNSUxBUl9BUElfS0VZPVlPVVJfS0VZIikKCiAgICBpZiBub3QgQ0ZHLmZvcmdlX2phcjoKICAgICAgICBwcmludCgiV0FSTklORzogLS1mb3JnZS1qYXIgbm90IHNldC4gL2FwaS9sYWIvc3RhcnQgd2lsbCBmYWlsLiIpCiAgICBpZiBub3QgQ0ZHLmxhYl9qYXI6CiAgICAgICAgcHJpbnQoIldBUk5JTkc6IExhYiBKQVIgbm90IGZvdW5kLiBCdWlsZCB3aXRoOiBtdm4gcGFja2FnZSAtRHNraXBUZXN0cyIpCiAgICBpZiBub3QgQ0ZHLmZvcmdlX2RlY2tzX2RpcjoKICAgICAgICBwcmludCgiV0FSTklORzogQ29tbWFuZGVyIGRlY2tzIGRpciBub3QgZm91bmQuIC9hcGkvbGFiL2RlY2tzIHdpbGwgcmV0dXJuIGVtcHR5LiIpCgogICAgcHJpbnQoKQogICAgcHJpbnQoZiIgIFN0YXJ0aW5nIHNlcnZlciBvbiBodHRwOi8vbG9jYWxob3N0OntDRkcucG9ydH0iKQogICAgaWYgX3NwYV9kaXIuZXhpc3RzKCk6CiAgICAgICAgcHJpbnQoZiIgIFdlYiBVSTogICAgICAgaHR0cDovL2xvY2FsaG9zdDp7Q0ZHLnBvcnR9LyAgKFJlYWN0IFNQQSkiKQogICAgICAgIHByaW50KGYiICBSb3V0ZXM6ICAgICAgIC8gKEJhdGNoIFNpbSksIC9jb2xsZWN0aW9uLCAvZGVja3MsIC9hdXRvZ2VuLCAvc2ltdWxhdG9yLCAvY29hY2gsIC90cmFpbmluZyIpCiAgICBlbHNlOgogICAgICAgIHByaW50KGYi' +
'ICBXZWIgVUk6ICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6e0NGRy5wb3J0fS9pbmRleC5odG1sICAobGVnYWN5IEhUTUwpIikKICAgICAgICBwcmludChmIiAgTk9URTogUmVhY3QgU1BBIG5vdCBidWlsdC4gUnVuOiBjZCBmcm9udGVuZC9jb21tYW5kZXItYWktbGFiLXVpICYmIG5wbSBpbnN0YWxsICYmIG5wbSBydW4gYnVpbGQiKQogICAgcHJpbnQoZiIgIEFQSSBkb2NzOiAgICAgaHR0cDovL2xvY2FsaG9zdDp7Q0ZHLnBvcnR9L2RvY3MiKQogICAgcHJpbnQoKQoKICAgIGltcG9ydCB1dmljb3JuCiAgICB1dmljb3JuLnJ1bihhcHAsIGhvc3Q9IjAuMC4wLjAiLCBwb3J0PUNGRy5wb3J0LCBsb2dfbGV2ZWw9ImluZm8iKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkK'
'dWlsZGVyIERCKS4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiJTRUxFQ1QgZC5pZCBhcyBkZWNrX2lkLCBkLm5hbWUgYXMgZGVja19uYW1lLCBkLmNvbW1hbmRlcl9uYW1lLAogICAgICAgICAgICAgICAgICBDT1VOVChkYy5pZCkgYXMgY2FyZF9jb3VudAogICAgICAgICAgIEZST00gZGVja3MgZAogICAgICAgICAgIExFRlQgSk9JTiBkZWNrX2NhcmRzIGRjIE9OIGRjLmRlY2tfaWQgPSBkLmlkCiAgICAgICAgICAgR1JPVVAgQlkgZC5pZAogICAgICAgICAgIE9SREVSIEJZIGQubmFtZSIiIgogICAgKS5mZXRjaGFsbCgpCgogICAgIyBBbHNvIGdldCByZXBvcnQgYXZhaWxhYmlsaXR5IGZyb20gY29hY2ggc2VydmljZQogICAgcmVwb3J0X2lkcyA9IHNldCgpCiAgICBpZiBfY29hY2hfc2VydmljZToKICAgICAgICByZXBvcnRfaWRzID0gc2V0KF9jb2FjaF9zZXJ2aWNlLmxpc3RfZGVja19yZXBvcnRzKCkpCgogICAgZGVja3MgPSBbXQogICAgZm9yIHIgaW4gcm93czoKICAgICAgICBkZWNrX25hbWUgPSByWyJkZWNrX25hbWUiXQogICAgICAgICMgQ2hlY2sgaWYgYSByZXBvcnQgZXhpc3RzIChieSBkZWNrIG5hbWUgc2x1ZyBtYXRjaCkKICAgICAgICBoYXNfcmVwb3J0ID0gYW55KAogICAgICAgICAgICBkZWNrX25hbWUubG93ZXIoKS5yZXBsYWNlKCIgIiwgIi0iKSA9PSByaWQubG93ZXIoKSBvcgogICAgICAgICAgICBkZWNrX25hbWUubG93ZXIoKSA9PSByaWQubG93ZXIoKQogICAgICAgICAgICBmb3IgcmlkIGluIHJlcG9ydF9pZHMKICAgICAgICApCiAgICAgICAgZGVja3MuYXBwZW5kKHsKICAgICAgICAgICAgImRlY2tfaWQiOiByWyJkZWNrX2lkIl0sCiAgICAgICAgICAgICJkZWNrX25hbWUiOiByWyJkZWNrX25hbWUiXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IHJbImNvbW1hbmRlcl9uYW1lIl0gb3IgIiIsCiAgICAgICAgICAgICJjYXJkX2NvdW50IjogclsiY2FyZF9jb3VudCJdLAogICAgICAgICAgICAiaGFzX3JlcG9ydCI6IGhhc19yZXBvcnQsCiAgICAgICAgICAgICJyZXBvcnRfY291bnQiOiAxIGlmIGhhc19yZXBvcnQgZWxzZSAwLAogICAgICAgICAgICAibGFzdF9yZXBvcnRfZGF0ZSI6IE5vbmUsCiAgICAgICAgfSkKICAgIHJldHVybiBkZWNrcwoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2RlY2tzL3tkZWNrX2lkfS9yZXBvcnQiKQphc3luYyBkZWYgY29hY2hfZ2V0X3JlcG9ydChkZWNrX2lkOiBzdHIpOgogICAgIiIiR2V0IHRoZSBsYXRlc3QgRGVja1JlcG9ydCBmb3IgYSBkZWNrLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKICAgIHJlcG9ydCA9IF9jb2FjaF9zZXJ2aWNlLmxvYWRfZGVja19yZXBvcnQoZGVja19pZCkKICAgIGlmIHJlcG9ydCBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkRlY2sgcmVwb3J0IG5vdCBmb3VuZDoge2RlY2tfaWR9IikKICAgIHJldHVybiByZXBvcnQubW9kZWxfZHVtcCgpCgoKY2xhc3MgQ29hY2hSZXF1ZXN0Qm9keShCYXNlTW9kZWwpOgogICAgZ29hbHM6IE9wdGlvbmFsW2RpY3RdID0gTm9uZQoKCmNsYXNzIENvYWNoQ2hhdE1lc3NhZ2UoQmFzZU1vZGVsKToKICAgIHJvbGU6IHN0ciAgIyAidXNlciIgb3IgImFzc2lzdGFudCIKICAgIGNvbnRlbnQ6IHN0cgoKY2xhc3MgQ29hY2hDaGF0UmVxdWVzdChCYXNlTW9kZWwpOgogICAgZGVja19pZDogc3RyCiAgICBtZXNzYWdlczogbGlzdFtkaWN0XSAgIyBjb252ZXJzYXRpb24gaGlzdG9yeSBbe3JvbGUsIGNvbnRlbnR9XQogICAgZ29hbHM6IE9wdGlvbmFsW2RpY3RdID0gTm9uZQogICAgc3RyZWFtOiBPcHRpb25hbFtib29sXSA9IEZhbHNlCgpjbGFzcyBDb2FjaEFwcGx5UmVxdWVzdChCYXNlTW9kZWwpOgogICAgc2Vzc2lvbl9pZDogc3RyCiAgICBkZWNrX2lkOiBpbnQgICMgbnVtZXJpYyBkZWNrIElEIGluIHRoZSBEQgogICAgYWNjZXB0ZWRfY3V0czogbGlzdFtzdHJdID0gW10gICMgY2FyZCBuYW1lcyB0byByZW1vdmUKICAgIGFjY2VwdGVkX2FkZHM6IGxpc3Rbc3RyXSA9IFtdICAjIGNhcmQgbmFtZXMgdG8gYWRkCgpjbGFzcyBDb2FjaEdvYWxzUmVxdWVzdChCYXNlTW9kZWwpOgogICAgdGFyZ2V0X3Bvd2VyX2xldmVsOiBPcHRpb25hbFtpbnRdID0gTm9uZSAgIyAxLTEwCiAgICBtZXRhX2ZvY3VzOiBP' +
'cHRpb25hbFtzdHJdID0gTm9uZSAgIyBhZ2dybywgY29udHJvbCwgY29tYm8sIG1pZHJhbmdlLCBzdGF4CiAgICBidWRnZXQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lICAjIGJ1ZGdldCwgbWVkaXVtLCBuby1saW1pdAogICAgZm9jdXNfYXJlYXM6IGxpc3Rbc3RyXSA9IFtdICAjIGUuZy4sIFsicmFtcCIsICJjYXJkIGRyYXciXQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9kZWNrcy97ZGVja19pZH0iKQphc3luYyBkZWYgY29hY2hfcnVuX3Nlc3Npb24oZGVja19pZDogc3RyLCBib2R5OiBDb2FjaFJlcXVlc3RCb2R5ID0gTm9uZSk6CiAgICAiIiJUcmlnZ2VyIGEgY29hY2hpbmcgc2Vzc2lvbiBmb3IgYSBkZWNrLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKCiAgICAjIExvYWQgZW1iZWRkaW5ncyBvbiBmaXJzdCB1c2UgaWYgbm90IGxvYWRlZAogICAgaWYgX2NvYWNoX2VtYmVkZGluZ3MgYW5kIG5vdCBfY29hY2hfZW1iZWRkaW5ncy5sb2FkZWQ6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5sb2FkKGZvcmNlX2Rvd25sb2FkPVRydWUpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIiAgQ29hY2g6IEVtYmVkZGluZ3MgZG93bmxvYWQgZmFpbGVkOiB7ZX0iKQoKICAgIGdvYWxzID0gTm9uZQogICAgaWYgYm9keSBhbmQgYm9keS5nb2FsczoKICAgICAgICBmcm9tIGNvYWNoLm1vZGVscyBpbXBvcnQgQ29hY2hHb2FscwogICAgICAgIHRyeToKICAgICAgICAgICAgZ29hbHMgPSBDb2FjaEdvYWxzKCoqYm9keS5nb2FscykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBnb2FscyA9IE5vbmUKCiAgICB0cnk6CiAgICAgICAgc2Vzc2lvbiA9IGF3YWl0IF9jb2FjaF9zZXJ2aWNlLnJ1bl9jb2FjaGluZ19zZXNzaW9uKGRlY2tfaWQsIGdvYWxzKQogICAgICAgIHJldHVybiBzZXNzaW9uLm1vZGVsX2R1bXAoKQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgc3RyKGUpKQogICAgZXhjZXB0IENvbm5lY3Rpb25FcnJvciBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCBmIkxMTSBjb25uZWN0aW9uIGZhaWxlZDoge2V9IikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJDb2FjaCBzZXNzaW9uIGZhaWxlZDoge2V9IikKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9zZXNzaW9ucyIpCmFzeW5jIGRlZiBjb2FjaF9saXN0X3Nlc3Npb25zKGRlY2tfaWQ6IHN0ciA9IE5vbmUpOgogICAgIiIiTGlzdCBhbGwgY29hY2hpbmcgc2Vzc2lvbnMsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgZGVjay4iIiIKICAgIGlmIF9jb2FjaF9zZXJ2aWNlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDb2FjaCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIpCiAgICByZXR1cm4geyJzZXNzaW9ucyI6IF9jb2FjaF9zZXJ2aWNlLmxpc3Rfc2Vzc2lvbnMoZGVja19pZCl9CgoKQGFwcC5nZXQoIi9hcGkvY29hY2gvc2Vzc2lvbnMve3Nlc3Npb25faWR9IikKYXN5bmMgZGVmIGNvYWNoX2dldF9zZXNzaW9uKHNlc3Npb25faWQ6IHN0cik6CiAgICAiIiJHZXQgYSBzcGVjaWZpYyBjb2FjaGluZyBzZXNzaW9uLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKICAgIHNlc3Npb24gPSBfY29hY2hfc2VydmljZS5sb2FkX3Nlc3Npb24oc2Vzc2lvbl9pZCkKICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJTZXNzaW9uIG5vdCBmb3VuZDoge3Nlc3Npb25faWR9IikKICAgIHJldHVybiBzZXNzaW9uLm1vZGVsX2R1bXAoKQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9lbWJlZGRpbmdzL2Rvd25sb2FkIikKYXN5bmMgZGVmIGNvYWNoX2Rvd25sb2FkX2VtYmVkZGluZ3MoKToKICAgICIiIkRvd25sb2FkIGFuZCBjb252ZXJ0IE1URyBjYXJkIGVtYmVkZGluZ3MgZnJvbSBIdWdnaW5nRmFjZS4iIiIKICAgIGlmIF9jb2FjaF9lbWJlZGRpbmdzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDb2FjaCBz' +
'ZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIpCiAgICB0cnk6CiAgICAgICAgX2NvYWNoX2VtYmVkZGluZ3MubG9hZChmb3JjZV9kb3dubG9hZD1UcnVlKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzdWNjZXNzIjogVHJ1ZSwKICAgICAgICAgICAgImNhcmRzIjogX2NvYWNoX2VtYmVkZGluZ3MuY2FyZF9jb3VudCwKICAgICAgICAgICAgIm1lc3NhZ2UiOiBmIkxvYWRlZCB7X2NvYWNoX2VtYmVkZGluZ3MuY2FyZF9jb3VudH0gY2FyZCBlbWJlZGRpbmdzIgogICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGYWlsZWQgdG8gZG93bmxvYWQgZW1iZWRkaW5nczoge2V9IikKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9lbWJlZGRpbmdzL3NlYXJjaCIpCmFzeW5jIGRlZiBjb2FjaF9zZWFyY2hfc2ltaWxhcihjYXJkOiBzdHIsIGNvbG9yczogc3RyID0gTm9uZSwgdG9wX246IGludCA9IDEwKToKICAgICIiIlNlYXJjaCBmb3Igc2ltaWxhciBjYXJkcyBieSBuYW1lLiIiIgogICAgaWYgX2NvYWNoX2VtYmVkZGluZ3MgaXMgTm9uZSBvciBub3QgX2NvYWNoX2VtYmVkZGluZ3MubG9hZGVkOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCAiRW1iZWRkaW5ncyBub3QgbG9hZGVkIikKICAgIGNvbG9yX2ZpbHRlciA9IGxpc3QoY29sb3JzLnVwcGVyKCkpIGlmIGNvbG9ycyBlbHNlIE5vbmUKICAgIG1hdGNoZXMgPSBfY29hY2hfZW1iZWRkaW5ncy5zZWFyY2hfc2ltaWxhcigKICAgICAgICBxdWVyeV9jYXJkPWNhcmQsIGNvbG9yX2ZpbHRlcj1jb2xvcl9maWx0ZXIsIHRvcF9uPXRvcF9uCiAgICApCiAgICByZXR1cm4geyJxdWVyeSI6IGNhcmQsICJtYXRjaGVzIjogW20udG9fZGljdCgpIGZvciBtIGluIG1hdGNoZXNdfQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9jaGF0IikKYXN5bmMgZGVmIGNvYWNoX2NoYXQoYm9keTogQ29hY2hDaGF0UmVxdWVzdCk6CiAgICAiIiJNdWx0aS10dXJuIGNvYWNoaW5nIGNoYXQuIFNlbmRzIGNvbnZlcnNhdGlvbiBoaXN0b3J5IHRvIExMTSBhbmQgcmV0dXJucyByZXNwb25zZS4iIiIKICAgIGlmIF9jb2FjaF9zZXJ2aWNlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDb2FjaCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIpCgogICAgIyBMb2FkIGRlY2sgcmVwb3J0IGZvciBjb250ZXh0CiAgICByZXBvcnQgPSBfY29hY2hfc2VydmljZS5sb2FkX2RlY2tfcmVwb3J0KGJvZHkuZGVja19pZCkKCiAgICAjIEJ1aWxkIHN5c3RlbSBwcm9tcHQgd2l0aCByZXBvcnQgY29udGV4dAogICAgZnJvbSBjb2FjaC5wcm9tcHRfdGVtcGxhdGUgaW1wb3J0IGJ1aWxkX3N5c3RlbV9wcm9tcHQKICAgIGZyb20gY29hY2gubW9kZWxzIGltcG9ydCBDb2FjaEdvYWxzCgogICAgZ29hbHMgPSBOb25lCiAgICBpZiBib2R5LmdvYWxzOgogICAgICAgIHRyeToKICAgICAgICAgICAgZ29hbHMgPSBDb2FjaEdvYWxzKCoqYm9keS5nb2FscykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBnb2FscyA9IE5vbmUKCiAgICBzeXN0ZW1fcHJvbXB0ID0gIiIKICAgIGlmIHJlcG9ydDoKICAgICAgICBzeXN0ZW1fcHJvbXB0ID0gYnVpbGRfc3lzdGVtX3Byb21wdChyZXBvcnQsIGdvYWxzKQogICAgZWxzZToKICAgICAgICBzeXN0ZW1fcHJvbXB0ID0gKAogICAgICAgICAgICAiWW91IGFyZSBhbiBleHBlcnQgTWFnaWM6IFRoZSBHYXRoZXJpbmcgQ29tbWFuZGVyIGRlY2sgY29hY2guICIKICAgICAgICAgICAgIkFuc3dlciBxdWVzdGlvbnMgYWJvdXQgZGVjayBidWlsZGluZywgc3RyYXRlZ3ksIGNhcmQgY2hvaWNlcywgYW5kIGdhbWUgdGhlb3J5LiAiCiAgICAgICAgICAgICJCZSBzcGVjaWZpYyBhbmQgYWN0aW9uYWJsZSBpbiB5b3VyIGFkdmljZS4iCiAgICAgICAgKQoKICAgICMgQnVpbGQgbWVzc2FnZXMgYXJyYXkgZm9yIExMTQogICAgbWVzc2FnZXMgPSBbeyJyb2xlIjogInN5c3RlbSIsICJjb250ZW50Ijogc3lzdGVtX3Byb21wdH1dCiAgICBmb3IgbXNnIGluIGJvZHkubWVzc2FnZXM6CiAgICAgICAgbWVzc2FnZXMuYXBwZW5kKHsicm9sZSI6IG1zZy5nZXQoInJvbGUiLCAidXNlciIpLCAiY29udGVudCI6IG1zZy5nZXQoImNvbnRlbnQiLCAiIil9KQoKICAgICMgQ2FsbCBMTE0gd2l0aCBtdWx0aS10dXJuIG1lc3NhZ2VzCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IGpzb24KICAgICAgICBmcm9tIHVybGxpYi5yZXF1' +
'ZXN0IGltcG9ydCB1cmxvcGVuLCBSZXF1ZXN0IGFzIFVybFJlcXVlc3QKICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgTE1fU1RVRElPX1VSTCwgTE1fU1RVRElPX1RJTUVPVVQKCiAgICAgICAgbW9kZWxfbmFtZSA9IF9jb2FjaF9sbG0uX3Jlc29sdmVfbW9kZWwoKQogICAgICAgIGxsbV9ib2R5ID0gewogICAgICAgICAgICAibW9kZWwiOiBtb2RlbF9uYW1lLAogICAgICAgICAgICAibWVzc2FnZXMiOiBtZXNzYWdlcywKICAgICAgICAgICAgInRlbXBlcmF0dXJlIjogMC43LAogICAgICAgICAgICAibWF4X3Rva2VucyI6IDQwOTYsCiAgICAgICAgfQoKICAgICAgICBpZiBib2R5LnN0cmVhbToKICAgICAgICAgICAgIyBTU0Ugc3RyZWFtaW5nIHJlc3BvbnNlCiAgICAgICAgICAgIGxsbV9ib2R5WyJzdHJlYW0iXSA9IFRydWUKCiAgICAgICAgICAgIGFzeW5jIGRlZiBnZW5lcmF0ZSgpOgogICAgICAgICAgICAgICAgaW1wb3J0IGFzeW5jaW8KICAgICAgICAgICAgICAgIGRlZiBfc3RyZWFtKCk6CiAgICAgICAgICAgICAgICAgICAgcmVxID0gVXJsUmVxdWVzdCgKICAgICAgICAgICAgICAgICAgICAgICAgZiJ7X2NvYWNoX2xsbS5iYXNlX3VybH0vY2hhdC9jb21wbGV0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9anNvbi5kdW1wcyhsbG1fYm9keSkuZW5jb2RlKCJ1dGYtOCIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSwKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPSJQT1NUIiwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGh0dHAuY2xpZW50CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHVybGxpYi5wYXJzZQogICAgICAgICAgICAgICAgICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShmIntfY29hY2hfbGxtLmJhc2VfdXJsfS9jaGF0L2NvbXBsZXRpb25zIikKICAgICAgICAgICAgICAgICAgICBjb25uID0gaHR0cC5jbGllbnQuSFRUUENvbm5lY3Rpb24ocGFyc2VkLmhvc3RuYW1lLCBwYXJzZWQucG9ydCwgdGltZW91dD1MTV9TVFVESU9fVElNRU9VVCkKICAgICAgICAgICAgICAgICAgICBjb25uLnJlcXVlc3QoIlBPU1QiLCBwYXJzZWQucGF0aCwgYm9keT1qc29uLmR1bXBzKGxsbV9ib2R5KS5lbmNvZGUoInV0Zi04IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9KQogICAgICAgICAgICAgICAgICAgIHJlc3AgPSBjb25uLmdldHJlc3BvbnNlKCkKICAgICAgICAgICAgICAgICAgICBjaHVua3MgPSBbXQogICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSByZXNwLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoInV0Zi04Iikuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoImRhdGE6ICIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGxpbmVbNjpdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYXRhID09ICJbRE9ORV0iOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoIltET05FXSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoZGF0YSkKICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2h1bmtzCgogICAgICAgICAgICAgICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKQogICAgICAgICAgICAgICAgY2h1bmtzID0gYXdhaXQgbG9vcC5ydW5faW5fZXhlY3V0b3IoTm9uZSwgX3N0cmVhbSkKCiAgICAgICAgICAgICAgICBmb3IgY2h1bmtfc3RyIGluIGNodW5rczoKICAgICAgICAgICAgICAgICAgICBpZiBjaHVua19zdHIgPT0gIltET05FXSI6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGYiZGF0YTogW0RPTkVdXG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAg' +
'ICAgICAgIGNodW5rID0ganNvbi5sb2FkcyhjaHVua19zdHIpCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gY2h1bmsuZ2V0KCJjaG9pY2VzIiwgW3t9XSlbMF0uZ2V0KCJkZWx0YSIsIHt9KQogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gZGVsdGEuZ2V0KCJjb250ZW50IiwgIiIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFN0cmlwIHRoaW5rIHRhZ3MgZnJvbSBzdHJlYW1pbmcgY2h1bmtzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBmImRhdGE6IHtqc29uLmR1bXBzKHsnY29udGVudCc6IGNvbnRlbnR9KX1cblxuIgogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHJldHVybiBTdHJlYW1pbmdSZXNwb25zZShnZW5lcmF0ZSgpLCBtZWRpYV90eXBlPSJ0ZXh0L2V2ZW50LXN0cmVhbSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBOb24tc3RyZWFtaW5nOiByZWd1bGFyIGNhbGwKICAgICAgICAgICAgcmVxID0gVXJsUmVxdWVzdCgKICAgICAgICAgICAgICAgIGYie19jb2FjaF9sbG0uYmFzZV91cmx9L2NoYXQvY29tcGxldGlvbnMiLAogICAgICAgICAgICAgICAgZGF0YT1qc29uLmR1bXBzKGxsbV9ib2R5KS5lbmNvZGUoInV0Zi04IiksCiAgICAgICAgICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSwKICAgICAgICAgICAgICAgIG1ldGhvZD0iUE9TVCIsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGltcG9ydCBhc3luY2lvCiAgICAgICAgICAgIGxvb3AgPSBhc3luY2lvLmdldF9ldmVudF9sb29wKCkKICAgICAgICAgICAgZGVmIF9jYWxsKCk6CiAgICAgICAgICAgICAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PUxNX1NUVURJT19USU1FT1VUKSBhcyByZXNwOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKCiAgICAgICAgICAgIHJhdyA9IGF3YWl0IGxvb3AucnVuX2luX2V4ZWN1dG9yKE5vbmUsIF9jYWxsKQoKICAgICAgICAgICAgY29udGVudCA9IHJhdy5nZXQoImNob2ljZXMiLCBbe31dKVswXS5nZXQoIm1lc3NhZ2UiLCB7fSkuZ2V0KCJjb250ZW50IiwgIiIpCiAgICAgICAgICAgICMgU3RyaXAgdGhpbmsgdGFncwogICAgICAgICAgICBjb250ZW50ID0gX2NvYWNoX2xsbS5fc3RyaXBfdGhpbmtfdGFncyhjb250ZW50KQogICAgICAgICAgICB1c2FnZSA9IHJhdy5nZXQoInVzYWdlIiwge30pCgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgImNvbnRlbnQiOiBjb250ZW50LAogICAgICAgICAgICAgICAgIm1vZGVsIjogcmF3LmdldCgibW9kZWwiLCAiIiksCiAgICAgICAgICAgICAgICAicHJvbXB0X3Rva2VucyI6IHVzYWdlLmdldCgicHJvbXB0X3Rva2VucyIsIDApLAogICAgICAgICAgICAgICAgImNvbXBsZXRpb25fdG9rZW5zIjogdXNhZ2UuZ2V0KCJjb21wbGV0aW9uX3Rva2VucyIsIDApLAogICAgICAgICAgICB9CgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkNoYXQgZmFpbGVkOiB7ZX0iKQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9hcHBseSIpCmFzeW5jIGRlZiBjb2FjaF9hcHBseV9zdWdnZXN0aW9ucyhib2R5OiBDb2FjaEFwcGx5UmVxdWVzdCk6CiAgICAiIiJBcHBseSBhY2NlcHRlZCBjb2FjaGluZyBzdWdnZXN0aW9ucyB0byBhIGRlY2sg4oCUIHJlbW92ZSBjdXRzLCBhZGQgYWRkcy4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgVmVyaWZ5IGRlY2sgZXhpc3RzCiAgICBkZWNrID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGRlY2tzIFdIRVJFIGlkID0gPyIsIChib2R5LmRlY2tfaWQsKSkuZmV0Y2hvbmUoKQogICAgaWYgbm90IGRlY2s6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiRGVjayB7Ym9keS5kZWNrX2lkfSBub3QgZm91bmQiKQoKICAgIHJlc3VsdHMgPSB7ImN1dHMiOiBbXSwgImFkZHMiOiBbXSwgImVycm9ycyI6IFtdfQoKICAgICMgUHJvY2VzcyBjdXRzOiByZW1vdmUgY2FyZHMgYnkgbmFtZQogICAgZm9yIGNhcmRfbmFtZSBpbiBib2R5LmFjY2VwdGVkX2N1dHM6CiAgICAgICAgcm93ID0gY29ubi5leGVjdXRl' +
'KAogICAgICAgICAgICAiU0VMRUNUIGlkIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgY2FyZF9uYW1lID0gPyBMSU1JVCAxIiwKICAgICAgICAgICAgKGJvZHkuZGVja19pZCwgY2FyZF9uYW1lKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGlmIHJvdzoKICAgICAgICAgICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGlkID0gPyIsIChyb3dbImlkIl0sKSkKICAgICAgICAgICAgcmVzdWx0c1siY3V0cyJdLmFwcGVuZCh7Im5hbWUiOiBjYXJkX25hbWUsICJzdGF0dXMiOiAicmVtb3ZlZCJ9KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVHJ5IGNhc2UtaW5zZW5zaXRpdmUKICAgICAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlNFTEVDVCBpZCwgY2FyZF9uYW1lIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgTE9XRVIoY2FyZF9uYW1lKSA9IExPV0VSKD8pIExJTUlUIDEiLAogICAgICAgICAgICAgICAgKGJvZHkuZGVja19pZCwgY2FyZF9uYW1lKQogICAgICAgICAgICApLmZldGNob25lKCkKICAgICAgICAgICAgaWYgcm93OgogICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGlkID0gPyIsIChyb3dbImlkIl0sKSkKICAgICAgICAgICAgICAgIHJlc3VsdHNbImN1dHMiXS5hcHBlbmQoeyJuYW1lIjogcm93WyJjYXJkX25hbWUiXSwgInN0YXR1cyI6ICJyZW1vdmVkIn0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN1bHRzWyJlcnJvcnMiXS5hcHBlbmQoeyJuYW1lIjogY2FyZF9uYW1lLCAiZXJyb3IiOiAiQ2FyZCBub3QgZm91bmQgaW4gZGVjayJ9KQoKICAgICMgUHJvY2VzcyBhZGRzOiBsb29rIHVwIGluIGNvbGxlY3Rpb24gZmlyc3QsIHRoZW4gU2NyeWZhbGwKICAgIGZvciBjYXJkX25hbWUgaW4gYm9keS5hY2NlcHRlZF9hZGRzOgogICAgICAgICMgVHJ5IHRvIGZpbmQgaW4gY29sbGVjdGlvbgogICAgICAgIGNlID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIHNjcnlmYWxsX2lkLCBuYW1lIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIExPV0VSKG5hbWUpID0gTE9XRVIoPykgTElNSVQgMSIsCiAgICAgICAgICAgIChjYXJkX25hbWUsKQogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICBzY3J5ZmFsbF9pZCA9IE5vbmUKICAgICAgICByZXNvbHZlZF9uYW1lID0gY2FyZF9uYW1lCgogICAgICAgIGlmIGNlOgogICAgICAgICAgICBzY3J5ZmFsbF9pZCA9IGNlWyJzY3J5ZmFsbF9pZCJdCiAgICAgICAgICAgIHJlc29sdmVkX25hbWUgPSBjZVsibmFtZSJdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUcnkgU2NyeWZhbGwgQVBJIGxvb2t1cAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgdXJsbGliLnBhcnNlCiAgICAgICAgICAgICAgICBlbmNvZGVkID0gdXJsbGliLnBhcnNlLnF1b3RlKGNhcmRfbmFtZSkKICAgICAgICAgICAgICAgIHNjcnlfcmVxID0gVXJsUmVxdWVzdCgKICAgICAgICAgICAgICAgICAgICBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy9uYW1lZD9mdXp6eT17ZW5jb2RlZH0iLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJVc2VyLUFnZW50IjogImNvbW1hbmRlci1haS1sYWIvMS4wIn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHdpdGggdXJsb3BlbihzY3J5X3JlcSwgdGltZW91dD0xMCkgYXMgcmVzcDoKICAgICAgICAgICAgICAgICAgICBjYXJkX2RhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKICAgICAgICAgICAgICAgICAgICBzY3J5ZmFsbF9pZCA9IGNhcmRfZGF0YS5nZXQoImlkIikKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZF9uYW1lID0gY2FyZF9kYXRhLmdldCgibmFtZSIsIGNhcmRfbmFtZSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2NyeWZhbGxfaWQ6CiAgICAgICAgICAgICMgQ2hlY2sgaWYgYWxyZWFkeSBpbiBkZWNrCiAgICAgICAgICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlNFTEVDVCBpZCBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gQU5EIHNjcnlmYWxsX2lkID0gPyIsCiAgICAgICAgICAgICAgICAoYm9keS5kZWNrX2lkLCBzY3J5ZmFs' +
'bF9pZCkKICAgICAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgICAgIGlmIG5vdCBleGlzdGluZzoKICAgICAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHkpIFZBTFVFUyAoPywgPywgPywgMSkiLAogICAgICAgICAgICAgICAgICAgIChib2R5LmRlY2tfaWQsIHNjcnlmYWxsX2lkLCByZXNvbHZlZF9uYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVzdWx0c1siYWRkcyJdLmFwcGVuZCh7Im5hbWUiOiByZXNvbHZlZF9uYW1lLCAic2NyeWZhbGxfaWQiOiBzY3J5ZmFsbF9pZCwgInN0YXR1cyI6ICJhZGRlZCJ9KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdWx0c1siYWRkcyJdLmFwcGVuZCh7Im5hbWUiOiByZXNvbHZlZF9uYW1lLCAic3RhdHVzIjogImFscmVhZHlfaW5fZGVjayJ9KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdHNbImVycm9ycyJdLmFwcGVuZCh7Im5hbWUiOiBjYXJkX25hbWUsICJlcnJvciI6ICJDb3VsZCBub3QgcmVzb2x2ZSBjYXJkIn0pCgogICAgY29ubi5leGVjdXRlKCJVUERBVEUgZGVja3MgU0VUIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwgKGJvZHkuZGVja19pZCwpKQogICAgY29ubi5jb21taXQoKQoKICAgIHJlc3VsdHNbInRvdGFsX2N1dHMiXSA9IGxlbihyZXN1bHRzWyJjdXRzIl0pCiAgICByZXN1bHRzWyJ0b3RhbF9hZGRzIl0gPSBsZW4oW2EgZm9yIGEgaW4gcmVzdWx0c1siYWRkcyJdIGlmIGFbInN0YXR1cyJdID09ICJhZGRlZCJdKQogICAgcmV0dXJuIHJlc3VsdHMKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9jYXJkcy1saWtlIikKYXN5bmMgZGVmIGNvYWNoX2NhcmRzX2xpa2UoY2FyZDogc3RyLCBjb2xvcnM6IHN0ciA9IE5vbmUsIHRvcF9uOiBpbnQgPSAxMCk6CiAgICAiIiJGaW5kIGNhcmRzIHNpbWlsYXIgdG8gYSBnaXZlbiBjYXJkIHVzaW5nIGVtYmVkZGluZ3MuIFVJLWZyaWVuZGx5IHZlcnNpb24uIiIiCiAgICBpZiBfY29hY2hfZW1iZWRkaW5ncyBpcyBOb25lIG9yIG5vdCBfY29hY2hfZW1iZWRkaW5ncy5sb2FkZWQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICJFbWJlZGRpbmdzIG5vdCBsb2FkZWQiKQoKICAgIGNvbG9yX2ZpbHRlciA9IGxpc3QoY29sb3JzLnVwcGVyKCkpIGlmIGNvbG9ycyBlbHNlIE5vbmUKICAgIG1hdGNoZXMgPSBfY29hY2hfZW1iZWRkaW5ncy5zZWFyY2hfc2ltaWxhcigKICAgICAgICBxdWVyeV9jYXJkPWNhcmQsIGNvbG9yX2ZpbHRlcj1jb2xvcl9maWx0ZXIsIHRvcF9uPXRvcF9uCiAgICApCgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByZXN1bHRzID0gW10KICAgIGZvciBtIGluIG1hdGNoZXM6CiAgICAgICAgIyBDaGVjayBpZiBjYXJkIGlzIGluIGNvbGxlY3Rpb24KICAgICAgICBvd25lZCA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBTVU0ocXVhbnRpdHkpIGFzIHF0eSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBMT1dFUihuYW1lKSA9IExPV0VSKD8pIiwKICAgICAgICAgICAgKG0ubmFtZSwpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgb3duZWRfcXR5ID0gKG93bmVkWyJxdHkiXSBvciAwKSBpZiBvd25lZCBlbHNlIDAKCiAgICAgICAgIyBHZXQgaW1hZ2UgVVJMIGFuZCBwcmljZQogICAgICAgIGNlID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIGltYWdlX3VybCwgdGNnX3ByaWNlIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIExPV0VSKG5hbWUpID0gTE9XRVIoPykgTElNSVQgMSIsCiAgICAgICAgICAgIChtLm5hbWUsKQogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICByZXN1bHRzLmFwcGVuZCh7CiAgICAgICAgICAgICJuYW1lIjogbS5uYW1lLAogICAgICAgICAgICAic2ltaWxhcml0eSI6IHJvdW5kKG0uc2ltaWxhcml0eSwgNCksCiAgICAgICAgICAgICJ0eXBlcyI6IG0udHlwZXMsCiAgICAgICAgICAgICJtYW5hX3ZhbHVlIjogbS5tYW5hX3ZhbHVlLAogICAgICAgICAgICAibWFuYV9jb3N0IjogbS5tYW5hX2Nvc3QsCiAgICAgICAgICAgICJ0ZXh0IjogbS50ZXh0WzoyMDBdIGlmIG0udGV4dCBlbHNlICIiLAogICAgICAgICAgICAib3duZWRfcXR5Ijogb3duZWRfcXR5LAogICAgICAgICAgICAiaW1hZ2VfdXJsIjogY2Vb' +
'ImltYWdlX3VybCJdIGlmIGNlIGVsc2UgTm9uZSwKICAgICAgICAgICAgInRjZ19wcmljZSI6IGNlWyJ0Y2dfcHJpY2UiXSBpZiBjZSBlbHNlIE5vbmUsCiAgICAgICAgfSkKCiAgICByZXR1cm4geyJxdWVyeSI6IGNhcmQsICJyZXN1bHRzIjogcmVzdWx0c30KCgpAYXBwLnBvc3QoIi9hcGkvY29hY2gvcmVwb3J0cy9nZW5lcmF0ZSIpCmFzeW5jIGRlZiBjb2FjaF9nZW5lcmF0ZV9yZXBvcnRzKCk6CiAgICAiIiJSZWJ1aWxkIGFsbCBkZWNrIHJlcG9ydHMgZnJvbSBiYXRjaCByZXN1bHQgSlNPTnMgaW4gcmVzdWx0cy8uIiIiCiAgICB0cnk6CiAgICAgICAgZnJvbSBjb2FjaC5yZXBvcnRfZ2VuZXJhdG9yIGltcG9ydCBnZW5lcmF0ZV9kZWNrX3JlcG9ydHMKICAgICAgICBsYWJfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgICAgIHJlc3VsdHNfZGlyID0gc3RyKGxhYl9yb290IC8gQ0ZHLnJlc3VsdHNfZGlyKQogICAgICAgIHJlcG9ydHNfZGlyID0gc3RyKGxhYl9yb290IC8gImRlY2stcmVwb3J0cyIpCiAgICAgICAgdXBkYXRlZCA9IGdlbmVyYXRlX2RlY2tfcmVwb3J0cyhyZXN1bHRzX2RpciwgcmVwb3J0c19kaXIpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInN0YXR1cyI6ICJvayIsCiAgICAgICAgICAgICJkZWNrc1VwZGF0ZWQiOiB1cGRhdGVkLAogICAgICAgICAgICAiY291bnQiOiBsZW4odXBkYXRlZCksCiAgICAgICAgICAgICJtZXNzYWdlIjogZiJHZW5lcmF0ZWQgcmVwb3J0cyBmb3Ige2xlbih1cGRhdGVkKX0gZGVja3MiIGlmIHVwZGF0ZWQgZWxzZSAiTm8gYmF0Y2ggcmVzdWx0cyBmb3VuZCIsCiAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIlJlcG9ydCBnZW5lcmF0aW9uIGZhaWxlZDoge2V9IikKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1MIFRyYWluaW5nIERhdGEgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpAYXBwLmdldCgiL2FwaS9tbC9zdGF0dXMiKQphc3luYyBkZWYgbWxfc3RhdHVzKCk6CiAgICAiIiJHZXQgTUwgZGVjaXNpb24gbG9nZ2luZyBzdGF0dXMgYW5kIGF2YWlsYWJsZSB0cmFpbmluZyBkYXRhLiIiIgogICAgZ2xvYmFsIF9tbF9sb2dnaW5nX2VuYWJsZWQKICAgIGxhYl9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICByZXN1bHRzX2RpciA9IGxhYl9yb290IC8gQ0ZHLnJlc3VsdHNfZGlyCgogICAgIyBGaW5kIGV4aXN0aW5nIE1MIGRlY2lzaW9uIGZpbGVzCiAgICBtbF9maWxlcyA9IFtdCiAgICBpZiByZXN1bHRzX2Rpci5leGlzdHMoKToKICAgICAgICBmb3IgZiBpbiBzb3J0ZWQocmVzdWx0c19kaXIuZ2xvYigibWwtZGVjaXNpb25zLSouanNvbmwiKSk6CiAgICAgICAgICAgIGxpbmVzID0gMAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZikgYXMgZmg6CiAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBzdW0oMSBmb3IgXyBpbiBmaCkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgbWxfZmlsZXMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJmaWxlIjogZi5uYW1lLAogICAgICAgICAgICAgICAgImRlY2lzaW9ucyI6IGxpbmVzLAogICAgICAgICAgICAgICAgInNpemVfa2IiOiByb3VuZChmLnN0YXQoKS5zdF9zaXplIC8gMTAyNCwgMSksCiAgICAgICAgICAgIH0pCgogICAgdG90YWxfZGVjaXNpb25zID0gc3VtKGZbImRlY2lzaW9ucyJdIGZvciBmIGluIG1sX2ZpbGVzKQogICAgcmV0dXJuIHsKICAgICAgICAibWxfbG9nZ2luZ19lbmFibGVkIjogX21sX2xvZ2dpbmdfZW5hYmxlZCwKICAgICAgICAidHJhaW5pbmdfZmlsZXMiOiBtbF9maWxlcywKICAgICAgICAidG90YWxfZGVjaXNpb25zIjog' +
'dG90YWxfZGVjaXNpb25zLAogICAgICAgICJ0b3RhbF9maWxlcyI6IGxlbihtbF9maWxlcyksCiAgICB9CgoKQGFwcC5wb3N0KCIvYXBpL21sL3RvZ2dsZSIpCmFzeW5jIGRlZiBtbF90b2dnbGUoZW5hYmxlOiBib29sID0gVHJ1ZSk6CiAgICAiIiJFbmFibGUgb3IgZGlzYWJsZSBNTCBkZWNpc2lvbiBsb2dnaW5nIGZvciBmdXR1cmUgYmF0Y2ggcnVucy4iIiIKICAgIGdsb2JhbCBfbWxfbG9nZ2luZ19lbmFibGVkCiAgICBfbWxfbG9nZ2luZ19lbmFibGVkID0gZW5hYmxlCiAgICByZXR1cm4gewogICAgICAgICJtbF9sb2dnaW5nX2VuYWJsZWQiOiBfbWxfbG9nZ2luZ19lbmFibGVkLAogICAgICAgICJtZXNzYWdlIjogZiJNTCBkZWNpc2lvbiBsb2dnaW5nIHsnZW5hYmxlZCcgaWYgZW5hYmxlIGVsc2UgJ2Rpc2FibGVkJ30gZm9yIGZ1dHVyZSBiYXRjaGVzIiwKICAgIH0KCgpAYXBwLmdldCgiL2FwaS9tbC9kZWNpc2lvbnMve2ZpbGVuYW1lfSIpCmFzeW5jIGRlZiBtbF9nZXRfZGVjaXNpb25zKGZpbGVuYW1lOiBzdHIsIGxpbWl0OiBpbnQgPSAxMDAsIG9mZnNldDogaW50ID0gMCk6CiAgICAiIiJSZWFkIGRlY2lzaW9uIHNuYXBzaG90cyBmcm9tIGEgdHJhaW5pbmcgZGF0YSBmaWxlLiIiIgogICAgbGFiX3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgIGZpbGVwYXRoID0gbGFiX3Jvb3QgLyBDRkcucmVzdWx0c19kaXIgLyBmaWxlbmFtZQoKICAgIGlmIG5vdCBmaWxlcGF0aC5leGlzdHMoKSBvciBub3QgZmlsZW5hbWUuc3RhcnRzd2l0aCgibWwtZGVjaXNpb25zLSIpOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIk1MIGRlY2lzaW9ucyBmaWxlIG5vdCBmb3VuZDoge2ZpbGVuYW1lfSIpCgogICAgZGVjaXNpb25zID0gW10KICAgIHRyeToKICAgICAgICBpbXBvcnQganNvbiBhcyBfanNvbgogICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCkgYXMgZjoKICAgICAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKGYpOgogICAgICAgICAgICAgICAgaWYgaSA8IG9mZnNldDoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgbGVuKGRlY2lzaW9ucykgPj0gbGltaXQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbnMuYXBwZW5kKF9qc29uLmxvYWRzKGxpbmUuc3RyaXAoKSkpCiAgICAgICAgICAgICAgICBleGNlcHQgX2pzb24uSlNPTkRlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiRmFpbGVkIHRvIHJlYWQgZGVjaXNpb25zOiB7ZX0iKQoKICAgIHJldHVybiB7CiAgICAgICAgImZpbGUiOiBmaWxlbmFtZSwKICAgICAgICAib2Zmc2V0Ijogb2Zmc2V0LAogICAgICAgICJsaW1pdCI6IGxpbWl0LAogICAgICAgICJjb3VudCI6IGxlbihkZWNpc2lvbnMpLAogICAgICAgICJkZWNpc2lvbnMiOiBkZWNpc2lvbnMsCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBNTCBQb2xpY3kgSW5mZXJlbmNlIEVuZHBvaW50cwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBMYXp5LWxvYWRlZCBwb2xpY3kgaW5mZXJlbmNlIHNlcnZpY2UgKG9ubHkgbG9hZHMgd2hlbiBmaXJzdCBjYWxsZWQpCl9wb2xpY3lfc2VydmljZSA9IE5vbmUKX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkID0gRmFsc2UKCgpkZWYgX2dldF9wb2xpY3lfc2VydmljZSgpOgogICAgIiIiR2V0IG9yIGluaXRpYWxpemUgdGhlIHBvbGljeSBpbmZlcmVuY2Ugc2VydmljZSAobGF6eSBsb2FkaW5nKS4iIiIKICAgIGdsb2JhbCBfcG9saWN5X3NlcnZpY2UsIF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZAogICAg' +
'aWYgX3BvbGljeV9zZXJ2aWNlIGlzIE5vbmUgYW5kIG5vdCBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQ6CiAgICAgICAgX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkID0gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBtbC5zZXJ2aW5nLnBvbGljeV9zZXJ2ZXIgaW1wb3J0IFBvbGljeUluZmVyZW5jZVNlcnZpY2UKICAgICAgICAgICAgX3BvbGljeV9zZXJ2aWNlID0gUG9saWN5SW5mZXJlbmNlU2VydmljZSgpCiAgICAgICAgICAgIGlmIF9wb2xpY3lfc2VydmljZS5sb2FkKCk6CiAgICAgICAgICAgICAgICBwcmludChmIltNTF0gUG9saWN5IG1vZGVsIGxvYWRlZCBvbiB7X3BvbGljeV9zZXJ2aWNlLmRldmljZX0iKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoZiJbTUxdIFBvbGljeSBtb2RlbCBub3QgYXZhaWxhYmxlOiB7X3BvbGljeV9zZXJ2aWNlLl9sb2FkX2Vycm9yfSIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIltNTF0gUG9saWN5IHNlcnZpY2UgaW5pdCBmYWlsZWQ6IHtlfSIpCiAgICByZXR1cm4gX3BvbGljeV9zZXJ2aWNlCgoKQGFwcC5wb3N0KCIvYXBpL21sL3ByZWRpY3QiKQphc3luYyBkZWYgbWxfcHJlZGljdChyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJQcmVkaWN0IGEgbWFjcm8tYWN0aW9uIGZyb20gYSBnYW1lIHN0YXRlIHNuYXBzaG90LgoKICAgIEFjY2VwdHMgRGVjaXNpb25TbmFwc2hvdC1zaGFwZWQgSlNPTiBmcm9tIHRoZSBKYXZhIGJhdGNoIHJ1bm5lci4KICAgIFJldHVybnMgdGhlIGxlYXJuZWQgcG9saWN5J3MgcmVjb21tZW5kZWQgYWN0aW9uLgoKICAgIFJlcXVlc3QgYm9keToKICAgICAgICB7CiAgICAgICAgICAgICJ0dXJuIjogNSwKICAgICAgICAgICAgInBoYXNlIjogIm1haW5fMSIsCiAgICAgICAgICAgICJhY3RpdmVfc2VhdCI6IDAsCiAgICAgICAgICAgICJwbGF5ZXJzIjogWy4uLl0sCiAgICAgICAgICAgICJhcmNoZXR5cGUiOiAiYWdncm8iLAogICAgICAgICAgICAidGVtcGVyYXR1cmUiOiAxLjAsCiAgICAgICAgICAgICJncmVlZHkiOiBmYWxzZQogICAgICAgIH0KCiAgICBSZXNwb25zZToKICAgICAgICB7CiAgICAgICAgICAgICJhY3Rpb24iOiAiY2FzdF9jcmVhdHVyZSIsCiAgICAgICAgICAgICJhY3Rpb25faW5kZXgiOiAwLAogICAgICAgICAgICAiY29uZmlkZW5jZSI6IDAuNzMsCiAgICAgICAgICAgICJwcm9iYWJpbGl0aWVzIjogey4uLn0sCiAgICAgICAgICAgICJpbmZlcmVuY2VfbXMiOiAyLjMKICAgICAgICB9CiAgICAiIiIKICAgIHN2YyA9IF9nZXRfcG9saWN5X3NlcnZpY2UoKQogICAgaWYgc3ZjIGlzIE5vbmUgb3Igbm90IHN2Yy5fbG9hZGVkOgogICAgICAgIGRldGFpbCA9ICJQb2xpY3kgbW9kZWwgbm90IGxvYWRlZC4gIgogICAgICAgIGlmIHN2YzoKICAgICAgICAgICAgZGV0YWlsICs9IHN2Yy5fbG9hZF9lcnJvciBvciAiVHJhaW4gYSBtb2RlbCBmaXJzdC4iCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGV0YWlsICs9ICJQeVRvcmNoIG1heSBub3QgYmUgaW5zdGFsbGVkLiIKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTUwMywgZGV0YWlsPWRldGFpbCkKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIHBsYXlzdHlsZSA9IGJvZHkucG9wKCJhcmNoZXR5cGUiLCAibWlkcmFuZ2UiKQogICAgdGVtcGVyYXR1cmUgPSBib2R5LnBvcCgidGVtcGVyYXR1cmUiLCAxLjApCiAgICBncmVlZHkgPSBib2R5LnBvcCgiZ3JlZWR5IiwgRmFsc2UpCgogICAgcmVzdWx0ID0gc3ZjLnByZWRpY3QoCiAgICAgICAgZGVjaXNpb25fc25hcHNob3Q9Ym9keSwKICAgICAgICBwbGF5c3R5bGU9cGxheXN0eWxlLAogICAgICAgIHRlbXBlcmF0dXJlPXRlbXBlcmF0dXJlLAogICAgICAgIGdyZWVkeT1ncmVlZHksCiAgICApCgogICAgaWYgImVycm9yIiBpbiByZXN1bHQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDAsIGRldGFpbD1yZXN1bHRbImVycm9yIl0pCiAgICByZXR1cm4gcmVzdWx0CgoKQGFwcC5wb3N0KCIvYXBpL21sL3ByZWRpY3QvYmF0Y2giKQphc3luYyBkZWYgbWxfcHJlZGljdF9iYXRjaChyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJQcmVkaWN0IGFjdGlvbnMgZm9yIG11bHRpcGxlIHNuYXBzaG90cyBhdCBvbmNlLgoKICAgIFJlcXVlc3QgYm9keTogeyJzbmFwc2hvdHMiOiBb' +
'Li4uXSwgImdyZWVkeSI6IHRydWV9CiAgICAiIiIKICAgIHN2YyA9IF9nZXRfcG9saWN5X3NlcnZpY2UoKQogICAgaWYgc3ZjIGlzIE5vbmUgb3Igbm90IHN2Yy5fbG9hZGVkOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAzLCBkZXRhaWw9IlBvbGljeSBtb2RlbCBub3QgbG9hZGVkIikKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIHNuYXBzaG90cyA9IGJvZHkuZ2V0KCJzbmFwc2hvdHMiLCBbXSkKICAgIGdyZWVkeSA9IGJvZHkuZ2V0KCJncmVlZHkiLCBUcnVlKQoKICAgIGlmIG5vdCBzbmFwc2hvdHM6CiAgICAgICAgcmV0dXJuIHsicmVzdWx0cyI6IFtdfQoKICAgIHJlc3VsdHMgPSBzdmMucHJlZGljdF9iYXRjaChzbmFwc2hvdHMsIGdyZWVkeT1ncmVlZHkpCiAgICByZXR1cm4geyJyZXN1bHRzIjogcmVzdWx0cywgImNvdW50IjogbGVuKHJlc3VsdHMpfQoKCkBhcHAuZ2V0KCIvYXBpL21sL21vZGVsIikKYXN5bmMgZGVmIG1sX21vZGVsX2luZm8oKToKICAgICIiIkdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9hZGVkIHBvbGljeSBtb2RlbC4iIiIKICAgIHN2YyA9IF9nZXRfcG9saWN5X3NlcnZpY2UoKQogICAgaWYgc3ZjIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgImxvYWRlZCI6IEZhbHNlLAogICAgICAgICAgICAiZXJyb3IiOiAiUG9saWN5IHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIiwKICAgICAgICAgICAgInRvcmNoX2F2YWlsYWJsZSI6IEZhbHNlLAogICAgICAgIH0KICAgIHJldHVybiBzdmMuZ2V0X3N0YXR1cygpCgoKQGFwcC5wb3N0KCIvYXBpL21sL3JlbG9hZCIpCmFzeW5jIGRlZiBtbF9yZWxvYWRfbW9kZWwoY2hlY2twb2ludDogc3RyID0gTm9uZSk6CiAgICAiIiJIb3QtcmVsb2FkIGEgcG9saWN5IG1vZGVsIGNoZWNrcG9pbnQuIiIiCiAgICBzdmMgPSBfZ2V0X3BvbGljeV9zZXJ2aWNlKCkKICAgIGlmIHN2YyBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAzLCBkZXRhaWw9IlBvbGljeSBzZXJ2aWNlIG5vdCBhdmFpbGFibGUiKQoKICAgICMgSWYgc2VydmljZSBoYXNuJ3QgbG9hZGVkIHlldCwgdHJ5IGZ1bGwgbG9hZAogICAgaWYgbm90IHN2Yy5fbG9hZGVkOgogICAgICAgIG9rID0gc3ZjLmxvYWQoKQogICAgZWxzZToKICAgICAgICBvayA9IHN2Yy5yZWxvYWQoY2hlY2twb2ludCkKCiAgICByZXR1cm4gewogICAgICAgICJzdWNjZXNzIjogb2ssCiAgICAgICAgInN0YXR1cyI6IHN2Yy5nZXRfc3RhdHVzKCksCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBNTCBUcmFpbmluZyBNYW5hZ2VtZW50IEVuZHBvaW50cwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBUcmFpbmluZyBzdGF0ZSB0cmFja2luZwpfdHJhaW5pbmdfc3RhdGUgPSB7CiAgICAicnVubmluZyI6IEZhbHNlLAogICAgInByb2dyZXNzIjogMCwKICAgICJ0b3RhbF9lcG9jaHMiOiAwLAogICAgImN1cnJlbnRfZXBvY2giOiAwLAogICAgInBoYXNlIjogImlkbGUiLCAgIyBpZGxlIHwgYnVpbGRpbmcgfCB0cmFpbmluZyB8IGV2YWx1YXRpbmcgfCBkb25lIHwgZXJyb3IKICAgICJtZXNzYWdlIjogIiIsCiAgICAibWV0cmljcyI6IE5vbmUsICAjIGxhdGVzdCBlcG9jaCBtZXRyaWNzCiAgICAicmVzdWx0IjogTm9uZSwgICAjIGZpbmFsIHRyYWluaW5nIHJlc3VsdAogICAgImVycm9yIjogTm9uZSwKICAgICJzdGFydGVkX2F0IjogTm9uZSwKfQoKCmRlZiBfcnVuX3RyYWluaW5nX3BpcGVsaW5lKAogICAgcmVzdWx0c19kaXI6IHN0ciwKICAgIGVwb2NoczogaW50LAogICAgbHI6IGZsb2F0LAogICAgYmF0Y2hfc2l6ZTogaW50LAogICAgcGF0aWVuY2U6IGludCwKICAgIHJlYnVpbGRfZGF0YXNldDogYm9vbCwKKToKICAgICIiIlJ1biB0aGUgZnVsbCBN' +
'TCB0cmFpbmluZyBwaXBlbGluZSBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiIiIgogICAgZ2xvYmFsIF90cmFpbmluZ19zdGF0ZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KQogICAgICAgIGlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicnVubmluZyJdID0gVHJ1ZQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsic3RhcnRlZF9hdCJdID0gZGF0ZXRpbWUubm93KCkuaXNvZm9ybWF0KCkKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbImVycm9yIl0gPSBOb25lCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJyZXN1bHQiXSA9IE5vbmUKCiAgICAgICAgZGF0YV9kaXIgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9yb290LCAibWwiLCAibW9kZWxzIikKICAgICAgICBja3B0X2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiLCAiY2hlY2twb2ludHMiKQogICAgICAgIG9zLm1ha2VkaXJzKGRhdGFfZGlyLCBleGlzdF9vaz1UcnVlKQogICAgICAgIG9zLm1ha2VkaXJzKGNrcHRfZGlyLCBleGlzdF9vaz1UcnVlKQoKICAgICAgICAjIC0tLSBQaGFzZSAxOiBCdWlsZCBEYXRhc2V0IC0tLQogICAgICAgIHRyYWluX3BhdGggPSBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ0cmFpbi5ucHoiKQogICAgICAgIGlmIHJlYnVpbGRfZGF0YXNldCBvciBub3Qgb3MucGF0aC5leGlzdHModHJhaW5fcGF0aCk6CiAgICAgICAgICAgIF90cmFpbmluZ19zdGF0ZVsicGhhc2UiXSA9ICJidWlsZGluZyIKICAgICAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSAiTG9hZGluZyBjYXJkIGVtYmVkZGluZ3MgJiBidWlsZGluZyBkYXRhc2V0Li4uIgogICAgICAgICAgICBwcmludCgiW01MIFRyYWluXSBCdWlsZGluZyBkYXRhc2V0IChsb2FkaW5nIGVtYmVkZGluZ3MsIG1heSBhdXRvLWRvd25sb2FkKS4uLiIpCgogICAgICAgICAgICBmcm9tIG1sLmRhdGEuZGF0YXNldF9idWlsZGVyIGltcG9ydCBidWlsZF9kYXRhc2V0LCBzcGxpdF9kYXRhc2V0LCBzYXZlX2RhdGFzZXQKICAgICAgICAgICAgZGF0YXNldCA9IGJ1aWxkX2RhdGFzZXQocmVzdWx0c19kaXI9cmVzdWx0c19kaXIpCiAgICAgICAgICAgIGlmIG5vdCBkYXRhc2V0OgogICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJObyB0cmFpbmluZyBkYXRhIHByb2R1Y2VkLiBDaGVjayBzZXJ2ZXIgbG9nIGZvciBkZXRhaWxzLiIpCiAgICAgICAgICAgIHRyYWluX2RzLCB2YWxfZHMsIHRlc3RfZHMgPSBzcGxpdF9kYXRhc2V0KGRhdGFzZXQpCiAgICAgICAgICAgIHNhdmVfZGF0YXNldCh0cmFpbl9kcywgb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidHJhaW4ubnB6IikpCiAgICAgICAgICAgIHNhdmVfZGF0YXNldCh2YWxfZHMsIG9zLnBhdGguam9pbihkYXRhX2RpciwgInZhbC5ucHoiKSkKICAgICAgICAgICAgc2F2ZV9kYXRhc2V0KHRlc3RfZHMsIG9zLnBhdGguam9pbihkYXRhX2RpciwgInRlc3QubnB6IikpCiAgICAgICAgICAgIHRvdGFsX3NhbXBsZXMgPSBsZW4oZGF0YXNldFsic3RhdGVzIl0pCiAgICAgICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gZiJEYXRhc2V0IGJ1aWx0OiB7dG90YWxfc2FtcGxlc30gc2FtcGxlcyIKICAgICAgICAgICAgcHJpbnQoZiJbTUwgVHJhaW5dIERhdGFzZXQgYnVpbHQ6IHt0b3RhbF9zYW1wbGVzfSBzYW1wbGVzIikKCiAgICAgICAgIyAtLS0gUGhhc2UgMjogVHJhaW4gLS0tCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJwaGFzZSJdID0gInRyYWluaW5nIgogICAgICAgIF90cmFpbmluZ19zdGF0ZVsidG90YWxfZXBvY2hzIl0gPSBlcG9jaHMKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbImN1cnJlbnRfZXBvY2giXSA9IDAKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1lc3NhZ2UiXSA9IGYiVHJhaW5pbmcgcG9saWN5IG5ldHdvcmsgKHtlcG9jaHN9IGVwb2NocykuLi4iCiAgICAgICAgcHJpbnQoZiJbTUwgVHJhaW5dIFN0YXJ0aW5nIHRyYWluaW5nOiB7ZXBvY2hzfSBlcG9jaHMsIGxyPXtscn0sIGJzPXtiYXRjaF9zaXplfSIpCgogICAgICAgIGltcG9ydCBudW1weSBhcyBucAogICAgICAgIGltcG9ydCB0b3JjaAogICAgICAgIGZyb20gbWwudHJhaW5pbmcucG9saWN5X25ldHdvcmsgaW1wb3J0' +
'IFBvbGljeU5ldHdvcmsKICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnRyYWluZXIgaW1wb3J0IFN1cGVydmlzZWRUcmFpbmVyCgogICAgICAgIGRlZiBsb2FkX25wel9zcGxpdChwYXRoKToKICAgICAgICAgICAgZGF0YSA9IG5wLmxvYWQocGF0aCkKICAgICAgICAgICAgcmV0dXJuIGRhdGFbInN0YXRlcyJdLmFzdHlwZShucC5mbG9hdDMyKSwgZGF0YVsibGFiZWxzIl0uYXN0eXBlKG5wLmludDY0KQoKICAgICAgICB0cmFpbl9zdGF0ZXMsIHRyYWluX2xhYmVscyA9IGxvYWRfbnB6X3NwbGl0KHRyYWluX3BhdGgpCiAgICAgICAgdmFsX3BhdGggPSBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ2YWwubnB6IikKICAgICAgICB2YWxfc3RhdGVzLCB2YWxfbGFiZWxzID0gbG9hZF9ucHpfc3BsaXQodmFsX3BhdGgpCgogICAgICAgIGFjdHVhbF9kaW0gPSB0cmFpbl9zdGF0ZXMuc2hhcGVbMV0KICAgICAgICBtb2RlbCA9IFBvbGljeU5ldHdvcmsoaW5wdXRfZGltPWFjdHVhbF9kaW0pCgogICAgICAgIGRldmljZSA9ICJjcHUiCiAgICAgICAgaWYgdG9yY2guY3VkYS5pc19hdmFpbGFibGUoKToKICAgICAgICAgICAgZGV2aWNlID0gImN1ZGEiCiAgICAgICAgZWxpZiBoYXNhdHRyKHRvcmNoLmJhY2tlbmRzLCAibXBzIikgYW5kIHRvcmNoLmJhY2tlbmRzLm1wcy5pc19hdmFpbGFibGUoKToKICAgICAgICAgICAgZGV2aWNlID0gIm1wcyIKCiAgICAgICAgdHJhaW5lciA9IFN1cGVydmlzZWRUcmFpbmVyKAogICAgICAgICAgICBtb2RlbD1tb2RlbCwKICAgICAgICAgICAgZGV2aWNlPWRldmljZSwKICAgICAgICAgICAgbGVhcm5pbmdfcmF0ZT1sciwKICAgICAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaF9zaXplLAogICAgICAgICAgICBlcG9jaHM9ZXBvY2hzLAogICAgICAgICAgICBwYXRpZW5jZT1wYXRpZW5jZSwKICAgICAgICAgICAgY2hlY2twb2ludF9kaXI9Y2twdF9kaXIsCiAgICAgICAgKQoKICAgICAgICAjIEhvb2sgaW50byB0cmFpbmVyIHRvIHJlcG9ydCBwcm9ncmVzcwogICAgICAgIG9yaWdpbmFsX3RyYWluID0gdHJhaW5lci50cmFpbgoKICAgICAgICBkZWYgcGF0Y2hlZF90cmFpbih0cmFpbl9zLCB0cmFpbl9sLCB2YWxfcywgdmFsX2wpOgogICAgICAgICAgICAjIFdlJ2xsIG1vbml0b3IgdGhlIGNoZWNrcG9pbnQgZGlyIGZvciBwcm9ncmVzcwogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxfdHJhaW4odHJhaW5fcywgdHJhaW5fbCwgdmFsX3MsIHZhbF9sKQoKICAgICAgICBzdW1tYXJ5ID0gdHJhaW5lci50cmFpbih0cmFpbl9zdGF0ZXMsIHRyYWluX2xhYmVscywgdmFsX3N0YXRlcywgdmFsX2xhYmVscykKCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJjdXJyZW50X2Vwb2NoIl0gPSBzdW1tYXJ5LmdldCgiZXBvY2hzX3RyYWluZWQiLCBlcG9jaHMpCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXRyaWNzIl0gPSBzdW1tYXJ5CgogICAgICAgICMgLS0tIFBoYXNlIDM6IEV2YWx1YXRlIC0tLQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicGhhc2UiXSA9ICJldmFsdWF0aW5nIgogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gIkV2YWx1YXRpbmcgb24gdGVzdCBzZXQuLi4iCgogICAgICAgIHRlc3RfcGF0aCA9IG9zLnBhdGguam9pbihkYXRhX2RpciwgInRlc3QubnB6IikKICAgICAgICBldmFsX3Jlc3VsdHMgPSBOb25lCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVzdF9wYXRoKToKICAgICAgICAgICAgZnJvbSBtbC50cmFpbmluZy50cmFpbmVyIGltcG9ydCBsb2FkX2NoZWNrcG9pbnQsIGV2YWx1YXRlX21vZGVsCiAgICAgICAgICAgIHRlc3Rfc3RhdGVzLCB0ZXN0X2xhYmVscyA9IGxvYWRfbnB6X3NwbGl0KHRlc3RfcGF0aCkKICAgICAgICAgICAgYmVzdF9tb2RlbCwgXyA9IGxvYWRfY2hlY2twb2ludChzdW1tYXJ5WyJjaGVja3BvaW50X3BhdGgiXSwgZGV2aWNlKQogICAgICAgICAgICBldmFsX3Jlc3VsdHMgPSBldmFsdWF0ZV9tb2RlbChiZXN0X21vZGVsLCB0ZXN0X3N0YXRlcywgdGVzdF9sYWJlbHMsIGRldmljZSkKCiAgICAgICAgICAgIGV2YWxfcGF0aCA9IG9zLnBhdGguam9pbihja3B0X2RpciwgImV2YWxfcmVzdWx0cy5qc29uIikKICAgICAgICAgICAgd2l0aCBvcGVuKGV2YWxfcGF0aCwgInciKSBhcyBmOgogICAgICAgICAgICAgICAganNvbi5kdW1wKGV2YWxfcmVzdWx0cywgZiwgaW5kZW50PTIpCgogICAgICAgICMgLS0tIERvbmUgLS0tCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJwaGFzZSJdID0g' +
'ImRvbmUiCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl0gPSBGYWxzZQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicmVzdWx0Il0gPSB7CiAgICAgICAgICAgICJ0cmFpbmluZyI6IHN1bW1hcnksCiAgICAgICAgICAgICJldmFsdWF0aW9uIjogZXZhbF9yZXN1bHRzLAogICAgICAgICAgICAiY2hlY2twb2ludCI6IHN1bW1hcnkuZ2V0KCJjaGVja3BvaW50X3BhdGgiLCAiIiksCiAgICAgICAgICAgICJkZXZpY2UiOiBkZXZpY2UsCiAgICAgICAgfQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gZiJUcmFpbmluZyBjb21wbGV0ZSEgQmVzdCB2YWwgYWNjOiB7c3VtbWFyeS5nZXQoJ2Jlc3RfdmFsX2FjY3VyYWN5JywgMCk6LjElfSIKICAgICAgICBwcmludChmIltNTCBUcmFpbl0gQ29tcGxldGU6IHtzdW1tYXJ5LmdldCgnYmVzdF92YWxfYWNjdXJhY3knLCAwKTouMSV9IHZhbCBhY2N1cmFjeSIpCgogICAgICAgICMgQXV0by1yZWxvYWQgcG9saWN5IHNlcnZlciB3aXRoIG5ldyBjaGVja3BvaW50CiAgICAgICAgZ2xvYmFsIF9wb2xpY3lfc2VydmljZSwgX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkCiAgICAgICAgaWYgX3BvbGljeV9zZXJ2aWNlIGFuZCBfcG9saWN5X3NlcnZpY2UuX2xvYWRlZDoKICAgICAgICAgICAgX3BvbGljeV9zZXJ2aWNlLnJlbG9hZChzdW1tYXJ5LmdldCgiY2hlY2twb2ludF9wYXRoIikpCiAgICAgICAgICAgIHByaW50KCJbTUwgVHJhaW5dIFBvbGljeSBzZXJ2ZXIgcmVsb2FkZWQgd2l0aCBuZXcgY2hlY2twb2ludCIpCiAgICAgICAgZWxpZiBub3QgX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkOgogICAgICAgICAgICBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQgPSBGYWxzZSAgIyBBbGxvdyByZS1pbml0IHdpdGggbmV3IG1vZGVsCgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAiZXJyb3IiCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl0gPSBGYWxzZQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsiZXJyb3IiXSA9IHN0cihlKQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gZiJUcmFpbmluZyBmYWlsZWQ6IHtlfSIKICAgICAgICBwcmludChmIltNTCBUcmFpbl0gRVJST1I6IHtlfSIpCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCIvYXBpL21sL3RyYWluIikKYXN5bmMgZGVmIG1sX3N0YXJ0X3RyYWluaW5nKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlRyaWdnZXIgTUwgdHJhaW5pbmcgcGlwZWxpbmUgZnJvbSB0aGUgd2ViIFVJLgoKICAgIFJlcXVlc3QgYm9keSAoYWxsIG9wdGlvbmFsKToKICAgICAgICB7CiAgICAgICAgICAgICJlcG9jaHMiOiA1MCwKICAgICAgICAgICAgImxyIjogMC4wMDEsCiAgICAgICAgICAgICJiYXRjaFNpemUiOiAyNTYsCiAgICAgICAgICAgICJwYXRpZW5jZSI6IDEwLAogICAgICAgICAgICAicmVidWlsZERhdGFzZXQiOiB0cnVlCiAgICAgICAgfQogICAgIiIiCiAgICBpZiBfdHJhaW5pbmdfc3RhdGVbInJ1bm5pbmciXToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwOSwgIlRyYWluaW5nIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKSBpZiBhd2FpdCByZXF1ZXN0LmJvZHkoKSBlbHNlIHt9CiAgICBlcG9jaHMgPSBib2R5LmdldCgiZXBvY2hzIiwgNTApCiAgICBsciA9IGJvZHkuZ2V0KCJsciIsIDAuMDAxKQogICAgYmF0Y2hfc2l6ZSA9IGJvZHkuZ2V0KCJiYXRjaFNpemUiLCAyNTYpCiAgICBwYXRpZW5jZSA9IGJvZHkuZ2V0KCJwYXRpZW5jZSIsIDEwKQogICAgcmVidWlsZCA9IGJvZHkuZ2V0KCJyZWJ1aWxkRGF0YXNldCIsIFRydWUpCgogICAgcmVzdWx0c19kaXIgPSBvcy5wYXRoLmpvaW4oc3RyKFBhdGgoX19maWxlX18pLnBhcmVudCksICJyZXN1bHRzIikKCiAgICAjIFJlc2V0IHN0YXRlCiAgICBfdHJhaW5pbmdfc3RhdGUudXBkYXRlKHsKICAgICAgICAicnVubmluZyI6IFRydWUsCiAgICAgICAgInByb2dyZXNzIjogMCwKICAgICAgICAidG90YWxfZXBvY2hzIjogZXBvY2hzLAogICAgICAgICJjdXJyZW50X2Vwb2NoIjogMCwKICAgICAgICAicGhhc2UiOiAic3RhcnRpbmciLAogICAgICAgICJtZXNzYWdlIjogIkluaXRpYWxpemluZyB0cmFpbmluZyBwaXBlbGluZS4uLiIs' +
'CiAgICAgICAgIm1ldHJpY3MiOiBOb25lLAogICAgICAgICJyZXN1bHQiOiBOb25lLAogICAgICAgICJlcnJvciI6IE5vbmUsCiAgICB9KQoKICAgICMgUnVuIGluIGJhY2tncm91bmQgdGhyZWFkCiAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKAogICAgICAgIHRhcmdldD1fcnVuX3RyYWluaW5nX3BpcGVsaW5lLAogICAgICAgIGFyZ3M9KHJlc3VsdHNfZGlyLCBlcG9jaHMsIGxyLCBiYXRjaF9zaXplLCBwYXRpZW5jZSwgcmVidWlsZCksCiAgICAgICAgZGFlbW9uPVRydWUsCiAgICApCiAgICB0aHJlYWQuc3RhcnQoKQoKICAgIHJldHVybiB7CiAgICAgICAgInN0YXR1cyI6ICJzdGFydGVkIiwKICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAiZXBvY2hzIjogZXBvY2hzLAogICAgICAgICAgICAibHIiOiBsciwKICAgICAgICAgICAgImJhdGNoU2l6ZSI6IGJhdGNoX3NpemUsCiAgICAgICAgICAgICJwYXRpZW5jZSI6IHBhdGllbmNlLAogICAgICAgICAgICAicmVidWlsZERhdGFzZXQiOiByZWJ1aWxkLAogICAgICAgIH0sCiAgICB9CgoKQGFwcC5nZXQoIi9hcGkvbWwvdHJhaW4vc3RhdHVzIikKYXN5bmMgZGVmIG1sX3RyYWluaW5nX3N0YXR1cygpOgogICAgIiIiR2V0IGN1cnJlbnQgdHJhaW5pbmcgcGlwZWxpbmUgc3RhdHVzLiIiIgogICAgcmV0dXJuIGRpY3QoX3RyYWluaW5nX3N0YXRlKQoKCkBhcHAuZ2V0KCIvYXBpL21sL2RhdGEvc3RhdHVzIikKYXN5bmMgZGVmIG1sX2RhdGFfc3RhdHVzKCk6CiAgICAiIiJHZXQgc3RhdHVzIG9mIGF2YWlsYWJsZSB0cmFpbmluZyBkYXRhIGFuZCBtb2RlbCBjaGVja3BvaW50cy4iIiIKICAgIHByb2plY3Rfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgcmVzdWx0c19kaXIgPSBwcm9qZWN0X3Jvb3QgLyAicmVzdWx0cyIKICAgIGRhdGFfZGlyID0gcHJvamVjdF9yb290IC8gIm1sIiAvICJtb2RlbHMiCiAgICBja3B0X2RpciA9IGRhdGFfZGlyIC8gImNoZWNrcG9pbnRzIgoKICAgICMgRGVjaXNpb24gbG9nIGZpbGVzCiAgICBkZWNpc2lvbl9maWxlcyA9IFtdCiAgICBpZiByZXN1bHRzX2Rpci5leGlzdHMoKToKICAgICAgICBmb3IgZiBpbiBzb3J0ZWQocmVzdWx0c19kaXIuZ2xvYigibWwtZGVjaXNpb25zLSouanNvbmwiKSk6CiAgICAgICAgICAgIGxpbmVfY291bnQgPSAwCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihmLCAiciIpIGFzIGZoOgogICAgICAgICAgICAgICAgICAgIGxpbmVfY291bnQgPSBzdW0oMSBmb3IgXyBpbiBmaCkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZGVjaXNpb25fZmlsZXMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJuYW1lIjogZi5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBmLnN0YXQoKS5zdF9zaXplLAogICAgICAgICAgICAgICAgImRlY2lzaW9ucyI6IGxpbmVfY291bnQsCiAgICAgICAgICAgIH0pCgogICAgIyBEYXRhc2V0IGZpbGVzCiAgICBkYXRhc2V0cyA9IHt9CiAgICBmb3Igc3BsaXQgaW4gWyJ0cmFpbiIsICJ2YWwiLCAidGVzdCJdOgogICAgICAgIHBhdGggPSBkYXRhX2RpciAvIGYie3NwbGl0fS5ucHoiCiAgICAgICAgaWYgcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICAgICAgICAgICAgICBkYXRhID0gbnAubG9hZChzdHIocGF0aCkpCiAgICAgICAgICAgICAgICBkYXRhc2V0c1tzcGxpdF0gPSB7CiAgICAgICAgICAgICAgICAgICAgInNhbXBsZXMiOiBpbnQoZGF0YVsic3RhdGVzIl0uc2hhcGVbMF0pLAogICAgICAgICAgICAgICAgICAgICJmZWF0dXJlcyI6IGludChkYXRhWyJzdGF0ZXMiXS5zaGFwZVsxXSksCiAgICAgICAgICAgICAgICAgICAgInNpemUiOiBwYXRoLnN0YXQoKS5zdF9zaXplLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgZGF0YXNldHNbc3BsaXRdID0geyJzaXplIjogcGF0aC5zdGF0KCkuc3Rfc2l6ZX0KCiAgICAjIENoZWNrcG9pbnRzCiAgICBjaGVja3BvaW50cyA9IFtdCiAgICBpZiBja3B0X2Rpci5leGlzdHMoKToKICAgICAgICBmb3IgZiBpbiBzb3J0ZWQoY2twdF9kaXIuZ2xvYigiKi5wdCIpKToKICAgICAgICAgICAgY2hlY2twb2ludHMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJuYW1lIjogZi5uYW1lLAogICAgICAgICAgICAgICAg' +
'InNpemUiOiBmLnN0YXQoKS5zdF9zaXplLAogICAgICAgICAgICAgICAgIm1vZGlmaWVkIjogZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChmLnN0YXQoKS5zdF9tdGltZSkuaXNvZm9ybWF0KCksCiAgICAgICAgICAgIH0pCgogICAgIyBFdmFsIHJlc3VsdHMKICAgIGV2YWxfcGF0aCA9IGNrcHRfZGlyIC8gImV2YWxfcmVzdWx0cy5qc29uIgogICAgZXZhbF9yZXN1bHRzID0gTm9uZQogICAgaWYgZXZhbF9wYXRoLmV4aXN0cygpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKGV2YWxfcGF0aCwgInIiKSBhcyBmOgogICAgICAgICAgICAgICAgZXZhbF9yZXN1bHRzID0ganNvbi5sb2FkKGYpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgIHJldHVybiB7CiAgICAgICAgImRlY2lzaW9uRmlsZXMiOiBkZWNpc2lvbl9maWxlcywKICAgICAgICAidG90YWxEZWNpc2lvbnMiOiBzdW0oZFsiZGVjaXNpb25zIl0gZm9yIGQgaW4gZGVjaXNpb25fZmlsZXMpLAogICAgICAgICJkYXRhc2V0cyI6IGRhdGFzZXRzLAogICAgICAgICJjaGVja3BvaW50cyI6IGNoZWNrcG9pbnRzLAogICAgICAgICJldmFsUmVzdWx0cyI6IGV2YWxfcmVzdWx0cywKICAgICAgICAicG9saWN5TG9hZGVkIjogX3BvbGljeV9zZXJ2aWNlIGlzIG5vdCBOb25lIGFuZCBfcG9saWN5X3NlcnZpY2UuX2xvYWRlZCBpZiBfcG9saWN5X3NlcnZpY2UgZWxzZSBGYWxzZSwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFBQTyBUcmFpbmluZyArIFRvdXJuYW1lbnQgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpfcHBvX3N0YXRlID0gewogICAgInJ1bm5pbmciOiBGYWxzZSwKICAgICJpdGVyYXRpb24iOiAwLAogICAgInRvdGFsX2l0ZXJhdGlvbnMiOiAwLAogICAgInBoYXNlIjogImlkbGUiLAogICAgIm1lc3NhZ2UiOiAiIiwKICAgICJtZXRyaWNzIjogTm9uZSwKICAgICJyZXN1bHQiOiBOb25lLAogICAgImVycm9yIjogTm9uZSwKfQoKX3RvdXJuYW1lbnRfc3RhdGUgPSB7CiAgICAicnVubmluZyI6IEZhbHNlLAogICAgInBoYXNlIjogImlkbGUiLAogICAgIm1lc3NhZ2UiOiAiIiwKICAgICJyZXN1bHQiOiBOb25lLAogICAgImVycm9yIjogTm9uZSwKfQoKCmRlZiBfcnVuX3Bwb19waXBlbGluZSgKICAgIGl0ZXJhdGlvbnM6IGludCwgZXBpc29kZXNfcGVyX2l0ZXI6IGludCwgcHBvX2Vwb2NoczogaW50LCBiYXRjaF9zaXplOiBpbnQsCiAgICBscjogZmxvYXQsIGNsaXBfZXBzaWxvbjogZmxvYXQsIGVudHJvcHlfY29lZmY6IGZsb2F0LAogICAgb3Bwb25lbnQ6IHN0ciwgcGxheXN0eWxlOiBzdHIsIGxvYWRfc3VwZXJ2aXNlZDogc3RyLAopOgogICAgIiIiUnVuIFBQTyB0cmFpbmluZyBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiIiIgogICAgZ2xvYmFsIF9wcG9fc3RhdGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgcHJvamVjdF9yb290ID0gc3RyKFBhdGgoX19maWxlX18pLnBhcmVudCkKICAgICAgICBpZiBwcm9qZWN0X3Jvb3Qgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9yb290KQoKICAgICAgICBfcHBvX3N0YXRlWyJydW5uaW5nIl0gPSBUcnVlCiAgICAgICAgX3Bwb19zdGF0ZVsiZXJyb3IiXSA9IE5vbmUKICAgICAgICBfcHBvX3N0YXRlWyJyZXN1bHQiXSA9IE5vbmUKCiAgICAgICAgZnJvbSBtbC50cmFpbmluZy5wcG9fdHJhaW5lciBpbXBvcnQgUFBPVHJhaW5lciwgUFBPQ29uZmlnCgogICAgICAgIGNrcHRfZGlyID0gb3MucGF0aC5qb2luKHByb2plY3Rfcm9vdCwgIm1sIiwgIm1vZGVscyIsICJjaGVja3BvaW50cyIpCiAgICAgICAgY29uZmlnID0gUFBPQ29uZmlnKAogICAgICAgICAgICBpdGVyYXRpb25zPWl0ZXJhdGlvbnMsCiAgICAgICAgICAg' +
'IGVwaXNvZGVzX3Blcl9pdGVyPWVwaXNvZGVzX3Blcl9pdGVyLAogICAgICAgICAgICBwcG9fZXBvY2hzPXBwb19lcG9jaHMsCiAgICAgICAgICAgIGJhdGNoX3NpemU9YmF0Y2hfc2l6ZSwKICAgICAgICAgICAgbGVhcm5pbmdfcmF0ZT1sciwKICAgICAgICAgICAgY2xpcF9lcHNpbG9uPWNsaXBfZXBzaWxvbiwKICAgICAgICAgICAgZW50cm9weV9jb2VmZj1lbnRyb3B5X2NvZWZmLAogICAgICAgICAgICBvcHBvbmVudD1vcHBvbmVudCwKICAgICAgICAgICAgcGxheXN0eWxlPXBsYXlzdHlsZSwKICAgICAgICAgICAgY2hlY2twb2ludF9kaXI9Y2twdF9kaXIsCiAgICAgICAgICAgIGxvYWRfc3VwZXJ2aXNlZD1sb2FkX3N1cGVydmlzZWQgaWYgbG9hZF9zdXBlcnZpc2VkIGVsc2UgTm9uZSwKICAgICAgICApCgogICAgICAgIHRyYWluZXIgPSBQUE9UcmFpbmVyKGNvbmZpZykKCiAgICAgICAgZGVmIHByb2dyZXNzX2NiKGl0ZXJhdGlvbiwgbWV0cmljcyk6CiAgICAgICAgICAgIF9wcG9fc3RhdGVbIml0ZXJhdGlvbiJdID0gaXRlcmF0aW9uCiAgICAgICAgICAgIF9wcG9fc3RhdGVbInBoYXNlIl0gPSAidHJhaW5pbmciCiAgICAgICAgICAgIF9wcG9fc3RhdGVbIm1lc3NhZ2UiXSA9IGYiSXRlcmF0aW9uIHtpdGVyYXRpb259L3tpdGVyYXRpb25zfSB8IFdSOiB7bWV0cmljcy5nZXQoJ3dpbl9yYXRlJywgMCk6LjAlfSIKICAgICAgICAgICAgX3Bwb19zdGF0ZVsibWV0cmljcyJdID0gbWV0cmljcwoKICAgICAgICBzdW1tYXJ5ID0gdHJhaW5lci50cmFpbihwcm9ncmVzc19jYWxsYmFjaz1wcm9ncmVzc19jYikKCiAgICAgICAgX3Bwb19zdGF0ZVsicGhhc2UiXSA9ICJkb25lIgogICAgICAgIF9wcG9fc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3Bwb19zdGF0ZVsicmVzdWx0Il0gPSBzdW1tYXJ5CiAgICAgICAgX3Bwb19zdGF0ZVsibWVzc2FnZSJdID0gZiJQUE8gY29tcGxldGUhIEJlc3Qgd2luIHJhdGU6IHtzdW1tYXJ5LmdldCgnYmVzdF93aW5fcmF0ZScsIDApOi4wJX0iCgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICBfcHBvX3N0YXRlWyJwaGFzZSJdID0gImVycm9yIgogICAgICAgIF9wcG9fc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3Bwb19zdGF0ZVsiZXJyb3IiXSA9IHN0cihlKQogICAgICAgIF9wcG9fc3RhdGVbIm1lc3NhZ2UiXSA9IGYiUFBPIGZhaWxlZDoge2V9IgogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQoKCkBhcHAucG9zdCgiL2FwaS9tbC90cmFpbi9wcG8iKQphc3luYyBkZWYgbWxfc3RhcnRfcHBvKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlN0YXJ0IFBQTyB0cmFpbmluZyBwaXBlbGluZS4iIiIKICAgIGlmIF9wcG9fc3RhdGVbInJ1bm5pbmciXToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwOSwgIlBQTyB0cmFpbmluZyBhbHJlYWR5IGluIHByb2dyZXNzIikKICAgIGlmIF90cmFpbmluZ19zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiU3VwZXJ2aXNlZCB0cmFpbmluZyBpbiBwcm9ncmVzcyDigJQgd2FpdCBmb3IgaXQgdG8gZmluaXNoIikKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkgaWYgYXdhaXQgcmVxdWVzdC5ib2R5KCkgZWxzZSB7fQogICAgaXRlcmF0aW9ucyA9IGJvZHkuZ2V0KCJpdGVyYXRpb25zIiwgMTAwKQogICAgZXBpc29kZXMgPSBib2R5LmdldCgiZXBpc29kZXNQZXJJdGVyIiwgNjQpCiAgICBwcG9fZXBvY2hzID0gYm9keS5nZXQoInBwb0Vwb2NocyIsIDQpCiAgICBiYXRjaF9zaXplID0gYm9keS5nZXQoImJhdGNoU2l6ZSIsIDI1NikKICAgIGxyID0gYm9keS5nZXQoImxyIiwgM2UtNCkKICAgIGNsaXBfZXBzID0gYm9keS5nZXQoImNsaXBFcHNpbG9uIiwgMC4yKQogICAgZW50cm9weSA9IGJvZHkuZ2V0KCJlbnRyb3B5Q29lZmYiLCAwLjAxKQogICAgb3Bwb25lbnQgPSBib2R5LmdldCgib3Bwb25lbnQiLCAiaGV1cmlzdGljIikKICAgIHBsYXlzdHlsZSA9IGJvZHkuZ2V0KCJwbGF5c3R5bGUiLCAibWlkcmFuZ2UiKQogICAgbG9hZF9zdXAgPSBib2R5LmdldCgibG9hZFN1cGVydmlzZWQiLCAiIikKCiAgICBfcHBvX3N0YXRlLnVwZGF0ZSh7CiAgICAgICAgInJ1bm5pbmciOiBUcnVlLCAiaXRlcmF0aW9uIjogMCwgInRvdGFsX2l0ZXJhdGlvbnMiOiBpdGVyYXRpb25zLAogICAgICAgICJwaGFzZSI6ICJzdGFydGluZyIsICJt' +
'ZXNzYWdlIjogIkluaXRpYWxpemluZyBQUE8uLi4iLAogICAgICAgICJtZXRyaWNzIjogTm9uZSwgInJlc3VsdCI6IE5vbmUsICJlcnJvciI6IE5vbmUsCiAgICB9KQoKICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoCiAgICAgICAgdGFyZ2V0PV9ydW5fcHBvX3BpcGVsaW5lLAogICAgICAgIGFyZ3M9KGl0ZXJhdGlvbnMsIGVwaXNvZGVzLCBwcG9fZXBvY2hzLCBiYXRjaF9zaXplLCBsciwgY2xpcF9lcHMsIGVudHJvcHksIG9wcG9uZW50LCBwbGF5c3R5bGUsIGxvYWRfc3VwKSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkKICAgIHRocmVhZC5zdGFydCgpCgogICAgcmV0dXJuIHsic3RhdHVzIjogInN0YXJ0ZWQiLCAiaXRlcmF0aW9ucyI6IGl0ZXJhdGlvbnN9CgoKQGFwcC5nZXQoIi9hcGkvbWwvdHJhaW4vcHBvL3N0YXR1cyIpCmFzeW5jIGRlZiBtbF9wcG9fc3RhdHVzKCk6CiAgICAiIiJHZXQgUFBPIHRyYWluaW5nIHN0YXR1cy4iIiIKICAgIHJldHVybiBkaWN0KF9wcG9fc3RhdGUpCgoKZGVmIF9ydW5fdG91cm5hbWVudF9waXBlbGluZShlcGlzb2RlczogaW50LCBwbGF5c3R5bGU6IHN0cik6CiAgICAiIiJSdW4gdG91cm5hbWVudCBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiIiIgogICAgZ2xvYmFsIF90b3VybmFtZW50X3N0YXRlCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIHByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQpCiAgICAgICAgaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByb2plY3Rfcm9vdCkKCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInJ1bm5pbmciXSA9IFRydWUKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsiZXJyb3IiXSA9IE5vbmUKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicmVzdWx0Il0gPSBOb25lCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInBoYXNlIl0gPSAicnVubmluZyIKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsibWVzc2FnZSJdID0gIlJ1bm5pbmcgdG91cm5hbWVudC4uLiIKCiAgICAgICAgZnJvbSBtbC5ldmFsLnRvdXJuYW1lbnQgaW1wb3J0ICgKICAgICAgICAgICAgcnVuX3RvdXJuYW1lbnQsIEhldXJpc3RpY1BvbGljeSwgUmFuZG9tUG9saWN5LCBMZWFybmVkUG9saWN5LAogICAgICAgICkKCiAgICAgICAgY2twdF9kaXIgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9yb290LCAibWwiLCAibW9kZWxzIiwgImNoZWNrcG9pbnRzIikKICAgICAgICBwb2xpY2llcyA9IHsKICAgICAgICAgICAgImhldXJpc3RpYyI6IEhldXJpc3RpY1BvbGljeSgpLAogICAgICAgICAgICAicmFuZG9tIjogUmFuZG9tUG9saWN5KCksCiAgICAgICAgfQoKICAgICAgICBzdXBfcGF0aCA9IG9zLnBhdGguam9pbihja3B0X2RpciwgImJlc3RfcG9saWN5LnB0IikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdXBfcGF0aCk6CiAgICAgICAgICAgIHBvbGljaWVzWyJzdXBlcnZpc2VkIl0gPSBMZWFybmVkUG9saWN5KHN1cF9wYXRoKQoKICAgICAgICBwcG9fcGF0aCA9IG9zLnBhdGguam9pbihja3B0X2RpciwgImJlc3RfcHBvLnB0IikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwcG9fcGF0aCk6CiAgICAgICAgICAgIHBvbGljaWVzWyJwcG8iXSA9IExlYXJuZWRQb2xpY3kocHBvX3BhdGgpCgogICAgICAgIHJlc3VsdCA9IHJ1bl90b3VybmFtZW50KAogICAgICAgICAgICBwb2xpY2llcz1wb2xpY2llcywKICAgICAgICAgICAgZXBpc29kZXNfcGVyX21hdGNodXA9ZXBpc29kZXMsCiAgICAgICAgICAgIHBsYXlzdHlsZT1wbGF5c3R5bGUsCiAgICAgICAgKQoKICAgICAgICAjIFNhdmUgcmVzdWx0cwogICAgICAgIG91dHB1dF9wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAidG91cm5hbWVudF9yZXN1bHRzLmpzb24iKQogICAgICAgIHdpdGggb3BlbihvdXRwdXRfcGF0aCwgInciKSBhcyBmOgogICAgICAgICAgICBqc29uLmR1bXAocmVzdWx0LnRvX2RpY3QoKSwgZiwgaW5kZW50PTIpCgogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJwaGFzZSJdID0gImRvbmUiCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInJlc3VsdCJdID0gcmVzdWx0LnRvX2RpY3QoKQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJtZXNzYWdlIl0gPSBmIlRvdXJuYW1lbnQgY29tcGxldGUhIHtyZXN1bHQudG90YWxfbWF0Y2hl' +
'c30gbWF0Y2hlcyIKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJwaGFzZSJdID0gImVycm9yIgogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJydW5uaW5nIl0gPSBGYWxzZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJlcnJvciJdID0gc3RyKGUpCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbIm1lc3NhZ2UiXSA9IGYiVG91cm5hbWVudCBmYWlsZWQ6IHtlfSIKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpAYXBwLnBvc3QoIi9hcGkvbWwvdG91cm5hbWVudCIpCmFzeW5jIGRlZiBtbF9zdGFydF90b3VybmFtZW50KHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlN0YXJ0IGEgdG91cm5hbWVudCBldmFsdWF0aW9uLiIiIgogICAgaWYgX3RvdXJuYW1lbnRfc3RhdGVbInJ1bm5pbmciXToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwOSwgIlRvdXJuYW1lbnQgYWxyZWFkeSBpbiBwcm9ncmVzcyIpCgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpIGlmIGF3YWl0IHJlcXVlc3QuYm9keSgpIGVsc2Uge30KICAgIGVwaXNvZGVzID0gYm9keS5nZXQoImVwaXNvZGVzIiwgNTApCiAgICBwbGF5c3R5bGUgPSBib2R5LmdldCgicGxheXN0eWxlIiwgIm1pZHJhbmdlIikKCiAgICBfdG91cm5hbWVudF9zdGF0ZS51cGRhdGUoewogICAgICAgICJydW5uaW5nIjogVHJ1ZSwgInBoYXNlIjogInN0YXJ0aW5nIiwKICAgICAgICAibWVzc2FnZSI6ICJJbml0aWFsaXppbmcgdG91cm5hbWVudC4uLiIsCiAgICAgICAgInJlc3VsdCI6IE5vbmUsICJlcnJvciI6IE5vbmUsCiAgICB9KQoKICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoCiAgICAgICAgdGFyZ2V0PV9ydW5fdG91cm5hbWVudF9waXBlbGluZSwKICAgICAgICBhcmdzPShlcGlzb2RlcywgcGxheXN0eWxlKSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkKICAgIHRocmVhZC5zdGFydCgpCgogICAgcmV0dXJuIHsic3RhdHVzIjogInN0YXJ0ZWQiLCAiZXBpc29kZXMiOiBlcGlzb2Rlc30KCgpAYXBwLmdldCgiL2FwaS9tbC90b3VybmFtZW50L3N0YXR1cyIpCmFzeW5jIGRlZiBtbF90b3VybmFtZW50X3N0YXR1cygpOgogICAgIiIiR2V0IHRvdXJuYW1lbnQgc3RhdHVzLiIiIgogICAgcmV0dXJuIGRpY3QoX3RvdXJuYW1lbnRfc3RhdGUpCgoKQGFwcC5nZXQoIi9hcGkvbWwvdG91cm5hbWVudC9yZXN1bHRzIikKYXN5bmMgZGVmIG1sX3RvdXJuYW1lbnRfcmVzdWx0cygpOgogICAgIiIiR2V0IGxhdGVzdCB0b3VybmFtZW50IHJlc3VsdHMuIiIiCiAgICBwcm9qZWN0X3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgIHJlc3VsdHNfcGF0aCA9IHByb2plY3Rfcm9vdCAvICJtbCIgLyAibW9kZWxzIiAvICJjaGVja3BvaW50cyIgLyAidG91cm5hbWVudF9yZXN1bHRzLmpzb24iCiAgICBpZiByZXN1bHRzX3BhdGguZXhpc3RzKCk6CiAgICAgICAgd2l0aCBvcGVuKHJlc3VsdHNfcGF0aCwgInIiKSBhcyBmOgogICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkKGYpCiAgICByZXR1cm4geyJlcnJvciI6ICJObyB0b3VybmFtZW50IHJlc3VsdHMgZm91bmQuIFJ1biBhIHRvdXJuYW1lbnQgZmlyc3QuIn0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFN0YXRpYyBGaWxlIFNlcnZpbmcgKFJlYWN0IFNQQSkg4oCUIE1VU1QgYmUgYWZ0ZXIgYWxsIEFQSSByb3V0ZXMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiMgVUkgU2VydmluZzogbGVnYWN5IEhUTUwvSlMvQ1NTIHBhZ2VzIChwcmltYXJ5KSBvciBSZWFjdCBTUEEgKGZhbGxiYWNrKQpfbGVnYWN5X3VpX2RpciA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJ1aSIKX3NwYV9kaXIgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAiZnJv' +
'bnRlbmQiIC8gImNvbW1hbmRlci1haS1sYWItdWkiIC8gImRpc3QiCgppZiBfbGVnYWN5X3VpX2Rpci5leGlzdHMoKToKICAgICMgUHJpbWFyeTogc2VydmUgdGhlIHByb3ZlbiBtdWx0aS1wYWdlIEhUTUwvSlMvQ1NTIFVJCiAgICBhcHAubW91bnQoIi8iLCBTdGF0aWNGaWxlcyhkaXJlY3Rvcnk9c3RyKF9sZWdhY3lfdWlfZGlyKSwgaHRtbD1UcnVlKSwgbmFtZT0idWkiKQoKZWxpZiBfc3BhX2Rpci5leGlzdHMoKToKICAgICMgRmFsbGJhY2s6IFJlYWN0IFNQQSAob25seSBpZiBsZWdhY3kgdWkvIGZvbGRlciBpcyBtaXNzaW5nKQogICAgX3NwYV9hc3NldHMgPSBfc3BhX2RpciAvICJhc3NldHMiCiAgICBpZiBfc3BhX2Fzc2V0cy5leGlzdHMoKToKICAgICAgICBhcHAubW91bnQoIi9hc3NldHMiLCBTdGF0aWNGaWxlcyhkaXJlY3Rvcnk9c3RyKF9zcGFfYXNzZXRzKSksIG5hbWU9InNwYS1hc3NldHMiKQoKICAgIEBhcHAuZ2V0KCIve2Z1bGxfcGF0aDpwYXRofSIpCiAgICBhc3luYyBkZWYgX3NwYV9jYXRjaGFsbChmdWxsX3BhdGg6IHN0cik6CiAgICAgICAgZnJvbSBmYXN0YXBpLnJlc3BvbnNlcyBpbXBvcnQgRmlsZVJlc3BvbnNlCiAgICAgICAgcmVxdWVzdGVkX2ZpbGUgPSBfc3BhX2RpciAvIGZ1bGxfcGF0aAogICAgICAgIGlmIGZ1bGxfcGF0aCBhbmQgcmVxdWVzdGVkX2ZpbGUuZXhpc3RzKCkgYW5kIHJlcXVlc3RlZF9maWxlLmlzX2ZpbGUoKToKICAgICAgICAgICAgcmV0dXJuIEZpbGVSZXNwb25zZShzdHIocmVxdWVzdGVkX2ZpbGUpKQogICAgICAgIHJldHVybiBGaWxlUmVzcG9uc2Uoc3RyKF9zcGFfZGlyIC8gImluZGV4Lmh0bWwiKSkKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFN0YXJ0dXAKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmRlZiBwYXJzZV9hcmdzKCk6CiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iQ29tbWFuZGVyIEFJIExhYiBBUEkgU2VydmVyIHYzIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZm9yZ2UtamFyIiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiRk9SR0VfSkFSIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIGZvcmdlLWd1aS1kZXNrdG9wIGphci13aXRoLWRlcGVuZGVuY2llcyIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWZvcmdlLWRpciIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIkZPUkdFX0RJUiIsICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRm9yZ2Ugd29ya2luZyBkaXJlY3RvcnkgKGNvbnRhaW5zIHJlcy8pIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZm9yZ2UtZGVja3MtZGlyIiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiRk9SR0VfREVDS1NfRElSIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIENvbW1hbmRlciBkZWNrIGZpbGVzIChkZWZhdWx0OiAlJUFQUERBVEElJS9Gb3JnZS9kZWNrcy9jb21tYW5kZXIpIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tbGFiLWphciIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIkxBQl9KQVIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gY29tbWFuZGVyLWFpLWxhYi5qYXIgKGRlZmF1bHQ6IGF1dG8tZGV0ZWN0IGZyb20gdGFyZ2V0LykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wb3J0IiwgdHlwZT1pbnQsIGRlZmF1bHQ9aW50KG9zLmVudmlyb24uZ2V0KCJMQUJfUE9SVCIsICI4MDgwIikpKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS14aW1pbGFyLWtleSIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIlhJTUlMQVJfQVBJX0tFWSIsICI5NmM3ZGFiMzVkZGJkODgyOWIwNGMwZjViY2VhNTdmNWVkZTIwNDk2IiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9' +
'IlhpbWlsYXIgQVBJIGtleSBmb3IgY2FyZCBzY2FubmVyICh2aXN1YWwgQUkgcmVjb2duaXRpb24pIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcHBseC1rZXkiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJQUExYX0FQSV9LRVkiLCAicHBseC1HNzZIZ3JBVThJbTcyYkVUTWV5UjRhc0FXd3RHOHdybXlmeTZWU0tBOURUbjA1RnEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGVycGxleGl0eSBBUEkga2V5IGZvciBBSSBkZWNrIHJlc2VhcmNoL2dlbmVyYXRpb24gKGVudjogUFBMWF9BUElfS0VZKSIpCiAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKCmRlZiByZXNvbHZlX2xhYl9qYXIoKSAtPiBzdHI6CiAgICB0YXJnZXRfZGlyID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gInRhcmdldCIKICAgIGlmIHRhcmdldF9kaXIuZXhpc3RzKCk6CiAgICAgICAgZm9yIHBhdHRlcm4gaW4gWwogICAgICAgICAgICAiY29tbWFuZGVyLWFpLWxhYi0qLWphci13aXRoLWRlcGVuZGVuY2llcy5qYXIiLAogICAgICAgICAgICAiY29tbWFuZGVyLWFpLWxhYi0qLXNoYWRlZC5qYXIiLAogICAgICAgICAgICAiY29tbWFuZGVyLWFpLWxhYi0qLmphciIsCiAgICAgICAgXToKICAgICAgICAgICAgamFycyA9IHNvcnRlZCh0YXJnZXRfZGlyLmdsb2IocGF0dGVybikpCiAgICAgICAgICAgIGphcnMgPSBbaiBmb3IgaiBpbiBqYXJzIGlmIG5vdCBqLm5hbWUuc3RhcnRzd2l0aCgib3JpZ2luYWwtIildCiAgICAgICAgICAgIGlmIGphcnM6CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyKGphcnNbMF0pCiAgICByZXR1cm4gIiIKCgpkZWYgcmVzb2x2ZV9mb3JnZV9kZWNrc19kaXIoKSAtPiBzdHI6CiAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICBhcHBkYXRhID0gb3MuZW52aXJvbi5nZXQoIkFQUERBVEEiLCAiIikKICAgICAgICBpZiBhcHBkYXRhOgogICAgICAgICAgICBjYW5kaWRhdGUgPSBvcy5wYXRoLmpvaW4oYXBwZGF0YSwgIkZvcmdlIiwgImRlY2tzIiwgImNvbW1hbmRlciIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoY2FuZGlkYXRlKToKICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGUKICAgIGhvbWUgPSBQYXRoLmhvbWUoKQogICAgZm9yIGNhbmRpZGF0ZSBpbiBbCiAgICAgICAgaG9tZSAvICIuZm9yZ2UiIC8gImRlY2tzIiAvICJjb21tYW5kZXIiLAogICAgICAgIGhvbWUgLyAiRm9yZ2UiIC8gImRlY2tzIiAvICJjb21tYW5kZXIiLAogICAgXToKICAgICAgICBpZiBjYW5kaWRhdGUuaXNfZGlyKCk6CiAgICAgICAgICAgIHJldHVybiBzdHIoY2FuZGlkYXRlKQogICAgcmV0dXJuICIiCgoKZGVmIGxvYWRfY29tbWFuZGVyX21ldGEoKToKICAgICIiIkxvYWQgY29tbWFuZGVyIG1ldGEgbWFwcGluZyBmcm9tIGZpbGUgb3IgdXNlIGJ1aWx0aW5zLiIiIgogICAgZ2xvYmFsIENPTU1BTkRFUl9NRVRBCiAgICBtZXRhX3BhdGggPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAiY29tbWFuZGVyLW1ldGEuanNvbiIKICAgIGlmIG1ldGFfcGF0aC5leGlzdHMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihtZXRhX3BhdGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIENPTU1BTkRFUl9NRVRBID0ganNvbi5sb2FkKGYpCiAgICAgICAgICAgIHByaW50KGYiICBNZXRhOiAgICAgICAgIExvYWRlZCB7bGVuKENPTU1BTkRFUl9NRVRBKX0gY29tbWFuZGVycyBmcm9tIHttZXRhX3BhdGh9IikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIiAgV0FSTklORzogRmFpbGVkIHRvIGxvYWQgY29tbWFuZGVyLW1ldGEuanNvbjoge2V9IikKCiAgICBDT01NQU5ERVJfTUVUQSA9IEJVSUxUSU5fQ09NTUFOREVSUwogICAgcHJpbnQoZiIgIE1ldGE6ICAgICAgICAge2xlbihDT01NQU5ERVJfTUVUQSl9IGJ1aWx0LWluIGNvbW1hbmRlcnMiKQoKCmRlZiBtYWluKCk6CiAgICBhcmdzID0gcGFyc2VfYXJncygpCgogICAgQ0ZHLmZvcmdlX2phciA9IGFyZ3MuZm9yZ2VfamFyCiAgICBDRkcuZm9yZ2VfZGlyID0gYXJncy5mb3JnZV9kaXIKICAgIENGRy5mb3JnZV9kZWNrc19kaXIgPSBhcmdzLmZvcmdlX2RlY2tzX2RpciBvciByZXNvbHZlX2ZvcmdlX2RlY2tzX2RpcigpCiAgICBDRkcubGFiX2phciA9IGFyZ3MubGFiX2phciBvciByZXNvbHZlX2xhYl9qYXIoKQogICAgQ0ZHLnBvcnQgPSBh' +
'cmdzLnBvcnQKICAgIENGRy54aW1pbGFyX2FwaV9rZXkgPSBhcmdzLnhpbWlsYXJfa2V5CiAgICBDRkcucHBseF9hcGlfa2V5ID0gYXJncy5wcGx4X2tleQoKICAgIHByaW50KCLilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZciKQogICAgcHJpbnQoIuKVkSAgICAgIENvbW1hbmRlciBBSSBMYWIg4oCUIEFQSSBTZXJ2ZXIgIHYzLjAuMCAgICAgIOKVkSIpCiAgICBwcmludCgi4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdIikKICAgIHByaW50KCkKICAgIHByaW50KGYiICBGb3JnZSBKQVI6ICAgIHtDRkcuZm9yZ2VfamFyfSIpCiAgICBwcmludChmIiAgRm9yZ2UgRGlyOiAgICB7Q0ZHLmZvcmdlX2Rpcn0iKQogICAgcHJpbnQoZiIgIERlY2tzIERpcjogICAge0NGRy5mb3JnZV9kZWNrc19kaXJ9IikKICAgIHByaW50KGYiICBMYWIgSkFSOiAgICAgIHtDRkcubGFiX2phcn0iKQogICAgcHJpbnQoZiIgIFJlc3VsdHMgRGlyOiAge0NGRy5yZXN1bHRzX2Rpcn0iKQogICAgcHJpbnQoZiIgIFBvcnQ6ICAgICAgICAge0NGRy5wb3J0fSIpCiAgICBwcmludChmIiAgWGltaWxhcjogICAgICB7J2NvbmZpZ3VyZWQnIGlmIENGRy54aW1pbGFyX2FwaV9rZXkgZWxzZSAnTk9UIFNFVCAoc2Nhbm5lciB3aWxsIGZhaWwpJ30iKQogICAgcHJpbnQoZiIgIFBlcnBsZXhpdHk6ICAgeydjb25maWd1cmVkJyBpZiBDRkcucHBseF9hcGlfa2V5IGVsc2UgJ05PVCBTRVQgKEFJIHJlc2VhcmNoL2dlbiBkaXNhYmxlZCknfSIpCiAgICBqMTcgPSBnZXRfamF2YTE3KCkKICAgIHByaW50KGYiICBKYXZhIDE3OiAgICAgIHtqMTcgaWYgajE3ICE9ICdqYXZhJyBlbHNlICdOT1QgRk9VTkQgKGJhdGNoIHNpbSBtYXkgZmFpbCBvbiBKYXZhIDI1KyknfSIpCiAgICBwcmludChmIiAgTE0gU3R1ZGlvOiAgICBodHRwOi8vMTkyLjE2OC4wLjEyMjoxMjM0IikKCiAgICBsb2FkX2NvbW1hbmRlcl9tZXRhKCkKICAgIGRvd25sb2FkX3ByZWNvbl9kYXRhYmFzZSgpICAjIEF1dG8tZG93bmxvYWRzIGFsbCAxNjMrIENvbW1hbmRlciBwcmVjb25zIG9uIGZpcnN0IHJ1bgogICAgaW5pdF9jb2xsZWN0aW9uX2RiKCkKICAgIGluaXRfY29hY2hfc2VydmljZSgpCgogICAgIyBYaW1pbGFyIEFQSSBrZXkgY2hlY2sKICAgIGlmIG5vdCBDRkcueGltaWxhcl9hcGlfa2V5OgogICAgICAgIHByaW50KCIgIFdBUk5JTkc6IC0teGltaWxhci1rZXkgbm90IHNldC4gQ2FyZCBzY2FubmVyIHdpbGwgbm90IHdvcmsuIikKICAgICAgICBwcmludCgiICAgICAgICAgICBTZXQgdmlhIENMSTogLS14aW1pbGFyLWtleSBZT1VSX0tFWSIpCiAgICAgICAgcHJpbnQoIiAgICAgICAgICAgT3IgZW52IHZhcjogIFhJTUlMQVJfQVBJX0tFWT1ZT1VSX0tFWSIpCgogICAgaWYgbm90IENGRy5mb3JnZV9qYXI6CiAgICAgICAgcHJpbnQoIldBUk5JTkc6IC0tZm9yZ2UtamFyIG5vdCBzZXQuIC9hcGkvbGFiL3N0YXJ0IHdpbGwgZmFpbC4iKQogICAgaWYgbm90IENGRy5sYWJfamFyOgogICAgICAgIHByaW50KCJXQVJOSU5HOiBMYWIgSkFSIG5vdCBmb3VuZC4gQnVpbGQgd2l0aDogbXZuIHBhY2thZ2UgLURza2lwVGVzdHMiKQogICAgaWYgbm90IENGRy5mb3JnZV9kZWNrc19kaXI6CiAgICAgICAgcHJpbnQoIldBUk5JTkc6IENvbW1hbmRlciBkZWNrcyBkaXIgbm90IGZvdW5kLiAvYXBpL2xhYi9kZWNrcyB3aWxsIHJldHVybiBlbXB0eS4iKQoKICAgIHByaW50KCkKICAgIHByaW50KGYiICBTdGFydGluZyBzZXJ2ZXIgb24gaHR0cDovL2xvY2FsaG9zdDp7Q0ZHLnBvcnR9IikKICAgIGlmIF9zcGFfZGlyLmV4aXN0cygpOgogICAgICAgIHByaW50KGYiICBXZWIgVUk6ICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6e0NGRy5wb3J0fS8gIChSZWFjdCBTUEEpIikKICAgICAgICBwcmludChmIiAgUm91dGVzOiAgICAgICAvIChCYXRjaCBTaW0pLCAvY29sbGVjdGlvbiwgL2RlY2tzLCAvYXV0b2dlbiwgL3NpbXVsYXRvciwgL2NvYWNoLCAvdHJhaW5pbmciKQogICAgZWxzZToKICAgICAg' +
'ICBwcmludChmIiAgV2ViIFVJOiAgICAgICBodHRwOi8vbG9jYWxob3N0OntDRkcucG9ydH0vaW5kZXguaHRtbCAgKGxlZ2FjeSBIVE1MKSIpCiAgICAgICAgcHJpbnQoZiIgIE5PVEU6IFJlYWN0IFNQQSBub3QgYnVpbHQuIFJ1bjogY2QgZnJvbnRlbmQvY29tbWFuZGVyLWFpLWxhYi11aSAmJiBucG0gaW5zdGFsbCAmJiBucG0gcnVuIGJ1aWxkIikKICAgIHByaW50KGYiICBBUEkgZG9jczogICAgIGh0dHA6Ly9sb2NhbGhvc3Q6e0NGRy5wb3J0fS9kb2NzIikKICAgIHByaW50KCkKCiAgICBpbXBvcnQgdXZpY29ybgogICAgdXZpY29ybi5ydW4oYXBwLCBob3N0PSIwLjAuMC4wIiwgcG9ydD1DRkcucG9ydCwgbG9nX2xldmVsPSJpbmZvIikKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg=='
Install-B64 -R 'lab_api.py' -B $b
# ml/__init__.py (0 bytes)
+2 -2
View File
@@ -7058,7 +7058,7 @@ async def coach_list_decks():
"""List all decks available for coaching (from deck builder DB)."""
conn = _get_db_conn()
rows = conn.execute(
"""SELECT d.id as deck_id, d.name as deck_name, d.commander,
"""SELECT d.id as deck_id, d.name as deck_name, d.commander_name,
COUNT(dc.id) as card_count
FROM decks d
LEFT JOIN deck_cards dc ON dc.deck_id = d.id
@@ -7083,7 +7083,7 @@ async def coach_list_decks():
decks.append({
"deck_id": r["deck_id"],
"deck_name": r["deck_name"],
"commander": r["commander"] or "",
"commander": r["commander_name"] or "",
"card_count": r["card_count"],
"has_report": has_report,
"report_count": 1 if has_report else 0,