Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 21779

KernelBot user 126 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.

submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-21779?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16

Benchmark evidence

2 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
199.9ms
#75 of 118
2025-05-13
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
208.9ms
#75 of 118
2025-05-13

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:9f2c2dbbc57cea663551d23c606ebe7a3126ab5003654a9a0adca4ca9ce06ede
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
aW1wb3J0IHRpbWUsIG1hdGgsIGRhdGFjbGFzc2VzCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgoKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAoKCmRlZiBfY2xvbmVfZGF0YShkYXRhKToKICAgICIiIgogICAgUmVjdXJzaXZlbHkgZ29lcyB0aHJvdWdoIGRhdGEgYW5kIGNsb25lcyBhbGwgdGVuc29ycy4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShkYXRhLCB0dXBsZSk6CiAgICAgICAgcmV0dXJuIHR1cGxlKF9jbG9uZV9kYXRhKHgpIGZvciB4IGluIGRhdGEpCiAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgbGlzdCk6CiAgICAgICAgcmV0dXJuIFtfY2xvbmVfZGF0YSh4KSBmb3IgeCBpbiBkYXRhXQogICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgIHJldHVybiB7azogX2Nsb25lX2RhdGEodikgZm9yIGssIHYgaW4gZGF0YS5pdGVtcygpfQogICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIHRvcmNoLlRlbnNvcik6CiAgICAgICAgcmV0dXJuIGRhdGEuY2xvbmUoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gZGF0YQoKZHVyYXRpb25zID0gW10KCkBkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKY2xhc3MgU3RhdHM6CiAgICBydW5zOiBpbnQKICAgIG1lYW46IGZsb2F0CiAgICBzdGQ6IGZsb2F0CiAgICBlcnI6IGZsb2F0CiAgICBiZXN0OiBmbG9hdAogICAgd29yc3Q6IGZsb2F0CgpkZWYgY2FsY3VsYXRlX3N0YXRzKGR1cmF0aW9uczogbGlzdFtpbnRdKToKICAgICIiIgogICAgQ2FsY3VsYXRlIHN0YXRpc3RpY2FsIGRhdGEgZnJvbSBhIGxpc3Qgb2YgZHVyYXRpb25zLgoKICAgIEBwYXJhbSBkdXJhdGlvbnM6IEEgbGlzdCBvZiBkdXJhdGlvbnMgaW4gbmFub3NlY29uZHMuCiAgICBAcmV0dXJuOiBBIFN0YXRzIG9iamVjdCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgcnVucywgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBlcnJvciwgYmVzdCwgYW5kIHdvcnN0IGR1cmF0aW9ucy4KICAgICIiIgogICAgcnVucyA9IGxlbihkdXJhdGlvbnMpCiAgICB0b3RhbCA9IHN1bShkdXJhdGlvbnMpCiAgICBiZXN0ID0gbWluKGR1cmF0aW9ucykKICAgIHdvcnN0ID0gbWF4KGR1cmF0aW9ucykKCiAgICBhdmcgPSB0b3RhbCAvIHJ1bnMKICAgIHZhcmlhbmNlID0gc3VtKG1hcChsYW1iZGEgeDogKHggLSBhdmcpKioyLCBkdXJhdGlvbnMpKQogICAgc3RkID0gbWF0aC5zcXJ0KHZhcmlhbmNlIC8gKHJ1bnMgLSAxKSkKICAgIGVyciA9IHN0ZCAvIG1hdGguc3FydChydW5zKQoKICAgIHJldHVybiBTdGF0cyhydW5zPXJ1bnMsIG1lYW49YXZnLCBzdGQ9c3RkLCBlcnI9ZXJyLCBiZXN0PWZsb2F0KGJlc3QpLAogICAgICAgICAgICAgICAgIHdvcnN0PWZsb2F0KHdvcnN0KSkKCgpjbGFzcyBFeHBlcnRfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCBkX2V4cGVydDogT3B0aW9uYWxbaW50XSA9IE5vbmUpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5hY3RfZm4gPSBubi5TaUxVKCkKICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0gaWYgZF9leHBlcnQgaXMgTm9uZSBlbHNlIGRfZXhwZXJ0CgogICAgICAgIHNlbGYuV19nYXRlID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX3VwID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kX2V4cGVydCwgc2VsZi5kX2hpZGRlbiwgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBnYXRlID0gc2VsZi5hY3RfZm4oc2VsZi5XX2dhdGUoeCkpCiAgICAgICAgb3V0ID0gc2VsZi5XX2Rvd24oZ2F0ZSAqIHNlbGYuV191cCh4KSkKICAgICAgICByZXR1cm4gb3V0CgoKY2xhc3MgTW9FR2F0ZV9yZWYobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wX2s6IGludCA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgc2VsZi5udW1fZXhwZXJ0czogaW50ID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KCiAgICAgICAgc2VsZi5XX2cgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5udW1fZXhwZXJ0cywgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSBzZWxmLldfZyh4KQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCiAgICAgICAgIyByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcywgbG9naXRzLCBzY29yZXMKCgpjbGFzcyBNb0VfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICBFeHBlcnRfcmVmKGNvbmZpZykKICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pCiAgICAgICAgXSkKICAgICAgICBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgICAgIHNoYXJlZF9leHBlcnRfZGltID0gY29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnRfcmVmKGNvbmZpZz1jb25maWcsIGRfZXhwZXJ0PXNoYXJlZF9leHBlcnRfZGltKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKICAgIAoKIyBjbGFzcyBFeHBlcnQobm4uTW9kdWxlKToKIyAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgd2VpZ2h0czogRGljdCwgc2hhcmVkOiBib29sLCBpOiBpbnQpOgojICAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiMgICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwojICAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiMgICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0KCiMgICAgICAgICBpZiBzaGFyZWQ6CiMgICAgICAgICAgICAgc2VsZi5XX2dhdGUgPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgICAgIHNlbGYuV191cCAgID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfZG93biA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICBlbHNlOgojICAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS50KCkuY2xvbmUoKQoKIyAgICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiMgICAgICAgICB4X2dhdGUgPSBGLmxpbmVhcih4LCBzZWxmLldfZ2F0ZSkKIyAgICAgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgICAgICB4X3VwID0gRi5saW5lYXIoeCwgc2VsZi5XX3VwKQojICAgICAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICAgICAgb3V0ID0gRi5saW5lYXIob3V0LCBzZWxmLldfZG93bikKCiMgICAgICAgICByZXR1cm4gb3V0CgpjbGFzcyBFeHBlcnQobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QsIHNoYXJlZDogYm9vbCwgaTogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQogICAgICAgIHNlbGYuZF9leHBlcnQ6IGludCA9IGNvbmZpZ1siZF9leHBlcnQiXQoKICAgICAgICBpZiBzaGFyZWQ6CiAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5XX2dhdGUgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgICAgIHNlbGYuV191cCAgID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfZG93biA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLmNsb25lKCkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4X2dhdGUgPSB4IEAgc2VsZi5XX2dhdGUKICAgICAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQogICAgICAgIHhfdXAgPSB4IEAgc2VsZi5XX3VwCiAgICAgICAgb3V0ID0geF9nYXRlICogeF91cAogICAgICAgIG91dCA9IG91dCBAIHNlbGYuV19kb3duCgogICAgICAgIHJldHVybiBvdXQKCgpjbGFzcyBNb0VHYXRlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgICAgIHNlbGYuV19nID0gd2VpZ2h0c1sncm91dGVyLndlaWdodCddLmNsb25lKCkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICAjIGxvZ2l0cyA9IHggQCBzZWxmLldfZwogICAgICAgIGxvZ2l0cyA9IEYubGluZWFyKHgsIHNlbGYuV19nKQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCiAgICAgICAgIyByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcywgbG9naXRzLCBzY29yZXMKCgpjbGFzcyBNb0Uobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5leHBlcnRzID0gbm4uTW9kdWxlTGlzdChbCiAgICAgICAgICAgICMgRXhwZXJ0X3JlZihjb25maWcpCiAgICAgICAgICAgIEV4cGVydChjb25maWcsIHdlaWdodHMsIEZhbHNlLCBpKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSkKICAgICAgICBdKQogICAgICAgIHNlbGYuZ2F0aW5nX25ldHdvcmsgPSBNb0VHYXRlX3JlZihjb25maWcpCiAgICAgICAgIyBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZShjb25maWcsIHdlaWdodHMpCiAgICAgICAgc2hhcmVkX2V4cGVydF9kaW0gPSBjb25maWdbImRfZXhwZXJ0Il0gKiBjb25maWdbIm5fc2hhcmVkX2V4cGVydHMiXQogICAgICAgIHNlbGYuc2hhcmVkX2V4cGVydCA9IEV4cGVydF9yZWYoY29uZmlnLCBkX2V4cGVydD1zaGFyZWRfZXhwZXJ0X2RpbSkKICAgICAgICAjIHNlbGYuc2hhcmVkX2V4cGVydCA9IEV4cGVydChjb25maWcsIHdlaWdodHMsIFRydWUsIDApCgogICAgQHRvcmNoLm5vX2dyYWQoKQogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2hhcmVkX291dHB1dCA9IHNlbGYuc2hhcmVkX2V4cGVydCh4KQogICAgICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gc2VsZi5nYXRpbmdfbmV0d29yayh4KQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW0gPSB4LnNoYXBlCiAgICAgICAgb3JpZ19zaGFwZSA9IHguc2hhcGUKICAgICAgICB4X2ZsYXQgPSB4LnZpZXcoLTEsIGhpZGRlbl9kaW0pCiAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcyA9IGV4cGVydF9pbmRpY2VzLnZpZXcoLTEpCiAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cyA9IGV4cGVydF9zY29yZXMudmlldygtMSwgMSkKICAgICAgICByb3V0ZWRfb3V0cHV0X2ZsYXQgPSBzZWxmLm1vZV9pbmZlcih4X2ZsYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzKQoKICAgICAgICByb3V0ZWRfb3V0cHV0ID0gcm91dGVkX291dHB1dF9mbGF0LnZpZXcoKm9yaWdfc2hhcGUpCiAgICAgICAgcmV0dXJuIHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgogICAgQHRvcmNoLm5vX2dyYWQoKQogICAgZGVmIG1vZV9pbmZlcihzZWxmLAogICAgICAgICAgICAgICAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0czogdG9yY2guVGVuc29yCiAgICAgICAgICAgICAgICAgKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZXhwZXJ0X2NhY2hlID0gdG9yY2guemVyb3NfbGlrZSh4KQogICAgICAgIGlkeHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmFyZ3NvcnQoKQogICAgICAgIGNvdW50cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYmluY291bnQoKS5jcHUoKS5udW1weSgpCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnQgPSBjb3VudHMuY3Vtc3VtKCkKICAgICAgICBudW1fcGVyX3RvayA9IHNlbGYuY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgICAgICB0b2tlbl9pZHhzID0gaWR4cyAvLyBudW1fcGVyX3RvawogICAgICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0KToKICAgICAgICAgICAgc3RhcnRfaWR4ID0gMCBpZiBleHBlcnRfaWQgPT0gMCBlbHNlIHRva2Vuc19wZXJfZXhwZXJ0W2V4cGVydF9pZCAtIDFdCiAgICAgICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGV4cGVydCA9IHNlbGYuZXhwZXJ0c1tleHBlcnRfaWRdCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzID0gdG9rZW5faWR4c1tzdGFydF9pZHg6ZW5kX2lkeF0KICAgICAgICAgICAgZXhwZXJ0X3Rva2VucyA9IHhbZXhwX3Rva2VuX2lkeHNdCiAgICAgICAgICAgIGV4cGVydF9vdXQgICAgPSBleHBlcnQoZXhwZXJ0X3Rva2VucykKICAgICAgICAgICAgZXhwZXJ0X291dC5tdWxfKGZsYXRfZXhwZXJ0X3dlaWdodHNbaWR4c1tzdGFydF9pZHg6ZW5kX2lkeF1dKQogICAgICAgICAgICBleHBlcnRfY2FjaGUuc2NhdHRlcl9yZWR1Y2VfKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCB4LnNoYXBlWy0xXSksCiAgICAgICAgICAgICAgICBleHBlcnRfb3V0LAogICAgICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIGV4cGVydF9jYWNoZQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgpAdG9yY2gubm9fZ3JhZCgpCmRlZiBtb2VfZXhwZXJ0X2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZ2F0ZTogdG9yY2guVGVuc29yLCB3X3VwOiB0b3JjaC5UZW5zb3IsIHdfZG93bjogdG9yY2guVGVuc29yKToKICAgICMgeF9nYXRlID0geCBAIHdfZ2F0ZQogICAgeF9nYXRlID0gRi5saW5lYXIoeCwgd19nYXRlLlQpCiAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQogICAgIyB4X3VwID0geCBAIHdfdXAKICAgIHhfdXAgPSBGLmxpbmVhcih4LCB3X3VwLlQpCiAgICBvdXQgPSB4X2dhdGUgKiB4X3VwCiAgICAjIG91dCA9IG91dCBAIHdfZG93bgogICAgb3V0ID0gRi5saW5lYXIob3V0LCB3X2Rvd24uVCkKICAgIHJldHVybiBvdXQKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0LCBjb25maWc6IERpY3QpOgogICAgbW9lX2dhdGUgPSBNb0VHYXRlX3JlZihjb25maWcpCiAgICBtb2VfZ2F0ZS5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGUoeCkKCiAgICAjIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgIyAgICAgeCwKICAgICMgICAgIHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSwKICAgICMgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdKQoKICAgIG1vZV9zaGFyZWQgPSBFeHBlcnRfcmVmKGNvbmZpZywgZF9leHBlcnQ9Y29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0pCiAgICBtb2Vfc2hhcmVkLldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICBtb2Vfc2hhcmVkLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgbW9lX3NoYXJlZC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQogICAgc2hhcmVkX291dHB1dCA9IG1vZV9zaGFyZWQoeCkKCiAgICAjIHNoYXJlZF9vdXRwdXQgPSBtb2VfZXhwZXJ0X2tlcm5lbCgKICAgICMgICAgIHgsCiAgICAjICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgIyAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSwKICAgICMgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgogICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbSA9IHguc2hhcGUKICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICB4X2ZsYXQgPSB4LnZpZXcoLTEsIGhpZGRlbl9kaW0pCiAgICBmbGF0X2V4cGVydF9pbmRpY2VzID0gZXhwZXJ0X2luZGljZXMudmlldygtMSkKICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCgogICAgZXhwZXJ0X2NhY2hlID0gdG9yY2guemVyb3NfbGlrZSh4X2ZsYXQpCiAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgIGNvdW50cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYmluY291bnQoKS5jcHUoKS5udW1weSgpCiAgICB0b2tlbnNfcGVyX2V4cGVydCA9IGNvdW50cy5jdW1zdW0oKQogICAgbnVtX3Blcl90b2sgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0KToKICAgICAgICBzdGFydF9pZHggPSAwIGlmIGV4cGVydF9pZCA9PSAwIGVsc2UgdG9rZW5zX3Blcl9leHBlcnRbZXhwZXJ0X2lkIC0gMV0KICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgZXhwZXJ0X3Rva2VucyA9IHhfZmxhdFtleHBfdG9rZW5faWR4c10KICAgICAgICBleHBlcnRfb3V0ID0gbW9lX2V4cGVydF9rZXJuZWwoCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMsCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjAud2VpZ2h0J10sCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjEud2VpZ2h0J10sCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjIud2VpZ2h0J10pCiAgICAgICAgZXhwZXJ0X291dC5tdWxfKGZsYXRfZXhwZXJ0X3dlaWdodHNbaWR4c1tzdGFydF9pZHg6ZW5kX2lkeF1dKQogICAgICAgIGV4cGVydF9jYWNoZS5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCB4X2ZsYXQuc2hhcGVbLTFdKSwKICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgKQoKICAgICAgICAjIGlmIGV4cGVydF9pZCA9PSAzMToKICAgICAgICAjICAgICBwcmludChmIm5fcm91dGVkX2V4cGVydHMge2NvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdfSIpCiAgICAgICAgIyAgICAgcmV0dXJuIHNoYXJlZF9vdXRwdXQKICAgIHJvdXRlZF9vdXRwdXQgPSBleHBlcnRfY2FjaGUudmlldygqb3JpZ19zaGFwZSkKICAgICMgaWYgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0gIT0gMzI6CiAgICAjICAgICByZXR1cm4gc2hhcmVkX291dHB1dAogICAgcmV0dXJuIHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIERlZXBTZWVrLXN0eWxlIE1peHR1cmUgb2YgRXhwZXJ0cyB1c2luZyBQeVRvcmNoLgogICAgCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIG9mIChpbnB1dDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwgY29uZmlnOiBEaWN0KQogICAgICAgICAgICAtIGlucHV0OiBJbnB1dCB0ZW5zb3Igb2Ygc2hhcGUgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW1dCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgIyBwcmludChmImJlZ2luIGtlcm5lbCB7dGltZS50aW1lX25zKCl9IikKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgIyBtb2UgPSBNb0UoY29uZmlnLCB3ZWlnaHRzKQoKICAgICMgcHJpbnQoZiJiZWdpbiBjb3B5IHt0aW1lLnRpbWVfbnMoKX0iKQoKICAgICMgbW9lLmdhdGluZ19uZXR3b3JrLldfZy53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1sncm91dGVyLndlaWdodCddKQoKICAgICMgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pOgogICAgIyAgICAgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAjICAgICB1cF9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddCiAgICAjICAgICBkb3duX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10KCiAgICAjICAgICAjIFRyYW5zcG9zZSB3ZWlnaHRzIHRvIG1hdGNoIGV4cGVjdGVkIHNoYXBlIGZvciBubi5MaW5lYXIKICAgICMgICAgIG1vZS5leHBlcnRzW2ldLldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoZ2F0ZV9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2UuZXhwZXJ0c1tpXS5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih1cF9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2UuZXhwZXJ0c1tpXS5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGRvd25fcHJval93ZWlnaHQudCgpKQoKICAgICMgbW9lLnNoYXJlZF9leHBlcnQuV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLnQoKSkKICAgICMgbW9lLnNoYXJlZF9leHBlcnQuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS50KCkpCiAgICAjIG1vZS5zaGFyZWRfZXhwZXJ0LldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkpCgogICAgIyBwcmludChmImJlZ2luIGNvbXB1dGUge3RpbWUudGltZV9ucygpfSIpCiAgICAjIG91dHB1dCA9IG1vZShpbnB1dF90ZW5zb3IpCiAgICAjIHByaW50KGYiZW5kIGNvbXB1dGUge3RpbWUudGltZV9ucygpfSIpCgogICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG91dHB1dCA9IG1vZV9rZXJuZWwoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcpCiAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKCiAgICBpZiBsZW4oZHVyYXRpb25zKSA9PSAwOgogICAgICAgIHByaW50KCkKCiAgICBkdXJhdGlvbnMuYXBwZW5kKGVuZC1zdGFydCkKICAgICMgaWYgbGVuKGR1cmF0aW9ucykgPiAxOgogICAgIyAgICAgc3RhdHMgPSBjYWxjdWxhdGVfc3RhdHMoZHVyYXRpb25zKQogICAgIyAgICAgaWYgc3RhdHMuZXJyIC8gc3RhdHMubWVhbiA8IDAuMDAxIG9yIHN0YXRzLm1lYW4gKiBzdGF0cy5ydW5zID4gMzBlOToKICAgICMgICAgICAgICBkdXJhdGlvbnMuY2xlYXIoKQogICAgIyAgICAgICAgIHByaW50KCJzd2l0Y2ggdGVzdCBjb25mIikKICAgIAogICAgcmV0dXJuIG91dHB1dAoKCiMgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKIyAgICAgZGF0YSA9IGdlbmVyYXRlX2lucHV0KDcxNjgsIDIwNDgsIDEyOCwgMSwgOCwgMSwgMTAyNCwgMTcpCiMgICAgIGN1c3RvbV9rZXJuZWwoZGF0YSkKCiAgICAjIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQoKICAgICMgbW9lX2dhdGUgPSBNb0VHYXRlKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX2dhdGVfcmVmID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgIyBtb2VfZ2F0ZV9yZWYuV19nLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10pCgogICAgIyBvdXRwdXQgPSBtb2VfZ2F0ZShpbnB1dF90ZW5zb3IpCiAgICAjIG91dHB1dF9yZWYgPSBtb2VfZ2F0ZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMF0sIG91dHB1dF9yZWZbMF0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMV0sIG91dHB1dF9yZWZbMV0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMl0sIG91dHB1dF9yZWZbMl0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbM10sIG91dHB1dF9yZWZbM10sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGV4cGVydCA9IEV4cGVydChjb25maWcsIHdlaWdodHMsIEZhbHNlLCBpKQogICAgIyAgICAgZXhwZXJ0X3JlZiA9IEV4cGVydF9yZWYoY29uZmlnKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLnQoKSkKICAgICMgICAgIGV4cGVydF9yZWYuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10udCgpKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLnQoKSkKCiAgICAjICAgICBvdXRwdXQgPSBleHBlcnQoaW5wdXRfdGVuc29yKQogICAgIyAgICAgb3V0cHV0X3JlZiA9IGV4cGVydF9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgICAgIHByaW50KGYiZXhwZXJ0IHtpfSIpCiAgICAjICAgICBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgb3V0cHV0X3JlZiwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX3JlZiA9IE1vRV9yZWYoY29uZmlnKQoKICAgICMgbW9lX3JlZi5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGdhdGVfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQogICAgIyAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgIyAgICAgZG93bl9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddCgogICAgIyAgICAgIyBUcmFuc3Bvc2Ugd2VpZ2h0cyB0byBtYXRjaCBleHBlY3RlZCBzaGFwZSBmb3Igbm4uTGluZWFyCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcihnYXRlX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZV9yZWYuZXhwZXJ0c1tpXS5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih1cF9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihkb3duX3Byb2pfd2VpZ2h0LnQoKSkKCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udCgpKQogICAgIyBtb2VfcmVmLnNoYXJlZF9leHBlcnQuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS50KCkpCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQoKICAgICMgb3V0cHV0ID0gbW9lKGlucHV0X3RlbnNvcikKICAgICMgb3V0cHV0X3JlZiA9IG1vZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXQsIG91dHB1dF9yZWYsIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkK

Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0

