Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 29756

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_7.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-29756?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.42ms
#31 of 118
2025-06-01
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
11.4ms
#18 of 118
2025-06-01

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:9999691e757aad14eb0834e16bf6c20c7630a9650fe8e7315f8c481a085d4a0d
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission_moe_version_7.py1 lines
aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMVtncmlkXSgKICAgICAgICB0b3BrX2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCgogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzWygxLCApXSgKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgKQogICAgCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTRbZ3JpZF0oCiAgICAgICAgdG9wa19pZHMsCiAgICAgICAgc29ydGVkX2lkcywKICAgICAgICBleHBlcnRfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAyMDQ4IGlmIG5fZWxlbWVudHMgPiAyMDQ4IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICAgICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGFjY3VtdWxhdG9yLCBtYXNrPWNfbWFzaykKCiAgICAgICAgdGlsZV9pZCArPSBOVU1fU01TCgoKZGVmIGludm9rZV9mdXNlZF9tb2Vfa2VybmVsKEE6IHRvcmNoLlRlbnNvciwgQjogdG9yY2guVGVuc29yLCBDOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BrX3dlaWdodHM6IHRvcmNoLlRlbnNvciwgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9yb3V0ZWRfd2VpZ2h0OiBib29sLCB0b3BfazogaW50KToKICAgIE5VTV9TTVMgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfcHJvcGVydGllcygiY3VkYSIpLm11bHRpX3Byb2Nlc3Nvcl9jb3VudCAqIDIKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKG1pbihOVU1fU01TLCB0cml0b24uY2Rpdihzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLCBNRVRBWyJCTE9DS19TSVpFX00iXSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXRvbi5jZGl2KEIuc2hhcGVbMV0sIE1FVEFbIkJMT0NLX1NJWkVfTiJdKSksICkKICAgIGZ1c2VkX21vZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgdG9wa193ZWlnaHRzLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgIEIuc2hhcGVbMV0sCiAgICAgICAgQi5zaGFwZVsyXSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgQS5zdHJpZGUoMCksCiAgICAgICAgQS5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQi5zdHJpZGUoMiksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMiksCiAgICAgICAgdG9wa193ZWlnaHRzLnN0cmlkZSgyKSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnN0cmlkZSgwKSwKICAgICAgICBNVUxfUk9VVEVEX1dFSUdIVD1tdWxfcm91dGVkX3dlaWdodCwKICAgICAgICB0b3Bfaz10b3BfaywKICAgICAgICBjb21wdXRlX3R5cGU9dGwuYmZsb2F0MTYgaWYgQS5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNiBlbHNlIHRsLmZsb2F0MTYsCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwKICAgICAgICBCTE9DS19TSVpFX049QkxPQ0tfU0laRV9OLAogICAgICAgIEJMT0NLX1NJWkVfSz1CTE9DS19TSVpFX0ssCiAgICAgICAgR1JPVVBfU0laRV9NPUdST1VQX1NJWkVfTSwKICAgICAgICBOVU1fU01TPU5VTV9TTVMsCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV94bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3huCiAgICBZX3B0cnMgPSBZICsgSURYICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV95bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3luCgogICAgdGlsZSA9IHRsLmxvYWQoWF9wdHJzLCBtYXNrPW1hc2ssIG90aGVyPW90aGVyKQogICAgdGwuc3RvcmUoWV9wdHJzLCB0aWxlLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV90cmFuc3Bvc2UoWCwgWSwgSURYPTAsIEJMT0NLX009MTI4LCBCTE9DS19OPTEyOCwgbnVtX3dhcnBzPTE2KSAtPiBOb25lOgogICAgaWYgWC5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFggPSBYLnZpZXcodG9yY2guaW50OCkKICAgIGlmIFkuZHR5cGUuaXRlbXNpemUgPT0gMToKICAgICAgICBZID0gWS52aWV3KHRvcmNoLmludDgpCgogICAgIyBjaGVjayBjb21wYXRpYmlsaXR5OgogICAgYXNzZXJ0IFguZHR5cGUgPT0gWS5kdHlwZQoKICAgIE0gPSBYLnNoYXBlWzBdCiAgICBOID0gWC5zaGFwZVsxXQoKICAgIHN0cmlkZV94bSA9IFguc3RyaWRlKDApCiAgICBzdHJpZGVfeG4gPSBYLnN0cmlkZSgxKQoKICAgIHN0cmlkZV95bSA9IFkuc3RyaWRlKC0yKQogICAgc3RyaWRlX3luID0gWS5zdHJpZGUoLTEpCgogICAgZ3JpZCA9ICgoTSArIEJMT0NLX00gLSAxKSAvLyBCTE9DS19NLCAoTiArIEJMT0NLX04gLSAxKSAvLyBCTE9DS19OKQogICAgdHJhbnNwb3NlX2tlcm5lbFtncmlkXSgKICAgICAgICBNLAogICAgICAgIE4sCiAgICAgICAgQkxPQ0tfTSwKICAgICAgICBCTE9DS19OLAogICAgICAgIFgsCiAgICAgICAgc3RyaWRlX3htLAogICAgICAgIHN0cmlkZV94biwKICAgICAgICBZLAogICAgICAgIHN0cmlkZV95bSwKICAgICAgICBzdHJpZGVfeW4sCiAgICAgICAgSURYPUlEWCwKICAgICAgICBudW1fd2FycHM9bnVtX3dhcnBzLAogICAgKQoKCkB0cml0b24uaml0CmRlZiBzdW1fa2VybmVsKGFfcHRyLCBiX3B0ciwgTiwgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoYXhpcz0wKQoKICAgIG9mZnNfbSA9IHBpZCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICBvZmZzX24gPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgYV9yb3dfcHRyID0gYV9wdHIgKyBvZmZzX21bOiwgTm9uZV0gKiBOICsgb2Zmc19uW05vbmUsIDpdCiAgICBiX3Jvd19wdHIgPSBiX3B0ciArIHBpZCAqIE4gICAgICAgICAgICAgKyBvZmZzX24KCiAgICBibG9ja19udW0gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKICAgIGZvciBpIGluIHJhbmdlKGJsb2NrX251bSk6CiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyLCBtYXNrPW9mZnNfbltOb25lLCA6XSA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IHRsLmxvYWQoYl9yb3dfcHRyLCBtYXNrPW9mZnNfbiA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IGIgKyB0bC5zdW0oYSwgYXhpcz0wLCBkdHlwZT10bC5mbG9hdDE2KQogICAgICAgIHRsLnN0b3JlKGJfcm93X3B0ciwgYiwgbWFzaz1vZmZzX24gPCBOIC0gaSAqIEJMT0NLX1NJWkVfTikKCiAgICAgICAgYV9yb3dfcHRyICs9IEJMT0NLX1NJWkVfTgogICAgICAgIGJfcm93X3B0ciArPSBCTE9DS19TSVpFX04KCgpkZWYgaW52b2tlX3N1bV9rZXJuZWwoaW5wdXQ6IHRvcmNoLlRlbnNvciwgb3V0cHV0OiB0b3JjaC5UZW5zb3IpOgogICAgYXNzZXJ0IGlucHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IG91dHB1dC5pc19jb250aWd1b3VzKCkKICAgIGFzc2VydCBsZW4oaW5wdXQuc2hhcGUpID09IDMgIyAoTSwgdG9waywgSykKICAgIGFzc2VydCBsZW4ob3V0cHV0LnNoYXBlKSA9PSAzICMgKGJhdGNoX3NpemUsIE0sIEspCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbMF0gPT0gb3V0cHV0LnNoYXBlWzBdICogb3V0cHV0LnNoYXBlWzFdCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbLTFdID09IG91dHB1dC5zaGFwZVstMV0KCiAgICBOID0gaW5wdXQuc2hhcGVbMl0KICAgIEJMT0NLX1NJWkVfTSA9IGlucHV0LnNoYXBlWzFdCiAgICBCTE9DS19TSVpFX04gPSAyMDQ4CiAgICBCTE9DS19TSVpFX04gPSBCTE9DS19TSVpFX04gaWYgTiA+PSBCTE9DS19TSVpFX04gZWxzZSBOCiAgICBncmlkID0gKGlucHV0LnNoYXBlWzBdLCkKICAgIHN1bV9rZXJuZWxbZ3JpZF0oaW5wdXQsIG91dHB1dCwgTiwgQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX04pCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2guZW1wdHkoKE0sIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCBOICogMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMiA9IHRvcmNoLmVtcHR5KChNICogY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGludGVybWVkaWF0ZV9jYWNoZTMgPSB0b3JjaC5lbXB0eSgoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIEspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGdhdGUKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IG1vZV9nYXRlX2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddLAogICAgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaGFyZWRfZXhwZXJ0cwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNoYXJlZF9vdXRwdXQgPSBtb2VfZXhwZXJ0X2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIG1vZSBhbGlnbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNvcnRlZF90b2tlbl9pZHMsIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdLCBCTE9DS19TSVpFX00pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8xCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW5wdXRfdGVuc29yLnZpZXcoLTEsIEspLCB3MSwgaW50ZXJtZWRpYXRlX2NhY2hlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaW5kaWNlcy5zaGFwZVsyXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc2lsdV9hbmRfbXVsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX3NpbHVfYW5kX211bF9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMS52aWV3KC0xLCAyICogTiksIGludGVybWVkaWF0ZV9jYWNoZTIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8yCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMiwgdzIsIGludGVybWVkaWF0ZV9jYWNoZTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfc2NvcmVzLCBleHBlcnRfaW5kaWNlcywgc29ydGVkX3Rva2VuX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQsIFRydWUsIDEpCgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgIyBzdW0KIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAgICAgcm91dGVkX291dHB1dCA9IHRvcmNoLnN1bSgKIyAgICAgICAgIGludGVybWVkaWF0ZV9jYWNoZTMudmlldygqaW50ZXJtZWRpYXRlX2NhY2hlMy5zaGFwZSksIGRpbT0xKS52aWV3KGNvbmZpZ1siYmF0Y2hfc2l6ZSJdLCBjb25maWdbInNlcV9sZW4iXSwgSykKCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAjIGFkZAojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojICAgICBvdXRwdXQgPSByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKIyAgICAgcmV0dXJuIG91dHB1dAoKICAgIGludm9rZV9zdW1fa2VybmVsKGludGVybWVkaWF0ZV9jYWNoZTMsIHNoYXJlZF9vdXRwdXQpCgogICAgcmV0dXJuIHNoYXJlZF9vdXRwdXQK

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

- aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMVtncmlkXSgKICAgICAgICB0b3BrX2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCgogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzWygxLCApXSgKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgKQogICAgCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTRbZ3JpZF0oCiAgICAgICAgdG9wa19pZHMsCiAgICAgICAgc29ydGVkX2lkcywKICAgICAgICBleHBlcnRfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAyMDQ4IGlmIG5fZWxlbWVudHMgPiAyMDQ4IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICAgICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGFjY3VtdWxhdG9yLCBtYXNrPWNfbWFzaykKCiAgICAgICAgdGlsZV9pZCArPSBOVU1fU01TCgoKZGVmIGludm9rZV9mdXNlZF9tb2Vfa2VybmVsKEE6IHRvcmNoLlRlbnNvciwgQjogdG9yY2guVGVuc29yLCBDOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BrX3dlaWdodHM6IHRvcmNoLlRlbnNvciwgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9yb3V0ZWRfd2VpZ2h0OiBib29sLCB0b3BfazogaW50KToKICAgIE5VTV9TTVMgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfcHJvcGVydGllcygiY3VkYSIpLm11bHRpX3Byb2Nlc3Nvcl9jb3VudCAqIDIKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKG1pbihOVU1fU01TLCB0cml0b24uY2Rpdihzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLCBNRVRBWyJCTE9DS19TSVpFX00iXSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXRvbi5jZGl2KEIuc2hhcGVbMV0sIE1FVEFbIkJMT0NLX1NJWkVfTiJdKSksICkKICAgIGZ1c2VkX21vZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgdG9wa193ZWlnaHRzLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgIEIuc2hhcGVbMV0sCiAgICAgICAgQi5zaGFwZVsyXSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgQS5zdHJpZGUoMCksCiAgICAgICAgQS5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQi5zdHJpZGUoMiksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMiksCiAgICAgICAgdG9wa193ZWlnaHRzLnN0cmlkZSgyKSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnN0cmlkZSgwKSwKICAgICAgICBNVUxfUk9VVEVEX1dFSUdIVD1tdWxfcm91dGVkX3dlaWdodCwKICAgICAgICB0b3Bfaz10b3BfaywKICAgICAgICBjb21wdXRlX3R5cGU9dGwuYmZsb2F0MTYgaWYgQS5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNiBlbHNlIHRsLmZsb2F0MTYsCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwKICAgICAgICBCTE9DS19TSVpFX049QkxPQ0tfU0laRV9OLAogICAgICAgIEJMT0NLX1NJWkVfSz1CTE9DS19TSVpFX0ssCiAgICAgICAgR1JPVVBfU0laRV9NPUdST1VQX1NJWkVfTSwKICAgICAgICBOVU1fU01TPU5VTV9TTVMsCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV94bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3huCiAgICBZX3B0cnMgPSBZICsgSURYICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV95bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3luCgogICAgdGlsZSA9IHRsLmxvYWQoWF9wdHJzLCBtYXNrPW1hc2ssIG90aGVyPW90aGVyKQogICAgdGwuc3RvcmUoWV9wdHJzLCB0aWxlLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV90cmFuc3Bvc2UoWCwgWSwgSURYPTAsIEJMT0NLX009MTI4LCBCTE9DS19OPTEyOCwgbnVtX3dhcnBzPTE2KSAtPiBOb25lOgogICAgaWYgWC5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFggPSBYLnZpZXcodG9yY2guaW50OCkKICAgIGlmIFkuZHR5cGUuaXRlbXNpemUgPT0gMToKICAgICAgICBZID0gWS52aWV3KHRvcmNoLmludDgpCgogICAgIyBjaGVjayBjb21wYXRpYmlsaXR5OgogICAgYXNzZXJ0IFguZHR5cGUgPT0gWS5kdHlwZQoKICAgIE0gPSBYLnNoYXBlWzBdCiAgICBOID0gWC5zaGFwZVsxXQoKICAgIHN0cmlkZV94bSA9IFguc3RyaWRlKDApCiAgICBzdHJpZGVfeG4gPSBYLnN0cmlkZSgxKQoKICAgIHN0cmlkZV95bSA9IFkuc3RyaWRlKC0yKQogICAgc3RyaWRlX3luID0gWS5zdHJpZGUoLTEpCgogICAgZ3JpZCA9ICgoTSArIEJMT0NLX00gLSAxKSAvLyBCTE9DS19NLCAoTiArIEJMT0NLX04gLSAxKSAvLyBCTE9DS19OKQogICAgdHJhbnNwb3NlX2tlcm5lbFtncmlkXSgKICAgICAgICBNLAogICAgICAgIE4sCiAgICAgICAgQkxPQ0tfTSwKICAgICAgICBCTE9DS19OLAogICAgICAgIFgsCiAgICAgICAgc3RyaWRlX3htLAogICAgICAgIHN0cmlkZV94biwKICAgICAgICBZLAogICAgICAgIHN0cmlkZV95bSwKICAgICAgICBzdHJpZGVfeW4sCiAgICAgICAgSURYPUlEWCwKICAgICAgICBudW1fd2FycHM9bnVtX3dhcnBzLAogICAgKQoKCkB0cml0b24uaml0CmRlZiBzdW1fa2VybmVsKGFfcHRyLCBiX3B0ciwgTiwgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoYXhpcz0wKQoKICAgIG9mZnNfbSA9IHBpZCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICBvZmZzX24gPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgYV9yb3dfcHRyID0gYV9wdHIgKyBvZmZzX21bOiwgTm9uZV0gKiBOICsgb2Zmc19uW05vbmUsIDpdCiAgICBiX3Jvd19wdHIgPSBiX3B0ciArIHBpZCAqIE4gICAgICAgICAgICAgKyBvZmZzX24KCiAgICBibG9ja19udW0gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKICAgIGZvciBpIGluIHJhbmdlKGJsb2NrX251bSk6CiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyLCBtYXNrPW9mZnNfbltOb25lLCA6XSA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IHRsLmxvYWQoYl9yb3dfcHRyLCBtYXNrPW9mZnNfbiA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IGIgKyB0bC5zdW0oYSwgYXhpcz0wLCBkdHlwZT10bC5mbG9hdDE2KQogICAgICAgIHRsLnN0b3JlKGJfcm93X3B0ciwgYiwgbWFzaz1vZmZzX24gPCBOIC0gaSAqIEJMT0NLX1NJWkVfTikKCiAgICAgICAgYV9yb3dfcHRyICs9IEJMT0NLX1NJWkVfTgogICAgICAgIGJfcm93X3B0ciArPSBCTE9DS19TSVpFX04KCgpkZWYgaW52b2tlX3N1bV9rZXJuZWwoaW5wdXQ6IHRvcmNoLlRlbnNvciwgb3V0cHV0OiB0b3JjaC5UZW5zb3IpOgogICAgYXNzZXJ0IGlucHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IG91dHB1dC5pc19jb250aWd1b3VzKCkKICAgIGFzc2VydCBsZW4oaW5wdXQuc2hhcGUpID09IDMgIyAoTSwgdG9waywgSykKICAgIGFzc2VydCBsZW4ob3V0cHV0LnNoYXBlKSA9PSAzICMgKGJhdGNoX3NpemUsIE0sIEspCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbMF0gPT0gb3V0cHV0LnNoYXBlWzBdICogb3V0cHV0LnNoYXBlWzFdCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbLTFdID09IG91dHB1dC5zaGFwZVstMV0KCiAgICBOID0gaW5wdXQuc2hhcGVbMl0KICAgIEJMT0NLX1NJWkVfTSA9IGlucHV0LnNoYXBlWzFdCiAgICBCTE9DS19TSVpFX04gPSAyMDQ4CiAgICBCTE9DS19TSVpFX04gPSBCTE9DS19TSVpFX04gaWYgTiA+PSBCTE9DS19TSVpFX04gZWxzZSBOCiAgICBncmlkID0gKGlucHV0LnNoYXBlWzBdLCkKICAgIHN1bV9rZXJuZWxbZ3JpZF0oaW5wdXQsIG91dHB1dCwgTiwgQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX04pCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2gub25lcygoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4gKiAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUyID0gdG9yY2guZW1wdHkoKE0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMyA9IHRvcmNoLmVtcHR5KChNLCBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgSyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBtb2UgZ2F0ZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10sCiAgICAgICAgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHNoYXJlZF9leHBlcnRzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc2hhcmVkX291dHB1dCA9IG1vZV9leHBlcnRfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGFsaWduCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc29ydGVkX3Rva2VuX2lkcywgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCA9IGludm9rZV9tb2VfYWxpZ25fYmxvY2tfc2l6ZSgKICAgICAgICBleHBlcnRfaW5kaWNlcywgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIEJMT0NLX1NJWkVfTSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzEKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnB1dF90ZW5zb3IudmlldygtMSwgSyksIHcxLCBpbnRlcm1lZGlhdGVfY2FjaGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X3Njb3JlcywgZXhwZXJ0X2luZGljZXMsIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pbmRpY2VzLnNoYXBlWzJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaWx1X2FuZF9tdWwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUxLnZpZXcoLTEsIDIgKiBOKSwgaW50ZXJtZWRpYXRlX2NhY2hlMikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUyLCB3MiwgaW50ZXJtZWRpYXRlX2NhY2hlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgVHJ1ZSwgMSkKCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAjIHN1bQojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojICAgICByb3V0ZWRfb3V0cHV0ID0gdG9yY2guc3VtKAojICAgICAgICAgaW50ZXJtZWRpYXRlX2NhY2hlMy52aWV3KCppbnRlcm1lZGlhdGVfY2FjaGUzLnNoYXBlKSwgZGltPTEpLnZpZXcoY29uZmlnWyJiYXRjaF9zaXplIl0sIGNvbmZpZ1sic2VxX2xlbiJdLCBLKQoKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICMgYWRkCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgICAgIG91dHB1dCA9IHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgojICAgICByZXR1cm4gb3V0cHV0CgogICAgaW52b2tlX3N1bV9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMywgc2hhcmVkX291dHB1dCkKCiAgICByZXR1cm4gc2hhcmVkX291dHB1dAo=
No newline at end of file
+ aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMVtncmlkXSgKICAgICAgICB0b3BrX2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCgogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzWygxLCApXSgKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgKQogICAgCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTRbZ3JpZF0oCiAgICAgICAgdG9wa19pZHMsCiAgICAgICAgc29ydGVkX2lkcywKICAgICAgICBleHBlcnRfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAyMDQ4IGlmIG5fZWxlbWVudHMgPiAyMDQ4IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICAgICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGFjY3VtdWxhdG9yLCBtYXNrPWNfbWFzaykKCiAgICAgICAgdGlsZV9pZCArPSBOVU1fU01TCgoKZGVmIGludm9rZV9mdXNlZF9tb2Vfa2VybmVsKEE6IHRvcmNoLlRlbnNvciwgQjogdG9yY2guVGVuc29yLCBDOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BrX3dlaWdodHM6IHRvcmNoLlRlbnNvciwgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9yb3V0ZWRfd2VpZ2h0OiBib29sLCB0b3BfazogaW50KToKICAgIE5VTV9TTVMgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfcHJvcGVydGllcygiY3VkYSIpLm11bHRpX3Byb2Nlc3Nvcl9jb3VudCAqIDIKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKG1pbihOVU1fU01TLCB0cml0b24uY2Rpdihzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLCBNRVRBWyJCTE9DS19TSVpFX00iXSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXRvbi5jZGl2KEIuc2hhcGVbMV0sIE1FVEFbIkJMT0NLX1NJWkVfTiJdKSksICkKICAgIGZ1c2VkX21vZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgdG9wa193ZWlnaHRzLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgIEIuc2hhcGVbMV0sCiAgICAgICAgQi5zaGFwZVsyXSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgQS5zdHJpZGUoMCksCiAgICAgICAgQS5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQi5zdHJpZGUoMiksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMiksCiAgICAgICAgdG9wa193ZWlnaHRzLnN0cmlkZSgyKSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnN0cmlkZSgwKSwKICAgICAgICBNVUxfUk9VVEVEX1dFSUdIVD1tdWxfcm91dGVkX3dlaWdodCwKICAgICAgICB0b3Bfaz10b3BfaywKICAgICAgICBjb21wdXRlX3R5cGU9dGwuYmZsb2F0MTYgaWYgQS5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNiBlbHNlIHRsLmZsb2F0MTYsCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwKICAgICAgICBCTE9DS19TSVpFX049QkxPQ0tfU0laRV9OLAogICAgICAgIEJMT0NLX1NJWkVfSz1CTE9DS19TSVpFX0ssCiAgICAgICAgR1JPVVBfU0laRV9NPUdST1VQX1NJWkVfTSwKICAgICAgICBOVU1fU01TPU5VTV9TTVMsCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV94bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3huCiAgICBZX3B0cnMgPSBZICsgSURYICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV95bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3luCgogICAgdGlsZSA9IHRsLmxvYWQoWF9wdHJzLCBtYXNrPW1hc2ssIG90aGVyPW90aGVyKQogICAgdGwuc3RvcmUoWV9wdHJzLCB0aWxlLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV90cmFuc3Bvc2UoWCwgWSwgSURYPTAsIEJMT0NLX009MTI4LCBCTE9DS19OPTEyOCwgbnVtX3dhcnBzPTE2KSAtPiBOb25lOgogICAgaWYgWC5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFggPSBYLnZpZXcodG9yY2guaW50OCkKICAgIGlmIFkuZHR5cGUuaXRlbXNpemUgPT0gMToKICAgICAgICBZID0gWS52aWV3KHRvcmNoLmludDgpCgogICAgIyBjaGVjayBjb21wYXRpYmlsaXR5OgogICAgYXNzZXJ0IFguZHR5cGUgPT0gWS5kdHlwZQoKICAgIE0gPSBYLnNoYXBlWzBdCiAgICBOID0gWC5zaGFwZVsxXQoKICAgIHN0cmlkZV94bSA9IFguc3RyaWRlKDApCiAgICBzdHJpZGVfeG4gPSBYLnN0cmlkZSgxKQoKICAgIHN0cmlkZV95bSA9IFkuc3RyaWRlKC0yKQogICAgc3RyaWRlX3luID0gWS5zdHJpZGUoLTEpCgogICAgZ3JpZCA9ICgoTSArIEJMT0NLX00gLSAxKSAvLyBCTE9DS19NLCAoTiArIEJMT0NLX04gLSAxKSAvLyBCTE9DS19OKQogICAgdHJhbnNwb3NlX2tlcm5lbFtncmlkXSgKICAgICAgICBNLAogICAgICAgIE4sCiAgICAgICAgQkxPQ0tfTSwKICAgICAgICBCTE9DS19OLAogICAgICAgIFgsCiAgICAgICAgc3RyaWRlX3htLAogICAgICAgIHN0cmlkZV94biwKICAgICAgICBZLAogICAgICAgIHN0cmlkZV95bSwKICAgICAgICBzdHJpZGVfeW4sCiAgICAgICAgSURYPUlEWCwKICAgICAgICBudW1fd2FycHM9bnVtX3dhcnBzLAogICAgKQoKCkB0cml0b24uaml0CmRlZiBzdW1fa2VybmVsKGFfcHRyLCBiX3B0ciwgTiwgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoYXhpcz0wKQoKICAgIG9mZnNfbSA9IHBpZCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICBvZmZzX24gPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgYV9yb3dfcHRyID0gYV9wdHIgKyBvZmZzX21bOiwgTm9uZV0gKiBOICsgb2Zmc19uW05vbmUsIDpdCiAgICBiX3Jvd19wdHIgPSBiX3B0ciArIHBpZCAqIE4gICAgICAgICAgICAgKyBvZmZzX24KCiAgICBibG9ja19udW0gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKICAgIGZvciBpIGluIHJhbmdlKGJsb2NrX251bSk6CiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyLCBtYXNrPW9mZnNfbltOb25lLCA6XSA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IHRsLmxvYWQoYl9yb3dfcHRyLCBtYXNrPW9mZnNfbiA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IGIgKyB0bC5zdW0oYSwgYXhpcz0wLCBkdHlwZT10bC5mbG9hdDE2KQogICAgICAgIHRsLnN0b3JlKGJfcm93X3B0ciwgYiwgbWFzaz1vZmZzX24gPCBOIC0gaSAqIEJMT0NLX1NJWkVfTikKCiAgICAgICAgYV9yb3dfcHRyICs9IEJMT0NLX1NJWkVfTgogICAgICAgIGJfcm93X3B0ciArPSBCTE9DS19TSVpFX04KCgpkZWYgaW52b2tlX3N1bV9rZXJuZWwoaW5wdXQ6IHRvcmNoLlRlbnNvciwgb3V0cHV0OiB0b3JjaC5UZW5zb3IpOgogICAgYXNzZXJ0IGlucHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IG91dHB1dC5pc19jb250aWd1b3VzKCkKICAgIGFzc2VydCBsZW4oaW5wdXQuc2hhcGUpID09IDMgIyAoTSwgdG9waywgSykKICAgIGFzc2VydCBsZW4ob3V0cHV0LnNoYXBlKSA9PSAzICMgKGJhdGNoX3NpemUsIE0sIEspCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbMF0gPT0gb3V0cHV0LnNoYXBlWzBdICogb3V0cHV0LnNoYXBlWzFdCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbLTFdID09IG91dHB1dC5zaGFwZVstMV0KCiAgICBOID0gaW5wdXQuc2hhcGVbMl0KICAgIEJMT0NLX1NJWkVfTSA9IGlucHV0LnNoYXBlWzFdCiAgICBCTE9DS19TSVpFX04gPSAyMDQ4CiAgICBCTE9DS19TSVpFX04gPSBCTE9DS19TSVpFX04gaWYgTiA+PSBCTE9DS19TSVpFX04gZWxzZSBOCiAgICBncmlkID0gKGlucHV0LnNoYXBlWzBdLCkKICAgIHN1bV9rZXJuZWxbZ3JpZF0oaW5wdXQsIG91dHB1dCwgTiwgQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX04pCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2guZW1wdHkoKE0sIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCBOICogMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMiA9IHRvcmNoLmVtcHR5KChNICogY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGludGVybWVkaWF0ZV9jYWNoZTMgPSB0b3JjaC5lbXB0eSgoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIEspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGdhdGUKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IG1vZV9nYXRlX2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddLAogICAgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaGFyZWRfZXhwZXJ0cwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNoYXJlZF9vdXRwdXQgPSBtb2VfZXhwZXJ0X2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIG1vZSBhbGlnbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNvcnRlZF90b2tlbl9pZHMsIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdLCBCTE9DS19TSVpFX00pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8xCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW5wdXRfdGVuc29yLnZpZXcoLTEsIEspLCB3MSwgaW50ZXJtZWRpYXRlX2NhY2hlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaW5kaWNlcy5zaGFwZVsyXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc2lsdV9hbmRfbXVsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX3NpbHVfYW5kX211bF9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMS52aWV3KC0xLCAyICogTiksIGludGVybWVkaWF0ZV9jYWNoZTIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8yCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMiwgdzIsIGludGVybWVkaWF0ZV9jYWNoZTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfc2NvcmVzLCBleHBlcnRfaW5kaWNlcywgc29ydGVkX3Rva2VuX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQsIFRydWUsIDEpCgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgIyBzdW0KIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAgICAgcm91dGVkX291dHB1dCA9IHRvcmNoLnN1bSgKIyAgICAgICAgIGludGVybWVkaWF0ZV9jYWNoZTMudmlldygqaW50ZXJtZWRpYXRlX2NhY2hlMy5zaGFwZSksIGRpbT0xKS52aWV3KGNvbmZpZ1siYmF0Y2hfc2l6ZSJdLCBjb25maWdbInNlcV9sZW4iXSwgSykKCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAjIGFkZAojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojICAgICBvdXRwdXQgPSByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKIyAgICAgcmV0dXJuIG91dHB1dAoKICAgIGludm9rZV9zdW1fa2VybmVsKGludGVybWVkaWF0ZV9jYWNoZTMsIHNoYXJlZF9vdXRwdXQpCgogICAgcmV0dXJuIHNoYXJlZF9vdXRwdXQK
No newline at end of file

Best evidence level for this revision: reported

JSON