Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 29220

KernelBot user 126 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

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

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

Benchmark evidence

2 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
5.65ms
#38 of 118
2025-05-30
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
12.0ms
#22 of 118
2025-05-30

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:642071a62049858662918586f99ef017b71624cdd0dcba848349ba72a5bfda81
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission_moe_version_6.py1 lines
aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbWF0bXVsCgojIEB0cml0b24uaml0CiMgZGVmIG1hdG11bF9rZXJuZWwoCiMgICAgICAgICAjIFBvaW50ZXJzIHRvIG1hdHJpY2VzCiMgICAgICAgICBhX3B0ciwgYl9wdHIsIGNfcHRyLAojICAgICAgICAgIyBNYXRyaXggZGltZW5zaW9ucwojICAgICAgICAgTSwgTiwgSywKIyAgICAgICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQojICAgICAgICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAojICAgICAgICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgojICAgICAgICAgc3RyaWRlX2FtLCBzdHJpZGVfYWssICAjCiMgICAgICAgICBzdHJpZGVfYmssIHN0cmlkZV9ibiwgICMKIyAgICAgICAgIHN0cmlkZV9jbSwgc3RyaWRlX2NuLAojICAgICAgICAgIyBNZXRhLXBhcmFtZXRlcnMKIyAgICAgICAgIEJMT0NLX1NJWkVfTTogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsICAjCiMgICAgICAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwgICMKIyAgICAgICAgIEFDVElWQVRJT046IHRsLmNvbnN0ZXhwciAgIwojICk6CiMgICAgICIiIktlcm5lbCBmb3IgY29tcHV0aW5nIHRoZSBtYXRtdWwgQyA9IEEgeCBCLgojICAgICBBIGhhcyBzaGFwZSAoTSwgSyksIEIgaGFzIHNoYXBlIChLLCBOKSBhbmQgQyBoYXMgc2hhcGUgKE0sIE4pCiMgICAgICIiIgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgTWFwIHByb2dyYW0gaWRzIGBwaWRgIHRvIHRoZSBibG9jayBvZiBDIGl0IHNob3VsZCBjb21wdXRlLgojICAgICAjIFRoaXMgaXMgZG9uZSBpbiBhIGdyb3VwZWQgb3JkZXJpbmcgdG8gcHJvbW90ZSBMMiBkYXRhIHJldXNlLgojICAgICAjIFNlZSBhYm92ZSBgTDIgQ2FjaGUgT3B0aW1pemF0aW9uc2Agc2VjdGlvbiBmb3IgZGV0YWlscy4KIyAgICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiMgICAgIG51bV9waWRfbSA9IHRsLmNkaXYoTSwgQkxPQ0tfU0laRV9NKQojICAgICBudW1fcGlkX24gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKIyAgICAgbnVtX3BpZF9pbl9ncm91cCA9IEdST1VQX1NJWkVfTSAqIG51bV9waWRfbgojICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiMgICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFX00KIyAgICAgZ3JvdXBfc2l6ZV9tID0gbWluKG51bV9waWRfbSAtIGZpcnN0X3BpZF9tLCBHUk9VUF9TSVpFX00pCiMgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAoKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApICUgZ3JvdXBfc2l6ZV9tKQojICAgICBwaWRfbiA9IChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAvLyBncm91cF9zaXplX20KCiMgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIENyZWF0ZSBwb2ludGVycyBmb3IgdGhlIGZpcnN0IGJsb2NrcyBvZiBBIGFuZCBCLgojICAgICAjIFdlIHdpbGwgYWR2YW5jZSB0aGlzIHBvaW50ZXIgYXMgd2UgbW92ZSBpbiB0aGUgSyBkaXJlY3Rpb24KIyAgICAgIyBhbmQgYWNjdW11bGF0ZQojICAgICAjIGBhX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9LXSBwb2ludGVycwojICAgICAjIGBiX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfSywgQkxPQ0tfU0laRV9OXSBwb2ludGVycwojICAgICAjIFNlZSBhYm92ZSBgUG9pbnRlciBBcml0aG1ldGljYCBzZWN0aW9uIGZvciBkZXRhaWxzCiMgICAgIG9mZnNfYW0gPSAocGlkX20gKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKSkgJSBNCiMgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiMgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiMgICAgIGFfcHRycyA9IGFfcHRyICsgKG9mZnNfYW1bOiwgTm9uZV0gKiBzdHJpZGVfYW0gKyBvZmZzX2tbTm9uZSwgOl0gKiBzdHJpZGVfYWspCiMgICAgIGJfcHRycyA9IGJfcHRyICsgKG9mZnNfa1s6LCBOb25lXSAqIHN0cmlkZV9iayArIG9mZnNfYm5bTm9uZSwgOl0gKiBzdHJpZGVfYm4pCgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgSXRlcmF0ZSB0byBjb21wdXRlIGEgYmxvY2sgb2YgdGhlIEMgbWF0cml4LgojICAgICAjIFdlIGFjY3VtdWxhdGUgaW50byBhIGBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX05dYCBibG9jawojICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiMgICAgICMgYGFjY3VtdWxhdG9yYCB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIGZwMTYgYWZ0ZXIgdGhlIGxvb3AuCiMgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKIyAgICAgZm9yIGsgaW4gcmFuZ2UoMCwgdGwuY2RpdihLLCBCTE9DS19TSVpFX0spKToKIyAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgIyBJZiBpdCBpcyBvdXQgb2YgYm91bmRzLCBzZXQgaXQgdG8gMC4KIyAgICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywgbWFzaz1vZmZzX2tbTm9uZSwgOl0gPCBLIC0gayAqIEJMT0NLX1NJWkVfSywgb3RoZXI9MC4wKQojICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSBrICogQkxPQ0tfU0laRV9LLCBvdGhlcj0wLjApCiMgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgYWNjdW11bGF0b3IgPSB0bC5kb3QoYSwgYiwgYWNjdW11bGF0b3IpCiMgICAgICAgICAjIEFkdmFuY2UgdGhlIHB0cnMgdG8gdGhlIG5leHQgSyBibG9jay4KIyAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKIyAgICAgICAgIGJfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYmsKIyAgICAgIyBZb3UgY2FuIGZ1c2UgYXJiaXRyYXJ5IGFjdGl2YXRpb24gZnVuY3Rpb25zIGhlcmUKIyAgICAgIyB3aGlsZSB0aGUgYWNjdW11bGF0b3IgaXMgc3RpbGwgaW4gRlAzMiEKIyAgICAgaWYgQUNUSVZBVElPTiA9PSAibGVha3lfcmVsdSI6CiMgICAgICAgICBhY2N1bXVsYXRvciA9IGxlYWt5X3JlbHUoYWNjdW11bGF0b3IpCiMgICAgIGMgPSBhY2N1bXVsYXRvci50byh0bC5mbG9hdDE2KQoKIyAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIFdyaXRlIGJhY2sgdGhlIGJsb2NrIG9mIHRoZSBvdXRwdXQgbWF0cml4IEMgd2l0aCBtYXNrcy4KIyAgICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKIyAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKIyAgICAgY19wdHJzID0gY19wdHIgKyBzdHJpZGVfY20gKiBvZmZzX2NtWzosIE5vbmVdICsgc3RyaWRlX2NuICogb2Zmc19jbltOb25lLCA6XQojICAgICBjX21hc2sgPSAob2Zmc19jbVs6LCBOb25lXSA8IE0pICYgKG9mZnNfY25bTm9uZSwgOl0gPCBOKQojICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKCiMgZGVmIG1hdG11bChhLCBiLCBhY3RpdmF0aW9uPSIiKToKIyAgICAgIyBDaGVjayBjb25zdHJhaW50cy4KIyAgICAgSyA9IGEuc2l6ZSgtMSkKIyAgICAgTSA9IGEubnVtZWwoKSAvLyBLCiMgICAgIE4gPSBiLnNpemUoMSkKIyAgICAgYXNzZXJ0IGEuaXNfY29udGlndW91cygpLCAiTWF0cml4IEEgbXVzdCBiZSBjb250aWd1b3VzIgojICAgICBhc3NlcnQgSyA9PSBiLnNoYXBlWzBdLCAiSW5jb21wYXRpYmxlIGRpbWVuc2lvbnMiCiMgICAgICMgQWxsb2NhdGVzIG91dHB1dC4KIyAgICAgYyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPWEuZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDE2KQojICAgICAjIDFEIGxhdW5jaCBrZXJuZWwgd2hlcmUgZWFjaCBibG9jayBnZXRzIGl0cyBvd24gcHJvZ3JhbS4KIyAgICAgZ3JpZCA9IGxhbWJkYSBNRVRBOiAodHJpdG9uLmNkaXYoTSwgTUVUQVsnQkxPQ0tfU0laRV9NJ10pICogdHJpdG9uLmNkaXYoTiwgTUVUQVsnQkxPQ0tfU0laRV9OJ10pLCApCiMgICAgIG1hdG11bF9rZXJuZWxbZ3JpZF0oCiMgICAgICAgICBhLCBiLCBjLCAgIwojICAgICAgICAgTSwgTiwgSywgICMKIyAgICAgICAgIEssIDEsICAjCiMgICAgICAgICBiLnN0cmlkZSgwKSwgYi5zdHJpZGUoMSksICAjCiMgICAgICAgICBOLCAxLCAgIwojICAgICAgICAgQkxPQ0tfU0laRV9NPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9OPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9LPTEyOCwKIyAgICAgICAgIEdST1VQX1NJWkVfTT00LAojICAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uICAjCiMgICAgICkKIyAgICAgcmV0dXJuIGMKCgojIEB0b3JjaC5ub19ncmFkKCkKIyBkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiMgICAgIHhfZ2F0ZSA9IG1hdG11bCh4LCB3X2dhdGUpCiMgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgIHhfdXAgPSBtYXRtdWwoeCwgd191cCkKIyAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICBvdXQgPSBtYXRtdWwob3V0LCB3X2Rvd24pCiMgICAgIHJldHVybiBvdXQKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UxW2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgZW5kID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBwcmludChmIm1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMToge2VuZCAtIHN0YXJ0fSIpCgogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIHByaW50KGYibW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UyOiB7ZW5kIC0gc3RhcnR9IikKCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlM1soMSwgKV0oCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZCwKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTM6IHtlbmQgLSBzdGFydH0iKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2U0W2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHNvcnRlZF9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQ6IHtlbmQgLSBzdGFydH0iKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgojIEB0cml0b24uaml0CiMgZGVmIHNpbHVfYW5kX211bF9rZXJuZWwoaW5wdXRfcHRyLCBvdXRwdXRfcHRyLCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIpOgojICAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKIyAgICAgYV9ibG9ja19zdGFydCA9IHBpZCAqIEJMT0NLX1NJWkUKIyAgICAgYl9ibG9ja19zdGFydCA9IGFfYmxvY2tfc3RhcnQgKyBuX2VsZW1lbnRzCiMgICAgIGFfb2Zmc2V0cyA9IGFfYmxvY2tfc3RhcnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkKIyAgICAgYl9vZmZzZXRzID0gYl9ibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQojICAgICBhX21hc2sgPSBhX29mZnNldHMgPCBuX2VsZW1lbnRzCiMgICAgIGJfbWFzayA9IGJfb2Zmc2V0cyA8IG5fZWxlbWVudHMgKiAyCgojICAgICBhID0gdGwubG9hZChpbnB1dF9wdHIgKyBhX29mZnNldHMsIG1hc2s9YV9tYXNrKQojICAgICBiID0gdGwubG9hZChpbnB1dF9wdHIgKyBiX29mZnNldHMsIG1hc2s9Yl9tYXNrKQojICAgICBvdXRwdXQgPSBhICogKDEgLyAoMSArIHRsLmV4cCgtYS50byh0bC5mbG9hdDMyKSkpKSAqIGIKIyAgICAgdGwuc3RvcmUob3V0cHV0X3B0ciArIGFfb2Zmc2V0cywgb3V0cHV0LCBtYXNrPWFfbWFzaykKCiMgZ3JpZCA9ICh0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFKSwpCiMgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dF90ZW5zb3IsIG91dHB1dF90ZW5zb3IsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkUpCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAxMDI0IGlmIG5fZWxlbWVudHMgPiAxMDI0IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICAgICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGFjY3VtdWxhdG9yLCBtYXNrPWNfbWFzaykKCiAgICAgICAgdGlsZV9pZCArPSBOVU1fU01TCgoKZGVmIGludm9rZV9mdXNlZF9tb2Vfa2VybmVsKEE6IHRvcmNoLlRlbnNvciwgQjogdG9yY2guVGVuc29yLCBDOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BrX3dlaWdodHM6IHRvcmNoLlRlbnNvciwgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9yb3V0ZWRfd2VpZ2h0OiBib29sLCB0b3BfazogaW50KToKICAgICMgcHJpbnQobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCkKICAgICMgcHJpbnQoc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSkKICAgIE5VTV9TTVMgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfcHJvcGVydGllcygiY3VkYSIpLm11bHRpX3Byb2Nlc3Nvcl9jb3VudCAqIDIKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKG1pbihOVU1fU01TLCB0cml0b24uY2Rpdihzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLCBNRVRBWyJCTE9DS19TSVpFX00iXSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXRvbi5jZGl2KEIuc2hhcGVbMV0sIE1FVEFbIkJMT0NLX1NJWkVfTiJdKSksICkKICAgIGZ1c2VkX21vZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgdG9wa193ZWlnaHRzLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgIEIuc2hhcGVbMV0sCiAgICAgICAgQi5zaGFwZVsyXSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgQS5zdHJpZGUoMCksCiAgICAgICAgQS5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQi5zdHJpZGUoMiksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMiksCiAgICAgICAgdG9wa193ZWlnaHRzLnN0cmlkZSgyKSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnN0cmlkZSgwKSwKICAgICAgICBNVUxfUk9VVEVEX1dFSUdIVD1tdWxfcm91dGVkX3dlaWdodCwKICAgICAgICB0b3Bfaz10b3BfaywKICAgICAgICBjb21wdXRlX3R5cGU9dGwuYmZsb2F0MTYgaWYgQS5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNiBlbHNlIHRsLmZsb2F0MTYsCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwKICAgICAgICBCTE9DS19TSVpFX049QkxPQ0tfU0laRV9OLAogICAgICAgIEJMT0NLX1NJWkVfSz1CTE9DS19TSVpFX0ssCiAgICAgICAgR1JPVVBfU0laRV9NPUdST1VQX1NJWkVfTSwKICAgICAgICBOVU1fU01TPU5VTV9TTVMsCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgICMgWF9wdHJzID0gWCArIG9mZl9tWzosIE5vbmVdICogMSArIG9mZl9uW05vbmUsIDpdICogTQogICAgIyBZX3B0cnMgPSBZICsgKEVfSUQgKiAyICsgV19JRCkgKiBNICogTiArIG9mZl9tWzosIE5vbmVdICogTiArIG9mZl9uW05vbmUsIDpdICogMQogICAgWF9wdHJzID0gWCArIG9mZl9tWzosIE5vbmVdICogc3RyaWRlX3htICsgb2ZmX25bTm9uZSwgOl0gKiBzdHJpZGVfeG4KICAgIFlfcHRycyA9IFkgKyBJRFggKiBNICogTiArIG9mZl9tWzosIE5vbmVdICogc3RyaWRlX3ltICsgb2ZmX25bTm9uZSwgOl0gKiBzdHJpZGVfeW4KCiAgICB0aWxlID0gdGwubG9hZChYX3B0cnMsIG1hc2s9bWFzaywgb3RoZXI9b3RoZXIpCiAgICB0bC5zdG9yZShZX3B0cnMsIHRpbGUsIG1hc2s9bWFzaykKCgpkZWYgaW52b2tlX3RyYW5zcG9zZShYLCBZLCBJRFg9MCwgQkxPQ0tfTT0xMjgsIEJMT0NLX049MTI4LCBudW1fd2FycHM9MTYpIC0+IE5vbmU6CiAgICBpZiBYLmR0eXBlLml0ZW1zaXplID09IDE6CiAgICAgICAgWCA9IFgudmlldyh0b3JjaC5pbnQ4KQogICAgaWYgWS5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFkgPSBZLnZpZXcodG9yY2guaW50OCkKCiAgICAjIGNoZWNrIGNvbXBhdGliaWxpdHk6CiAgICBhc3NlcnQgWC5kdHlwZSA9PSBZLmR0eXBlCgogICAgTSA9IFguc2hhcGVbMF0KICAgIE4gPSBYLnNoYXBlWzFdCgogICAgc3RyaWRlX3htID0gWC5zdHJpZGUoMCkKICAgIHN0cmlkZV94biA9IFguc3RyaWRlKDEpCgogICAgc3RyaWRlX3ltID0gWS5zdHJpZGUoLTIpCiAgICBzdHJpZGVfeW4gPSBZLnN0cmlkZSgtMSkKCiAgICBncmlkID0gKChNICsgQkxPQ0tfTSAtIDEpIC8vIEJMT0NLX00sIChOICsgQkxPQ0tfTiAtIDEpIC8vIEJMT0NLX04pCiAgICB0cmFuc3Bvc2Vfa2VybmVsW2dyaWRdKAogICAgICAgIE0sCiAgICAgICAgTiwKICAgICAgICBCTE9DS19NLAogICAgICAgIEJMT0NLX04sCiAgICAgICAgWCwKICAgICAgICBzdHJpZGVfeG0sCiAgICAgICAgc3RyaWRlX3huLAogICAgICAgIFksCiAgICAgICAgc3RyaWRlX3ltLAogICAgICAgIHN0cmlkZV95biwKICAgICAgICBJRFg9SURYLAogICAgICAgIG51bV93YXJwcz1udW1fd2FycHMsCiAgICApCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2gub25lcygoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4gKiAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUyID0gdG9yY2guZW1wdHkoKE0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMyA9IHRvcmNoLmVtcHR5KChNLCBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgSyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBtb2UgZ2F0ZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10sCiAgICAgICAgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHNoYXJlZF9leHBlcnRzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc2hhcmVkX291dHB1dCA9IG1vZV9leHBlcnRfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGFsaWduCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc29ydGVkX3Rva2VuX2lkcywgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCA9IGludm9rZV9tb2VfYWxpZ25fYmxvY2tfc2l6ZSgKICAgICAgICBleHBlcnRfaW5kaWNlcywgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIEJMT0NLX1NJWkVfTSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzEKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnB1dF90ZW5zb3IudmlldygtMSwgSyksIHcxLCBpbnRlcm1lZGlhdGVfY2FjaGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X3Njb3JlcywgZXhwZXJ0X2luZGljZXMsIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pbmRpY2VzLnNoYXBlWzJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaWx1X2FuZF9tdWwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUxLnZpZXcoLTEsIDIgKiBOKSwgaW50ZXJtZWRpYXRlX2NhY2hlMikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUyLCB3MiwgaW50ZXJtZWRpYXRlX2NhY2hlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgVHJ1ZSwgMSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc3VtCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgcm91dGVkX291dHB1dCA9IHRvcmNoLnN1bSgKICAgICAgICBpbnRlcm1lZGlhdGVfY2FjaGUzLnZpZXcoKmludGVybWVkaWF0ZV9jYWNoZTMuc2hhcGUpLCBkaW09MSkudmlldyhjb25maWdbImJhdGNoX3NpemUiXSwgY29uZmlnWyJzZXFfbGVuIl0sIEspCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGFkZAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIG91dHB1dCA9IHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgogICAgcmV0dXJuIG91dHB1dAoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGRhdGEgPSBnZW5lcmF0ZV9pbnB1dCgKICAgICAgICAgICAgZGhpZGRlbj03MTY4LCBkZXhwZXJ0PTIwNDgsCiAgICAgICAgICAgIG5yb3V0ZWRleHBlcnRzPTMyLCBuc2hhcmVkZXhwZXJ0cz0xLCBuZXhwZXJ0c3BlcnRva2VuPTQsCiAgICAgICAgICAgIGJzPTEsIHNlcWxlbj0yMDQ4LCBzZWVkPTEpCiAgICBvdXRwdXQgPSBjdXN0b21fa2VybmVsKGRhdGEpCiAgICByZWZfZGF0YSA9IF9jbG9uZV9kYXRhKGRhdGEpCiAgICByZWZfb3V0cHV0ID0gcmVmX2tlcm5lbChyZWZfZGF0YSkKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0LCByZWZfb3V0cHV0LCBydG9sPTFlLTIsIGF0b2w9MWUtMikpCgogICAgIyB0aW1lX2xpc3QgPSBbXQogICAgIyBmb3IgaSBpbiByYW5nZSgyMDApOgogICAgIyAgICAgZGF0YSA9IGdlbmVyYXRlX2lucHV0KAogICAgIyAgICAgICAgIGRoaWRkZW49NzE2OCwgZGV4cGVydD0yMDQ4LAogICAgIyAgICAgICAgIG5yb3V0ZWRleHBlcnRzPTMyLCBuc2hhcmVkZXhwZXJ0cz0xLCBuZXhwZXJ0c3BlcnRva2VuPTQsCiAgICAjICAgICAgICAgYnM9MSwgc2VxbGVuPTgxOTIsIHNlZWQ9MSkKCiAgICAjICAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgICAgIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQoKICAgICMgICAgIG91dHB1dCA9IGN1c3RvbV9rZXJuZWwoZGF0YSkKCiAgICAjICAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgICAgIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgICAgIHRpbWVfbGlzdC5hcHBlbmQoKGVuZCAtIHN0YXJ0KSAvIDEwMDAgLyAxMDAwKQoKICAgICMgICAgIHJlZl9kYXRhID0gX2Nsb25lX2RhdGEoZGF0YSkKICAgICMgICAgIHJlZl9vdXRwdXQgPSByZWZfa2VybmVsKHJlZl9kYXRhKQoKICAgICMgcHJpbnQodGltZV9saXN0KQogICAgIyBwcmludChmImFsbDoge3N1bSh0aW1lX2xpc3RbLTEwMDpdKSAvIDEwMH0iKQo=

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 29047.

- aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbWF0bXVsCgojIEB0cml0b24uaml0CiMgZGVmIG1hdG11bF9rZXJuZWwoCiMgICAgICAgICAjIFBvaW50ZXJzIHRvIG1hdHJpY2VzCiMgICAgICAgICBhX3B0ciwgYl9wdHIsIGNfcHRyLAojICAgICAgICAgIyBNYXRyaXggZGltZW5zaW9ucwojICAgICAgICAgTSwgTiwgSywKIyAgICAgICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQojICAgICAgICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAojICAgICAgICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgojICAgICAgICAgc3RyaWRlX2FtLCBzdHJpZGVfYWssICAjCiMgICAgICAgICBzdHJpZGVfYmssIHN0cmlkZV9ibiwgICMKIyAgICAgICAgIHN0cmlkZV9jbSwgc3RyaWRlX2NuLAojICAgICAgICAgIyBNZXRhLXBhcmFtZXRlcnMKIyAgICAgICAgIEJMT0NLX1NJWkVfTTogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsICAjCiMgICAgICAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwgICMKIyAgICAgICAgIEFDVElWQVRJT046IHRsLmNvbnN0ZXhwciAgIwojICk6CiMgICAgICIiIktlcm5lbCBmb3IgY29tcHV0aW5nIHRoZSBtYXRtdWwgQyA9IEEgeCBCLgojICAgICBBIGhhcyBzaGFwZSAoTSwgSyksIEIgaGFzIHNoYXBlIChLLCBOKSBhbmQgQyBoYXMgc2hhcGUgKE0sIE4pCiMgICAgICIiIgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgTWFwIHByb2dyYW0gaWRzIGBwaWRgIHRvIHRoZSBibG9jayBvZiBDIGl0IHNob3VsZCBjb21wdXRlLgojICAgICAjIFRoaXMgaXMgZG9uZSBpbiBhIGdyb3VwZWQgb3JkZXJpbmcgdG8gcHJvbW90ZSBMMiBkYXRhIHJldXNlLgojICAgICAjIFNlZSBhYm92ZSBgTDIgQ2FjaGUgT3B0aW1pemF0aW9uc2Agc2VjdGlvbiBmb3IgZGV0YWlscy4KIyAgICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiMgICAgIG51bV9waWRfbSA9IHRsLmNkaXYoTSwgQkxPQ0tfU0laRV9NKQojICAgICBudW1fcGlkX24gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKIyAgICAgbnVtX3BpZF9pbl9ncm91cCA9IEdST1VQX1NJWkVfTSAqIG51bV9waWRfbgojICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiMgICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFX00KIyAgICAgZ3JvdXBfc2l6ZV9tID0gbWluKG51bV9waWRfbSAtIGZpcnN0X3BpZF9tLCBHUk9VUF9TSVpFX00pCiMgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAoKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApICUgZ3JvdXBfc2l6ZV9tKQojICAgICBwaWRfbiA9IChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAvLyBncm91cF9zaXplX20KCiMgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIENyZWF0ZSBwb2ludGVycyBmb3IgdGhlIGZpcnN0IGJsb2NrcyBvZiBBIGFuZCBCLgojICAgICAjIFdlIHdpbGwgYWR2YW5jZSB0aGlzIHBvaW50ZXIgYXMgd2UgbW92ZSBpbiB0aGUgSyBkaXJlY3Rpb24KIyAgICAgIyBhbmQgYWNjdW11bGF0ZQojICAgICAjIGBhX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9LXSBwb2ludGVycwojICAgICAjIGBiX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfSywgQkxPQ0tfU0laRV9OXSBwb2ludGVycwojICAgICAjIFNlZSBhYm92ZSBgUG9pbnRlciBBcml0aG1ldGljYCBzZWN0aW9uIGZvciBkZXRhaWxzCiMgICAgIG9mZnNfYW0gPSAocGlkX20gKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKSkgJSBNCiMgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiMgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiMgICAgIGFfcHRycyA9IGFfcHRyICsgKG9mZnNfYW1bOiwgTm9uZV0gKiBzdHJpZGVfYW0gKyBvZmZzX2tbTm9uZSwgOl0gKiBzdHJpZGVfYWspCiMgICAgIGJfcHRycyA9IGJfcHRyICsgKG9mZnNfa1s6LCBOb25lXSAqIHN0cmlkZV9iayArIG9mZnNfYm5bTm9uZSwgOl0gKiBzdHJpZGVfYm4pCgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgSXRlcmF0ZSB0byBjb21wdXRlIGEgYmxvY2sgb2YgdGhlIEMgbWF0cml4LgojICAgICAjIFdlIGFjY3VtdWxhdGUgaW50byBhIGBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX05dYCBibG9jawojICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiMgICAgICMgYGFjY3VtdWxhdG9yYCB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIGZwMTYgYWZ0ZXIgdGhlIGxvb3AuCiMgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKIyAgICAgZm9yIGsgaW4gcmFuZ2UoMCwgdGwuY2RpdihLLCBCTE9DS19TSVpFX0spKToKIyAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgIyBJZiBpdCBpcyBvdXQgb2YgYm91bmRzLCBzZXQgaXQgdG8gMC4KIyAgICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywgbWFzaz1vZmZzX2tbTm9uZSwgOl0gPCBLIC0gayAqIEJMT0NLX1NJWkVfSywgb3RoZXI9MC4wKQojICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSBrICogQkxPQ0tfU0laRV9LLCBvdGhlcj0wLjApCiMgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgYWNjdW11bGF0b3IgPSB0bC5kb3QoYSwgYiwgYWNjdW11bGF0b3IpCiMgICAgICAgICAjIEFkdmFuY2UgdGhlIHB0cnMgdG8gdGhlIG5leHQgSyBibG9jay4KIyAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKIyAgICAgICAgIGJfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYmsKIyAgICAgIyBZb3UgY2FuIGZ1c2UgYXJiaXRyYXJ5IGFjdGl2YXRpb24gZnVuY3Rpb25zIGhlcmUKIyAgICAgIyB3aGlsZSB0aGUgYWNjdW11bGF0b3IgaXMgc3RpbGwgaW4gRlAzMiEKIyAgICAgaWYgQUNUSVZBVElPTiA9PSAibGVha3lfcmVsdSI6CiMgICAgICAgICBhY2N1bXVsYXRvciA9IGxlYWt5X3JlbHUoYWNjdW11bGF0b3IpCiMgICAgIGMgPSBhY2N1bXVsYXRvci50byh0bC5mbG9hdDE2KQoKIyAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIFdyaXRlIGJhY2sgdGhlIGJsb2NrIG9mIHRoZSBvdXRwdXQgbWF0cml4IEMgd2l0aCBtYXNrcy4KIyAgICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKIyAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKIyAgICAgY19wdHJzID0gY19wdHIgKyBzdHJpZGVfY20gKiBvZmZzX2NtWzosIE5vbmVdICsgc3RyaWRlX2NuICogb2Zmc19jbltOb25lLCA6XQojICAgICBjX21hc2sgPSAob2Zmc19jbVs6LCBOb25lXSA8IE0pICYgKG9mZnNfY25bTm9uZSwgOl0gPCBOKQojICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKCiMgZGVmIG1hdG11bChhLCBiLCBhY3RpdmF0aW9uPSIiKToKIyAgICAgIyBDaGVjayBjb25zdHJhaW50cy4KIyAgICAgSyA9IGEuc2l6ZSgtMSkKIyAgICAgTSA9IGEubnVtZWwoKSAvLyBLCiMgICAgIE4gPSBiLnNpemUoMSkKIyAgICAgYXNzZXJ0IGEuaXNfY29udGlndW91cygpLCAiTWF0cml4IEEgbXVzdCBiZSBjb250aWd1b3VzIgojICAgICBhc3NlcnQgSyA9PSBiLnNoYXBlWzBdLCAiSW5jb21wYXRpYmxlIGRpbWVuc2lvbnMiCiMgICAgICMgQWxsb2NhdGVzIG91dHB1dC4KIyAgICAgYyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPWEuZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDE2KQojICAgICAjIDFEIGxhdW5jaCBrZXJuZWwgd2hlcmUgZWFjaCBibG9jayBnZXRzIGl0cyBvd24gcHJvZ3JhbS4KIyAgICAgZ3JpZCA9IGxhbWJkYSBNRVRBOiAodHJpdG9uLmNkaXYoTSwgTUVUQVsnQkxPQ0tfU0laRV9NJ10pICogdHJpdG9uLmNkaXYoTiwgTUVUQVsnQkxPQ0tfU0laRV9OJ10pLCApCiMgICAgIG1hdG11bF9rZXJuZWxbZ3JpZF0oCiMgICAgICAgICBhLCBiLCBjLCAgIwojICAgICAgICAgTSwgTiwgSywgICMKIyAgICAgICAgIEssIDEsICAjCiMgICAgICAgICBiLnN0cmlkZSgwKSwgYi5zdHJpZGUoMSksICAjCiMgICAgICAgICBOLCAxLCAgIwojICAgICAgICAgQkxPQ0tfU0laRV9NPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9OPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9LPTEyOCwKIyAgICAgICAgIEdST1VQX1NJWkVfTT00LAojICAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uICAjCiMgICAgICkKIyAgICAgcmV0dXJuIGMKCgojIEB0b3JjaC5ub19ncmFkKCkKIyBkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiMgICAgIHhfZ2F0ZSA9IG1hdG11bCh4LCB3X2dhdGUpCiMgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgIHhfdXAgPSBtYXRtdWwoeCwgd191cCkKIyAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICBvdXQgPSBtYXRtdWwob3V0LCB3X2Rvd24pCiMgICAgIHJldHVybiBvdXQKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UxW2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgZW5kID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBwcmludChmIm1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMToge2VuZCAtIHN0YXJ0fSIpCgogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIHByaW50KGYibW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UyOiB7ZW5kIC0gc3RhcnR9IikKCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlM1soMSwgKV0oCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZCwKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTM6IHtlbmQgLSBzdGFydH0iKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2U0W2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHNvcnRlZF9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQ6IHtlbmQgLSBzdGFydH0iKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgojIEB0cml0b24uaml0CiMgZGVmIHNpbHVfYW5kX211bF9rZXJuZWwoaW5wdXRfcHRyLCBvdXRwdXRfcHRyLCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIpOgojICAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKIyAgICAgYV9ibG9ja19zdGFydCA9IHBpZCAqIEJMT0NLX1NJWkUKIyAgICAgYl9ibG9ja19zdGFydCA9IGFfYmxvY2tfc3RhcnQgKyBuX2VsZW1lbnRzCiMgICAgIGFfb2Zmc2V0cyA9IGFfYmxvY2tfc3RhcnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkKIyAgICAgYl9vZmZzZXRzID0gYl9ibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQojICAgICBhX21hc2sgPSBhX29mZnNldHMgPCBuX2VsZW1lbnRzCiMgICAgIGJfbWFzayA9IGJfb2Zmc2V0cyA8IG5fZWxlbWVudHMgKiAyCgojICAgICBhID0gdGwubG9hZChpbnB1dF9wdHIgKyBhX29mZnNldHMsIG1hc2s9YV9tYXNrKQojICAgICBiID0gdGwubG9hZChpbnB1dF9wdHIgKyBiX29mZnNldHMsIG1hc2s9Yl9tYXNrKQojICAgICBvdXRwdXQgPSBhICogKDEgLyAoMSArIHRsLmV4cCgtYS50byh0bC5mbG9hdDMyKSkpKSAqIGIKIyAgICAgdGwuc3RvcmUob3V0cHV0X3B0ciArIGFfb2Zmc2V0cywgb3V0cHV0LCBtYXNrPWFfbWFzaykKCiMgZ3JpZCA9ICh0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFKSwpCiMgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dF90ZW5zb3IsIG91dHB1dF90ZW5zb3IsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkUpCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAxMDI0IGlmIG5fZWxlbWVudHMgPiAxMDI0IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuWwogICAgICAgICAgICBOb25lLCA6XQogICAgICAgIGNfbWFzayA9IHRva2VuX21hc2tbOiwgTm9uZV0gJiAob2Zmc19jbltOb25lLCA6XSA8IE4pCiAgICAgICAgdGwuc3RvcmUoY19wdHJzLCBhY2N1bXVsYXRvciwgbWFzaz1jX21hc2spCgogICAgICAgIHRpbGVfaWQgKz0gTlVNX1NNUwoKCmRlZiBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChBOiB0b3JjaC5UZW5zb3IsIEI6IHRvcmNoLlRlbnNvciwgQzogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wa193ZWlnaHRzOiB0b3JjaC5UZW5zb3IsIHRvcGtfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfdG9rZW5faWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxfcm91dGVkX3dlaWdodDogYm9vbCwgdG9wX2s6IGludCk6CiAgICAjIHByaW50KG51bV90b2tlbnNfcG9zdF9wYWRkZWQpCiAgICAjIHByaW50KHNvcnRlZF90b2tlbl9pZHMuc2hhcGVbMF0pCiAgICBOVU1fU01TID0gdG9yY2guY3VkYS5nZXRfZGV2aWNlX3Byb3BlcnRpZXMoImN1ZGEiKS5tdWx0aV9wcm9jZXNzb3JfY291bnQgKiAyCiAgICBncmlkID0gbGFtYmRhIE1FVEE6IChtaW4oTlVNX1NNUywgdHJpdG9uLmNkaXYoc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSwgTUVUQVsiQkxPQ0tfU0laRV9NIl0pICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cml0b24uY2RpdihCLnNoYXBlWzFdLCBNRVRBWyJCTE9DS19TSVpFX04iXSkpLCApCiAgICBmdXNlZF9tb2Vfa2VybmVsW2dyaWRdKAogICAgICAgIEEsCiAgICAgICAgQiwKICAgICAgICBDLAogICAgICAgIHRvcGtfd2VpZ2h0cywKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgIGV4cGVydF9pZHMsCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwKICAgICAgICBCLnNoYXBlWzFdLAogICAgICAgIEIuc2hhcGVbMl0sCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSwKICAgICAgICB0b3BrX2lkcy5udW1lbCgpLAogICAgICAgIEEuc3RyaWRlKDApLAogICAgICAgIEEuc3RyaWRlKDEpLAogICAgICAgIEIuc3RyaWRlKDApLAogICAgICAgIEIuc3RyaWRlKDIpLAogICAgICAgIEIuc3RyaWRlKDEpLAogICAgICAgIEMuc3RyaWRlKDEpLAogICAgICAgIEMuc3RyaWRlKDIpLAogICAgICAgIHRvcGtfd2VpZ2h0cy5zdHJpZGUoMiksCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5zdHJpZGUoMCksCiAgICAgICAgTVVMX1JPVVRFRF9XRUlHSFQ9bXVsX3JvdXRlZF93ZWlnaHQsCiAgICAgICAgdG9wX2s9dG9wX2ssCiAgICAgICAgY29tcHV0ZV90eXBlPXRsLmJmbG9hdDE2IGlmIEEuZHR5cGUgPT0gdG9yY2guYmZsb2F0MTYgZWxzZSB0bC5mbG9hdDE2LAogICAgICAgIEJMT0NLX1NJWkVfTT1CTE9DS19TSVpFX00sCiAgICAgICAgQkxPQ0tfU0laRV9OPUJMT0NLX1NJWkVfTiwKICAgICAgICBCTE9DS19TSVpFX0s9QkxPQ0tfU0laRV9LLAogICAgICAgIEdST1VQX1NJWkVfTT1HUk9VUF9TSVpFX00sCiAgICAgICAgTlVNX1NNUz1OVU1fU01TLAogICAgICAgIG51bV93YXJwcz04LAogICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICB3YXZlc19wZXJfZXU9MCwKICAgICAgICBrcGFjaz0xLAogICAgICAgIG1hdHJpeF9pbnN0cl9ub25rZGltPTE2LAogICAgKQoKCiMgbWFpbiBrZXJuZWwKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9leHBlcnRfa2VybmVsKHg6IHRvcmNoLlRlbnNvciwgd19nYXRlOiB0b3JjaC5UZW5zb3IsIHdfdXA6IHRvcmNoLlRlbnNvciwgd19kb3duOiB0b3JjaC5UZW5zb3IpOgogICAgIyB4X2dhdGUgPSB4IEAgd19nYXRlCiAgICB4X2dhdGUgPSBGLmxpbmVhcih4LCB3X2dhdGUuVCkKICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiAgICAjIHhfdXAgPSB4IEAgd191cAogICAgeF91cCA9IEYubGluZWFyKHgsIHdfdXAuVCkKICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKICAgICMgb3V0ID0gb3V0IEAgd19kb3duCiAgICBvdXQgPSBGLmxpbmVhcihvdXQsIHdfZG93bi5UKQogICAgcmV0dXJuIG91dAoKCkB0cml0b24uaml0CmRlZiB0cmFuc3Bvc2Vfa2VybmVsKAogICAgTTogdGwuY29uc3RleHByLAogICAgTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgWCwKICAgIHN0cmlkZV94bTogdGwuY29uc3RleHByLAogICAgc3RyaWRlX3huOiB0bC5jb25zdGV4cHIsCiAgICBZLAogICAgc3RyaWRlX3ltOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeW46IHRsLmNvbnN0ZXhwciwKICAgIElEWDogdGwuY29uc3RleHByLAopOgogICAgcGlkX20gPSB0bC5wcm9ncmFtX2lkKDApLnRvKHRsLmludDY0KQogICAgcGlkX24gPSB0bC5wcm9ncmFtX2lkKDEpLnRvKHRsLmludDY0KQoKICAgIG1fZXhhY3Q6IHRsLmNvbnN0ZXhwciA9IChNICUgQkxPQ0tfTSkgPT0gMAogICAgbl9leGFjdDogdGwuY29uc3RleHByID0gKE4gJSBCTE9DS19OKSA9PSAwCgogICAgb2ZmX20gPSBwaWRfbSAqIEJMT0NLX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTSkKICAgIG9mZl9uID0gcGlkX24gKiBCTE9DS19OICsgdGwuYXJhbmdlKDAsIEJMT0NLX04pCgogICAgbWFza19tID0gb2ZmX20gPCBNCiAgICBtYXNrX24gPSBvZmZfbiA8IE4KCiAgICBpZiBtX2V4YWN0OgogICAgICAgIGlmIG5fZXhhY3Q6CiAgICAgICAgICAgIG1hc2sgPSBOb25lCiAgICAgICAgICAgIG90aGVyID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1hc2sgPSBtYXNrX25bTm9uZSwgOl0KICAgICAgICAgICAgb3RoZXIgPSAwCiAgICBlbHNlOgogICAgICAgIGlmIG5fZXhhY3Q6CiAgICAgICAgICAgIG1hc2sgPSBtYXNrX21bOiwgTm9uZV0KICAgICAgICAgICAgb3RoZXIgPSAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXSAmIG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKCiAgICAjIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIDEgKyBvZmZfbltOb25lLCA6XSAqIE0KICAgICMgWV9wdHJzID0gWSArIChFX0lEICogMiArIFdfSUQpICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIE4gKyBvZmZfbltOb25lLCA6XSAqIDEKICAgIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV94bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3huCiAgICBZX3B0cnMgPSBZICsgSURYICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV95bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3luCgogICAgdGlsZSA9IHRsLmxvYWQoWF9wdHJzLCBtYXNrPW1hc2ssIG90aGVyPW90aGVyKQogICAgdGwuc3RvcmUoWV9wdHJzLCB0aWxlLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV90cmFuc3Bvc2UoWCwgWSwgSURYPTAsIEJMT0NLX009MTI4LCBCTE9DS19OPTEyOCwgbnVtX3dhcnBzPTE2KSAtPiBOb25lOgogICAgaWYgWC5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFggPSBYLnZpZXcodG9yY2guaW50OCkKICAgIGlmIFkuZHR5cGUuaXRlbXNpemUgPT0gMToKICAgICAgICBZID0gWS52aWV3KHRvcmNoLmludDgpCgogICAgIyBjaGVjayBjb21wYXRpYmlsaXR5OgogICAgYXNzZXJ0IFguZHR5cGUgPT0gWS5kdHlwZQoKICAgIE0gPSBYLnNoYXBlWzBdCiAgICBOID0gWC5zaGFwZVsxXQoKICAgIHN0cmlkZV94bSA9IFguc3RyaWRlKDApCiAgICBzdHJpZGVfeG4gPSBYLnN0cmlkZSgxKQoKICAgIHN0cmlkZV95bSA9IFkuc3RyaWRlKC0yKQogICAgc3RyaWRlX3luID0gWS5zdHJpZGUoLTEpCgogICAgZ3JpZCA9ICgoTSArIEJMT0NLX00gLSAxKSAvLyBCTE9DS19NLCAoTiArIEJMT0NLX04gLSAxKSAvLyBCTE9DS19OKQogICAgdHJhbnNwb3NlX2tlcm5lbFtncmlkXSgKICAgICAgICBNLAogICAgICAgIE4sCiAgICAgICAgQkxPQ0tfTSwKICAgICAgICBCTE9DS19OLAogICAgICAgIFgsCiAgICAgICAgc3RyaWRlX3htLAogICAgICAgIHN0cmlkZV94biwKICAgICAgICBZLAogICAgICAgIHN0cmlkZV95bSwKICAgICAgICBzdHJpZGVfeW4sCiAgICAgICAgSURYPUlEWCwKICAgICAgICBudW1fd2FycHM9bnVtX3dhcnBzLAogICAgKQoKCncxOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDQwOTYsIDcxNjgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQp3MjogdG9yY2guVGVuc29yID0gdG9yY2guZW1wdHkoKDMyLCA3MTY4LCAyMDQ4KSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKCgpAdG9yY2gubm9fZ3JhZCgpCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgRGVlcFNlZWstc3R5bGUgTWl4dHVyZSBvZiBFeHBlcnRzIHVzaW5nIFB5VG9yY2guCiAgICAKICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgb2YgKGlucHV0OiB0b3JjaC5UZW5zb3IsIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLCBjb25maWc6IERpY3QpCiAgICAgICAgICAgIC0gaW5wdXQ6IElucHV0IHRlbnNvciBvZiBzaGFwZSBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbV0KICAgICAgICAgICAgLSB3ZWlnaHRzOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgd2VpZ2h0cwogICAgICAgICAgICAtIGNvbmZpZzogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgICAKICAgIFJldHVybnM6CiAgICAgICAgVHVwbGUgY29udGFpbmluZzoKICAgICAgICAgICAgLSBvdXRwdXQ6IFByb2Nlc3NlZCB0ZW5zb3IgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWxdCiAgICAgICAgICAgIC0gYXV4X2RhdGE6IERpY3Rpb25hcnkgd2l0aCBhdXhpbGlhcnkgZGF0YQogICAgIiIiCiAgICB0aW1lX2xpc3QgPSBbXQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBwcmVwYXJlIHdlaWdodAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXQogICAgY29uZmlnOiBEaWN0W3N0ciwgaW50XQogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCgogICAgTSA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdICogY29uZmlnWyJzZXFfbGVuIl0KICAgIE4gPSBjb25maWdbImRfZXhwZXJ0Il0KICAgIEsgPSBjb25maWdbImRfaGlkZGVuIl0KCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgZm9yIGogaW4gcmFuZ2UoMik6CiAgICAgICAgICAgIGludm9rZV90cmFuc3Bvc2Uod2VpZ2h0c1tmImV4cGVydHMue2l9LntqfS53ZWlnaHQiXS5ULCB3MSwgaSAqIDIgKyBqKQogICAgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pOgogICAgICAgIGludm9rZV90cmFuc3Bvc2Uod2VpZ2h0c1tmImV4cGVydHMue2l9LjIud2VpZ2h0Il0uVCwgdzIsIGkpCgogICAgaW50ZXJtZWRpYXRlX2NhY2hlMSA9IHRvcmNoLm9uZXMoKE0sIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCBOICogMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMiA9IHRvcmNoLmVtcHR5KChNICogY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGludGVybWVkaWF0ZV9jYWNoZTMgPSB0b3JjaC5lbXB0eSgoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIEspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGdhdGUKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IG1vZV9nYXRlX2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddLAogICAgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaGFyZWRfZXhwZXJ0cwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNoYXJlZF9vdXRwdXQgPSBtb2VfZXhwZXJ0X2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIG1vZSBhbGlnbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNvcnRlZF90b2tlbl9pZHMsIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdLCBCTE9DS19TSVpFX00pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8xCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW5wdXRfdGVuc29yLnZpZXcoLTEsIEspLCB3MSwgaW50ZXJtZWRpYXRlX2NhY2hlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaW5kaWNlcy5zaGFwZVsyXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc2lsdV9hbmRfbXVsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX3NpbHVfYW5kX211bF9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMS52aWV3KC0xLCAyICogTiksIGludGVybWVkaWF0ZV9jYWNoZTIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8yCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMiwgdzIsIGludGVybWVkaWF0ZV9jYWNoZTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfc2NvcmVzLCBleHBlcnRfaW5kaWNlcywgc29ydGVkX3Rva2VuX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQsIFRydWUsIDEpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHN1bQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHJvdXRlZF9vdXRwdXQgPSB0b3JjaC5zdW0oCiAgICAgICAgaW50ZXJtZWRpYXRlX2NhY2hlMy52aWV3KCppbnRlcm1lZGlhdGVfY2FjaGUzLnNoYXBlKSwgZGltPTEpLnZpZXcoY29uZmlnWyJiYXRjaF9zaXplIl0sIGNvbmZpZ1sic2VxX2xlbiJdLCBLKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBhZGQKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBvdXRwdXQgPSByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIHJldHVybiBvdXRwdXQKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBkYXRhID0gZ2VuZXJhdGVfaW5wdXQoCiAgICAgICAgICAgIGRoaWRkZW49NzE2OCwgZGV4cGVydD0yMDQ4LAogICAgICAgICAgICBucm91dGVkZXhwZXJ0cz0zMiwgbnNoYXJlZGV4cGVydHM9MSwgbmV4cGVydHNwZXJ0b2tlbj00LAogICAgICAgICAgICBicz0xLCBzZXFsZW49MjA0OCwgc2VlZD0xKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChkYXRhKQogICAgcmVmX2RhdGEgPSBfY2xvbmVfZGF0YShkYXRhKQogICAgcmVmX291dHB1dCA9IHJlZl9rZXJuZWwocmVmX2RhdGEpCiAgICBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgdGltZV9saXN0ID0gW10KICAgICMgZm9yIGkgaW4gcmFuZ2UoMjAwKToKICAgICMgICAgIGRhdGEgPSBnZW5lcmF0ZV9pbnB1dCgKICAgICMgICAgICAgICBkaGlkZGVuPTcxNjgsIGRleHBlcnQ9MjA0OCwKICAgICMgICAgICAgICBucm91dGVkZXhwZXJ0cz0zMiwgbnNoYXJlZGV4cGVydHM9MSwgbmV4cGVydHNwZXJ0b2tlbj00LAogICAgIyAgICAgICAgIGJzPTEsIHNlcWxlbj04MTkyLCBzZWVkPTEpCgogICAgIyAgICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjICAgICBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKCiAgICAjICAgICBvdXRwdXQgPSBjdXN0b21fa2VybmVsKGRhdGEpCgogICAgIyAgICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjICAgICBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjICAgICB0aW1lX2xpc3QuYXBwZW5kKChlbmQgLSBzdGFydCkgLyAxMDAwIC8gMTAwMCkKCiAgICAjICAgICByZWZfZGF0YSA9IF9jbG9uZV9kYXRhKGRhdGEpCiAgICAjICAgICByZWZfb3V0cHV0ID0gcmVmX2tlcm5lbChyZWZfZGF0YSkKCiAgICAjIHByaW50KHRpbWVfbGlzdCkKICAgICMgcHJpbnQoZiJhbGw6IHtzdW0odGltZV9saXN0Wy0xMDA6XSkgLyAxMDB9IikK
No newline at end of file
+ aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbWF0bXVsCgojIEB0cml0b24uaml0CiMgZGVmIG1hdG11bF9rZXJuZWwoCiMgICAgICAgICAjIFBvaW50ZXJzIHRvIG1hdHJpY2VzCiMgICAgICAgICBhX3B0ciwgYl9wdHIsIGNfcHRyLAojICAgICAgICAgIyBNYXRyaXggZGltZW5zaW9ucwojICAgICAgICAgTSwgTiwgSywKIyAgICAgICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQojICAgICAgICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAojICAgICAgICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgojICAgICAgICAgc3RyaWRlX2FtLCBzdHJpZGVfYWssICAjCiMgICAgICAgICBzdHJpZGVfYmssIHN0cmlkZV9ibiwgICMKIyAgICAgICAgIHN0cmlkZV9jbSwgc3RyaWRlX2NuLAojICAgICAgICAgIyBNZXRhLXBhcmFtZXRlcnMKIyAgICAgICAgIEJMT0NLX1NJWkVfTTogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsICAjCiMgICAgICAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwgICMKIyAgICAgICAgIEFDVElWQVRJT046IHRsLmNvbnN0ZXhwciAgIwojICk6CiMgICAgICIiIktlcm5lbCBmb3IgY29tcHV0aW5nIHRoZSBtYXRtdWwgQyA9IEEgeCBCLgojICAgICBBIGhhcyBzaGFwZSAoTSwgSyksIEIgaGFzIHNoYXBlIChLLCBOKSBhbmQgQyBoYXMgc2hhcGUgKE0sIE4pCiMgICAgICIiIgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgTWFwIHByb2dyYW0gaWRzIGBwaWRgIHRvIHRoZSBibG9jayBvZiBDIGl0IHNob3VsZCBjb21wdXRlLgojICAgICAjIFRoaXMgaXMgZG9uZSBpbiBhIGdyb3VwZWQgb3JkZXJpbmcgdG8gcHJvbW90ZSBMMiBkYXRhIHJldXNlLgojICAgICAjIFNlZSBhYm92ZSBgTDIgQ2FjaGUgT3B0aW1pemF0aW9uc2Agc2VjdGlvbiBmb3IgZGV0YWlscy4KIyAgICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiMgICAgIG51bV9waWRfbSA9IHRsLmNkaXYoTSwgQkxPQ0tfU0laRV9NKQojICAgICBudW1fcGlkX24gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKIyAgICAgbnVtX3BpZF9pbl9ncm91cCA9IEdST1VQX1NJWkVfTSAqIG51bV9waWRfbgojICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiMgICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFX00KIyAgICAgZ3JvdXBfc2l6ZV9tID0gbWluKG51bV9waWRfbSAtIGZpcnN0X3BpZF9tLCBHUk9VUF9TSVpFX00pCiMgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAoKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApICUgZ3JvdXBfc2l6ZV9tKQojICAgICBwaWRfbiA9IChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAvLyBncm91cF9zaXplX20KCiMgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIENyZWF0ZSBwb2ludGVycyBmb3IgdGhlIGZpcnN0IGJsb2NrcyBvZiBBIGFuZCBCLgojICAgICAjIFdlIHdpbGwgYWR2YW5jZSB0aGlzIHBvaW50ZXIgYXMgd2UgbW92ZSBpbiB0aGUgSyBkaXJlY3Rpb24KIyAgICAgIyBhbmQgYWNjdW11bGF0ZQojICAgICAjIGBhX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9LXSBwb2ludGVycwojICAgICAjIGBiX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfSywgQkxPQ0tfU0laRV9OXSBwb2ludGVycwojICAgICAjIFNlZSBhYm92ZSBgUG9pbnRlciBBcml0aG1ldGljYCBzZWN0aW9uIGZvciBkZXRhaWxzCiMgICAgIG9mZnNfYW0gPSAocGlkX20gKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKSkgJSBNCiMgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiMgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiMgICAgIGFfcHRycyA9IGFfcHRyICsgKG9mZnNfYW1bOiwgTm9uZV0gKiBzdHJpZGVfYW0gKyBvZmZzX2tbTm9uZSwgOl0gKiBzdHJpZGVfYWspCiMgICAgIGJfcHRycyA9IGJfcHRyICsgKG9mZnNfa1s6LCBOb25lXSAqIHN0cmlkZV9iayArIG9mZnNfYm5bTm9uZSwgOl0gKiBzdHJpZGVfYm4pCgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgSXRlcmF0ZSB0byBjb21wdXRlIGEgYmxvY2sgb2YgdGhlIEMgbWF0cml4LgojICAgICAjIFdlIGFjY3VtdWxhdGUgaW50byBhIGBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX05dYCBibG9jawojICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiMgICAgICMgYGFjY3VtdWxhdG9yYCB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIGZwMTYgYWZ0ZXIgdGhlIGxvb3AuCiMgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKIyAgICAgZm9yIGsgaW4gcmFuZ2UoMCwgdGwuY2RpdihLLCBCTE9DS19TSVpFX0spKToKIyAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgIyBJZiBpdCBpcyBvdXQgb2YgYm91bmRzLCBzZXQgaXQgdG8gMC4KIyAgICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywgbWFzaz1vZmZzX2tbTm9uZSwgOl0gPCBLIC0gayAqIEJMT0NLX1NJWkVfSywgb3RoZXI9MC4wKQojICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSBrICogQkxPQ0tfU0laRV9LLCBvdGhlcj0wLjApCiMgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgYWNjdW11bGF0b3IgPSB0bC5kb3QoYSwgYiwgYWNjdW11bGF0b3IpCiMgICAgICAgICAjIEFkdmFuY2UgdGhlIHB0cnMgdG8gdGhlIG5leHQgSyBibG9jay4KIyAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKIyAgICAgICAgIGJfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYmsKIyAgICAgIyBZb3UgY2FuIGZ1c2UgYXJiaXRyYXJ5IGFjdGl2YXRpb24gZnVuY3Rpb25zIGhlcmUKIyAgICAgIyB3aGlsZSB0aGUgYWNjdW11bGF0b3IgaXMgc3RpbGwgaW4gRlAzMiEKIyAgICAgaWYgQUNUSVZBVElPTiA9PSAibGVha3lfcmVsdSI6CiMgICAgICAgICBhY2N1bXVsYXRvciA9IGxlYWt5X3JlbHUoYWNjdW11bGF0b3IpCiMgICAgIGMgPSBhY2N1bXVsYXRvci50byh0bC5mbG9hdDE2KQoKIyAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIFdyaXRlIGJhY2sgdGhlIGJsb2NrIG9mIHRoZSBvdXRwdXQgbWF0cml4IEMgd2l0aCBtYXNrcy4KIyAgICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKIyAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKIyAgICAgY19wdHJzID0gY19wdHIgKyBzdHJpZGVfY20gKiBvZmZzX2NtWzosIE5vbmVdICsgc3RyaWRlX2NuICogb2Zmc19jbltOb25lLCA6XQojICAgICBjX21hc2sgPSAob2Zmc19jbVs6LCBOb25lXSA8IE0pICYgKG9mZnNfY25bTm9uZSwgOl0gPCBOKQojICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKCiMgZGVmIG1hdG11bChhLCBiLCBhY3RpdmF0aW9uPSIiKToKIyAgICAgIyBDaGVjayBjb25zdHJhaW50cy4KIyAgICAgSyA9IGEuc2l6ZSgtMSkKIyAgICAgTSA9IGEubnVtZWwoKSAvLyBLCiMgICAgIE4gPSBiLnNpemUoMSkKIyAgICAgYXNzZXJ0IGEuaXNfY29udGlndW91cygpLCAiTWF0cml4IEEgbXVzdCBiZSBjb250aWd1b3VzIgojICAgICBhc3NlcnQgSyA9PSBiLnNoYXBlWzBdLCAiSW5jb21wYXRpYmxlIGRpbWVuc2lvbnMiCiMgICAgICMgQWxsb2NhdGVzIG91dHB1dC4KIyAgICAgYyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPWEuZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDE2KQojICAgICAjIDFEIGxhdW5jaCBrZXJuZWwgd2hlcmUgZWFjaCBibG9jayBnZXRzIGl0cyBvd24gcHJvZ3JhbS4KIyAgICAgZ3JpZCA9IGxhbWJkYSBNRVRBOiAodHJpdG9uLmNkaXYoTSwgTUVUQVsnQkxPQ0tfU0laRV9NJ10pICogdHJpdG9uLmNkaXYoTiwgTUVUQVsnQkxPQ0tfU0laRV9OJ10pLCApCiMgICAgIG1hdG11bF9rZXJuZWxbZ3JpZF0oCiMgICAgICAgICBhLCBiLCBjLCAgIwojICAgICAgICAgTSwgTiwgSywgICMKIyAgICAgICAgIEssIDEsICAjCiMgICAgICAgICBiLnN0cmlkZSgwKSwgYi5zdHJpZGUoMSksICAjCiMgICAgICAgICBOLCAxLCAgIwojICAgICAgICAgQkxPQ0tfU0laRV9NPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9OPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9LPTEyOCwKIyAgICAgICAgIEdST1VQX1NJWkVfTT00LAojICAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uICAjCiMgICAgICkKIyAgICAgcmV0dXJuIGMKCgojIEB0b3JjaC5ub19ncmFkKCkKIyBkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiMgICAgIHhfZ2F0ZSA9IG1hdG11bCh4LCB3X2dhdGUpCiMgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgIHhfdXAgPSBtYXRtdWwoeCwgd191cCkKIyAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICBvdXQgPSBtYXRtdWwob3V0LCB3X2Rvd24pCiMgICAgIHJldHVybiBvdXQKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UxW2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgZW5kID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBwcmludChmIm1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMToge2VuZCAtIHN0YXJ0fSIpCgogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIHByaW50KGYibW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UyOiB7ZW5kIC0gc3RhcnR9IikKCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlM1soMSwgKV0oCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZCwKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTM6IHtlbmQgLSBzdGFydH0iKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2U0W2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHNvcnRlZF9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQ6IHtlbmQgLSBzdGFydH0iKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgojIEB0cml0b24uaml0CiMgZGVmIHNpbHVfYW5kX211bF9rZXJuZWwoaW5wdXRfcHRyLCBvdXRwdXRfcHRyLCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIpOgojICAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKIyAgICAgYV9ibG9ja19zdGFydCA9IHBpZCAqIEJMT0NLX1NJWkUKIyAgICAgYl9ibG9ja19zdGFydCA9IGFfYmxvY2tfc3RhcnQgKyBuX2VsZW1lbnRzCiMgICAgIGFfb2Zmc2V0cyA9IGFfYmxvY2tfc3RhcnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkKIyAgICAgYl9vZmZzZXRzID0gYl9ibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQojICAgICBhX21hc2sgPSBhX29mZnNldHMgPCBuX2VsZW1lbnRzCiMgICAgIGJfbWFzayA9IGJfb2Zmc2V0cyA8IG5fZWxlbWVudHMgKiAyCgojICAgICBhID0gdGwubG9hZChpbnB1dF9wdHIgKyBhX29mZnNldHMsIG1hc2s9YV9tYXNrKQojICAgICBiID0gdGwubG9hZChpbnB1dF9wdHIgKyBiX29mZnNldHMsIG1hc2s9Yl9tYXNrKQojICAgICBvdXRwdXQgPSBhICogKDEgLyAoMSArIHRsLmV4cCgtYS50byh0bC5mbG9hdDMyKSkpKSAqIGIKIyAgICAgdGwuc3RvcmUob3V0cHV0X3B0ciArIGFfb2Zmc2V0cywgb3V0cHV0LCBtYXNrPWFfbWFzaykKCiMgZ3JpZCA9ICh0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFKSwpCiMgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dF90ZW5zb3IsIG91dHB1dF90ZW5zb3IsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkUpCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAxMDI0IGlmIG5fZWxlbWVudHMgPiAxMDI0IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICAgICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGFjY3VtdWxhdG9yLCBtYXNrPWNfbWFzaykKCiAgICAgICAgdGlsZV9pZCArPSBOVU1fU01TCgoKZGVmIGludm9rZV9mdXNlZF9tb2Vfa2VybmVsKEE6IHRvcmNoLlRlbnNvciwgQjogdG9yY2guVGVuc29yLCBDOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BrX3dlaWdodHM6IHRvcmNoLlRlbnNvciwgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9yb3V0ZWRfd2VpZ2h0OiBib29sLCB0b3BfazogaW50KToKICAgICMgcHJpbnQobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCkKICAgICMgcHJpbnQoc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSkKICAgIE5VTV9TTVMgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfcHJvcGVydGllcygiY3VkYSIpLm11bHRpX3Byb2Nlc3Nvcl9jb3VudCAqIDIKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKG1pbihOVU1fU01TLCB0cml0b24uY2Rpdihzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLCBNRVRBWyJCTE9DS19TSVpFX00iXSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXRvbi5jZGl2KEIuc2hhcGVbMV0sIE1FVEFbIkJMT0NLX1NJWkVfTiJdKSksICkKICAgIGZ1c2VkX21vZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgdG9wa193ZWlnaHRzLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgIEIuc2hhcGVbMV0sCiAgICAgICAgQi5zaGFwZVsyXSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgQS5zdHJpZGUoMCksCiAgICAgICAgQS5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQi5zdHJpZGUoMiksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMiksCiAgICAgICAgdG9wa193ZWlnaHRzLnN0cmlkZSgyKSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnN0cmlkZSgwKSwKICAgICAgICBNVUxfUk9VVEVEX1dFSUdIVD1tdWxfcm91dGVkX3dlaWdodCwKICAgICAgICB0b3Bfaz10b3BfaywKICAgICAgICBjb21wdXRlX3R5cGU9dGwuYmZsb2F0MTYgaWYgQS5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNiBlbHNlIHRsLmZsb2F0MTYsCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwKICAgICAgICBCTE9DS19TSVpFX049QkxPQ0tfU0laRV9OLAogICAgICAgIEJMT0NLX1NJWkVfSz1CTE9DS19TSVpFX0ssCiAgICAgICAgR1JPVVBfU0laRV9NPUdST1VQX1NJWkVfTSwKICAgICAgICBOVU1fU01TPU5VTV9TTVMsCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgICMgWF9wdHJzID0gWCArIG9mZl9tWzosIE5vbmVdICogMSArIG9mZl9uW05vbmUsIDpdICogTQogICAgIyBZX3B0cnMgPSBZICsgKEVfSUQgKiAyICsgV19JRCkgKiBNICogTiArIG9mZl9tWzosIE5vbmVdICogTiArIG9mZl9uW05vbmUsIDpdICogMQogICAgWF9wdHJzID0gWCArIG9mZl9tWzosIE5vbmVdICogc3RyaWRlX3htICsgb2ZmX25bTm9uZSwgOl0gKiBzdHJpZGVfeG4KICAgIFlfcHRycyA9IFkgKyBJRFggKiBNICogTiArIG9mZl9tWzosIE5vbmVdICogc3RyaWRlX3ltICsgb2ZmX25bTm9uZSwgOl0gKiBzdHJpZGVfeW4KCiAgICB0aWxlID0gdGwubG9hZChYX3B0cnMsIG1hc2s9bWFzaywgb3RoZXI9b3RoZXIpCiAgICB0bC5zdG9yZShZX3B0cnMsIHRpbGUsIG1hc2s9bWFzaykKCgpkZWYgaW52b2tlX3RyYW5zcG9zZShYLCBZLCBJRFg9MCwgQkxPQ0tfTT0xMjgsIEJMT0NLX049MTI4LCBudW1fd2FycHM9MTYpIC0+IE5vbmU6CiAgICBpZiBYLmR0eXBlLml0ZW1zaXplID09IDE6CiAgICAgICAgWCA9IFgudmlldyh0b3JjaC5pbnQ4KQogICAgaWYgWS5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFkgPSBZLnZpZXcodG9yY2guaW50OCkKCiAgICAjIGNoZWNrIGNvbXBhdGliaWxpdHk6CiAgICBhc3NlcnQgWC5kdHlwZSA9PSBZLmR0eXBlCgogICAgTSA9IFguc2hhcGVbMF0KICAgIE4gPSBYLnNoYXBlWzFdCgogICAgc3RyaWRlX3htID0gWC5zdHJpZGUoMCkKICAgIHN0cmlkZV94biA9IFguc3RyaWRlKDEpCgogICAgc3RyaWRlX3ltID0gWS5zdHJpZGUoLTIpCiAgICBzdHJpZGVfeW4gPSBZLnN0cmlkZSgtMSkKCiAgICBncmlkID0gKChNICsgQkxPQ0tfTSAtIDEpIC8vIEJMT0NLX00sIChOICsgQkxPQ0tfTiAtIDEpIC8vIEJMT0NLX04pCiAgICB0cmFuc3Bvc2Vfa2VybmVsW2dyaWRdKAogICAgICAgIE0sCiAgICAgICAgTiwKICAgICAgICBCTE9DS19NLAogICAgICAgIEJMT0NLX04sCiAgICAgICAgWCwKICAgICAgICBzdHJpZGVfeG0sCiAgICAgICAgc3RyaWRlX3huLAogICAgICAgIFksCiAgICAgICAgc3RyaWRlX3ltLAogICAgICAgIHN0cmlkZV95biwKICAgICAgICBJRFg9SURYLAogICAgICAgIG51bV93YXJwcz1udW1fd2FycHMsCiAgICApCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2gub25lcygoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4gKiAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUyID0gdG9yY2guZW1wdHkoKE0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMyA9IHRvcmNoLmVtcHR5KChNLCBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgSyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBtb2UgZ2F0ZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10sCiAgICAgICAgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHNoYXJlZF9leHBlcnRzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc2hhcmVkX291dHB1dCA9IG1vZV9leHBlcnRfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGFsaWduCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc29ydGVkX3Rva2VuX2lkcywgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCA9IGludm9rZV9tb2VfYWxpZ25fYmxvY2tfc2l6ZSgKICAgICAgICBleHBlcnRfaW5kaWNlcywgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIEJMT0NLX1NJWkVfTSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzEKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnB1dF90ZW5zb3IudmlldygtMSwgSyksIHcxLCBpbnRlcm1lZGlhdGVfY2FjaGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X3Njb3JlcywgZXhwZXJ0X2luZGljZXMsIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pbmRpY2VzLnNoYXBlWzJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaWx1X2FuZF9tdWwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUxLnZpZXcoLTEsIDIgKiBOKSwgaW50ZXJtZWRpYXRlX2NhY2hlMikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUyLCB3MiwgaW50ZXJtZWRpYXRlX2NhY2hlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgVHJ1ZSwgMSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc3VtCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgcm91dGVkX291dHB1dCA9IHRvcmNoLnN1bSgKICAgICAgICBpbnRlcm1lZGlhdGVfY2FjaGUzLnZpZXcoKmludGVybWVkaWF0ZV9jYWNoZTMuc2hhcGUpLCBkaW09MSkudmlldyhjb25maWdbImJhdGNoX3NpemUiXSwgY29uZmlnWyJzZXFfbGVuIl0sIEspCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGFkZAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIG91dHB1dCA9IHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgogICAgcmV0dXJuIG91dHB1dAoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGRhdGEgPSBnZW5lcmF0ZV9pbnB1dCgKICAgICAgICAgICAgZGhpZGRlbj03MTY4LCBkZXhwZXJ0PTIwNDgsCiAgICAgICAgICAgIG5yb3V0ZWRleHBlcnRzPTMyLCBuc2hhcmVkZXhwZXJ0cz0xLCBuZXhwZXJ0c3BlcnRva2VuPTQsCiAgICAgICAgICAgIGJzPTEsIHNlcWxlbj0yMDQ4LCBzZWVkPTEpCiAgICBvdXRwdXQgPSBjdXN0b21fa2VybmVsKGRhdGEpCiAgICByZWZfZGF0YSA9IF9jbG9uZV9kYXRhKGRhdGEpCiAgICByZWZfb3V0cHV0ID0gcmVmX2tlcm5lbChyZWZfZGF0YSkKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0LCByZWZfb3V0cHV0LCBydG9sPTFlLTIsIGF0b2w9MWUtMikpCgogICAgIyB0aW1lX2xpc3QgPSBbXQogICAgIyBmb3IgaSBpbiByYW5nZSgyMDApOgogICAgIyAgICAgZGF0YSA9IGdlbmVyYXRlX2lucHV0KAogICAgIyAgICAgICAgIGRoaWRkZW49NzE2OCwgZGV4cGVydD0yMDQ4LAogICAgIyAgICAgICAgIG5yb3V0ZWRleHBlcnRzPTMyLCBuc2hhcmVkZXhwZXJ0cz0xLCBuZXhwZXJ0c3BlcnRva2VuPTQsCiAgICAjICAgICAgICAgYnM9MSwgc2VxbGVuPTgxOTIsIHNlZWQ9MSkKCiAgICAjICAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgICAgIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQoKICAgICMgICAgIG91dHB1dCA9IGN1c3RvbV9rZXJuZWwoZGF0YSkKCiAgICAjICAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgICAgIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgICAgIHRpbWVfbGlzdC5hcHBlbmQoKGVuZCAtIHN0YXJ0KSAvIDEwMDAgLyAxMDAwKQoKICAgICMgICAgIHJlZl9kYXRhID0gX2Nsb25lX2RhdGEoZGF0YSkKICAgICMgICAgIHJlZl9vdXRwdXQgPSByZWZfa2VybmVsKHJlZl9kYXRhKQoKICAgICMgcHJpbnQodGltZV9saXN0KQogICAgIyBwcmludChmImFsbDoge3N1bSh0aW1lX2xpc3RbLTEwMDpdKSAvIDEwMH0iKQo=
No newline at end of file

Best evidence level for this revision: reported

JSON