submission 29859
KernelBot user 376 · 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.
baguette_mla.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-29859?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesbf16
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:a6c42bdfcdf486161dea37ed2a3b7e1632ad455050f7a99d19b8bbda3ff94567
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
baguette_mla.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKa2VybmVsX2NwcCA9IHIiIiIKI3VuZGVmIF9fSElQX05PX0hBTEZfT1BFUkFUT1JTX18KI3VuZGVmIF9fSElQX05PX0hBTEZfQ09OVkVSU0lPTlNfXwojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmbG9hdDE2Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCiNpbmNsdWRlIDxyb2NibGFzL3JvY2JsYXMuaD4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCgoKUFlCSU5EMTFfTU9EVUxFKHJvcGUsIG0pIHsKICBtLmRlZigiaW5pdCIsICZpbml0LCAiSW5pdCBjb2RlIik7CiAgbS5kZWYoInJvcGUiLCAmY29tcHV0ZV9yb3Blc193cmFwcGVyLCAiUm9wZSBrZXJuZWwiKTsKICBtLmRlZigic3RvcmVrdiIsICZzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyLCAiS1ZDYWNoZSBrZXJuZWwiKTsKICBtLmRlZigiZG93bl9wcm9qIiwgJmRvd25fcHJvaiwgIkRvd24gUHJvaiBrZXJuZWwiKTsKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTciXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUpIC0+IE5vbmU6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KICAgIApAZGF0YWNsYXNzCmNsYXNzIENvbmZpZzoKICAgIGJhdGNoX3NpemU6IGludAogICAgZGltOiBpbnQKICAgIG5faGVhZHM6IGludAogICAgcV9sb3JhX3Jhbms6IGludCAKICAgIGt2X2xvcmFfcmFuazogaW50CiAgICBxa19ub3BlX2hlYWRfZGltOiBpbnQKICAgIHFrX3JvcGVfaGVhZF9kaW06IGludAogICAgdl9oZWFkX2RpbTogaW50CiAgICBzZXFfbGVuOiBpbnQKICAgIG1heF9zZXFfbGVuOiBpbnQKICAgIGt2X2NhY2hlX3NoYXBlOiB0dXBsZQogICAgUV9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIFFfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICB3b193ZWlnaHQ6IHRvcmNoLlRlbnNvcgoKICAgICAKY2xhc3MgTUxBKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBDb25maWcpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZGltID0gY29uZmlnLmRpbQogICAgICAgIHNlbGYubl9oZWFkcyA9IGNvbmZpZy5uX2hlYWRzCiAgICAgICAgc2VsZi5xX2xvcmFfcmFuayA9IGNvbmZpZy5xX2xvcmFfcmFuawogICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rID0gY29uZmlnLmt2X2xvcmFfcmFuawogICAgICAgIHNlbGYubm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltID0gY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnZfaGVhZF9kaW0gPSBjb25maWcudl9oZWFkX2RpbQogICAgICAgICMgRG93bi1wcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYua3ZfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAgc2VsZi5xX2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5xX2xvcmFfcmFuayxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLmt2X2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsrNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAgICAgIGhpcF9tb2R1bGUuaW5pdCgpCiAgICAgICAgCiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgoKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICBoaXBfbW9kdWxlLmRvd25fcHJvaigKICAgICAgICAgICAgICAgIHguZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYuUV9wcm9qX2Rvd24ud2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24ud2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYV9yYW5rLAogICAgICAgICAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsrNjQsCiAgICAgICAgICAgICAgICB4LnNoYXBlWzJdKQogICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUuc3RvcmVrdigKICAgICAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAga3ZfY2FjaGUuZ2V0X2RhdGEoKS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgICAgIGt2X2NhY2hlLnNlcV9sZW4pCiAgICAgICAgCiAgICAgICAga3ZfY2FjaGUuc2VxX2xlbis9MQogICAgICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4KICAgICAgICAKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCiAgICAgICAga3ZfbG9yYSA9IGt2X2NhY2hlLmdldF9kYXRhKClbOiwgOmt2X2xlbiwgOl0KICAgICAgICAKICAgICAgICBrdkRvd25fbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgIFdrdl91cCA9IHNlbGYuS1ZfcHJval91cC53ZWlnaHQudCgpLnZpZXcoc2VsZi5rdl9sb3JhX3Jhbmssc2VsZi5uX2hlYWRzLHNlbGYubm9wZV9oZWFkX2RpbStzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAgV2tfdXAsIFd2X3VwID0gdG9yY2guc3BsaXQoV2t2X3VwLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnZfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAgV2tfdXAgPSBXa191cC5wZXJtdXRlKDEsIDIsIDApICMgKG5faGVhZCwgZGltLCBoZWFkKSwgdGhlbiAobl9oZWFkLCBoZWFkLGRpbSkgZm9yIG1hdG11bAogICAgICAgIFd2X3VwID0gV3ZfdXAucGVybXV0ZSgxLCAwLCAyKSAgIyBzaGFwZTogKG5faGVhZCwgZGltLCBoZWFkKSAgICAgICAgCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuUV9wcm9qX3VwLndlaWdodC50KCkudmlldyhzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLm5vcGVfaGVhZF9kaW0rc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFdxX1VwX25vcGUsIFdxX1VwX3JvcGUgPSB0b3JjaC5zcGxpdChXcU5vcGVSb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAgCiAgICAgICAgV3FfVXBfbm9wZSA9IFdxX1VwX25vcGUucGVybXV0ZSgxLCAwLCAyKSAKICAgICAgICBXX21lcmdlZCA9IHRvcmNoLm1hdG11bChXcV9VcF9ub3BlLFdrX3VwKSAKICAgCiAgICAgICAgV3FfVXBfcm9wZSA9IFdxX1VwX3JvcGUucmVzaGFwZShzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcypzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgUVJvcGUgPSB0b3JjaC5tYXRtdWwoc2VsZi5xX2xvcmEsV3FfVXBfcm9wZSkKICAgICAgICAKICAgICAgICBrdl9kb3duX3Blcm11dGUgPSBrdkRvd25fbm9wZS5wZXJtdXRlKDAsMiwxKQogICAgICAgIAogICAgICAgIHFfZG93biA9IHNlbGYucV9sb3JhLnVuc3F1ZWV6ZSgxKSAjICgxMjgsMSwxNTM2KSAtPiAoMTI4LDEsMSwxNTM2KQogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2X2Rvd25fcGVybXV0ZS51bnNxdWVlemUoMSkgIygxMjgsNTEyLHNlcSkgLT4gKDEyOCwxLDUxMixzZXEpCiAgICAgICAgCiAgICAgICAgU2NvcmVOb1JvcGUxID0gdG9yY2gubWF0bXVsKHFfZG93bi5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV19tZXJnZWQpCiAgICAgICAgU2NvcmVOb1JvcGUxID0gU2NvcmVOb1JvcGUxLnBlcm11dGUoMSwwLDIpCiAgICAgICAgU2NvcmVOb1JvcGVfdD1TY29yZU5vUm9wZTEudmlldyhiYXRjaF9zaXplLHNlbGYubl9oZWFkcyw1MTIpICNbYnMsbl9oZWFkLDUxMl0pCiAgICAgICAgU2NvcmVOb1JvcGUgPSB0b3JjaC5tYXRtdWwoU2NvcmVOb1JvcGVfdCxrdl9kb3duX3Blcm11dGUuc3F1ZWV6ZSgxKSkKICAgICAgICAKICAgICAgICBRUm9wZSA9IFFSb3BlLnZpZXcoMTI4LCAxLCAxMjgsIDY0KQogICAgICAgIHFfcm9wZSA9IFFSb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogCiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIGt2X2xlbiwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgcV9yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywxLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLnJvcGUoa19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLnN0cmlkZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5faGVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGt2X2xlbikKICAgICAgICAKICAgICAgICBrX3JvcGVfb3V0ID0ga19yb3BlX291dC51bnNxdWVlemUoMSkKICAgICAgICAKICAgICAgICBTY29yZU91dCA9IHRvcmNoLmJhZGRibW0oCiAgICAgICAgICAgICAgICAgICAgICAgIFNjb3JlTm9Sb3BlLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LnNxdWVlemUoMiksCiAgICAgICAgICAgICAgICAgICAgICAgIGtfcm9wZV9vdXQucGVybXV0ZSgwLCAxLCAzLCAyKS5zcXVlZXplKDEpLAogICAgICAgICAgICAgICAgICAgICAgICBiZXRhPTEuMCAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pLAogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYT0xLjAgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgQXR0bk91dFNNYXggPSBGLnNvZnRtYXgoU2NvcmVPdXQsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAga3ZfZG93biA9IGt2RG93bl9ub3BlLnVuc3F1ZWV6ZSgxKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoQXR0bk91dFNNYXguc3F1ZWV6ZSgyKSxrdl9kb3duLnNxdWVlemUoMSkpCiAgICAgICAgeTBfYz15MF9jLnVuc3F1ZWV6ZSgyKQogICAgICAgIAogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV3ZfdXApCiAgICAgICAgeTBfYyA9IHkwX2MucGVybXV0ZSgxLDAsMikKICAgICAgICB5MF9jID0gc2VsZi53byh5MF9jLmZsYXR0ZW4oc3RhcnRfZGltPTEpKQogICAgICAgIAogICAgICAgIHJldHVybiB5MF9jLnZpZXcoYmF0Y2hfc2l6ZSwxLHNlbGYuZGltKSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKbW9kZWwgPSBOb25lCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgICAgICBnbG9iYWwgbW9kZWwKICAgICAgICBpZiBtb2RlbCA9PSBOb25lOgogICAgICAgICAgICBtb2RlbCA9IE1MQShjb25maWcpLnRvKCdjdWRhOjAnKQogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLndvX3dlaWdodCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnNpemUoKSwgY29uZmlnLlFfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX3VwX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLlFfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0LnNldF8oY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc3RyaWRlKCkpIAogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQuc2V0Xyhjb25maWcud29fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcud29fd2VpZ2h0LnNpemUoKSwgY29uZmlnLndvX3dlaWdodC5zdHJpZGUoKSkgCgogICAgICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgICAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZQ==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 submission 26740.
- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgoKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCgpjbGFzcyBNTEEobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IENvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgIyBEb3duLXByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLnFfbG9yYV9yYW5rLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0sIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQoKICAgICAgICAjIFVwLXByb2plY3Rpb24gYW5kIHJvcGUgcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYucV9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5rdl9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBSb1BFIG9uIGhhbGYgZW1iZWRkaW5ncwogICAgICAgIHNlbGYucV9yb3BlID0gUm9QRShzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgc2VsZi5rX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKCiAgICAgICAgIyBPdXRwdXQgcHJvamVjdGlvbgogICAgICAgIHNlbGYud28gPSBubi5MaW5lYXIoc2VsZi52X2hlYWRfZGltICogc2VsZi5uX2hlYWRzLCBzZWxmLmRpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgIAoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICAjIHNlcV9sZW4gPSAxIGFsd2F5cyBoZXJlCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgbW9kZWxfZGltID0geC5zaXplKCkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICBTdGVwIDE6IEhhbmRsZSBkb3duLXByb2plY3Rpb24gKyBLViBjYWNoZSAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgcV9sb3JhID0gc2VsZi5RX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEgPSBzZWxmLktWX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICBTdGVwIDI6IFVwLXByb2plY3QgYW5kIHByZXBhcmUgTm9QRSArIFJvUEUgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIyBIYW5kbGUgcXVlcmllcyBRIGZpcnN0CiAgICAgICAgcV9ub3BlX2FuZF9yb3BlID0gc2VsZi5RX3Byb2pfdXAocV9sb3JhKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICAjIEhhbmRsZSBrZXlzIGFuZCB2YWx1ZXMgSy9WLiBWIGRvZXMgbm90IG5lZWQgUm9QRQogICAgICAgIGt2X25vcGUsIGtfcm9wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtzZWxmLmt2X2xvcmFfcmFuaywgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIGt2X25vcGUgPSBzZWxmLktWX3Byb2pfdXAoa3Zfbm9wZSkudmlldygKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwga3ZfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkKICAgICAgICBrX25vcGUsIHYgPSB0b3JjaC5zcGxpdChrdl9ub3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnZfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgU3RlcCAzOiBIYW5kbGUgUm9QRSBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3IgcXVlcmllcyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHggc2VxX2xlbiB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBxX3JvcGUgPSBzZWxmLnFfcm9wZShxX3JvcGUsIHN0YXJ0X3Bvcz1xdWVyeV9wb3MpCgogICAgICAgIHFfbm9wZSA9IHFfbm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHggc2VxX2xlbiB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkKCgogICAgICAgICMgQ29tcHV0ZSBSb1BFIGZvciBrZXlzIGFuZCBjb21iaW5lIHdpdGggbm8tUm9QRSBwYXJ0CiAgICAgICAga19yb3BlID0ga19yb3BlWzosIE5vbmUsIDosIDpdCiAgICAgICAga19yb3BlID0gc2VsZi5rX3JvcGUoa19yb3BlKS5leHBhbmQoLTEsc2VsZi5uX2hlYWRzLC0xLC0xKQogICAgICAgIGtfbm9wZSA9IGtfbm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBrdl9sZW4geCBuX2hlYWRzIHggcm9wZV9oZWFkX2RpbQogICAgICAgIGsgPSB0b3JjaC5jb25jYXQoW2tfbm9wZSwga19yb3BlXSwgZGltPS0xKQogICAgICAgICAgICAgICAgCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBNdWx0aS1oZWFkIEF0dGVudGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgdiA9IHYucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHggbl9oZWFkcyB4IGt2X2xlbiB4IHZfaGVhZF9kaW0KICAgICAgICBzY29yZXMgPSB0b3JjaC5tYXRtdWwocSwgay50cmFuc3Bvc2UoLTEsIC0yKSkgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIGF0dG4gPSBGLnNvZnRtYXgoc2NvcmVzLCBkaW09LTEpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHkgPSB0b3JjaC5tYXRtdWwoYXR0biwgdikudmlldyhiYXRjaF9zaXplLCAxLCAtMSkKICAgICAgICB5ID0gc2VsZi53byh5KQoKICAgICAgICByZXR1cm4geSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKbW9kZWwgPSBOb25lCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgIGdsb2JhbCBtb2RlbAogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgaWYgbW9kZWwgPT0gTm9uZToKICAgICAgICAgICAgbW9kZWwgPSBNTEEoY29uZmlnKS50bygnY3VkYScpCiAgICAgICAgICAgIG1vZGVsLlFfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC5RX3Byb2pfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC5LVl9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC5LVl9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval91cF93ZWlnaHQpCiAgICAgICAgICAgIG1vZGVsLndvLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcud29fd2VpZ2h0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZGVsLlFfcHJval9kb3duLndlaWdodC5zZXRfKGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQudW50eXBlZF9zdG9yYWdlKCksIDAsIGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQuc2l6ZSgpLCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnN0cmlkZSgpKSAKICAgICAgICAgICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodC5zZXRfKGNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5zaXplKCksIGNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpKSAKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval9kb3duLndlaWdodC5zZXRfKGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5zaXplKCksIGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LnN0cmlkZSgpKSAKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQuc2V0Xyhjb25maWcuS1ZfcHJval91cF93ZWlnaHQudW50eXBlZF9zdG9yYWdlKCksIDAsIGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC5zaXplKCksIGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLndvLndlaWdodC5zZXRfKGNvbmZpZy53b193ZWlnaHQudW50eXBlZF9zdG9yYWdlKCksIDAsIGNvbmZpZy53b193ZWlnaHQuc2l6ZSgpLCBjb25maWcud29fd2VpZ2h0LnN0cmlkZSgpKSAKCgogICAgb3V0cHV0LCBrdl9jYWNoZSA9IG1vZGVsKHgsIGt2X2NhY2hlKQogICAgcmV0dXJuIG91dHB1dCwga3ZfY2FjaGU=No newline at end of file+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKa2VybmVsX2NwcCA9IHIiIiIKI3VuZGVmIF9fSElQX05PX0hBTEZfT1BFUkFUT1JTX18KI3VuZGVmIF9fSElQX05PX0hBTEZfQ09OVkVSU0lPTlNfXwojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmbG9hdDE2Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCiNpbmNsdWRlIDxyb2NibGFzL3JvY2JsYXMuaD4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCgoKUFlCSU5EMTFfTU9EVUxFKHJvcGUsIG0pIHsKICBtLmRlZigiaW5pdCIsICZpbml0LCAiSW5pdCBjb2RlIik7CiAgbS5kZWYoInJvcGUiLCAmY29tcHV0ZV9yb3Blc193cmFwcGVyLCAiUm9wZSBrZXJuZWwiKTsKICBtLmRlZigic3RvcmVrdiIsICZzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyLCAiS1ZDYWNoZSBrZXJuZWwiKTsKICBtLmRlZigiZG93bl9wcm9qIiwgJmRvd25fcHJvaiwgIkRvd24gUHJvaiBrZXJuZWwiKTsKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTciXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUpIC0+IE5vbmU6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KICAgIApAZGF0YWNsYXNzCmNsYXNzIENvbmZpZzoKICAgIGJhdGNoX3NpemU6IGludAogICAgZGltOiBpbnQKICAgIG5faGVhZHM6IGludAogICAgcV9sb3JhX3Jhbms6IGludCAKICAgIGt2X2xvcmFfcmFuazogaW50CiAgICBxa19ub3BlX2hlYWRfZGltOiBpbnQKICAgIHFrX3JvcGVfaGVhZF9kaW06IGludAogICAgdl9oZWFkX2RpbTogaW50CiAgICBzZXFfbGVuOiBpbnQKICAgIG1heF9zZXFfbGVuOiBpbnQKICAgIGt2X2NhY2hlX3NoYXBlOiB0dXBsZQogICAgUV9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIFFfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICB3b193ZWlnaHQ6IHRvcmNoLlRlbnNvcgoKICAgICAKY2xhc3MgTUxBKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBDb25maWcpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZGltID0gY29uZmlnLmRpbQogICAgICAgIHNlbGYubl9oZWFkcyA9IGNvbmZpZy5uX2hlYWRzCiAgICAgICAgc2VsZi5xX2xvcmFfcmFuayA9IGNvbmZpZy5xX2xvcmFfcmFuawogICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rID0gY29uZmlnLmt2X2xvcmFfcmFuawogICAgICAgIHNlbGYubm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltID0gY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnZfaGVhZF9kaW0gPSBjb25maWcudl9oZWFkX2RpbQogICAgICAgICMgRG93bi1wcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYua3ZfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAgc2VsZi5xX2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5xX2xvcmFfcmFuayxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLmt2X2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsrNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAgICAgIGhpcF9tb2R1bGUuaW5pdCgpCiAgICAgICAgCiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgoKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICBoaXBfbW9kdWxlLmRvd25fcHJvaigKICAgICAgICAgICAgICAgIHguZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYuUV9wcm9qX2Rvd24ud2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24ud2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYV9yYW5rLAogICAgICAgICAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsrNjQsCiAgICAgICAgICAgICAgICB4LnNoYXBlWzJdKQogICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUuc3RvcmVrdigKICAgICAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAga3ZfY2FjaGUuZ2V0X2RhdGEoKS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgICAgIGt2X2NhY2hlLnNlcV9sZW4pCiAgICAgICAgCiAgICAgICAga3ZfY2FjaGUuc2VxX2xlbis9MQogICAgICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4KICAgICAgICAKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCiAgICAgICAga3ZfbG9yYSA9IGt2X2NhY2hlLmdldF9kYXRhKClbOiwgOmt2X2xlbiwgOl0KICAgICAgICAKICAgICAgICBrdkRvd25fbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgIFdrdl91cCA9IHNlbGYuS1ZfcHJval91cC53ZWlnaHQudCgpLnZpZXcoc2VsZi5rdl9sb3JhX3Jhbmssc2VsZi5uX2hlYWRzLHNlbGYubm9wZV9oZWFkX2RpbStzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAgV2tfdXAsIFd2X3VwID0gdG9yY2guc3BsaXQoV2t2X3VwLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnZfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAgV2tfdXAgPSBXa191cC5wZXJtdXRlKDEsIDIsIDApICMgKG5faGVhZCwgZGltLCBoZWFkKSwgdGhlbiAobl9oZWFkLCBoZWFkLGRpbSkgZm9yIG1hdG11bAogICAgICAgIFd2X3VwID0gV3ZfdXAucGVybXV0ZSgxLCAwLCAyKSAgIyBzaGFwZTogKG5faGVhZCwgZGltLCBoZWFkKSAgICAgICAgCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuUV9wcm9qX3VwLndlaWdodC50KCkudmlldyhzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLm5vcGVfaGVhZF9kaW0rc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFdxX1VwX25vcGUsIFdxX1VwX3JvcGUgPSB0b3JjaC5zcGxpdChXcU5vcGVSb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAgCiAgICAgICAgV3FfVXBfbm9wZSA9IFdxX1VwX25vcGUucGVybXV0ZSgxLCAwLCAyKSAKICAgICAgICBXX21lcmdlZCA9IHRvcmNoLm1hdG11bChXcV9VcF9ub3BlLFdrX3VwKSAKICAgCiAgICAgICAgV3FfVXBfcm9wZSA9IFdxX1VwX3JvcGUucmVzaGFwZShzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcypzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgUVJvcGUgPSB0b3JjaC5tYXRtdWwoc2VsZi5xX2xvcmEsV3FfVXBfcm9wZSkKICAgICAgICAKICAgICAgICBrdl9kb3duX3Blcm11dGUgPSBrdkRvd25fbm9wZS5wZXJtdXRlKDAsMiwxKQogICAgICAgIAogICAgICAgIHFfZG93biA9IHNlbGYucV9sb3JhLnVuc3F1ZWV6ZSgxKSAjICgxMjgsMSwxNTM2KSAtPiAoMTI4LDEsMSwxNTM2KQogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2X2Rvd25fcGVybXV0ZS51bnNxdWVlemUoMSkgIygxMjgsNTEyLHNlcSkgLT4gKDEyOCwxLDUxMixzZXEpCiAgICAgICAgCiAgICAgICAgU2NvcmVOb1JvcGUxID0gdG9yY2gubWF0bXVsKHFfZG93bi5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV19tZXJnZWQpCiAgICAgICAgU2NvcmVOb1JvcGUxID0gU2NvcmVOb1JvcGUxLnBlcm11dGUoMSwwLDIpCiAgICAgICAgU2NvcmVOb1JvcGVfdD1TY29yZU5vUm9wZTEudmlldyhiYXRjaF9zaXplLHNlbGYubl9oZWFkcyw1MTIpICNbYnMsbl9oZWFkLDUxMl0pCiAgICAgICAgU2NvcmVOb1JvcGUgPSB0b3JjaC5tYXRtdWwoU2NvcmVOb1JvcGVfdCxrdl9kb3duX3Blcm11dGUuc3F1ZWV6ZSgxKSkKICAgICAgICAKICAgICAgICBRUm9wZSA9IFFSb3BlLnZpZXcoMTI4LCAxLCAxMjgsIDY0KQogICAgICAgIHFfcm9wZSA9IFFSb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogCiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIGt2X2xlbiwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgcV9yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywxLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLnJvcGUoa19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLnN0cmlkZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5faGVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGt2X2xlbikKICAgICAgICAKICAgICAgICBrX3JvcGVfb3V0ID0ga19yb3BlX291dC51bnNxdWVlemUoMSkKICAgICAgICAKICAgICAgICBTY29yZU91dCA9IHRvcmNoLmJhZGRibW0oCiAgICAgICAgICAgICAgICAgICAgICAgIFNjb3JlTm9Sb3BlLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LnNxdWVlemUoMiksCiAgICAgICAgICAgICAgICAgICAgICAgIGtfcm9wZV9vdXQucGVybXV0ZSgwLCAxLCAzLCAyKS5zcXVlZXplKDEpLAogICAgICAgICAgICAgICAgICAgICAgICBiZXRhPTEuMCAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pLAogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYT0xLjAgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgQXR0bk91dFNNYXggPSBGLnNvZnRtYXgoU2NvcmVPdXQsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAga3ZfZG93biA9IGt2RG93bl9ub3BlLnVuc3F1ZWV6ZSgxKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoQXR0bk91dFNNYXguc3F1ZWV6ZSgyKSxrdl9kb3duLnNxdWVlemUoMSkpCiAgICAgICAgeTBfYz15MF9jLnVuc3F1ZWV6ZSgyKQogICAgICAgIAogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV3ZfdXApCiAgICAgICAgeTBfYyA9IHkwX2MucGVybXV0ZSgxLDAsMikKICAgICAgICB5MF9jID0gc2VsZi53byh5MF9jLmZsYXR0ZW4oc3RhcnRfZGltPTEpKQogICAgICAgIAogICAgICAgIHJldHVybiB5MF9jLnZpZXcoYmF0Y2hfc2l6ZSwxLHNlbGYuZGltKSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKbW9kZWwgPSBOb25lCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgICAgICBnbG9iYWwgbW9kZWwKICAgICAgICBpZiBtb2RlbCA9PSBOb25lOgogICAgICAgICAgICBtb2RlbCA9IE1MQShjb25maWcpLnRvKCdjdWRhOjAnKQogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLndvX3dlaWdodCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnNpemUoKSwgY29uZmlnLlFfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX3VwX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLlFfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0LnNldF8oY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc3RyaWRlKCkpIAogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQuc2V0Xyhjb25maWcud29fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcud29fd2VpZ2h0LnNpemUoKSwgY29uZmlnLndvX3dlaWdodC5zdHJpZGUoKSkgCgogICAgICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgICAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZQ==No newline at end of file
Best evidence level for this revision: reported
JSON