amd-mixture-of-experts · submission 29457
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-29457?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16
Benchmark evidence
2 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:8a0a2dea2e8acc2ab54938bc969dbf567d2d24a7f5946dee45c18b490d2c481f
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
submission_moe_version_7.py1 lines
aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMVtncmlkXSgKICAgICAgICB0b3BrX2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCgogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzWygxLCApXSgKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgKQogICAgCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTRbZ3JpZF0oCiAgICAgICAgdG9wa19pZHMsCiAgICAgICAgc29ydGVkX2lkcywKICAgICAgICBleHBlcnRfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAyMDQ4IGlmIG5fZWxlbWVudHMgPiAyMDQ4IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICAgICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGFjY3VtdWxhdG9yLCBtYXNrPWNfbWFzaykKCiAgICAgICAgdGlsZV9pZCArPSBOVU1fU01TCgoKZGVmIGludm9rZV9mdXNlZF9tb2Vfa2VybmVsKEE6IHRvcmNoLlRlbnNvciwgQjogdG9yY2guVGVuc29yLCBDOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BrX3dlaWdodHM6IHRvcmNoLlRlbnNvciwgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9yb3V0ZWRfd2VpZ2h0OiBib29sLCB0b3BfazogaW50KToKICAgIE5VTV9TTVMgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfcHJvcGVydGllcygiY3VkYSIpLm11bHRpX3Byb2Nlc3Nvcl9jb3VudCAqIDIKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKG1pbihOVU1fU01TLCB0cml0b24uY2Rpdihzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLCBNRVRBWyJCTE9DS19TSVpFX00iXSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXRvbi5jZGl2KEIuc2hhcGVbMV0sIE1FVEFbIkJMT0NLX1NJWkVfTiJdKSksICkKICAgIGZ1c2VkX21vZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgdG9wa193ZWlnaHRzLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgIEIuc2hhcGVbMV0sCiAgICAgICAgQi5zaGFwZVsyXSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgQS5zdHJpZGUoMCksCiAgICAgICAgQS5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQi5zdHJpZGUoMiksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMiksCiAgICAgICAgdG9wa193ZWlnaHRzLnN0cmlkZSgyKSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnN0cmlkZSgwKSwKICAgICAgICBNVUxfUk9VVEVEX1dFSUdIVD1tdWxfcm91dGVkX3dlaWdodCwKICAgICAgICB0b3Bfaz10b3BfaywKICAgICAgICBjb21wdXRlX3R5cGU9dGwuYmZsb2F0MTYgaWYgQS5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNiBlbHNlIHRsLmZsb2F0MTYsCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwKICAgICAgICBCTE9DS19TSVpFX049QkxPQ0tfU0laRV9OLAogICAgICAgIEJMT0NLX1NJWkVfSz1CTE9DS19TSVpFX0ssCiAgICAgICAgR1JPVVBfU0laRV9NPUdST1VQX1NJWkVfTSwKICAgICAgICBOVU1fU01TPU5VTV9TTVMsCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV94bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3huCiAgICBZX3B0cnMgPSBZICsgSURYICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV95bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3luCgogICAgdGlsZSA9IHRsLmxvYWQoWF9wdHJzLCBtYXNrPW1hc2ssIG90aGVyPW90aGVyKQogICAgdGwuc3RvcmUoWV9wdHJzLCB0aWxlLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV90cmFuc3Bvc2UoWCwgWSwgSURYPTAsIEJMT0NLX009MTI4LCBCTE9DS19OPTEyOCwgbnVtX3dhcnBzPTE2KSAtPiBOb25lOgogICAgaWYgWC5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFggPSBYLnZpZXcodG9yY2guaW50OCkKICAgIGlmIFkuZHR5cGUuaXRlbXNpemUgPT0gMToKICAgICAgICBZID0gWS52aWV3KHRvcmNoLmludDgpCgogICAgIyBjaGVjayBjb21wYXRpYmlsaXR5OgogICAgYXNzZXJ0IFguZHR5cGUgPT0gWS5kdHlwZQoKICAgIE0gPSBYLnNoYXBlWzBdCiAgICBOID0gWC5zaGFwZVsxXQoKICAgIHN0cmlkZV94bSA9IFguc3RyaWRlKDApCiAgICBzdHJpZGVfeG4gPSBYLnN0cmlkZSgxKQoKICAgIHN0cmlkZV95bSA9IFkuc3RyaWRlKC0yKQogICAgc3RyaWRlX3luID0gWS5zdHJpZGUoLTEpCgogICAgZ3JpZCA9ICgoTSArIEJMT0NLX00gLSAxKSAvLyBCTE9DS19NLCAoTiArIEJMT0NLX04gLSAxKSAvLyBCTE9DS19OKQogICAgdHJhbnNwb3NlX2tlcm5lbFtncmlkXSgKICAgICAgICBNLAogICAgICAgIE4sCiAgICAgICAgQkxPQ0tfTSwKICAgICAgICBCTE9DS19OLAogICAgICAgIFgsCiAgICAgICAgc3RyaWRlX3htLAogICAgICAgIHN0cmlkZV94biwKICAgICAgICBZLAogICAgICAgIHN0cmlkZV95bSwKICAgICAgICBzdHJpZGVfeW4sCiAgICAgICAgSURYPUlEWCwKICAgICAgICBudW1fd2FycHM9bnVtX3dhcnBzLAogICAgKQoKCkB0cml0b24uaml0CmRlZiBzdW1fa2VybmVsKGFfcHRyLCBiX3B0ciwgTiwgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoYXhpcz0wKQoKICAgIG9mZnNfbSA9IHBpZCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICBvZmZzX24gPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgYV9yb3dfcHRyID0gYV9wdHIgKyBvZmZzX21bOiwgTm9uZV0gKiBOICsgb2Zmc19uW05vbmUsIDpdCiAgICBiX3Jvd19wdHIgPSBiX3B0ciArIHBpZCAqIE4gICAgICAgICAgICAgKyBvZmZzX24KCiAgICBibG9ja19udW0gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKICAgIGZvciBpIGluIHJhbmdlKGJsb2NrX251bSk6CiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyLCBtYXNrPW9mZnNfbltOb25lLCA6XSA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IHRsLmxvYWQoYl9yb3dfcHRyLCBtYXNrPW9mZnNfbiA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IGIgKyB0bC5zdW0oYSwgYXhpcz0wLCBkdHlwZT10bC5mbG9hdDE2KQogICAgICAgIHRsLnN0b3JlKGJfcm93X3B0ciwgYiwgbWFzaz1vZmZzX24gPCBOIC0gaSAqIEJMT0NLX1NJWkVfTikKCiAgICAgICAgYV9yb3dfcHRyICs9IEJMT0NLX1NJWkVfTgogICAgICAgIGJfcm93X3B0ciArPSBCTE9DS19TSVpFX04KCgpkZWYgaW52b2tlX3N1bV9rZXJuZWwoaW5wdXQ6IHRvcmNoLlRlbnNvciwgb3V0cHV0OiB0b3JjaC5UZW5zb3IpOgogICAgYXNzZXJ0IGlucHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IG91dHB1dC5pc19jb250aWd1b3VzKCkKICAgIGFzc2VydCBsZW4oaW5wdXQuc2hhcGUpID09IDMgIyAoTSwgdG9waywgSykKICAgIGFzc2VydCBsZW4ob3V0cHV0LnNoYXBlKSA9PSAzICMgKGJhdGNoX3NpemUsIE0sIEspCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbMF0gPT0gb3V0cHV0LnNoYXBlWzBdICogb3V0cHV0LnNoYXBlWzFdCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbLTFdID09IG91dHB1dC5zaGFwZVstMV0KCiAgICBOID0gaW5wdXQuc2hhcGVbMl0KICAgIEJMT0NLX1NJWkVfTSA9IGlucHV0LnNoYXBlWzFdCiAgICBCTE9DS19TSVpFX04gPSAyMDQ4CiAgICBCTE9DS19TSVpFX04gPSBCTE9DS19TSVpFX04gaWYgTiA+PSBCTE9DS19TSVpFX04gZWxzZSBOCiAgICBncmlkID0gKGlucHV0LnNoYXBlWzBdLCkKICAgIHN1bV9rZXJuZWxbZ3JpZF0oaW5wdXQsIG91dHB1dCwgTiwgQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX04pCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2gub25lcygoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4gKiAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUyID0gdG9yY2guZW1wdHkoKE0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMyA9IHRvcmNoLmVtcHR5KChNLCBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgSyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBtb2UgZ2F0ZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10sCiAgICAgICAgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHNoYXJlZF9leHBlcnRzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc2hhcmVkX291dHB1dCA9IG1vZV9leHBlcnRfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGFsaWduCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc29ydGVkX3Rva2VuX2lkcywgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCA9IGludm9rZV9tb2VfYWxpZ25fYmxvY2tfc2l6ZSgKICAgICAgICBleHBlcnRfaW5kaWNlcywgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIEJMT0NLX1NJWkVfTSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzEKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnB1dF90ZW5zb3IudmlldygtMSwgSyksIHcxLCBpbnRlcm1lZGlhdGVfY2FjaGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X3Njb3JlcywgZXhwZXJ0X2luZGljZXMsIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pbmRpY2VzLnNoYXBlWzJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaWx1X2FuZF9tdWwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUxLnZpZXcoLTEsIDIgKiBOKSwgaW50ZXJtZWRpYXRlX2NhY2hlMikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUyLCB3MiwgaW50ZXJtZWRpYXRlX2NhY2hlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgVHJ1ZSwgMSkKCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAjIHN1bQojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojICAgICByb3V0ZWRfb3V0cHV0ID0gdG9yY2guc3VtKAojICAgICAgICAgaW50ZXJtZWRpYXRlX2NhY2hlMy52aWV3KCppbnRlcm1lZGlhdGVfY2FjaGUzLnNoYXBlKSwgZGltPTEpLnZpZXcoY29uZmlnWyJiYXRjaF9zaXplIl0sIGNvbmZpZ1sic2VxX2xlbiJdLCBLKQoKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICMgYWRkCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgICAgIG91dHB1dCA9IHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgojICAgICByZXR1cm4gb3V0cHV0CgogICAgaW52b2tlX3N1bV9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMywgc2hhcmVkX291dHB1dCkKCiAgICByZXR1cm4gc2hhcmVkX291dHB1dAo=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 29220.
- aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbWF0bXVsCgojIEB0cml0b24uaml0CiMgZGVmIG1hdG11bF9rZXJuZWwoCiMgICAgICAgICAjIFBvaW50ZXJzIHRvIG1hdHJpY2VzCiMgICAgICAgICBhX3B0ciwgYl9wdHIsIGNfcHRyLAojICAgICAgICAgIyBNYXRyaXggZGltZW5zaW9ucwojICAgICAgICAgTSwgTiwgSywKIyAgICAgICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQojICAgICAgICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAojICAgICAgICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgojICAgICAgICAgc3RyaWRlX2FtLCBzdHJpZGVfYWssICAjCiMgICAgICAgICBzdHJpZGVfYmssIHN0cmlkZV9ibiwgICMKIyAgICAgICAgIHN0cmlkZV9jbSwgc3RyaWRlX2NuLAojICAgICAgICAgIyBNZXRhLXBhcmFtZXRlcnMKIyAgICAgICAgIEJMT0NLX1NJWkVfTTogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsICAjCiMgICAgICAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwgICMKIyAgICAgICAgIEFDVElWQVRJT046IHRsLmNvbnN0ZXhwciAgIwojICk6CiMgICAgICIiIktlcm5lbCBmb3IgY29tcHV0aW5nIHRoZSBtYXRtdWwgQyA9IEEgeCBCLgojICAgICBBIGhhcyBzaGFwZSAoTSwgSyksIEIgaGFzIHNoYXBlIChLLCBOKSBhbmQgQyBoYXMgc2hhcGUgKE0sIE4pCiMgICAgICIiIgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgTWFwIHByb2dyYW0gaWRzIGBwaWRgIHRvIHRoZSBibG9jayBvZiBDIGl0IHNob3VsZCBjb21wdXRlLgojICAgICAjIFRoaXMgaXMgZG9uZSBpbiBhIGdyb3VwZWQgb3JkZXJpbmcgdG8gcHJvbW90ZSBMMiBkYXRhIHJldXNlLgojICAgICAjIFNlZSBhYm92ZSBgTDIgQ2FjaGUgT3B0aW1pemF0aW9uc2Agc2VjdGlvbiBmb3IgZGV0YWlscy4KIyAgICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiMgICAgIG51bV9waWRfbSA9IHRsLmNkaXYoTSwgQkxPQ0tfU0laRV9NKQojICAgICBudW1fcGlkX24gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKIyAgICAgbnVtX3BpZF9pbl9ncm91cCA9IEdST1VQX1NJWkVfTSAqIG51bV9waWRfbgojICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiMgICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFX00KIyAgICAgZ3JvdXBfc2l6ZV9tID0gbWluKG51bV9waWRfbSAtIGZpcnN0X3BpZF9tLCBHUk9VUF9TSVpFX00pCiMgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAoKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApICUgZ3JvdXBfc2l6ZV9tKQojICAgICBwaWRfbiA9IChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAvLyBncm91cF9zaXplX20KCiMgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIENyZWF0ZSBwb2ludGVycyBmb3IgdGhlIGZpcnN0IGJsb2NrcyBvZiBBIGFuZCBCLgojICAgICAjIFdlIHdpbGwgYWR2YW5jZSB0aGlzIHBvaW50ZXIgYXMgd2UgbW92ZSBpbiB0aGUgSyBkaXJlY3Rpb24KIyAgICAgIyBhbmQgYWNjdW11bGF0ZQojICAgICAjIGBhX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9LXSBwb2ludGVycwojICAgICAjIGBiX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfSywgQkxPQ0tfU0laRV9OXSBwb2ludGVycwojICAgICAjIFNlZSBhYm92ZSBgUG9pbnRlciBBcml0aG1ldGljYCBzZWN0aW9uIGZvciBkZXRhaWxzCiMgICAgIG9mZnNfYW0gPSAocGlkX20gKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKSkgJSBNCiMgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiMgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiMgICAgIGFfcHRycyA9IGFfcHRyICsgKG9mZnNfYW1bOiwgTm9uZV0gKiBzdHJpZGVfYW0gKyBvZmZzX2tbTm9uZSwgOl0gKiBzdHJpZGVfYWspCiMgICAgIGJfcHRycyA9IGJfcHRyICsgKG9mZnNfa1s6LCBOb25lXSAqIHN0cmlkZV9iayArIG9mZnNfYm5bTm9uZSwgOl0gKiBzdHJpZGVfYm4pCgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgSXRlcmF0ZSB0byBjb21wdXRlIGEgYmxvY2sgb2YgdGhlIEMgbWF0cml4LgojICAgICAjIFdlIGFjY3VtdWxhdGUgaW50byBhIGBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX05dYCBibG9jawojICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiMgICAgICMgYGFjY3VtdWxhdG9yYCB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIGZwMTYgYWZ0ZXIgdGhlIGxvb3AuCiMgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKIyAgICAgZm9yIGsgaW4gcmFuZ2UoMCwgdGwuY2RpdihLLCBCTE9DS19TSVpFX0spKToKIyAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgIyBJZiBpdCBpcyBvdXQgb2YgYm91bmRzLCBzZXQgaXQgdG8gMC4KIyAgICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywgbWFzaz1vZmZzX2tbTm9uZSwgOl0gPCBLIC0gayAqIEJMT0NLX1NJWkVfSywgb3RoZXI9MC4wKQojICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSBrICogQkxPQ0tfU0laRV9LLCBvdGhlcj0wLjApCiMgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgYWNjdW11bGF0b3IgPSB0bC5kb3QoYSwgYiwgYWNjdW11bGF0b3IpCiMgICAgICAgICAjIEFkdmFuY2UgdGhlIHB0cnMgdG8gdGhlIG5leHQgSyBibG9jay4KIyAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKIyAgICAgICAgIGJfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYmsKIyAgICAgIyBZb3UgY2FuIGZ1c2UgYXJiaXRyYXJ5IGFjdGl2YXRpb24gZnVuY3Rpb25zIGhlcmUKIyAgICAgIyB3aGlsZSB0aGUgYWNjdW11bGF0b3IgaXMgc3RpbGwgaW4gRlAzMiEKIyAgICAgaWYgQUNUSVZBVElPTiA9PSAibGVha3lfcmVsdSI6CiMgICAgICAgICBhY2N1bXVsYXRvciA9IGxlYWt5X3JlbHUoYWNjdW11bGF0b3IpCiMgICAgIGMgPSBhY2N1bXVsYXRvci50byh0bC5mbG9hdDE2KQoKIyAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIFdyaXRlIGJhY2sgdGhlIGJsb2NrIG9mIHRoZSBvdXRwdXQgbWF0cml4IEMgd2l0aCBtYXNrcy4KIyAgICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKIyAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKIyAgICAgY19wdHJzID0gY19wdHIgKyBzdHJpZGVfY20gKiBvZmZzX2NtWzosIE5vbmVdICsgc3RyaWRlX2NuICogb2Zmc19jbltOb25lLCA6XQojICAgICBjX21hc2sgPSAob2Zmc19jbVs6LCBOb25lXSA8IE0pICYgKG9mZnNfY25bTm9uZSwgOl0gPCBOKQojICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKCiMgZGVmIG1hdG11bChhLCBiLCBhY3RpdmF0aW9uPSIiKToKIyAgICAgIyBDaGVjayBjb25zdHJhaW50cy4KIyAgICAgSyA9IGEuc2l6ZSgtMSkKIyAgICAgTSA9IGEubnVtZWwoKSAvLyBLCiMgICAgIE4gPSBiLnNpemUoMSkKIyAgICAgYXNzZXJ0IGEuaXNfY29udGlndW91cygpLCAiTWF0cml4IEEgbXVzdCBiZSBjb250aWd1b3VzIgojICAgICBhc3NlcnQgSyA9PSBiLnNoYXBlWzBdLCAiSW5jb21wYXRpYmxlIGRpbWVuc2lvbnMiCiMgICAgICMgQWxsb2NhdGVzIG91dHB1dC4KIyAgICAgYyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPWEuZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDE2KQojICAgICAjIDFEIGxhdW5jaCBrZXJuZWwgd2hlcmUgZWFjaCBibG9jayBnZXRzIGl0cyBvd24gcHJvZ3JhbS4KIyAgICAgZ3JpZCA9IGxhbWJkYSBNRVRBOiAodHJpdG9uLmNkaXYoTSwgTUVUQVsnQkxPQ0tfU0laRV9NJ10pICogdHJpdG9uLmNkaXYoTiwgTUVUQVsnQkxPQ0tfU0laRV9OJ10pLCApCiMgICAgIG1hdG11bF9rZXJuZWxbZ3JpZF0oCiMgICAgICAgICBhLCBiLCBjLCAgIwojICAgICAgICAgTSwgTiwgSywgICMKIyAgICAgICAgIEssIDEsICAjCiMgICAgICAgICBiLnN0cmlkZSgwKSwgYi5zdHJpZGUoMSksICAjCiMgICAgICAgICBOLCAxLCAgIwojICAgICAgICAgQkxPQ0tfU0laRV9NPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9OPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9LPTEyOCwKIyAgICAgICAgIEdST1VQX1NJWkVfTT00LAojICAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uICAjCiMgICAgICkKIyAgICAgcmV0dXJuIGMKCgojIEB0b3JjaC5ub19ncmFkKCkKIyBkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiMgICAgIHhfZ2F0ZSA9IG1hdG11bCh4LCB3X2dhdGUpCiMgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgIHhfdXAgPSBtYXRtdWwoeCwgd191cCkKIyAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICBvdXQgPSBtYXRtdWwob3V0LCB3X2Rvd24pCiMgICAgIHJldHVybiBvdXQKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UxW2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgZW5kID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBwcmludChmIm1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMToge2VuZCAtIHN0YXJ0fSIpCgogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIHByaW50KGYibW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UyOiB7ZW5kIC0gc3RhcnR9IikKCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlM1soMSwgKV0oCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZCwKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTM6IHtlbmQgLSBzdGFydH0iKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2U0W2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHNvcnRlZF9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQ6IHtlbmQgLSBzdGFydH0iKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgojIEB0cml0b24uaml0CiMgZGVmIHNpbHVfYW5kX211bF9rZXJuZWwoaW5wdXRfcHRyLCBvdXRwdXRfcHRyLCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIpOgojICAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKIyAgICAgYV9ibG9ja19zdGFydCA9IHBpZCAqIEJMT0NLX1NJWkUKIyAgICAgYl9ibG9ja19zdGFydCA9IGFfYmxvY2tfc3RhcnQgKyBuX2VsZW1lbnRzCiMgICAgIGFfb2Zmc2V0cyA9IGFfYmxvY2tfc3RhcnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkKIyAgICAgYl9vZmZzZXRzID0gYl9ibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQojICAgICBhX21hc2sgPSBhX29mZnNldHMgPCBuX2VsZW1lbnRzCiMgICAgIGJfbWFzayA9IGJfb2Zmc2V0cyA8IG5fZWxlbWVudHMgKiAyCgojICAgICBhID0gdGwubG9hZChpbnB1dF9wdHIgKyBhX29mZnNldHMsIG1hc2s9YV9tYXNrKQojICAgICBiID0gdGwubG9hZChpbnB1dF9wdHIgKyBiX29mZnNldHMsIG1hc2s9Yl9tYXNrKQojICAgICBvdXRwdXQgPSBhICogKDEgLyAoMSArIHRsLmV4cCgtYS50byh0bC5mbG9hdDMyKSkpKSAqIGIKIyAgICAgdGwuc3RvcmUob3V0cHV0X3B0ciArIGFfb2Zmc2V0cywgb3V0cHV0LCBtYXNrPWFfbWFzaykKCiMgZ3JpZCA9ICh0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFKSwpCiMgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dF90ZW5zb3IsIG91dHB1dF90ZW5zb3IsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkUpCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAxMDI0IGlmIG5fZWxlbWVudHMgPiAxMDI0IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICAgICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGFjY3VtdWxhdG9yLCBtYXNrPWNfbWFzaykKCiAgICAgICAgdGlsZV9pZCArPSBOVU1fU01TCgoKZGVmIGludm9rZV9mdXNlZF9tb2Vfa2VybmVsKEE6IHRvcmNoLlRlbnNvciwgQjogdG9yY2guVGVuc29yLCBDOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BrX3dlaWdodHM6IHRvcmNoLlRlbnNvciwgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9yb3V0ZWRfd2VpZ2h0OiBib29sLCB0b3BfazogaW50KToKICAgICMgcHJpbnQobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCkKICAgICMgcHJpbnQoc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSkKICAgIE5VTV9TTVMgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfcHJvcGVydGllcygiY3VkYSIpLm11bHRpX3Byb2Nlc3Nvcl9jb3VudCAqIDIKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKG1pbihOVU1fU01TLCB0cml0b24uY2Rpdihzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLCBNRVRBWyJCTE9DS19TSVpFX00iXSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXRvbi5jZGl2KEIuc2hhcGVbMV0sIE1FVEFbIkJMT0NLX1NJWkVfTiJdKSksICkKICAgIGZ1c2VkX21vZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgdG9wa193ZWlnaHRzLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgIEIuc2hhcGVbMV0sCiAgICAgICAgQi5zaGFwZVsyXSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgQS5zdHJpZGUoMCksCiAgICAgICAgQS5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQi5zdHJpZGUoMiksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMiksCiAgICAgICAgdG9wa193ZWlnaHRzLnN0cmlkZSgyKSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnN0cmlkZSgwKSwKICAgICAgICBNVUxfUk9VVEVEX1dFSUdIVD1tdWxfcm91dGVkX3dlaWdodCwKICAgICAgICB0b3Bfaz10b3BfaywKICAgICAgICBjb21wdXRlX3R5cGU9dGwuYmZsb2F0MTYgaWYgQS5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNiBlbHNlIHRsLmZsb2F0MTYsCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwKICAgICAgICBCTE9DS19TSVpFX049QkxPQ0tfU0laRV9OLAogICAgICAgIEJMT0NLX1NJWkVfSz1CTE9DS19TSVpFX0ssCiAgICAgICAgR1JPVVBfU0laRV9NPUdST1VQX1NJWkVfTSwKICAgICAgICBOVU1fU01TPU5VTV9TTVMsCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgICMgWF9wdHJzID0gWCArIG9mZl9tWzosIE5vbmVdICogMSArIG9mZl9uW05vbmUsIDpdICogTQogICAgIyBZX3B0cnMgPSBZICsgKEVfSUQgKiAyICsgV19JRCkgKiBNICogTiArIG9mZl9tWzosIE5vbmVdICogTiArIG9mZl9uW05vbmUsIDpdICogMQogICAgWF9wdHJzID0gWCArIG9mZl9tWzosIE5vbmVdICogc3RyaWRlX3htICsgb2ZmX25bTm9uZSwgOl0gKiBzdHJpZGVfeG4KICAgIFlfcHRycyA9IFkgKyBJRFggKiBNICogTiArIG9mZl9tWzosIE5vbmVdICogc3RyaWRlX3ltICsgb2ZmX25bTm9uZSwgOl0gKiBzdHJpZGVfeW4KCiAgICB0aWxlID0gdGwubG9hZChYX3B0cnMsIG1hc2s9bWFzaywgb3RoZXI9b3RoZXIpCiAgICB0bC5zdG9yZShZX3B0cnMsIHRpbGUsIG1hc2s9bWFzaykKCgpkZWYgaW52b2tlX3RyYW5zcG9zZShYLCBZLCBJRFg9MCwgQkxPQ0tfTT0xMjgsIEJMT0NLX049MTI4LCBudW1fd2FycHM9MTYpIC0+IE5vbmU6CiAgICBpZiBYLmR0eXBlLml0ZW1zaXplID09IDE6CiAgICAgICAgWCA9IFgudmlldyh0b3JjaC5pbnQ4KQogICAgaWYgWS5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFkgPSBZLnZpZXcodG9yY2guaW50OCkKCiAgICAjIGNoZWNrIGNvbXBhdGliaWxpdHk6CiAgICBhc3NlcnQgWC5kdHlwZSA9PSBZLmR0eXBlCgogICAgTSA9IFguc2hhcGVbMF0KICAgIE4gPSBYLnNoYXBlWzFdCgogICAgc3RyaWRlX3htID0gWC5zdHJpZGUoMCkKICAgIHN0cmlkZV94biA9IFguc3RyaWRlKDEpCgogICAgc3RyaWRlX3ltID0gWS5zdHJpZGUoLTIpCiAgICBzdHJpZGVfeW4gPSBZLnN0cmlkZSgtMSkKCiAgICBncmlkID0gKChNICsgQkxPQ0tfTSAtIDEpIC8vIEJMT0NLX00sIChOICsgQkxPQ0tfTiAtIDEpIC8vIEJMT0NLX04pCiAgICB0cmFuc3Bvc2Vfa2VybmVsW2dyaWRdKAogICAgICAgIE0sCiAgICAgICAgTiwKICAgICAgICBCTE9DS19NLAogICAgICAgIEJMT0NLX04sCiAgICAgICAgWCwKICAgICAgICBzdHJpZGVfeG0sCiAgICAgICAgc3RyaWRlX3huLAogICAgICAgIFksCiAgICAgICAgc3RyaWRlX3ltLAogICAgICAgIHN0cmlkZV95biwKICAgICAgICBJRFg9SURYLAogICAgICAgIG51bV93YXJwcz1udW1fd2FycHMsCiAgICApCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2gub25lcygoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4gKiAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUyID0gdG9yY2guZW1wdHkoKE0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMyA9IHRvcmNoLmVtcHR5KChNLCBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgSyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBtb2UgZ2F0ZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10sCiAgICAgICAgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHNoYXJlZF9leHBlcnRzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc2hhcmVkX291dHB1dCA9IG1vZV9leHBlcnRfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGFsaWduCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc29ydGVkX3Rva2VuX2lkcywgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCA9IGludm9rZV9tb2VfYWxpZ25fYmxvY2tfc2l6ZSgKICAgICAgICBleHBlcnRfaW5kaWNlcywgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIEJMT0NLX1NJWkVfTSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzEKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnB1dF90ZW5zb3IudmlldygtMSwgSyksIHcxLCBpbnRlcm1lZGlhdGVfY2FjaGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X3Njb3JlcywgZXhwZXJ0X2luZGljZXMsIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pbmRpY2VzLnNoYXBlWzJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaWx1X2FuZF9tdWwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUxLnZpZXcoLTEsIDIgKiBOKSwgaW50ZXJtZWRpYXRlX2NhY2hlMikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUyLCB3MiwgaW50ZXJtZWRpYXRlX2NhY2hlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgVHJ1ZSwgMSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc3VtCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgcm91dGVkX291dHB1dCA9IHRvcmNoLnN1bSgKICAgICAgICBpbnRlcm1lZGlhdGVfY2FjaGUzLnZpZXcoKmludGVybWVkaWF0ZV9jYWNoZTMuc2hhcGUpLCBkaW09MSkudmlldyhjb25maWdbImJhdGNoX3NpemUiXSwgY29uZmlnWyJzZXFfbGVuIl0sIEspCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGFkZAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIG91dHB1dCA9IHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgogICAgcmV0dXJuIG91dHB1dAoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGRhdGEgPSBnZW5lcmF0ZV9pbnB1dCgKICAgICAgICAgICAgZGhpZGRlbj03MTY4LCBkZXhwZXJ0PTIwNDgsCiAgICAgICAgICAgIG5yb3V0ZWRleHBlcnRzPTMyLCBuc2hhcmVkZXhwZXJ0cz0xLCBuZXhwZXJ0c3BlcnRva2VuPTQsCiAgICAgICAgICAgIGJzPTEsIHNlcWxlbj0yMDQ4LCBzZWVkPTEpCiAgICBvdXRwdXQgPSBjdXN0b21fa2VybmVsKGRhdGEpCiAgICByZWZfZGF0YSA9IF9jbG9uZV9kYXRhKGRhdGEpCiAgICByZWZfb3V0cHV0ID0gcmVmX2tlcm5lbChyZWZfZGF0YSkKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0LCByZWZfb3V0cHV0LCBydG9sPTFlLTIsIGF0b2w9MWUtMikpCgogICAgIyB0aW1lX2xpc3QgPSBbXQogICAgIyBmb3IgaSBpbiByYW5nZSgyMDApOgogICAgIyAgICAgZGF0YSA9IGdlbmVyYXRlX2lucHV0KAogICAgIyAgICAgICAgIGRoaWRkZW49NzE2OCwgZGV4cGVydD0yMDQ4LAogICAgIyAgICAgICAgIG5yb3V0ZWRleHBlcnRzPTMyLCBuc2hhcmVkZXhwZXJ0cz0xLCBuZXhwZXJ0c3BlcnRva2VuPTQsCiAgICAjICAgICAgICAgYnM9MSwgc2VxbGVuPTgxOTIsIHNlZWQ9MSkKCiAgICAjICAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgICAgIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQoKICAgICMgICAgIG91dHB1dCA9IGN1c3RvbV9rZXJuZWwoZGF0YSkKCiAgICAjICAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgICAgIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgICAgIHRpbWVfbGlzdC5hcHBlbmQoKGVuZCAtIHN0YXJ0KSAvIDEwMDAgLyAxMDAwKQoKICAgICMgICAgIHJlZl9kYXRhID0gX2Nsb25lX2RhdGEoZGF0YSkKICAgICMgICAgIHJlZl9vdXRwdXQgPSByZWZfa2VybmVsKHJlZl9kYXRhKQoKICAgICMgcHJpbnQodGltZV9saXN0KQogICAgIyBwcmludChmImFsbDoge3N1bSh0aW1lX2xpc3RbLTEwMDpdKSAvIDEwMH0iKQo=No newline at end of file+ aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMVtncmlkXSgKICAgICAgICB0b3BrX2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCgogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzWygxLCApXSgKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgKQogICAgCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTRbZ3JpZF0oCiAgICAgICAgdG9wa19pZHMsCiAgICAgICAgc29ydGVkX2lkcywKICAgICAgICBleHBlcnRfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAyMDQ4IGlmIG5fZWxlbWVudHMgPiAyMDQ4IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICAgICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGFjY3VtdWxhdG9yLCBtYXNrPWNfbWFzaykKCiAgICAgICAgdGlsZV9pZCArPSBOVU1fU01TCgoKZGVmIGludm9rZV9mdXNlZF9tb2Vfa2VybmVsKEE6IHRvcmNoLlRlbnNvciwgQjogdG9yY2guVGVuc29yLCBDOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BrX3dlaWdodHM6IHRvcmNoLlRlbnNvciwgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9yb3V0ZWRfd2VpZ2h0OiBib29sLCB0b3BfazogaW50KToKICAgIE5VTV9TTVMgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfcHJvcGVydGllcygiY3VkYSIpLm11bHRpX3Byb2Nlc3Nvcl9jb3VudCAqIDIKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKG1pbihOVU1fU01TLCB0cml0b24uY2Rpdihzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLCBNRVRBWyJCTE9DS19TSVpFX00iXSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXRvbi5jZGl2KEIuc2hhcGVbMV0sIE1FVEFbIkJMT0NLX1NJWkVfTiJdKSksICkKICAgIGZ1c2VkX21vZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgdG9wa193ZWlnaHRzLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgIEIuc2hhcGVbMV0sCiAgICAgICAgQi5zaGFwZVsyXSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnNoYXBlWzBdLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgQS5zdHJpZGUoMCksCiAgICAgICAgQS5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQi5zdHJpZGUoMiksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMSksCiAgICAgICAgQy5zdHJpZGUoMiksCiAgICAgICAgdG9wa193ZWlnaHRzLnN0cmlkZSgyKSwKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLnN0cmlkZSgwKSwKICAgICAgICBNVUxfUk9VVEVEX1dFSUdIVD1tdWxfcm91dGVkX3dlaWdodCwKICAgICAgICB0b3Bfaz10b3BfaywKICAgICAgICBjb21wdXRlX3R5cGU9dGwuYmZsb2F0MTYgaWYgQS5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNiBlbHNlIHRsLmZsb2F0MTYsCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwKICAgICAgICBCTE9DS19TSVpFX049QkxPQ0tfU0laRV9OLAogICAgICAgIEJMT0NLX1NJWkVfSz1CTE9DS19TSVpFX0ssCiAgICAgICAgR1JPVVBfU0laRV9NPUdST1VQX1NJWkVfTSwKICAgICAgICBOVU1fU01TPU5VTV9TTVMsCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV94bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3huCiAgICBZX3B0cnMgPSBZICsgSURYICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV95bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3luCgogICAgdGlsZSA9IHRsLmxvYWQoWF9wdHJzLCBtYXNrPW1hc2ssIG90aGVyPW90aGVyKQogICAgdGwuc3RvcmUoWV9wdHJzLCB0aWxlLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV90cmFuc3Bvc2UoWCwgWSwgSURYPTAsIEJMT0NLX009MTI4LCBCTE9DS19OPTEyOCwgbnVtX3dhcnBzPTE2KSAtPiBOb25lOgogICAgaWYgWC5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFggPSBYLnZpZXcodG9yY2guaW50OCkKICAgIGlmIFkuZHR5cGUuaXRlbXNpemUgPT0gMToKICAgICAgICBZID0gWS52aWV3KHRvcmNoLmludDgpCgogICAgIyBjaGVjayBjb21wYXRpYmlsaXR5OgogICAgYXNzZXJ0IFguZHR5cGUgPT0gWS5kdHlwZQoKICAgIE0gPSBYLnNoYXBlWzBdCiAgICBOID0gWC5zaGFwZVsxXQoKICAgIHN0cmlkZV94bSA9IFguc3RyaWRlKDApCiAgICBzdHJpZGVfeG4gPSBYLnN0cmlkZSgxKQoKICAgIHN0cmlkZV95bSA9IFkuc3RyaWRlKC0yKQogICAgc3RyaWRlX3luID0gWS5zdHJpZGUoLTEpCgogICAgZ3JpZCA9ICgoTSArIEJMT0NLX00gLSAxKSAvLyBCTE9DS19NLCAoTiArIEJMT0NLX04gLSAxKSAvLyBCTE9DS19OKQogICAgdHJhbnNwb3NlX2tlcm5lbFtncmlkXSgKICAgICAgICBNLAogICAgICAgIE4sCiAgICAgICAgQkxPQ0tfTSwKICAgICAgICBCTE9DS19OLAogICAgICAgIFgsCiAgICAgICAgc3RyaWRlX3htLAogICAgICAgIHN0cmlkZV94biwKICAgICAgICBZLAogICAgICAgIHN0cmlkZV95bSwKICAgICAgICBzdHJpZGVfeW4sCiAgICAgICAgSURYPUlEWCwKICAgICAgICBudW1fd2FycHM9bnVtX3dhcnBzLAogICAgKQoKCkB0cml0b24uaml0CmRlZiBzdW1fa2VybmVsKGFfcHRyLCBiX3B0ciwgTiwgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoYXhpcz0wKQoKICAgIG9mZnNfbSA9IHBpZCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICBvZmZzX24gPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgYV9yb3dfcHRyID0gYV9wdHIgKyBvZmZzX21bOiwgTm9uZV0gKiBOICsgb2Zmc19uW05vbmUsIDpdCiAgICBiX3Jvd19wdHIgPSBiX3B0ciArIHBpZCAqIE4gICAgICAgICAgICAgKyBvZmZzX24KCiAgICBibG9ja19udW0gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKICAgIGZvciBpIGluIHJhbmdlKGJsb2NrX251bSk6CiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyLCBtYXNrPW9mZnNfbltOb25lLCA6XSA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IHRsLmxvYWQoYl9yb3dfcHRyLCBtYXNrPW9mZnNfbiA8IE4gLSBpICogQkxPQ0tfU0laRV9OLCBvdGhlcj0wLjApCiAgICAgICAgYiA9IGIgKyB0bC5zdW0oYSwgYXhpcz0wLCBkdHlwZT10bC5mbG9hdDE2KQogICAgICAgIHRsLnN0b3JlKGJfcm93X3B0ciwgYiwgbWFzaz1vZmZzX24gPCBOIC0gaSAqIEJMT0NLX1NJWkVfTikKCiAgICAgICAgYV9yb3dfcHRyICs9IEJMT0NLX1NJWkVfTgogICAgICAgIGJfcm93X3B0ciArPSBCTE9DS19TSVpFX04KCgpkZWYgaW52b2tlX3N1bV9rZXJuZWwoaW5wdXQ6IHRvcmNoLlRlbnNvciwgb3V0cHV0OiB0b3JjaC5UZW5zb3IpOgogICAgYXNzZXJ0IGlucHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IG91dHB1dC5pc19jb250aWd1b3VzKCkKICAgIGFzc2VydCBsZW4oaW5wdXQuc2hhcGUpID09IDMgIyAoTSwgdG9waywgSykKICAgIGFzc2VydCBsZW4ob3V0cHV0LnNoYXBlKSA9PSAzICMgKGJhdGNoX3NpemUsIE0sIEspCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbMF0gPT0gb3V0cHV0LnNoYXBlWzBdICogb3V0cHV0LnNoYXBlWzFdCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbLTFdID09IG91dHB1dC5zaGFwZVstMV0KCiAgICBOID0gaW5wdXQuc2hhcGVbMl0KICAgIEJMT0NLX1NJWkVfTSA9IGlucHV0LnNoYXBlWzFdCiAgICBCTE9DS19TSVpFX04gPSAyMDQ4CiAgICBCTE9DS19TSVpFX04gPSBCTE9DS19TSVpFX04gaWYgTiA+PSBCTE9DS19TSVpFX04gZWxzZSBOCiAgICBncmlkID0gKGlucHV0LnNoYXBlWzBdLCkKICAgIHN1bV9rZXJuZWxbZ3JpZF0oaW5wdXQsIG91dHB1dCwgTiwgQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX04pCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2gub25lcygoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4gKiAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUyID0gdG9yY2guZW1wdHkoKE0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMyA9IHRvcmNoLmVtcHR5KChNLCBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgSyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBtb2UgZ2F0ZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10sCiAgICAgICAgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHNoYXJlZF9leHBlcnRzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc2hhcmVkX291dHB1dCA9IG1vZV9leHBlcnRfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGFsaWduCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc29ydGVkX3Rva2VuX2lkcywgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCA9IGludm9rZV9tb2VfYWxpZ25fYmxvY2tfc2l6ZSgKICAgICAgICBleHBlcnRfaW5kaWNlcywgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIEJMT0NLX1NJWkVfTSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzEKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnB1dF90ZW5zb3IudmlldygtMSwgSyksIHcxLCBpbnRlcm1lZGlhdGVfY2FjaGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X3Njb3JlcywgZXhwZXJ0X2luZGljZXMsIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pbmRpY2VzLnNoYXBlWzJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaWx1X2FuZF9tdWwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUxLnZpZXcoLTEsIDIgKiBOKSwgaW50ZXJtZWRpYXRlX2NhY2hlMikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUyLCB3MiwgaW50ZXJtZWRpYXRlX2NhY2hlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgVHJ1ZSwgMSkKCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAjIHN1bQojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojICAgICByb3V0ZWRfb3V0cHV0ID0gdG9yY2guc3VtKAojICAgICAgICAgaW50ZXJtZWRpYXRlX2NhY2hlMy52aWV3KCppbnRlcm1lZGlhdGVfY2FjaGUzLnNoYXBlKSwgZGltPTEpLnZpZXcoY29uZmlnWyJiYXRjaF9zaXplIl0sIGNvbmZpZ1sic2VxX2xlbiJdLCBLKQoKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICMgYWRkCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgICAgIG91dHB1dCA9IHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgojICAgICByZXR1cm4gb3V0cHV0CgogICAgaW52b2tlX3N1bV9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMywgc2hhcmVkX291dHB1dCkKCiAgICByZXR1cm4gc2hhcmVkX291dHB1dAo=No newline at end of file
Best evidence level for this revision: reported
JSON