amd-mixture-of-experts · submission 29858
KernelBot user 302 · 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.
moe_v4_clean.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-29858?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
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:63840fc0535039bd35cfe7486bfd765d7aa2d63387b740d0ea958d1eea587b98
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
moe_v4_clean.py1 lines
aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICAjIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgIyBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoQkxPQ0tfTSwgQkxPQ0tfSykKICAgICAgICBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFjY3VtICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKICAgIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKCkB0cml0b24uaml0CmRlZiBzd2lnbHUoeCwgeSk6CiAgICBsb2dfMl9lOiB0bC5jb25zdGV4cHIgPSAxLjQ0MjY5NTA0MQogICAgZXhwX3ggPSB0bC5leHAyKCAtbG9nXzJfZSAqIHgpCiAgICByZXR1cm4gMS4gLyAoMS4gKyBleHBfeCkgKiB4ICogeQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKICAgIApAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHVfc2h1ZmZsZSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICg4LCB0cml0b24uY2RpdihuLCBCTE9DS19OKSwgY2RpdihtYXhfbSwgQkxPQ0tfTSkgKiBjZGl2KGdyb3VwX3NpemUsIDgpKQogICAgWENEX0NOVCA9IDgKICAgIG1fYmxvY2tfY250ID0gdGwuY2RpdihtYXhfbSwgQkxPQ0tfTSkKICAgIAogICAgCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMCkgKyB0bC5wcm9ncmFtX2lkKDIpIC8vIG1fYmxvY2tfY250ICogWENEX0NOVAogICAgbl9zdGFydCA9IHRsLnByb2dyYW1faWQoMSkgKiBCTE9DS19OCiAgICBtX2lkID0gdGwucHJvZ3JhbV9pZCgyKSAlIG1fYmxvY2tfY250CiAgICAKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgIyBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazAgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMCwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKQogICAgICAgIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsICkKICAgICAgICBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCApCiAgICAgICAgYWNjdW0wICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMCkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhY2N1bTEgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2sxKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIwID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjAsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgICAgIGJfYmxvY2tfcHRyMSA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIxLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIG91dCA9IHN3aWdsdShhY2N1bTAsIGFjY3VtMSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgb3V0LnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX1NJWkUiOiAxMDI0ICogOCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKSAgICAgICAgICAgCkB0cml0b24uaml0CmRlZiB3ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgZmZuMV9vdXQsCiAgICB0b2tlbjJpbmRleCwKICAgIHRvcGtfc2NvcmVzLAogICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgbW9lX291dCwKICAgIGRfaGlkZGVuLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBmZm4xX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyB0b3BrX3Njb3JlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBzaGFyZWRfZXhwZXJ0X2ZmbjE6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBtb2Vfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pCiAgICAKICAgIHNlZ21lbnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgdG9rZW5faWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgc2VnbWVudF9pZHggKiBCTE9DS19TSVpFCiAgICBtYXNrID0gb2Zmc2V0cyA8IGRfaGlkZGVuCiAgICAKICAgIGRhdGEgPSB0bC5sb2FkKAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShuX2V4cGVydHNfcGVyX3Rva2VuKToKICAgICAgICB3ZWlnaHQgPSB0bC5sb2FkKHRvcGtfc2NvcmVzICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgaW5kZXggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgZmZuMV9vdXRfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBmZm4xX291dCArIGluZGV4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIGRhdGEgKz0gd2VpZ2h0ICogZmZuMV9vdXRfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIG1vZV9vdXQgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgZGF0YSwKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgIAojIGNvbmZpZzogeydkX2hpZGRlbic6IDcxNjgsICdkX2V4cGVydCc6IDIwNDgsICduX3JvdXRlZF9leHBlcnRzJzogMzIsICduX3NoYXJlZF9leHBlcnRzJzogMSwgJ25fZXhwZXJ0c19wZXJfdG9rZW4nOiA0LCAnYmF0Y2hfc2l6ZSc6IDEsICdzZXFfbGVuJzogMjA0OH0KIyBpbnB1dF90ZW5zb3IgbGF5b3V0OiAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuICogc2VxX2xlbiwgZF9oaWRkZW4sIDEpCiMgcm91dGVyLndlaWdodCBsYXlvdXQ6IChuX3JvdXRlZF9leHBlcnRzLCAgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIGV4cGVydHMue2l9LjAud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMS53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0KSA6IChkX2V4cGVydCwgMSkKIyBleHBlcnRzLntpfS4yLndlaWdodCBsYXlvdXQ6IChkX2V4cGVydCwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpIDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCgpjbGFzcyBUaW1lcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbDogc3RyKToKICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5lbmRfdGltZSA9IE5vbmUKICAgICAgICBzZWxmLmludGVydmFsID0gTm9uZQogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAjIHNlbGYuc3RhcnQgPSB0aW1lLnRpbWUoKQogICAgICAgIHJldHVybiBzZWxmCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAgICAgIyBzZWxmLmVuZCA9IHRpbWUudGltZSgpCiAgICAgICAgIyBzZWxmLmludGVydmFsID0gKHNlbGYuZW5kIC0gc2VsZi5zdGFydCkgKiAxMDAwICMgaW4gbXMKICAgICAgICAjIHByaW50KGYie3NlbGYubGFiZWx9OiB7c2VsZi5pbnRlcnZhbDouNGZ9IG1zIikKICAgICAgICByZXR1cm4gRmFsc2UKZGVmIG1vZV9mb3J3YXJkKAogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IsCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwKICAgIGRfaGlkZGVuOiBpbnQsCiAgICBkX2V4cGVydDogaW50LAogICAgbl9yb3V0ZWRfZXhwZXJ0czogaW50LAogICAgbl9zaGFyZWRfZXhwZXJ0czogaW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbjogaW50LAogICAgYmF0Y2hfc2l6ZTogaW50LAogICAgc2VxX2xlbjogaW50CikgLT4gdG9yY2guVGVuc29yOgogICAgaW5wdXRfdGVuc29yID0gaW5wdXRfdGVuc29yLnJlc2hhcGUoLTEsIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgVE9ETzogdXNlIGN1ZGEgZ3JhcGg/CiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHRlbnNvciB0aW1lciIpIGFzIHQ6CiAgICAgICAgIyBBbGxvY2F0ZSB0ZW5zb3IgCiAgICAgICAgIyBUT0RPOiBwcmVhbGxvY2F0ZSB0ZW5zb3IKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShzaXplPShuX3JvdXRlZF9leHBlcnRzLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guemVyb3Moc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIAogICAgICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICAgICAjIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgIyBmZm4wX3JocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgZmZuMV9vdXQgPSB0b3JjaC5lbXB0eV9saWtlKHJlcGVhdGVkX3Rva2VucykKICAgICAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCiAgICAjIFRPRE86IG11bHRpIHN0cmVhbQogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgICAgIGJfcHRycyA9IHRvcmNoLnRlbnNvcigKICAgICAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSArCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgICAgICkKICAgICAgICBiX3B0cnMwID0gYl9wdHJzWzpuX3JvdXRlZF9leHBlcnRzXQogICAgICAgIGJfcHRyczEgPSBiX3B0cnNbbl9yb3V0ZWRfZXhwZXJ0czoyKm5fcm91dGVkX2V4cGVydHNdCiAgICAgICAgYl9wdHJzMiA9IGJfcHRyc1syKm5fcm91dGVkX2V4cGVydHM6XQoKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzaGFyZWQgZXhwZXJ0IHRpbWVyIikgYXMgdDoKICAgICAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICAgICAgc2hhcmVkX2V4cGVydF93ZWlnaHQxID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSAjIChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10gIyAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICAgICAjIFRPRE86IGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgIyBUT0RPOiBzaGFyZWQgZXhwZXJ0IGluIGEgc2VwYXJhdGUgc3RyZWFtPwogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgPSBzaGFyZWRfZXhwZXJ0X2ZmbjAgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHJvdXRlciB0aW1lciIpIGFzIHQ6CiAgICAgICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgbG9naXRzID0gdG9yY2gubWF0bXVsKGlucHV0X3RlbnNvciwgcm91dGVyX3dlaWdodC50KCkpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgICAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgbl9leHBlcnRzX3Blcl90b2tlbiwgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSAgICAKCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAgICAgIyBleHBlcnQydG9rZW5fY291bnQgKG5fcm91dGVkX2V4cGVydHMsKQogICAgICAgICMgd2l0aGluX2V4cGVydF9pbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICAgICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgICAgIGJhdGNoX3NpemUgKiBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICkKICAgICAgICAjIHRva2VuMmluZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgICAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgKQoKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2NhdHRlciB0aW1lciIpIGFzIHQ6CiAgICAgICAgc2NhdHRlclsgKG5fZXhwZXJ0c19wZXJfdG9rZW4sIHNlcV9sZW4sIGJhdGNoX3NpemUpIF0oCiAgICAgICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHJlcGVhdGVkX3Rva2VucywKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgZF9oaWRkZW4sCiAgICAgICAgKQogICAgCiAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjAgdGltZXIiKSBhcyB0OiAgICAKICAgICAgICBncm91cF9nZW1tX1N3aUdsdVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzMCA9IGJfcHRyczAsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzMSA9IGJfcHRyczEsCiAgICAgICAgICAgIGMgPSBmZm4wX291dCwKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IG1heF9tLAogICAgICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgICAgIGsgPSBkX2hpZGRlbiwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjEgdGltZXIiKSBhcyB0OgogICAgICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gZmZuMF9vdXQsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMiwKICAgICAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGsgPSBkX2V4cGVydCwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHdlaWdodGVkIHN1bSBnYXRoZXIgdGltZXIiKSBhcyB0OgogICAgICAgIHdlaWdodGVkX3N1bV9nYXRoZXJbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX1NJWkUiXSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKV0oCiAgICAgICAgICAgIGZmbjFfb3V0LAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgdG9wa19zY29yZXMsCiAgICAgICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICAgICAgbW9lX291dCwKICAgICAgICAgICAgZF9oaWRkZW4sCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgICMgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgICAgICkKICAgICMgc2xlZXAgOCBtcyAKICAgICMgYmVuY2htYXJrIHN1Y2tzICEKICAgICMgdGltZS5zbGVlcCgwLjAwOCkKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBvdXRwdXQgPSBtb2VfZm9yd2FyZChpbnB1dF90ZW5zb3IsIHdlaWdodHMsICoqY29uZmlnKQogICAgcmV0dXJuIG91dHB1dAo=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 26179.
- aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgIGJfYmxvY2sgPSB0bC5sb2FkKGJfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYWNjdW0gKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2spICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGFfYmxvY2tfcHRyLCBvZmZzZXRzPSgwLCBCTE9DS19LKSkKICAgICAgICBiX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgIyB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgYWNjdW0udG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQoKQHRyaXRvbi5qaXQKZGVmIHN3aWdsdSh4LCB5KToKICAgIGxvZ18yX2U6IHRsLmNvbnN0ZXhwciA9IDEuNDQyNjk1MDQxCiAgICBleHBfeCA9IHRsLmV4cDIoIC1sb2dfMl9lICogeCkKICAgIHJldHVybiAxLiAvICgxLiArIGV4cF94KSAqIHggKiB5CkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogNjQsCiAgICAgICAgICAgICAgICAiQkxPQ0tfSyI6IDMyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9OCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgICksCiAgICBdLAogICAga2V5PVtdLAopCkB0cml0b24uaml0CmRlZiBncm91cF9nZW1tX1N3aUdsdSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogMTAyNCAqIDgsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikgICAgICAgICAgIApAdHJpdG9uLmppdApkZWYgd2VpZ2h0ZWRfc3VtX2dhdGhlcigKICAgIGZmbjFfb3V0LAogICAgdG9rZW4yaW5kZXgsCiAgICB0b3BrX3Njb3JlcywKICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgIG1vZV9vdXQsCiAgICBkX2hpZGRlbiwKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKQogICAgCiAgICBzZWdtZW50X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHRva2VuX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIHNlZ21lbnRfaWR4ICogQkxPQ0tfU0laRQogICAgbWFzayA9IG9mZnNldHMgPCBkX2hpZGRlbgogICAgCiAgICBkYXRhID0gdGwubG9hZCgKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2Uobl9leHBlcnRzX3Blcl90b2tlbik6CiAgICAgICAgd2VpZ2h0ID0gdGwubG9hZCh0b3BrX3Njb3JlcyArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGluZGV4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGZmbjFfb3V0X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgZmZuMV9vdXQgKyBpbmRleCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICBkYXRhICs9IHdlaWdodCAqIGZmbjFfb3V0X2Jsb2NrCiAgICB0bC5zdG9yZSgKICAgICAgICBtb2Vfb3V0ICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIGRhdGEsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQoKY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCmRlZiBtb2VfZm9yd2FyZCgKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yLAogICAgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sCiAgICBkX2hpZGRlbjogaW50LAogICAgZF9leHBlcnQ6IGludCwKICAgIG5fcm91dGVkX2V4cGVydHM6IGludCwKICAgIG5fc2hhcmVkX2V4cGVydHM6IGludCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW46IGludCwKICAgIGJhdGNoX3NpemU6IGludCwKICAgIHNlcV9sZW46IGludAopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGlucHV0X3RlbnNvciA9IGlucHV0X3RlbnNvci5yZXNoYXBlKC0xLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHRlbnNvciB0aW1lciIpIGFzIHQ6CiAgICAjIEFsbG9jYXRlIHRlbnNvciAKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShzaXplPShuX3JvdXRlZF9leHBlcnRzLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guemVyb3Moc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIAogICAgICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICAgICAjIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgIyBmZm4wX3JocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgZmZuMV9vdXQgPSB0b3JjaC5lbXB0eV9saWtlKHJlcGVhdGVkX3Rva2VucykKICAgICAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgICAgIGJfcHRyczAgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczEgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczIgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQoKICAgIAogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgcm91dGVyIHRpbWVyIikgYXMgdDoKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgbG9naXRzID0gdG9yY2gubWF0bXVsKGlucHV0X3RlbnNvciwgcm91dGVyX3dlaWdodC50KCkpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgICAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgbl9leHBlcnRzX3Blcl90b2tlbiwgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSAgICAKCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgICMgVE9ETzogc2hhcmVkIGV4cGVydCBpbiBhIHNlcGFyYXRlIHN0cmVhbT8KICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2hhcmVkIGV4cGVydCB0aW1lciIpIGFzIHQ6CiAgICAgICAgc2hhcmVkX2V4cGVydF9mZm4wID0gRi5zaWx1KGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MCkgKiAoaW5wdXRfdGVuc29yIEAgc2hhcmVkX2V4cGVydF93ZWlnaHQxKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBjYWxjdWxhdGUgaW5kZXggdGltZXIiKSBhcyB0OgogICAgICAgICMgZXhwZXJ0MnRva2VuX2NvdW50IChuX3JvdXRlZF9leHBlcnRzLCkKICAgICAgICAjIHdpdGhpbl9leHBlcnRfaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgICAgIGNhbGN1bGF0ZV9leHBlcnQydG9rZW5fY291bnRfYW5kX3dpdGhpbl9leHBlcnRfaW5kZXhbIChuX3JvdXRlZF9leHBlcnRzLCApIF0oCiAgICAgICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgICAgICBiYXRjaF9zaXplICogc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICApCiAgICAgICAgIyB0b2tlbjJpbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICAgICAgY2FsY3VsYXRlX3Rva2VuMmluZGV4WyBsYW1iZGEgbWV0YSA6ICh0cml0b24uY2RpdihiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIG1ldGFbIkJMT0NLX1NJWkUiXSksKSBdKAogICAgICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIGJhdGNoX3NpemUgKiBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICkKCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHNjYXR0ZXIgdGltZXIiKSBhcyB0OgogICAgICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgICAgIHRva2VuMmluZGV4LAogICAgICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIGRfaGlkZGVuLAogICAgICAgICkKICAgIAogICAgbWF4X20gPSBiYXRjaF9zaXplICogc2VxX2xlbgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIHRpbWVyIikgYXMgdDogICAgCiAgICAgICAgZ3JvdXBfZ2VtbV9Td2lHbHVbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgICAgICBiX2Jhc2VfcHRyczAgPSBiX3B0cnMwLAogICAgICAgICAgICBiX2Jhc2VfcHRyczEgPSBiX3B0cnMxLAogICAgICAgICAgICBjID0gZmZuMF9vdXQsCiAgICAgICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICAgICAgbWF4X20gPSBtYXhfbSwKICAgICAgICAgICAgbiA9IGRfZXhwZXJ0LAogICAgICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4xIHRpbWVyIikgYXMgdDoKICAgICAgICBncm91cF9nZW1tWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19OIl0pLCB0cml0b24uY2RpdihtYXhfbSwgbWV0YVsiQkxPQ0tfTSJdKSwgbl9yb3V0ZWRfZXhwZXJ0cykgXSgKICAgICAgICAgICAgYSA9IGZmbjBfb3V0LAogICAgICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgICAgIGMgPSBmZm4xX291dCwKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbiA9IGRfaGlkZGVuLAogICAgICAgICAgICBrID0gZF9leHBlcnQsCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICB3ZWlnaHRlZCBzdW0gZ2F0aGVyIHRpbWVyIikgYXMgdDoKICAgICAgICB3ZWlnaHRlZF9zdW1fZ2F0aGVyWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCBiYXRjaF9zaXplICogc2VxX2xlbildKAogICAgICAgICAgICBmZm4xX291dCwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICAgICAgICAgIG1vZV9vdXQsCiAgICAgICAgICAgIGRfaGlkZGVuLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICAjIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICAgICApCiAgICAjIHNsZWVwIDggbXMgCiAgICAjIGJlbmNobWFyayBzdWNrcyAhCiAgICAjIHRpbWUuc2xlZXAoMC4wMDgpCiAgICByZXR1cm4gbW9lX291dC5yZXNoYXBlKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgb3V0cHV0ID0gbW9lX2ZvcndhcmQoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCAqKmNvbmZpZykKICAgIHJldHVybiBvdXRwdXQKNo newline at end of file+ aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICAjIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgIyBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoQkxPQ0tfTSwgQkxPQ0tfSykKICAgICAgICBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFjY3VtICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKICAgIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKCkB0cml0b24uaml0CmRlZiBzd2lnbHUoeCwgeSk6CiAgICBsb2dfMl9lOiB0bC5jb25zdGV4cHIgPSAxLjQ0MjY5NTA0MQogICAgZXhwX3ggPSB0bC5leHAyKCAtbG9nXzJfZSAqIHgpCiAgICByZXR1cm4gMS4gLyAoMS4gKyBleHBfeCkgKiB4ICogeQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKICAgIApAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHVfc2h1ZmZsZSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICg4LCB0cml0b24uY2RpdihuLCBCTE9DS19OKSwgY2RpdihtYXhfbSwgQkxPQ0tfTSkgKiBjZGl2KGdyb3VwX3NpemUsIDgpKQogICAgWENEX0NOVCA9IDgKICAgIG1fYmxvY2tfY250ID0gdGwuY2RpdihtYXhfbSwgQkxPQ0tfTSkKICAgIAogICAgCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMCkgKyB0bC5wcm9ncmFtX2lkKDIpIC8vIG1fYmxvY2tfY250ICogWENEX0NOVAogICAgbl9zdGFydCA9IHRsLnByb2dyYW1faWQoMSkgKiBCTE9DS19OCiAgICBtX2lkID0gdGwucHJvZ3JhbV9pZCgyKSAlIG1fYmxvY2tfY250CiAgICAKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgIyBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazAgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMCwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKQogICAgICAgIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsICkKICAgICAgICBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCApCiAgICAgICAgYWNjdW0wICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMCkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhY2N1bTEgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2sxKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIwID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjAsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgICAgIGJfYmxvY2tfcHRyMSA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIxLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIG91dCA9IHN3aWdsdShhY2N1bTAsIGFjY3VtMSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgb3V0LnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX1NJWkUiOiAxMDI0ICogOCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKSAgICAgICAgICAgCkB0cml0b24uaml0CmRlZiB3ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgZmZuMV9vdXQsCiAgICB0b2tlbjJpbmRleCwKICAgIHRvcGtfc2NvcmVzLAogICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgbW9lX291dCwKICAgIGRfaGlkZGVuLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBmZm4xX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyB0b3BrX3Njb3JlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBzaGFyZWRfZXhwZXJ0X2ZmbjE6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBtb2Vfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pCiAgICAKICAgIHNlZ21lbnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgdG9rZW5faWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgc2VnbWVudF9pZHggKiBCTE9DS19TSVpFCiAgICBtYXNrID0gb2Zmc2V0cyA8IGRfaGlkZGVuCiAgICAKICAgIGRhdGEgPSB0bC5sb2FkKAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShuX2V4cGVydHNfcGVyX3Rva2VuKToKICAgICAgICB3ZWlnaHQgPSB0bC5sb2FkKHRvcGtfc2NvcmVzICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgaW5kZXggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgZmZuMV9vdXRfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBmZm4xX291dCArIGluZGV4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIGRhdGEgKz0gd2VpZ2h0ICogZmZuMV9vdXRfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIG1vZV9vdXQgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgZGF0YSwKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgIAojIGNvbmZpZzogeydkX2hpZGRlbic6IDcxNjgsICdkX2V4cGVydCc6IDIwNDgsICduX3JvdXRlZF9leHBlcnRzJzogMzIsICduX3NoYXJlZF9leHBlcnRzJzogMSwgJ25fZXhwZXJ0c19wZXJfdG9rZW4nOiA0LCAnYmF0Y2hfc2l6ZSc6IDEsICdzZXFfbGVuJzogMjA0OH0KIyBpbnB1dF90ZW5zb3IgbGF5b3V0OiAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuICogc2VxX2xlbiwgZF9oaWRkZW4sIDEpCiMgcm91dGVyLndlaWdodCBsYXlvdXQ6IChuX3JvdXRlZF9leHBlcnRzLCAgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIGV4cGVydHMue2l9LjAud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMS53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0KSA6IChkX2V4cGVydCwgMSkKIyBleHBlcnRzLntpfS4yLndlaWdodCBsYXlvdXQ6IChkX2V4cGVydCwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpIDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCgpjbGFzcyBUaW1lcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbDogc3RyKToKICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5lbmRfdGltZSA9IE5vbmUKICAgICAgICBzZWxmLmludGVydmFsID0gTm9uZQogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAjIHNlbGYuc3RhcnQgPSB0aW1lLnRpbWUoKQogICAgICAgIHJldHVybiBzZWxmCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAgICAgIyBzZWxmLmVuZCA9IHRpbWUudGltZSgpCiAgICAgICAgIyBzZWxmLmludGVydmFsID0gKHNlbGYuZW5kIC0gc2VsZi5zdGFydCkgKiAxMDAwICMgaW4gbXMKICAgICAgICAjIHByaW50KGYie3NlbGYubGFiZWx9OiB7c2VsZi5pbnRlcnZhbDouNGZ9IG1zIikKICAgICAgICByZXR1cm4gRmFsc2UKZGVmIG1vZV9mb3J3YXJkKAogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IsCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwKICAgIGRfaGlkZGVuOiBpbnQsCiAgICBkX2V4cGVydDogaW50LAogICAgbl9yb3V0ZWRfZXhwZXJ0czogaW50LAogICAgbl9zaGFyZWRfZXhwZXJ0czogaW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbjogaW50LAogICAgYmF0Y2hfc2l6ZTogaW50LAogICAgc2VxX2xlbjogaW50CikgLT4gdG9yY2guVGVuc29yOgogICAgaW5wdXRfdGVuc29yID0gaW5wdXRfdGVuc29yLnJlc2hhcGUoLTEsIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgVE9ETzogdXNlIGN1ZGEgZ3JhcGg/CiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHRlbnNvciB0aW1lciIpIGFzIHQ6CiAgICAgICAgIyBBbGxvY2F0ZSB0ZW5zb3IgCiAgICAgICAgIyBUT0RPOiBwcmVhbGxvY2F0ZSB0ZW5zb3IKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShzaXplPShuX3JvdXRlZF9leHBlcnRzLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guemVyb3Moc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIAogICAgICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICAgICAjIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgIyBmZm4wX3JocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgZmZuMV9vdXQgPSB0b3JjaC5lbXB0eV9saWtlKHJlcGVhdGVkX3Rva2VucykKICAgICAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCiAgICAjIFRPRE86IG11bHRpIHN0cmVhbQogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgICAgIGJfcHRycyA9IHRvcmNoLnRlbnNvcigKICAgICAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSArCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgICAgICkKICAgICAgICBiX3B0cnMwID0gYl9wdHJzWzpuX3JvdXRlZF9leHBlcnRzXQogICAgICAgIGJfcHRyczEgPSBiX3B0cnNbbl9yb3V0ZWRfZXhwZXJ0czoyKm5fcm91dGVkX2V4cGVydHNdCiAgICAgICAgYl9wdHJzMiA9IGJfcHRyc1syKm5fcm91dGVkX2V4cGVydHM6XQoKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzaGFyZWQgZXhwZXJ0IHRpbWVyIikgYXMgdDoKICAgICAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICAgICAgc2hhcmVkX2V4cGVydF93ZWlnaHQxID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSAjIChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10gIyAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICAgICAjIFRPRE86IGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgIyBUT0RPOiBzaGFyZWQgZXhwZXJ0IGluIGEgc2VwYXJhdGUgc3RyZWFtPwogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgPSBzaGFyZWRfZXhwZXJ0X2ZmbjAgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHJvdXRlciB0aW1lciIpIGFzIHQ6CiAgICAgICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgbG9naXRzID0gdG9yY2gubWF0bXVsKGlucHV0X3RlbnNvciwgcm91dGVyX3dlaWdodC50KCkpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgICAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgbl9leHBlcnRzX3Blcl90b2tlbiwgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSAgICAKCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAgICAgIyBleHBlcnQydG9rZW5fY291bnQgKG5fcm91dGVkX2V4cGVydHMsKQogICAgICAgICMgd2l0aGluX2V4cGVydF9pbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICAgICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgICAgIGJhdGNoX3NpemUgKiBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICkKICAgICAgICAjIHRva2VuMmluZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgICAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgKQoKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2NhdHRlciB0aW1lciIpIGFzIHQ6CiAgICAgICAgc2NhdHRlclsgKG5fZXhwZXJ0c19wZXJfdG9rZW4sIHNlcV9sZW4sIGJhdGNoX3NpemUpIF0oCiAgICAgICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHJlcGVhdGVkX3Rva2VucywKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgZF9oaWRkZW4sCiAgICAgICAgKQogICAgCiAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjAgdGltZXIiKSBhcyB0OiAgICAKICAgICAgICBncm91cF9nZW1tX1N3aUdsdVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzMCA9IGJfcHRyczAsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzMSA9IGJfcHRyczEsCiAgICAgICAgICAgIGMgPSBmZm4wX291dCwKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IG1heF9tLAogICAgICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgICAgIGsgPSBkX2hpZGRlbiwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjEgdGltZXIiKSBhcyB0OgogICAgICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gZmZuMF9vdXQsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMiwKICAgICAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGsgPSBkX2V4cGVydCwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHdlaWdodGVkIHN1bSBnYXRoZXIgdGltZXIiKSBhcyB0OgogICAgICAgIHdlaWdodGVkX3N1bV9nYXRoZXJbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX1NJWkUiXSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKV0oCiAgICAgICAgICAgIGZmbjFfb3V0LAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgdG9wa19zY29yZXMsCiAgICAgICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICAgICAgbW9lX291dCwKICAgICAgICAgICAgZF9oaWRkZW4sCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgICMgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgICAgICkKICAgICMgc2xlZXAgOCBtcyAKICAgICMgYmVuY2htYXJrIHN1Y2tzICEKICAgICMgdGltZS5zbGVlcCgwLjAwOCkKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBvdXRwdXQgPSBtb2VfZm9yd2FyZChpbnB1dF90ZW5zb3IsIHdlaWdodHMsICoqY29uZmlnKQogICAgcmV0dXJuIG91dHB1dAo=No newline at end of file
Best evidence level for this revision: reported
JSON