Changes from previous submission

Against this author's previous submission amd-mixture-of-experts · submission 21773.

- aW1wb3J0IHRpbWUsIG1hdGgsIGRhdGFjbGFzc2VzCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgoKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAoKCmRlZiBfY2xvbmVfZGF0YShkYXRhKToKICAgICIiIgogICAgUmVjdXJzaXZlbHkgZ29lcyB0aHJvdWdoIGRhdGEgYW5kIGNsb25lcyBhbGwgdGVuc29ycy4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShkYXRhLCB0dXBsZSk6CiAgICAgICAgcmV0dXJuIHR1cGxlKF9jbG9uZV9kYXRhKHgpIGZvciB4IGluIGRhdGEpCiAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgbGlzdCk6CiAgICAgICAgcmV0dXJuIFtfY2xvbmVfZGF0YSh4KSBmb3IgeCBpbiBkYXRhXQogICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgIHJldHVybiB7azogX2Nsb25lX2RhdGEodikgZm9yIGssIHYgaW4gZGF0YS5pdGVtcygpfQogICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIHRvcmNoLlRlbnNvcik6CiAgICAgICAgcmV0dXJuIGRhdGEuY2xvbmUoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gZGF0YQoKZHVyYXRpb25zID0gW10KCkBkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKY2xhc3MgU3RhdHM6CiAgICBydW5zOiBpbnQKICAgIG1lYW46IGZsb2F0CiAgICBzdGQ6IGZsb2F0CiAgICBlcnI6IGZsb2F0CiAgICBiZXN0OiBmbG9hdAogICAgd29yc3Q6IGZsb2F0CgpkZWYgY2FsY3VsYXRlX3N0YXRzKGR1cmF0aW9uczogbGlzdFtpbnRdKToKICAgICIiIgogICAgQ2FsY3VsYXRlIHN0YXRpc3RpY2FsIGRhdGEgZnJvbSBhIGxpc3Qgb2YgZHVyYXRpb25zLgoKICAgIEBwYXJhbSBkdXJhdGlvbnM6IEEgbGlzdCBvZiBkdXJhdGlvbnMgaW4gbmFub3NlY29uZHMuCiAgICBAcmV0dXJuOiBBIFN0YXRzIG9iamVjdCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgcnVucywgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBlcnJvciwgYmVzdCwgYW5kIHdvcnN0IGR1cmF0aW9ucy4KICAgICIiIgogICAgcnVucyA9IGxlbihkdXJhdGlvbnMpCiAgICB0b3RhbCA9IHN1bShkdXJhdGlvbnMpCiAgICBiZXN0ID0gbWluKGR1cmF0aW9ucykKICAgIHdvcnN0ID0gbWF4KGR1cmF0aW9ucykKCiAgICBhdmcgPSB0b3RhbCAvIHJ1bnMKICAgIHZhcmlhbmNlID0gc3VtKG1hcChsYW1iZGEgeDogKHggLSBhdmcpKioyLCBkdXJhdGlvbnMpKQogICAgc3RkID0gbWF0aC5zcXJ0KHZhcmlhbmNlIC8gKHJ1bnMgLSAxKSkKICAgIGVyciA9IHN0ZCAvIG1hdGguc3FydChydW5zKQoKICAgIHJldHVybiBTdGF0cyhydW5zPXJ1bnMsIG1lYW49YXZnLCBzdGQ9c3RkLCBlcnI9ZXJyLCBiZXN0PWZsb2F0KGJlc3QpLAogICAgICAgICAgICAgICAgIHdvcnN0PWZsb2F0KHdvcnN0KSkKCgpjbGFzcyBFeHBlcnRfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCBkX2V4cGVydDogT3B0aW9uYWxbaW50XSA9IE5vbmUpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5hY3RfZm4gPSBubi5TaUxVKCkKICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0gaWYgZF9leHBlcnQgaXMgTm9uZSBlbHNlIGRfZXhwZXJ0CgogICAgICAgIHNlbGYuV19nYXRlID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX3VwID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kX2V4cGVydCwgc2VsZi5kX2hpZGRlbiwgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBnYXRlID0gc2VsZi5hY3RfZm4oc2VsZi5XX2dhdGUoeCkpCiAgICAgICAgb3V0ID0gc2VsZi5XX2Rvd24oZ2F0ZSAqIHNlbGYuV191cCh4KSkKICAgICAgICByZXR1cm4gb3V0CgoKY2xhc3MgTW9FR2F0ZV9yZWYobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wX2s6IGludCA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgc2VsZi5udW1fZXhwZXJ0czogaW50ID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KCiAgICAgICAgc2VsZi5XX2cgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5udW1fZXhwZXJ0cywgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSBzZWxmLldfZyh4KQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCiAgICAgICAgIyByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcywgbG9naXRzLCBzY29yZXMKCgpjbGFzcyBNb0VfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICBFeHBlcnRfcmVmKGNvbmZpZykKICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pCiAgICAgICAgXSkKICAgICAgICBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgICAgIHNoYXJlZF9leHBlcnRfZGltID0gY29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnRfcmVmKGNvbmZpZz1jb25maWcsIGRfZXhwZXJ0PXNoYXJlZF9leHBlcnRfZGltKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKICAgIAoKIyBjbGFzcyBFeHBlcnQobm4uTW9kdWxlKToKIyAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgd2VpZ2h0czogRGljdCwgc2hhcmVkOiBib29sLCBpOiBpbnQpOgojICAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiMgICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwojICAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiMgICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0KCiMgICAgICAgICBpZiBzaGFyZWQ6CiMgICAgICAgICAgICAgc2VsZi5XX2dhdGUgPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgICAgIHNlbGYuV191cCAgID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfZG93biA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICBlbHNlOgojICAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS50KCkuY2xvbmUoKQoKIyAgICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiMgICAgICAgICB4X2dhdGUgPSBGLmxpbmVhcih4LCBzZWxmLldfZ2F0ZSkKIyAgICAgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgICAgICB4X3VwID0gRi5saW5lYXIoeCwgc2VsZi5XX3VwKQojICAgICAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICAgICAgb3V0ID0gRi5saW5lYXIob3V0LCBzZWxmLldfZG93bikKCiMgICAgICAgICByZXR1cm4gb3V0CgpjbGFzcyBFeHBlcnQobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QsIHNoYXJlZDogYm9vbCwgaTogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQogICAgICAgIHNlbGYuZF9leHBlcnQ6IGludCA9IGNvbmZpZ1siZF9leHBlcnQiXQoKICAgICAgICBpZiBzaGFyZWQ6CiAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5XX2dhdGUgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgICAgIHNlbGYuV191cCAgID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfZG93biA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLmNsb25lKCkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4X2dhdGUgPSB4IEAgc2VsZi5XX2dhdGUKICAgICAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQogICAgICAgIHhfdXAgPSB4IEAgc2VsZi5XX3VwCiAgICAgICAgb3V0ID0geF9nYXRlICogeF91cAogICAgICAgIG91dCA9IG91dCBAIHNlbGYuV19kb3duCgogICAgICAgIHJldHVybiBvdXQKCgpjbGFzcyBNb0VHYXRlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgICAgIHNlbGYuV19nID0gd2VpZ2h0c1sncm91dGVyLndlaWdodCddLmNsb25lKCkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICAjIGxvZ2l0cyA9IHggQCBzZWxmLldfZwogICAgICAgIGxvZ2l0cyA9IEYubGluZWFyKHgsIHNlbGYuV19nKQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCiAgICAgICAgIyByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcywgbG9naXRzLCBzY29yZXMKCgpjbGFzcyBNb0Uobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5leHBlcnRzID0gbm4uTW9kdWxlTGlzdChbCiAgICAgICAgICAgICMgRXhwZXJ0X3JlZihjb25maWcpCiAgICAgICAgICAgIEV4cGVydChjb25maWcsIHdlaWdodHMsIEZhbHNlLCBpKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSkKICAgICAgICBdKQogICAgICAgIHNlbGYuZ2F0aW5nX25ldHdvcmsgPSBNb0VHYXRlX3JlZihjb25maWcpCiAgICAgICAgIyBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZShjb25maWcsIHdlaWdodHMpCiAgICAgICAgc2hhcmVkX2V4cGVydF9kaW0gPSBjb25maWdbImRfZXhwZXJ0Il0gKiBjb25maWdbIm5fc2hhcmVkX2V4cGVydHMiXQogICAgICAgIHNlbGYuc2hhcmVkX2V4cGVydCA9IEV4cGVydF9yZWYoY29uZmlnLCBkX2V4cGVydD1zaGFyZWRfZXhwZXJ0X2RpbSkKICAgICAgICAjIHNlbGYuc2hhcmVkX2V4cGVydCA9IEV4cGVydChjb25maWcsIHdlaWdodHMsIFRydWUsIDApCgogICAgQHRvcmNoLm5vX2dyYWQoKQogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2hhcmVkX291dHB1dCA9IHNlbGYuc2hhcmVkX2V4cGVydCh4KQogICAgICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gc2VsZi5nYXRpbmdfbmV0d29yayh4KQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW0gPSB4LnNoYXBlCiAgICAgICAgb3JpZ19zaGFwZSA9IHguc2hhcGUKICAgICAgICB4X2ZsYXQgPSB4LnZpZXcoLTEsIGhpZGRlbl9kaW0pCiAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcyA9IGV4cGVydF9pbmRpY2VzLnZpZXcoLTEpCiAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cyA9IGV4cGVydF9zY29yZXMudmlldygtMSwgMSkKICAgICAgICByb3V0ZWRfb3V0cHV0X2ZsYXQgPSBzZWxmLm1vZV9pbmZlcih4X2ZsYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzKQoKICAgICAgICByb3V0ZWRfb3V0cHV0ID0gcm91dGVkX291dHB1dF9mbGF0LnZpZXcoKm9yaWdfc2hhcGUpCiAgICAgICAgcmV0dXJuIHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgogICAgQHRvcmNoLm5vX2dyYWQoKQogICAgZGVmIG1vZV9pbmZlcihzZWxmLAogICAgICAgICAgICAgICAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0czogdG9yY2guVGVuc29yCiAgICAgICAgICAgICAgICAgKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZXhwZXJ0X2NhY2hlID0gdG9yY2guemVyb3NfbGlrZSh4KQogICAgICAgIGlkeHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmFyZ3NvcnQoKQogICAgICAgIGNvdW50cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYmluY291bnQoKS5jcHUoKS5udW1weSgpCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnQgPSBjb3VudHMuY3Vtc3VtKCkKICAgICAgICBudW1fcGVyX3RvayA9IHNlbGYuY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgICAgICB0b2tlbl9pZHhzID0gaWR4cyAvLyBudW1fcGVyX3RvawogICAgICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0KToKICAgICAgICAgICAgc3RhcnRfaWR4ID0gMCBpZiBleHBlcnRfaWQgPT0gMCBlbHNlIHRva2Vuc19wZXJfZXhwZXJ0W2V4cGVydF9pZCAtIDFdCiAgICAgICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGV4cGVydCA9IHNlbGYuZXhwZXJ0c1tleHBlcnRfaWRdCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzID0gdG9rZW5faWR4c1tzdGFydF9pZHg6ZW5kX2lkeF0KICAgICAgICAgICAgZXhwZXJ0X3Rva2VucyA9IHhbZXhwX3Rva2VuX2lkeHNdCiAgICAgICAgICAgIGV4cGVydF9vdXQgICAgPSBleHBlcnQoZXhwZXJ0X3Rva2VucykKICAgICAgICAgICAgZXhwZXJ0X291dC5tdWxfKGZsYXRfZXhwZXJ0X3dlaWdodHNbaWR4c1tzdGFydF9pZHg6ZW5kX2lkeF1dKQogICAgICAgICAgICBleHBlcnRfY2FjaGUuc2NhdHRlcl9yZWR1Y2VfKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCB4LnNoYXBlWy0xXSksCiAgICAgICAgICAgICAgICBleHBlcnRfb3V0LAogICAgICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIGV4cGVydF9jYWNoZQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgpAdG9yY2gubm9fZ3JhZCgpCmRlZiBtb2VfZXhwZXJ0X2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZ2F0ZTogdG9yY2guVGVuc29yLCB3X3VwOiB0b3JjaC5UZW5zb3IsIHdfZG93bjogdG9yY2guVGVuc29yKToKICAgICMgeF9nYXRlID0geCBAIHdfZ2F0ZQogICAgeF9nYXRlID0gRi5saW5lYXIoeCwgd19nYXRlLlQpCiAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQogICAgIyB4X3VwID0geCBAIHdfdXAKICAgIHhfdXAgPSBGLmxpbmVhcih4LCB3X3VwLlQpCiAgICBvdXQgPSB4X2dhdGUgKiB4X3VwCiAgICAjIG91dCA9IG91dCBAIHdfZG93bgogICAgb3V0ID0gRi5saW5lYXIob3V0LCB3X2Rvd24uVCkKICAgIHJldHVybiBvdXQKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0LCBjb25maWc6IERpY3QpOgogICAgbW9lX2dhdGUgPSBNb0VHYXRlX3JlZihjb25maWcpCiAgICBtb2VfZ2F0ZS5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGUoeCkKCiAgICAjIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgIyAgICAgeCwKICAgICMgICAgIHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSwKICAgICMgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdKQoKICAgIG1vZV9zaGFyZWQgPSBFeHBlcnRfcmVmKGNvbmZpZywgZF9leHBlcnQ9Y29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0pCiAgICBtb2Vfc2hhcmVkLldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICBtb2Vfc2hhcmVkLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgbW9lX3NoYXJlZC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQogICAgc2hhcmVkX291dHB1dCA9IG1vZV9zaGFyZWQoeCkKCiAgICAjIHNoYXJlZF9vdXRwdXQgPSBtb2VfZXhwZXJ0X2tlcm5lbCgKICAgICMgICAgIHgsCiAgICAjICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgIyAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSwKICAgICMgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgogICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbSA9IHguc2hhcGUKICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICB4X2ZsYXQgPSB4LnZpZXcoLTEsIGhpZGRlbl9kaW0pCiAgICBmbGF0X2V4cGVydF9pbmRpY2VzID0gZXhwZXJ0X2luZGljZXMudmlldygtMSkKICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCgogICAgZXhwZXJ0X2NhY2hlID0gdG9yY2guemVyb3NfbGlrZSh4X2ZsYXQpCiAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgIGNvdW50cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYmluY291bnQoKS5jcHUoKS5udW1weSgpCiAgICB0b2tlbnNfcGVyX2V4cGVydCA9IGNvdW50cy5jdW1zdW0oKQogICAgbnVtX3Blcl90b2sgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0KToKICAgICAgICBzdGFydF9pZHggPSAwIGlmIGV4cGVydF9pZCA9PSAwIGVsc2UgdG9rZW5zX3Blcl9leHBlcnRbZXhwZXJ0X2lkIC0gMV0KICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgZXhwZXJ0X3Rva2VucyA9IHhfZmxhdFtleHBfdG9rZW5faWR4c10KICAgICAgICBleHBlcnRfb3V0ID0gbW9lX2V4cGVydF9rZXJuZWwoCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMsCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjAud2VpZ2h0J10sCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjEud2VpZ2h0J10sCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjIud2VpZ2h0J10pCiAgICAgICAgZXhwZXJ0X291dC5tdWxfKGZsYXRfZXhwZXJ0X3dlaWdodHNbaWR4c1tzdGFydF9pZHg6ZW5kX2lkeF1dKQogICAgICAgIGV4cGVydF9jYWNoZS5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCB4X2ZsYXQuc2hhcGVbLTFdKSwKICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgKQoKICAgICAgICAjIGlmIGV4cGVydF9pZCA9PSAzMToKICAgICAgICAjICAgICBwcmludChmIm5fcm91dGVkX2V4cGVydHMge2NvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdfSIpCiAgICAgICAgIyAgICAgcmV0dXJuIHNoYXJlZF9vdXRwdXQKICAgIHJvdXRlZF9vdXRwdXQgPSBleHBlcnRfY2FjaGUudmlldygqb3JpZ19zaGFwZSkKICAgICMgaWYgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0gIT0gMzI6CiAgICAjICAgICByZXR1cm4gc2hhcmVkX291dHB1dAogICAgcmV0dXJuIHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIERlZXBTZWVrLXN0eWxlIE1peHR1cmUgb2YgRXhwZXJ0cyB1c2luZyBQeVRvcmNoLgogICAgCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIG9mIChpbnB1dDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwgY29uZmlnOiBEaWN0KQogICAgICAgICAgICAtIGlucHV0OiBJbnB1dCB0ZW5zb3Igb2Ygc2hhcGUgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW1dCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgIyBwcmludChmImJlZ2luIGtlcm5lbCB7dGltZS50aW1lX25zKCl9IikKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgaW5wdXRfdGVuc29yX25ldyA9IF9jbG9uZV9kYXRhKGlucHV0X3RlbnNvcikKICAgIHdlaWdodHNfbmV3ID0gX2Nsb25lX2RhdGEod2VpZ2h0cykKICAgICMgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKCiAgICAjIHByaW50KGYiYmVnaW4gY29weSB7dGltZS50aW1lX25zKCl9IikKCiAgICAjIG1vZS5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGdhdGVfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQogICAgIyAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgIyAgICAgZG93bl9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddCgogICAgIyAgICAgIyBUcmFuc3Bvc2Ugd2VpZ2h0cyB0byBtYXRjaCBleHBlY3RlZCBzaGFwZSBmb3Igbm4uTGluZWFyCiAgICAjICAgICBtb2UuZXhwZXJ0c1tpXS5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGdhdGVfcHJval93ZWlnaHQudCgpKQogICAgIyAgICAgbW9lLmV4cGVydHNbaV0uV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIodXBfcHJval93ZWlnaHQudCgpKQogICAgIyAgICAgbW9lLmV4cGVydHNbaV0uV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihkb3duX3Byb2pfd2VpZ2h0LnQoKSkKCiAgICAjIG1vZS5zaGFyZWRfZXhwZXJ0LldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICAjIG1vZS5zaGFyZWRfZXhwZXJ0LldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgIyBtb2Uuc2hhcmVkX2V4cGVydC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQoKICAgICMgcHJpbnQoZiJiZWdpbiBjb21wdXRlIHt0aW1lLnRpbWVfbnMoKX0iKQogICAgIyBvdXRwdXQgPSBtb2UoaW5wdXRfdGVuc29yKQogICAgIyBwcmludChmImVuZCBjb21wdXRlIHt0aW1lLnRpbWVfbnMoKX0iKQoKICAgIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBvdXRwdXQgPSBtb2Vfa2VybmVsKGlucHV0X3RlbnNvcl9uZXcsIHdlaWdodHNfbmV3LCBjb25maWcpCiAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKCiAgICBpZiBsZW4oZHVyYXRpb25zKSA9PSAwOgogICAgICAgIHByaW50KCkKCiAgICBkdXJhdGlvbnMuYXBwZW5kKGVuZC1zdGFydCkKICAgICMgaWYgbGVuKGR1cmF0aW9ucykgPiAxOgogICAgIyAgICAgc3RhdHMgPSBjYWxjdWxhdGVfc3RhdHMoZHVyYXRpb25zKQogICAgIyAgICAgaWYgc3RhdHMuZXJyIC8gc3RhdHMubWVhbiA8IDAuMDAxIG9yIHN0YXRzLm1lYW4gKiBzdGF0cy5ydW5zID4gMzBlOToKICAgICMgICAgICAgICBkdXJhdGlvbnMuY2xlYXIoKQogICAgIyAgICAgICAgIHByaW50KCJzd2l0Y2ggdGVzdCBjb25mIikKICAgIAogICAgcmV0dXJuIG91dHB1dAoKCiMgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKIyAgICAgZGF0YSA9IGdlbmVyYXRlX2lucHV0KDcxNjgsIDIwNDgsIDEyOCwgMSwgOCwgMSwgMTAyNCwgMTcpCiMgICAgIGN1c3RvbV9rZXJuZWwoZGF0YSkKCiAgICAjIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQoKICAgICMgbW9lX2dhdGUgPSBNb0VHYXRlKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX2dhdGVfcmVmID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgIyBtb2VfZ2F0ZV9yZWYuV19nLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10pCgogICAgIyBvdXRwdXQgPSBtb2VfZ2F0ZShpbnB1dF90ZW5zb3IpCiAgICAjIG91dHB1dF9yZWYgPSBtb2VfZ2F0ZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMF0sIG91dHB1dF9yZWZbMF0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMV0sIG91dHB1dF9yZWZbMV0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMl0sIG91dHB1dF9yZWZbMl0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbM10sIG91dHB1dF9yZWZbM10sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGV4cGVydCA9IEV4cGVydChjb25maWcsIHdlaWdodHMsIEZhbHNlLCBpKQogICAgIyAgICAgZXhwZXJ0X3JlZiA9IEV4cGVydF9yZWYoY29uZmlnKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLnQoKSkKICAgICMgICAgIGV4cGVydF9yZWYuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10udCgpKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLnQoKSkKCiAgICAjICAgICBvdXRwdXQgPSBleHBlcnQoaW5wdXRfdGVuc29yKQogICAgIyAgICAgb3V0cHV0X3JlZiA9IGV4cGVydF9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgICAgIHByaW50KGYiZXhwZXJ0IHtpfSIpCiAgICAjICAgICBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgb3V0cHV0X3JlZiwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX3JlZiA9IE1vRV9yZWYoY29uZmlnKQoKICAgICMgbW9lX3JlZi5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGdhdGVfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQogICAgIyAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgIyAgICAgZG93bl9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddCgogICAgIyAgICAgIyBUcmFuc3Bvc2Ugd2VpZ2h0cyB0byBtYXRjaCBleHBlY3RlZCBzaGFwZSBmb3Igbm4uTGluZWFyCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcihnYXRlX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZV9yZWYuZXhwZXJ0c1tpXS5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih1cF9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihkb3duX3Byb2pfd2VpZ2h0LnQoKSkKCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udCgpKQogICAgIyBtb2VfcmVmLnNoYXJlZF9leHBlcnQuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS50KCkpCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQoKICAgICMgb3V0cHV0ID0gbW9lKGlucHV0X3RlbnNvcikKICAgICMgb3V0cHV0X3JlZiA9IG1vZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXQsIG91dHB1dF9yZWYsIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkK
No newline at end of file
+ aW1wb3J0IHRpbWUsIG1hdGgsIGRhdGFjbGFzc2VzCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgoKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAoKCmRlZiBfY2xvbmVfZGF0YShkYXRhKToKICAgICIiIgogICAgUmVjdXJzaXZlbHkgZ29lcyB0aHJvdWdoIGRhdGEgYW5kIGNsb25lcyBhbGwgdGVuc29ycy4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShkYXRhLCB0dXBsZSk6CiAgICAgICAgcmV0dXJuIHR1cGxlKF9jbG9uZV9kYXRhKHgpIGZvciB4IGluIGRhdGEpCiAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgbGlzdCk6CiAgICAgICAgcmV0dXJuIFtfY2xvbmVfZGF0YSh4KSBmb3IgeCBpbiBkYXRhXQogICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgIHJldHVybiB7azogX2Nsb25lX2RhdGEodikgZm9yIGssIHYgaW4gZGF0YS5pdGVtcygpfQogICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIHRvcmNoLlRlbnNvcik6CiAgICAgICAgcmV0dXJuIGRhdGEuY2xvbmUoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gZGF0YQoKZHVyYXRpb25zID0gW10KCkBkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKY2xhc3MgU3RhdHM6CiAgICBydW5zOiBpbnQKICAgIG1lYW46IGZsb2F0CiAgICBzdGQ6IGZsb2F0CiAgICBlcnI6IGZsb2F0CiAgICBiZXN0OiBmbG9hdAogICAgd29yc3Q6IGZsb2F0CgpkZWYgY2FsY3VsYXRlX3N0YXRzKGR1cmF0aW9uczogbGlzdFtpbnRdKToKICAgICIiIgogICAgQ2FsY3VsYXRlIHN0YXRpc3RpY2FsIGRhdGEgZnJvbSBhIGxpc3Qgb2YgZHVyYXRpb25zLgoKICAgIEBwYXJhbSBkdXJhdGlvbnM6IEEgbGlzdCBvZiBkdXJhdGlvbnMgaW4gbmFub3NlY29uZHMuCiAgICBAcmV0dXJuOiBBIFN0YXRzIG9iamVjdCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgcnVucywgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBlcnJvciwgYmVzdCwgYW5kIHdvcnN0IGR1cmF0aW9ucy4KICAgICIiIgogICAgcnVucyA9IGxlbihkdXJhdGlvbnMpCiAgICB0b3RhbCA9IHN1bShkdXJhdGlvbnMpCiAgICBiZXN0ID0gbWluKGR1cmF0aW9ucykKICAgIHdvcnN0ID0gbWF4KGR1cmF0aW9ucykKCiAgICBhdmcgPSB0b3RhbCAvIHJ1bnMKICAgIHZhcmlhbmNlID0gc3VtKG1hcChsYW1iZGEgeDogKHggLSBhdmcpKioyLCBkdXJhdGlvbnMpKQogICAgc3RkID0gbWF0aC5zcXJ0KHZhcmlhbmNlIC8gKHJ1bnMgLSAxKSkKICAgIGVyciA9IHN0ZCAvIG1hdGguc3FydChydW5zKQoKICAgIHJldHVybiBTdGF0cyhydW5zPXJ1bnMsIG1lYW49YXZnLCBzdGQ9c3RkLCBlcnI9ZXJyLCBiZXN0PWZsb2F0KGJlc3QpLAogICAgICAgICAgICAgICAgIHdvcnN0PWZsb2F0KHdvcnN0KSkKCgpjbGFzcyBFeHBlcnRfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCBkX2V4cGVydDogT3B0aW9uYWxbaW50XSA9IE5vbmUpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5hY3RfZm4gPSBubi5TaUxVKCkKICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0gaWYgZF9leHBlcnQgaXMgTm9uZSBlbHNlIGRfZXhwZXJ0CgogICAgICAgIHNlbGYuV19nYXRlID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX3VwID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kX2V4cGVydCwgc2VsZi5kX2hpZGRlbiwgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBnYXRlID0gc2VsZi5hY3RfZm4oc2VsZi5XX2dhdGUoeCkpCiAgICAgICAgb3V0ID0gc2VsZi5XX2Rvd24oZ2F0ZSAqIHNlbGYuV191cCh4KSkKICAgICAgICByZXR1cm4gb3V0CgoKY2xhc3MgTW9FR2F0ZV9yZWYobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wX2s6IGludCA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgc2VsZi5udW1fZXhwZXJ0czogaW50ID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KCiAgICAgICAgc2VsZi5XX2cgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5udW1fZXhwZXJ0cywgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSBzZWxmLldfZyh4KQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCiAgICAgICAgIyByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcywgbG9naXRzLCBzY29yZXMKCgpjbGFzcyBNb0VfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICBFeHBlcnRfcmVmKGNvbmZpZykKICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pCiAgICAgICAgXSkKICAgICAgICBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgICAgIHNoYXJlZF9leHBlcnRfZGltID0gY29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnRfcmVmKGNvbmZpZz1jb25maWcsIGRfZXhwZXJ0PXNoYXJlZF9leHBlcnRfZGltKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKICAgIAoKIyBjbGFzcyBFeHBlcnQobm4uTW9kdWxlKToKIyAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgd2VpZ2h0czogRGljdCwgc2hhcmVkOiBib29sLCBpOiBpbnQpOgojICAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiMgICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwojICAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiMgICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0KCiMgICAgICAgICBpZiBzaGFyZWQ6CiMgICAgICAgICAgICAgc2VsZi5XX2dhdGUgPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgICAgIHNlbGYuV191cCAgID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfZG93biA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICBlbHNlOgojICAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS50KCkuY2xvbmUoKQoKIyAgICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiMgICAgICAgICB4X2dhdGUgPSBGLmxpbmVhcih4LCBzZWxmLldfZ2F0ZSkKIyAgICAgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgICAgICB4X3VwID0gRi5saW5lYXIoeCwgc2VsZi5XX3VwKQojICAgICAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICAgICAgb3V0ID0gRi5saW5lYXIob3V0LCBzZWxmLldfZG93bikKCiMgICAgICAgICByZXR1cm4gb3V0CgpjbGFzcyBFeHBlcnQobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QsIHNoYXJlZDogYm9vbCwgaTogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQogICAgICAgIHNlbGYuZF9leHBlcnQ6IGludCA9IGNvbmZpZ1siZF9leHBlcnQiXQoKICAgICAgICBpZiBzaGFyZWQ6CiAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5XX2dhdGUgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgICAgIHNlbGYuV191cCAgID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfZG93biA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLmNsb25lKCkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4X2dhdGUgPSB4IEAgc2VsZi5XX2dhdGUKICAgICAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQogICAgICAgIHhfdXAgPSB4IEAgc2VsZi5XX3VwCiAgICAgICAgb3V0ID0geF9nYXRlICogeF91cAogICAgICAgIG91dCA9IG91dCBAIHNlbGYuV19kb3duCgogICAgICAgIHJldHVybiBvdXQKCgpjbGFzcyBNb0VHYXRlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgICAgIHNlbGYuV19nID0gd2VpZ2h0c1sncm91dGVyLndlaWdodCddLmNsb25lKCkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICAjIGxvZ2l0cyA9IHggQCBzZWxmLldfZwogICAgICAgIGxvZ2l0cyA9IEYubGluZWFyKHgsIHNlbGYuV19nKQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCiAgICAgICAgIyByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcywgbG9naXRzLCBzY29yZXMKCgpjbGFzcyBNb0Uobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5leHBlcnRzID0gbm4uTW9kdWxlTGlzdChbCiAgICAgICAgICAgICMgRXhwZXJ0X3JlZihjb25maWcpCiAgICAgICAgICAgIEV4cGVydChjb25maWcsIHdlaWdodHMsIEZhbHNlLCBpKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSkKICAgICAgICBdKQogICAgICAgIHNlbGYuZ2F0aW5nX25ldHdvcmsgPSBNb0VHYXRlX3JlZihjb25maWcpCiAgICAgICAgIyBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZShjb25maWcsIHdlaWdodHMpCiAgICAgICAgc2hhcmVkX2V4cGVydF9kaW0gPSBjb25maWdbImRfZXhwZXJ0Il0gKiBjb25maWdbIm5fc2hhcmVkX2V4cGVydHMiXQogICAgICAgIHNlbGYuc2hhcmVkX2V4cGVydCA9IEV4cGVydF9yZWYoY29uZmlnLCBkX2V4cGVydD1zaGFyZWRfZXhwZXJ0X2RpbSkKICAgICAgICAjIHNlbGYuc2hhcmVkX2V4cGVydCA9IEV4cGVydChjb25maWcsIHdlaWdodHMsIFRydWUsIDApCgogICAgQHRvcmNoLm5vX2dyYWQoKQogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2hhcmVkX291dHB1dCA9IHNlbGYuc2hhcmVkX2V4cGVydCh4KQogICAgICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gc2VsZi5nYXRpbmdfbmV0d29yayh4KQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW0gPSB4LnNoYXBlCiAgICAgICAgb3JpZ19zaGFwZSA9IHguc2hhcGUKICAgICAgICB4X2ZsYXQgPSB4LnZpZXcoLTEsIGhpZGRlbl9kaW0pCiAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcyA9IGV4cGVydF9pbmRpY2VzLnZpZXcoLTEpCiAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cyA9IGV4cGVydF9zY29yZXMudmlldygtMSwgMSkKICAgICAgICByb3V0ZWRfb3V0cHV0X2ZsYXQgPSBzZWxmLm1vZV9pbmZlcih4X2ZsYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzKQoKICAgICAgICByb3V0ZWRfb3V0cHV0ID0gcm91dGVkX291dHB1dF9mbGF0LnZpZXcoKm9yaWdfc2hhcGUpCiAgICAgICAgcmV0dXJuIHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgogICAgQHRvcmNoLm5vX2dyYWQoKQogICAgZGVmIG1vZV9pbmZlcihzZWxmLAogICAgICAgICAgICAgICAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0czogdG9yY2guVGVuc29yCiAgICAgICAgICAgICAgICAgKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZXhwZXJ0X2NhY2hlID0gdG9yY2guemVyb3NfbGlrZSh4KQogICAgICAgIGlkeHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmFyZ3NvcnQoKQogICAgICAgIGNvdW50cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYmluY291bnQoKS5jcHUoKS5udW1weSgpCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnQgPSBjb3VudHMuY3Vtc3VtKCkKICAgICAgICBudW1fcGVyX3RvayA9IHNlbGYuY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgICAgICB0b2tlbl9pZHhzID0gaWR4cyAvLyBudW1fcGVyX3RvawogICAgICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0KToKICAgICAgICAgICAgc3RhcnRfaWR4ID0gMCBpZiBleHBlcnRfaWQgPT0gMCBlbHNlIHRva2Vuc19wZXJfZXhwZXJ0W2V4cGVydF9pZCAtIDFdCiAgICAgICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGV4cGVydCA9IHNlbGYuZXhwZXJ0c1tleHBlcnRfaWRdCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzID0gdG9rZW5faWR4c1tzdGFydF9pZHg6ZW5kX2lkeF0KICAgICAgICAgICAgZXhwZXJ0X3Rva2VucyA9IHhbZXhwX3Rva2VuX2lkeHNdCiAgICAgICAgICAgIGV4cGVydF9vdXQgICAgPSBleHBlcnQoZXhwZXJ0X3Rva2VucykKICAgICAgICAgICAgZXhwZXJ0X291dC5tdWxfKGZsYXRfZXhwZXJ0X3dlaWdodHNbaWR4c1tzdGFydF9pZHg6ZW5kX2lkeF1dKQogICAgICAgICAgICBleHBlcnRfY2FjaGUuc2NhdHRlcl9yZWR1Y2VfKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCB4LnNoYXBlWy0xXSksCiAgICAgICAgICAgICAgICBleHBlcnRfb3V0LAogICAgICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIGV4cGVydF9jYWNoZQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgpAdG9yY2gubm9fZ3JhZCgpCmRlZiBtb2VfZXhwZXJ0X2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZ2F0ZTogdG9yY2guVGVuc29yLCB3X3VwOiB0b3JjaC5UZW5zb3IsIHdfZG93bjogdG9yY2guVGVuc29yKToKICAgICMgeF9nYXRlID0geCBAIHdfZ2F0ZQogICAgeF9nYXRlID0gRi5saW5lYXIoeCwgd19nYXRlLlQpCiAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQogICAgIyB4X3VwID0geCBAIHdfdXAKICAgIHhfdXAgPSBGLmxpbmVhcih4LCB3X3VwLlQpCiAgICBvdXQgPSB4X2dhdGUgKiB4X3VwCiAgICAjIG91dCA9IG91dCBAIHdfZG93bgogICAgb3V0ID0gRi5saW5lYXIob3V0LCB3X2Rvd24uVCkKICAgIHJldHVybiBvdXQKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0LCBjb25maWc6IERpY3QpOgogICAgbW9lX2dhdGUgPSBNb0VHYXRlX3JlZihjb25maWcpCiAgICBtb2VfZ2F0ZS5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGUoeCkKCiAgICAjIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgIyAgICAgeCwKICAgICMgICAgIHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSwKICAgICMgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdKQoKICAgIG1vZV9zaGFyZWQgPSBFeHBlcnRfcmVmKGNvbmZpZywgZF9leHBlcnQ9Y29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0pCiAgICBtb2Vfc2hhcmVkLldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICBtb2Vfc2hhcmVkLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgbW9lX3NoYXJlZC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQogICAgc2hhcmVkX291dHB1dCA9IG1vZV9zaGFyZWQoeCkKCiAgICAjIHNoYXJlZF9vdXRwdXQgPSBtb2VfZXhwZXJ0X2tlcm5lbCgKICAgICMgICAgIHgsCiAgICAjICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgIyAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSwKICAgICMgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgogICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbSA9IHguc2hhcGUKICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICB4X2ZsYXQgPSB4LnZpZXcoLTEsIGhpZGRlbl9kaW0pCiAgICBmbGF0X2V4cGVydF9pbmRpY2VzID0gZXhwZXJ0X2luZGljZXMudmlldygtMSkKICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCgogICAgZXhwZXJ0X2NhY2hlID0gdG9yY2guemVyb3NfbGlrZSh4X2ZsYXQpCiAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgIGNvdW50cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYmluY291bnQoKS5jcHUoKS5udW1weSgpCiAgICB0b2tlbnNfcGVyX2V4cGVydCA9IGNvdW50cy5jdW1zdW0oKQogICAgbnVtX3Blcl90b2sgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0KToKICAgICAgICBzdGFydF9pZHggPSAwIGlmIGV4cGVydF9pZCA9PSAwIGVsc2UgdG9rZW5zX3Blcl9leHBlcnRbZXhwZXJ0X2lkIC0gMV0KICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgZXhwZXJ0X3Rva2VucyA9IHhfZmxhdFtleHBfdG9rZW5faWR4c10KICAgICAgICBleHBlcnRfb3V0ID0gbW9lX2V4cGVydF9rZXJuZWwoCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMsCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjAud2VpZ2h0J10sCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjEud2VpZ2h0J10sCiAgICAgICAgICAgIHdlaWdodHNbZidleHBlcnRzLntleHBlcnRfaWR9LjIud2VpZ2h0J10pCiAgICAgICAgZXhwZXJ0X291dC5tdWxfKGZsYXRfZXhwZXJ0X3dlaWdodHNbaWR4c1tzdGFydF9pZHg6ZW5kX2lkeF1dKQogICAgICAgIGV4cGVydF9jYWNoZS5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCB4X2ZsYXQuc2hhcGVbLTFdKSwKICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgKQoKICAgICAgICAjIGlmIGV4cGVydF9pZCA9PSAzMToKICAgICAgICAjICAgICBwcmludChmIm5fcm91dGVkX2V4cGVydHMge2NvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdfSIpCiAgICAgICAgIyAgICAgcmV0dXJuIHNoYXJlZF9vdXRwdXQKICAgIHJvdXRlZF9vdXRwdXQgPSBleHBlcnRfY2FjaGUudmlldygqb3JpZ19zaGFwZSkKICAgICMgaWYgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0gIT0gMzI6CiAgICAjICAgICByZXR1cm4gc2hhcmVkX291dHB1dAogICAgcmV0dXJuIHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIERlZXBTZWVrLXN0eWxlIE1peHR1cmUgb2YgRXhwZXJ0cyB1c2luZyBQeVRvcmNoLgogICAgCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIG9mIChpbnB1dDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwgY29uZmlnOiBEaWN0KQogICAgICAgICAgICAtIGlucHV0OiBJbnB1dCB0ZW5zb3Igb2Ygc2hhcGUgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW1dCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgIyBwcmludChmImJlZ2luIGtlcm5lbCB7dGltZS50aW1lX25zKCl9IikKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgIyBtb2UgPSBNb0UoY29uZmlnLCB3ZWlnaHRzKQoKICAgICMgcHJpbnQoZiJiZWdpbiBjb3B5IHt0aW1lLnRpbWVfbnMoKX0iKQoKICAgICMgbW9lLmdhdGluZ19uZXR3b3JrLldfZy53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1sncm91dGVyLndlaWdodCddKQoKICAgICMgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pOgogICAgIyAgICAgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAjICAgICB1cF9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddCiAgICAjICAgICBkb3duX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10KCiAgICAjICAgICAjIFRyYW5zcG9zZSB3ZWlnaHRzIHRvIG1hdGNoIGV4cGVjdGVkIHNoYXBlIGZvciBubi5MaW5lYXIKICAgICMgICAgIG1vZS5leHBlcnRzW2ldLldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoZ2F0ZV9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2UuZXhwZXJ0c1tpXS5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih1cF9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2UuZXhwZXJ0c1tpXS5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGRvd25fcHJval93ZWlnaHQudCgpKQoKICAgICMgbW9lLnNoYXJlZF9leHBlcnQuV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLnQoKSkKICAgICMgbW9lLnNoYXJlZF9leHBlcnQuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS50KCkpCiAgICAjIG1vZS5zaGFyZWRfZXhwZXJ0LldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkpCgogICAgIyBwcmludChmImJlZ2luIGNvbXB1dGUge3RpbWUudGltZV9ucygpfSIpCiAgICAjIG91dHB1dCA9IG1vZShpbnB1dF90ZW5zb3IpCiAgICAjIHByaW50KGYiZW5kIGNvbXB1dGUge3RpbWUudGltZV9ucygpfSIpCgogICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG91dHB1dCA9IG1vZV9rZXJuZWwoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcpCiAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKCiAgICBpZiBsZW4oZHVyYXRpb25zKSA9PSAwOgogICAgICAgIHByaW50KCkKCiAgICBkdXJhdGlvbnMuYXBwZW5kKGVuZC1zdGFydCkKICAgICMgaWYgbGVuKGR1cmF0aW9ucykgPiAxOgogICAgIyAgICAgc3RhdHMgPSBjYWxjdWxhdGVfc3RhdHMoZHVyYXRpb25zKQogICAgIyAgICAgaWYgc3RhdHMuZXJyIC8gc3RhdHMubWVhbiA8IDAuMDAxIG9yIHN0YXRzLm1lYW4gKiBzdGF0cy5ydW5zID4gMzBlOToKICAgICMgICAgICAgICBkdXJhdGlvbnMuY2xlYXIoKQogICAgIyAgICAgICAgIHByaW50KCJzd2l0Y2ggdGVzdCBjb25mIikKICAgIAogICAgcmV0dXJuIG91dHB1dAoKCiMgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKIyAgICAgZGF0YSA9IGdlbmVyYXRlX2lucHV0KDcxNjgsIDIwNDgsIDEyOCwgMSwgOCwgMSwgMTAyNCwgMTcpCiMgICAgIGN1c3RvbV9rZXJuZWwoZGF0YSkKCiAgICAjIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQoKICAgICMgbW9lX2dhdGUgPSBNb0VHYXRlKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX2dhdGVfcmVmID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgIyBtb2VfZ2F0ZV9yZWYuV19nLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10pCgogICAgIyBvdXRwdXQgPSBtb2VfZ2F0ZShpbnB1dF90ZW5zb3IpCiAgICAjIG91dHB1dF9yZWYgPSBtb2VfZ2F0ZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMF0sIG91dHB1dF9yZWZbMF0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMV0sIG91dHB1dF9yZWZbMV0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMl0sIG91dHB1dF9yZWZbMl0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbM10sIG91dHB1dF9yZWZbM10sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGV4cGVydCA9IEV4cGVydChjb25maWcsIHdlaWdodHMsIEZhbHNlLCBpKQogICAgIyAgICAgZXhwZXJ0X3JlZiA9IEV4cGVydF9yZWYoY29uZmlnKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLnQoKSkKICAgICMgICAgIGV4cGVydF9yZWYuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10udCgpKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLnQoKSkKCiAgICAjICAgICBvdXRwdXQgPSBleHBlcnQoaW5wdXRfdGVuc29yKQogICAgIyAgICAgb3V0cHV0X3JlZiA9IGV4cGVydF9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgICAgIHByaW50KGYiZXhwZXJ0IHtpfSIpCiAgICAjICAgICBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgb3V0cHV0X3JlZiwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX3JlZiA9IE1vRV9yZWYoY29uZmlnKQoKICAgICMgbW9lX3JlZi5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGdhdGVfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQogICAgIyAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgIyAgICAgZG93bl9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddCgogICAgIyAgICAgIyBUcmFuc3Bvc2Ugd2VpZ2h0cyB0byBtYXRjaCBleHBlY3RlZCBzaGFwZSBmb3Igbm4uTGluZWFyCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcihnYXRlX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZV9yZWYuZXhwZXJ0c1tpXS5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih1cF9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihkb3duX3Byb2pfd2VpZ2h0LnQoKSkKCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udCgpKQogICAgIyBtb2VfcmVmLnNoYXJlZF9leHBlcnQuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS50KCkpCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQoKICAgICMgb3V0cHV0ID0gbW9lKGlucHV0X3RlbnNvcikKICAgICMgb3V0cHV0X3JlZiA9IG1vZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXQsIG91dHB1dF9yZWYsIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkK
No newline at end of file

Best evidence level for this revision: reported

JSON