submission 27739
KernelBot user 302 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.
mla_decode_v0.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-27739?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesbf16
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:f59f758b1e29139a995f5385de70b678db5eef9cd38722206358194d9ab6e126
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
mla_decode_v0.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCmltcG9ydCB0aW1lCmltcG9ydCB0cml0b24KaW1wb3J0IHRyaXRvbi5sYW5ndWFnZSBhcyB0bApjbGFzcyBSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcigidGhldGEiLCB0aGV0YSkKCiAgICBkZWYgcm90YXRlX2hhbGYoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgeDEsIHgyID0geC5jaHVuaygyLCBkaW09LTEpCiAgICAgICAgcmV0dXJuIHRvcmNoLmNhdCgoLXgyLCB4MSksIGRpbT0tMSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpCiAgICAgICAgaWR4X3RoZXRhMiA9IHRvcmNoLmNhdChbaWR4X3RoZXRhLCBpZHhfdGhldGFdLCBkaW09LTEpCiAgICAgICAgdG9yY2guY29zCiAgICAgICAgY29zID0gaWR4X3RoZXRhMi5jb3MoKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICBzaW4gPSBpZHhfdGhldGEyLnNpbigpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHJldHVybiB4ICogY29zICsgc2VsZi5yb3RhdGVfaGFsZih4KSAqIHNpbgoKY2xhc3MgTXlSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnRoZXRhID0gdGhldGEuY3VkYSgpIAogICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBvbGRfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeCA9IHgucmVzaGFwZSgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKSAjIChzZXFfbGVuLCkKICAgICAgICBwcmludChmInNlcV9pZHg6IHtzZXFfaWR4fSBkdHlwZToge3NlcV9pZHguZHR5cGV9IHNoYXBlOiB7c2VxX2lkeC5zaGFwZX0iKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpICMgKHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgcHJpbnQoZiJpZHhfdGhldGEgZHR5cGU6IHtpZHhfdGhldGEuZHR5cGV9ICIpCiAgICAgICAgaWR4X3RoZXRhID0gaWR4X3RoZXRhLnZpZXcoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIHgxID0geFs6LCA6LCA6ZF9tb2RlbC8vMl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgeDIgPSB4WzosIDosIGRfbW9kZWwvLzI6XSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICBwcmludChmImNvc2luZSBkdHlwZToge2lkeF90aGV0YS5jb3MoKS5kdHlwZX0gIikKICAgICAgICBwcmludChmIngxICogaWR4X3RoZXRhLmNvcygpIGR0eXBlOiB7KHgxICogaWR4X3RoZXRhLmNvcygpKS5kdHlwZX0gIikKICAgICAgICBuZXdfeDEgPSB4MSAqIGlkeF90aGV0YS5jb3MoKSAtIHgyICogaWR4X3RoZXRhLnNpbigpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIG5ld194MiA9IHgxICogaWR4X3RoZXRhLnNpbigpICsgeDIgKiBpZHhfdGhldGEuY29zKCkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgcHJpbnQoZiJuZXdfeDEgZHR5cGU6IHtuZXdfeDEuZHR5cGV9IG5ld194MiBkdHlwZToge25ld194Mi5kdHlwZX0iKQogICAgICAgIG5ld194ID0gdG9yY2guY2F0KFtuZXdfeDEsIG5ld194Ml0sIGRpbT0tMSkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwpCiAgICAgICAgbmV3X3ggPSBuZXdfeC52aWV3KG9sZF9zaGFwZSkgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICByZXR1cm4gbmV3X3gKICAgICAgICAKICAgICAgICAKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYucV9sb3JhX3JhbmssIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuS1ZfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLmt2X2xvcmFfcmFuayArIHNlbGYucm9wZV9oZWFkX2RpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCgogICAgICAgICMgVXAtcHJvamVjdGlvbiBhbmQgcm9wZSBwcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5xX2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQoKICAgICAgICAjIE91dHB1dCBwcm9qZWN0aW9uCiAgICAgICAgc2VsZi53byA9IG5uLkxpbmVhcihzZWxmLnZfaGVhZF9kaW0gKiBzZWxmLm5faGVhZHMsIHNlbGYuZGltLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLmVwcyA9IDFlLTYKICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIGt2X2NhY2hlOiBLVkNhY2hlKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgIyBzZXFfbGVuID0gMSBhbHdheXMgaGVyZQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIG1vZGVsX2RpbSA9IHguc2l6ZSgpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgU3RlcCAxOiBIYW5kbGUgZG93bi1wcm9qZWN0aW9uICsgS1YgY2FjaGUgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHFfbG9yYSA9IHNlbGYuUV9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhID0gc2VsZi5LVl9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhLCBrdl9sZW4gPSBrdl9jYWNoZShrdl9sb3JhKQogICAgICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgU3RlcCAyOiBVcC1wcm9qZWN0IGFuZCBwcmVwYXJlIE5vUEUgKyBSb1BFICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgSGFuZGxlIHF1ZXJpZXMgUSBmaXJzdAogICAgICAgIHFfbm9wZV9hbmRfcm9wZSA9IHNlbGYuUV9wcm9qX3VwKHFfbG9yYSkudmlldygKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgc2VsZi5uX2hlYWRzLCBzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgcV9ub3BlLCBxX3JvcGUgPSB0b3JjaC5zcGxpdChxX25vcGVfYW5kX3JvcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyBIYW5kbGUga2V5cyBhbmQgdmFsdWVzIEsvVi4gViBkb2VzIG5vdCBuZWVkIFJvUEUKICAgICAgICBrdl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICAgICBrdl9ub3BlID0gc2VsZi5LVl9wcm9qX3VwKGt2X25vcGUpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIGt2X2xlbiwgc2VsZi5uX2hlYWRzLCBzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAga19ub3BlLCB2ID0gdG9yY2guc3BsaXQoa3Zfbm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi52X2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgIFN0ZXAgMzogSGFuZGxlIFJvUEUgU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIHF1ZXJpZXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBxX3JvcGUgPSBxX3JvcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHggbl9oZWFkcyB4IHNlcV9sZW4geCByb3BlX2hlYWRfZGltCiAgICAgICAgcV9yb3BlID0gc2VsZi5xX3JvcGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQoKICAgICAgICBxX25vcGUgPSBxX25vcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHggbl9oZWFkcyB4IHNlcV9sZW4geCByb3BlX2hlYWRfZGltCiAgICAgICAgcSA9IHRvcmNoLmNvbmNhdChbcV9ub3BlLCBxX3JvcGVdLCBkaW09LTEpCgoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3Iga2V5cyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIGtfcm9wZSA9IGtfcm9wZVs6LCBOb25lLCA6LCA6XQogICAgICAgIGtfcm9wZSA9IHNlbGYua19yb3BlKGtfcm9wZSkuZXhwYW5kKC0xLHNlbGYubl9oZWFkcywtMSwtMSkKICAgICAgICBrX25vcGUgPSBrX25vcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHgga3ZfbGVuIHggbl9oZWFkcyB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBrID0gdG9yY2guY29uY2F0KFtrX25vcGUsIGtfcm9wZV0sIGRpbT0tMSkKICAgICAgICAgICAgICAgIAogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgTXVsdGktaGVhZCBBdHRlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHYgPSB2LnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBrdl9sZW4geCB2X2hlYWRfZGltCiAgICAgICAgc2NvcmVzID0gdG9yY2gubWF0bXVsKHEsIGsudHJhbnNwb3NlKC0xLCAtMikpIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICBhdHRuID0gRi5zb2Z0bWF4KHNjb3JlcywgZGltPS0xKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICB5ID0gdG9yY2gubWF0bXVsKGF0dG4sIHYpLnZpZXcoYmF0Y2hfc2l6ZSwgMSwgLTEpCiAgICAgICAgeSA9IHNlbGYud28oeSkKCiAgICAgICAgcmV0dXJuIHksIGt2X2NhY2hlLmdldF9kYXRhKCkKCmRlZiBwcmludF9jb25maWcoY29uZmlnOiBDb25maWcpOgogICAgZm9yIGtleSBpbiBjb25maWcuX19kaWN0X186CiAgICAgICAgaWYgaXNpbnN0YW5jZShjb25maWcuX19kaWN0X19ba2V5XSwgdG9yY2guVGVuc29yKToKICAgICAgICAgICAgcHJpbnQoZiJ7a2V5fToge2NvbmZpZy5fX2RpY3RfX1trZXldLnNoYXBlfSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoZiJ7a2V5fToge2NvbmZpZy5fX2RpY3RfX1trZXldfSIpCgpkZWYgdG9yY2hfcm9wZSgKICAgIHRoZXRhOiB0b3JjaC5UZW5zb3IsCiAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICBzdGFydF9wb3M6IGludCA9IDAsCik6CiAgICAjIHg6ICgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgb2xkX3NoYXBlID0geC5zaGFwZQogICAgeCA9IHgucmVzaGFwZSgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpICMgKHNlcV9sZW4sKQogICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgdGhldGEpICMgKHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAKICAgIGNvcyA9IGlkeF90aGV0YS5jb3MoKQogICAgc2luID0gaWR4X3RoZXRhLnNpbigpCiAgICB4MCA9IHhbOiwgOiwgOmRfbW9kZWwvLzJdICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgeDEgPSB4WzosIDosIGRfbW9kZWwvLzI6XSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgIG5ld194MCA9IHgwICogY29zIC0geDEgKiBzaW4gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICBuZXdfeDEgPSB4MCAqIHNpbiArIHgxICogY29zICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgbmV3X3ggPSB0b3JjaC5jYXQoW25ld194MCwgbmV3X3gxXSwgZGltPS0xKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIG5ld194ID0gbmV3X3gudmlldyhvbGRfc2hhcGUpICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWwpCiAgICByZXR1cm4gbmV3X3gKQHRyaXRvbi5qaXQKZGVmIHJvcGVfa2VybmVsKAogICAgeCwKICAgIHksCiAgICB0aGV0YSwKICAgIHN0YXJ0X3Bvc2l0aW9uLAogICAgYmF0Y2hzaXplLAogICAgc2VxX2xlbiwKICAgIG5faGVhZHMsCiAgICByb3BlX2hlYWRfZGltOiB0bC5jb25zdGV4cHIsCiAgICB4X2JhdGNoX3N0cmlkZSwKICAgIHhfc2VxX3N0cmlkZSwKICAgIHhfaGVhZF9zdHJpZGUsCiAgICB5X2JhdGNoX3N0cmlkZSwKICAgIHlfc2VxX3N0cmlkZSwKICAgIHlfaGVhZF9zdHJpZGUsCiAgICBoZWFkX2Jsb2NrX3NpemU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgeDogIChiYXRjaHNpemUsIHNlcV9sZW4sIG5faGVhZHMsIHJvcGVfaGVhZF9kaW0pIAogICAgIyB5OiAgKGJhdGNoc2l6ZSwgc2VxX2xlbiwgbl9oZWFkcywgcm9wZV9oZWFkX2RpbSkKICAgICMgdGhldGE6IChyb3BlX2hlYWRfZGltIC8vIDIsICkKICAgICMgZ3JpZDogKGNkaXYobl9oZWFkcywgaGVhZF9ibG9ja19zaXplKSwgc2VxX2xlbiwgYmF0Y2hzaXplKQogICAgCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBzZXFfaWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgaGVhZF9iZWdpbiA9IHRsLnByb2dyYW1faWQoMCkgKiBoZWFkX2Jsb2NrX3NpemUKICAgIAogICAgeDBfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeCArIGJhdGNoX2lkeCAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB4X2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh4X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB4ICsgYmF0Y2hfaWR4ICogeF9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeF9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHhfaGVhZF9zdHJpZGUgKyByb3BlX2hlYWRfZGltLy8yLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh4X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB5MF9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB5ICsgYmF0Y2hfaWR4ICogeV9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeV9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHlfaGVhZF9zdHJpZGUsCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oaGVhZF9ibG9ja19zaXplLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KHlfaGVhZF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShoZWFkX2Jsb2NrX3NpemUsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHkxX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHkgKyBiYXRjaF9pZHggKiB5X2JhdGNoX3N0cmlkZSArIHNlcV9pZHggKiB5X3NlcV9zdHJpZGUgKyBoZWFkX2JlZ2luICogeV9oZWFkX3N0cmlkZSArIHJvcGVfaGVhZF9kaW0vLzIsCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oaGVhZF9ibG9ja19zaXplLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KHlfaGVhZF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShoZWFkX2Jsb2NrX3NpemUsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHRoZXRhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHRoZXRhLAogICAgICAgIHNoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yLCApLAogICAgICAgIHN0cmlkZXM9KDAsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MCA9IHRsLmxvYWQoeDBfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHgxID0gdGwubG9hZCh4MV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgdGhldGEgPSB0bC5sb2FkKHRoZXRhX2Jsb2NrX3B0cikgIyAoMSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHBvc2l0aW9uID0gKHN0YXJ0X3Bvc2l0aW9uICsgc2VxX2lkeCkudG8odGwuaW50NjQpICMgKDEsICkKICAgICMgcHJlY2lzaW9uISEhIQogICAgdGhldGEgPSAodGhldGEgKiBwb3NpdGlvbikgIyAoMSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIGNvcyA9IHRsLmNvcyh0aGV0YSkudG8odGwuYmZsb2F0MTYpICMgKDEsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICBzaW4gPSB0bC5zaW4odGhldGEpLnRvKHRsLmJmbG9hdDE2KSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgCiAgICB5MCA9ICh4MCAqIGNvcykgLSAoeDEgKiBzaW4pICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHkxID0gKHgwICogc2luKSArICh4MSAqIGNvcykgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQoKCnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKSBmb3IgZF9tb2RlbCBpbiBbNjQsXQp9CnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IHRoZXRhLmN1ZGEoKSBmb3IgZF9tb2RlbCwgdGhldGEgaW4gdGhldGFzLml0ZW1zKCkKfQpkZWYgbWxhX2RlY29kZV92MCgKICAgIGNvbmZpZzogQ29uZmlnLAogICAgeDogdG9yY2guVGVuc29yLAogICAga3ZfY2FjaGU6IEtWQ2FjaGUsCikgLT4gVHVwbGVbdG9yY2guVGVuc29yLCBLVkNhY2hlXToKICAgICMgZGltOiAgICAgICAgICAgICAgICA3MTY4CiAgICAjIG5faGVhZHM6ICAgICAgICAgICAgIDEyOAogICAgIyBxX2xvcmFfcmFuazogICAgICAgIDE1MzYKICAgICMga3ZfbG9yYV9yYW5rOiAgICAgICA1MTIKICAgICMgcWtfbm9wZV9oZWFkX2RpbTogICAxMjgKICAgICMgcWtfcm9wZV9oZWFkX2RpbTogICA2NAogICAgIyB2X2hlYWRfZGltOiAgICAgICAgMTI4CiAgICAjIFFfcHJval9kb3duX3dlaWdodDogICAoMTUzNiwgNzE2OCkKICAgICMgUV9wcm9qX3VwX3dlaWdodDogICAgICgoMTI4ICsgNjQpICogMTI4LCAxNTM2KSA9ICgyNDU3NiwgMTUzNikKICAgICMgS1ZfcHJval9kb3duX3dlaWdodDogICg1MTIgKyA2NCwgNzE2OCkgPSAoNTc2LCA3MTY4KQogICAgIyBLVl9wcm9qX3VwX3dlaWdodDogICAgKCgxMjggKyAxMjgpICogMTI4LCA1MTIpID0gKDMyNzY4LCA1MTIpCiAgICAjIHdvX3dlaWdodDogICAgICAgICAgICAoNzE2OCwgMTI4ICogMTI4KSA9ICg3MTY4LCAxNjM4NCkKICAgICMga3ZfY2FjaGVfc2hhcGU6ICAgICAoYmF0Y2hzaXplLCBtYXhfc2VxX2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgIChxX2xvcmFfcmFuaywgZGltKQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkgKiBuX2hlYWRzLCBxX2xvcmFfcmFuaykKICAgICMgS1ZfcHJval9kb3duX3dlaWdodDogIChrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltLCBkaW0pCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgIChkaW0sIHZfaGVhZF9kaW0gKiBuX2hlYWRzKQogICAgIyB4OiAgICAgICAgICAgICAgICAoYmF0Y2hzaXplLCAxLCBkaW0pCiAgICBxX2xvcmEgPSB4IEAgY29uZmlnLlFfcHJval9kb3duX3dlaWdodC5UICMgKGJhdGNoc2l6ZSwgMSwgcV9sb3JhX3JhbmspCiAgICBjdXJfa3ZfbG9yYSA9IHggQCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5UICMgKGJhdGNoc2l6ZSwgMSwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgIyBzdG9yZSBrdl9sb3JhIGluIGNhY2hlIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgY2FjaGUKICAgIGt2X2NhY2hlX2RhdGEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpICMgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBrdl9jYWNoZS5zZXFfbGVuICs9IDEKICAgIGt2X2NhY2hlX2RhdGFbOiwga3ZfY2FjaGUuc2VxX2xlbiAtIDEsIDpdID0gY3VyX2t2X2xvcmEuc3F1ZWV6ZSgxKSAKICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4gIyAoYmF0Y2hzaXplLCBrdl9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBrdl9jYWNoZV9kYXRhID0ga3ZfY2FjaGUuZ2V0X2RhdGEoKSAjIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAga3ZfbG9yYSA9IGt2X2NhY2hlX2RhdGFbOiwgOmt2X2NhY2hlLnNlcV9sZW4sIDpdICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSA6IChtYXhfc2VxX2xlbiAqIChrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSAsMSkKICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEgIwogICAgCiAgICBxX25vcGVfYW5kX3JvcGUgPSBxX2xvcmEgQCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5UICMgKGJhdGNoc2l6ZSwgMSwgKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMpCiAgICBxX25vcGVfYW5kX3JvcGUgPSBxX25vcGVfYW5kX3JvcGUudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbY29uZmlnLnFrX25vcGVfaGVhZF9kaW0sIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwgZGltPS0xKSAKICAgICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSkgOiAobl9oZWFkcyAqIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSksIG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAxKSAKICAgICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfcm9wZV9oZWFkX2RpbSkgOiAobl9oZWFkcyAqIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSksIG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAxKQogICAgIyBwcmludChmInFfbm9wZSBzaGFwZToge3Ffbm9wZS5zaGFwZX0gc3RyaWRlOiB7cV9ub3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7cV9ub3BlLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmInFfcm9wZSBzaGFwZToge3Ffcm9wZS5zaGFwZX0gc3RyaWRlOiB7cV9yb3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7cV9yb3BlLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBUT0RPOiBpbnBsYWNlIHJvcGUgZm9yIHFfcm9wZQogICAgIyByb3BlX21vZHVsZSA9IE15Um9QRShjb25maWcucWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgcV9yb3BlX3JlZiA9IHRvcmNoX3JvcGUoCiAgICAgICAgdGhldGFzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwKICAgICAgICBxX3JvcGUucGVybXV0ZSgwLCAyLCAxLCAzKSwgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBxa19yb3BlX2hlYWRfZGltKQogICAgICAgIHN0YXJ0X3Bvcz1xdWVyeV9wb3MsCiAgICApLnBlcm11dGUoMCwgMiwgMSwgMykgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKQogICAgcV9yb3BlX291dCA9IHFfcm9wZV9yZWYKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnZpZXcoY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnZfaGVhZF9kaW0sIGNvbmZpZy5rdl9sb3JhX3JhbmspICMgKG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltLCBrdl9sb3JhX3JhbmspCiAgICBrX25vcGVfcHJval91cF93ZWlnaHQsIHZfcHJval91cF93ZWlnaHQgPSB0b3JjaC5zcGxpdChLVl9wcm9qX3VwX3dlaWdodCwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcudl9oZWFkX2RpbV0sIGRpbT0tMikgCiAgICAjIChuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltLCBrdl9sb3JhX3JhbmspIDogKChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBrdl9sb3JhX3JhbmssIGt2X2xvcmFfcmFuaywgMSkKICAgICMgKG5faGVhZHMsIHZfaGVhZF9kaW0sIGt2X2xvcmFfcmFuaykgOiAoKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIGt2X2xvcmFfcmFuaywga3ZfbG9yYV9yYW5rLCAxKQogICAgIyBwcmludChmImtfbm9wZV9wcm9qX3VwX3dlaWdodCBzaGFwZToge2tfbm9wZV9wcm9qX3VwX3dlaWdodC5zaGFwZX0gc3RyaWRlOiB7a19ub3BlX3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a19ub3BlX3Byb2pfdXBfd2VpZ2h0LmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmInZfcHJval91cF93ZWlnaHQgc2hhcGU6IHt2X3Byb2pfdXBfd2VpZ2h0LnNoYXBlfSBzdHJpZGU6IHt2X3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7dl9wcm9qX3VwX3dlaWdodC5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogY2hlY2sgaWYgY29udGlndW91cyBpcyBjYWxsZWQgb3Igbm90CiAgICBxX25vcGVfcHJvamVkID0gdG9yY2guZWluc3VtKCdic2hkLGhkYy0+YnNoYycsIHFfbm9wZSwga19ub3BlX3Byb2pfdXBfd2VpZ2h0KSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgICMgcHJpbnQoZiJxX25vcGVfcHJvamVkIHNoYXBlOiB7cV9ub3BlX3Byb2plZC5zaGFwZX0gc3RyaWRlOiB7cV9ub3BlX3Byb2plZC5zdHJpZGUoKX0gaXNfY29udGlndW91czoge3Ffbm9wZV9wcm9qZWQuaXNfY29udGlndW91cygpfSIpCiAgICAKICAgIAogICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW2NvbmZpZy5rdl9sb3JhX3JhbmssIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwgZGltPS0xKSAKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmspIDogKG1heF9zZXFfbGVuICogKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltICwxKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIHFrX3JvcGVfaGVhZF9kaW0pIDogKG1heF9zZXFfbGVuICogKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltICwxKQogICAgIyBwcmludChmImt2X25vcGUgc2hhcGU6IHtrdl9ub3BlLnNoYXBlfSBzdHJpZGU6IHtrdl9ub3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a3Zfbm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgcHJpbnQoZiJrX3JvcGUgc2hhcGU6IHtrX3JvcGUuc2hhcGV9IHN0cmlkZToge2tfcm9wZS5zdHJpZGUoKX0gaXNfY29udGlndW91czoge2tfcm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogb3V0IG9mIHBsYWNlIHJvcGUgZm9yIGtfcm9wZQogICAga19yb3BlX3JlZiA9IHRvcmNoX3JvcGUoCiAgICAgICAgdGhldGFzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwKICAgICAgICBrX3JvcGUsCiAgICAgICAgc3RhcnRfcG9zPTAsICAgIAogICAgKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAga19yb3BlX291dCA9IGtfcm9wZV9yZWYKICAgICMgcHJpbnQoZiJrX3JvcGUgZHR5cGU6IHtrX3JvcGUuZHR5cGV9IHNoYXBlOiB7a19yb3BlLnNoYXBlfSBzdHJpZGU6IHtrX3JvcGUuc3RyaWRlKCl9IGlzX2NvbnRpZ3VvdXM6IHtrX3JvcGUuaXNfY29udGlndW91cygpfSIpCiAgICAjIFRPRE86IE1MQQogICAgc2NvcmUgPSB0b3JjaC5laW5zdW0oJ2JzaGMsYnZjLT5ic2h2JywgcV9ub3BlX3Byb2plZCwga3Zfbm9wZSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sZW4pCiAgICBzY29yZSArPSB0b3JjaC5laW5zdW0oJ2JzaGQsYnZkLT5ic2h2JywgcV9yb3BlX291dCwga19yb3BlX291dCkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sZW4pCiAgICBzY29yZSA9IHNjb3JlIC8gbWF0aC5zcXJ0KGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywga3ZfbGVuKQogICAgYXR0biA9IEYuc29mdG1heChzY29yZSwgZGltPS0xKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xlbikKICAgIHkgPSB0b3JjaC5laW5zdW0oJ2JzaHYsYnZjLT5ic2hjJywgYXR0biwga3Zfbm9wZSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAKICAgIAogICAgeSA9IHRvcmNoLmVpbnN1bSgnYnNoYyxoZGMtPmJzaGQnLCB5LCB2X3Byb2pfdXBfd2VpZ2h0KSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHZfaGVhZF9kaW0pCiAgICB5ID0gdG9yY2guZWluc3VtKCdic2hkLG9oZC0+YnNvJywgeSwgY29uZmlnLndvX3dlaWdodC52aWV3KGNvbmZpZy5kaW0sIGNvbmZpZy5uX2hlYWRzLCBjb25maWcudl9oZWFkX2RpbSkpICMgKGJhdGNoc2l6ZSwgMSwgZGltKQogICAgcmV0dXJuIHksIGt2X2NhY2hlX2RhdGEKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KToKICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBkYXRhCiAgICAjIHByaW50X2NvbmZpZyhjb25maWcpCiAgICBvdXQgPSBtbGFfZGVjb2RlX3YwKAogICAgICAgIGNvbmZpZywKICAgICAgICB4LAogICAgICAgIGt2X2NhY2hlLAogICAgKQogICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICB0aW1lLnNsZWVwKDAuMDA2KQogICAgcmV0dXJuIG91dAogICAgCiAgICAjIG1vZGVsID0gTUxBKGNvbmZpZykKICAgICMgbW9kZWwuUV9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodCkKICAgICMgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgIyBvdXRwdXQsIGt2X2NhY2hlID0gbW9kZWwoeCwga3ZfY2FjaGUpCiAgICAjIHJldHVybiBvdXRwdXQsIGt2X2NhY2hlCiAgICAKCmRlZiBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpOgogICAgIyBTaXplcyBkZXJpdmVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9kZWVwc2Vlay1haS9EZWVwU2Vlay1WMy9ibG9iL21haW4vaW5mZXJlbmNlL21vZGVsLnB5CiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQogICAgCiAgICAjIEdlbmVyYXRlIHdlaWdodHMgZm9yIGxpbmVhciBsYXllcnMKICAgIFFfcHJval9kb3duX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkcSwgZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKDUxMiArIDY0LCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIFFfcHJval91cF93ZWlnaHQgPSB0b3JjaC5yYW5kbigoKDEyOCArIDY0KSAqIDEyOCwgZHEpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2gucmFuZG4oKCgxMjggKyAxMjgpICogMTI4LCA1MTIpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIHdvX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkaW0sIDEyOCAqIDEyOCksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQoKICAgIGNvbmZpZyA9IENvbmZpZygKICAgICAgICBiYXRjaF9zaXplPWJhdGNoc2l6ZSwKICAgICAgICBkaW09ZGltLAogICAgICAgIHFfbG9yYV9yYW5rPWRxLAogICAgICAgIG5faGVhZHM9MTI4LAogICAgICAgIGt2X2xvcmFfcmFuaz01MTIsCiAgICAgICAgcWtfbm9wZV9oZWFkX2RpbT0xMjgsCiAgICAgICAgcWtfcm9wZV9oZWFkX2RpbT02NCwKICAgICAgICB2X2hlYWRfZGltPTEyOCwKICAgICAgICBzZXFfbGVuPTEsCiAgICAgICAgbWF4X3NlcV9sZW49ODE5MiwKICAgICAgICBrdl9jYWNoZV9zaGFwZT0oYmF0Y2hzaXplLCA4MTkyLCA1MTIgKyA2NCksCiAgICAgICAgUV9wcm9qX2Rvd25fd2VpZ2h0PVFfcHJval9kb3duX3dlaWdodCwKICAgICAgICBRX3Byb2pfdXBfd2VpZ2h0PVFfcHJval91cF93ZWlnaHQsCiAgICAgICAgS1ZfcHJval9kb3duX3dlaWdodD1LVl9wcm9qX2Rvd25fd2VpZ2h0LAogICAgICAgIEtWX3Byb2pfdXBfd2VpZ2h0PUtWX3Byb2pfdXBfd2VpZ2h0LAogICAgICAgIHdvX3dlaWdodD13b193ZWlnaHQsCiAgICApCiAgICB4ID0gdG9yY2gucmFuZG4oKGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcuZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICAKICAgICMgUHJlLWZpbGwgS1YgY2FjaGUKICAgIGt2X2NhY2hlID0gS1ZDYWNoZSgoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5tYXhfc2VxX2xlbiwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSkudG8oJ2N1ZGEnKQogICAgcHJlX2ZpbGxlZF9jYWNoZSA9IHRvcmNoLnJhbmRuKChjb25maWcuYmF0Y2hfc2l6ZSwgcHJlZmlsbCwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAga3ZfY2FjaGUocHJlX2ZpbGxlZF9jYWNoZSkKCiAgICByZXR1cm4gY29uZmlnLCB4LCBrdl9jYWNoZQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAjIEV4YW1wbGUgdXNhZ2UKICAgIGJhdGNoc2l6ZSA9IDEyOAogICAgZGltID0gNzE2OAogICAgZHEgPSAxNTM2CiAgICBwcmVmaWxsID0gNDA5NgogICAgc2VlZCA9IDk4MTcKICAgIHdpdGggdG9yY2gucHJvZmlsZXIucHJvZmlsZSgKICAgICAgICBhY3Rpdml0aWVzPVt0b3JjaC5wcm9maWxlci5Qcm9maWxlckFjdGl2aXR5LkNQVSwgdG9yY2gucHJvZmlsZXIuUHJvZmlsZXJBY3Rpdml0eS5DVURBXSwKICAgICAgICAjIHNjaGVkdWxlPXRvcmNoLnByb2ZpbGVyLnNjaGVkdWxlKHdhaXQ9MSwgd2FybXVwPTEsIGFjdGl2ZT0zKSwgICMg5o6n5Yi25YiG5p6Q5q2l6aqkCiAgICAgICAgcmVjb3JkX3NoYXBlcz1UcnVlLAogICAgICAgIHByb2ZpbGVfbWVtb3J5PVRydWUsCiAgICAgICAgd2l0aF9zdGFjaz1UcnVlLAogICAgKSBhcyBwcm9mOgogICAgICAgIGZvciBpIGluIHJhbmdlKDIpOgogICAgICAgICAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZ2VuZXJhdGVfaW5wdXQoYmF0Y2hzaXplLCBkaW0sIGRxLCBwcmVmaWxsLCBzZWVkKQogICAgICAgICAgICBjdXN0b21fa2VybmVsKChjb25maWcsIHgsIGt2X2NhY2hlKSkKICAgIHByb2YuZXhwb3J0X2Nocm9tZV90cmFjZSgibWxhX3RyYWNlLmpzb24iKQogICAgcHJpbnQocHJvZi5rZXlfYXZlcmFnZXMoKS50YWJsZShzb3J0X2J5PSJjdWRhX3RpbWVfdG90YWwiLCByb3dfbGltaXQ9NSkpSource code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 26088.
- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCmltcG9ydCB0aW1lCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgpjbGFzcyBNeVJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYudGhldGEgPSB0aGV0YS5jdWRhKCkgCiAgICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIG9sZF9zaGFwZSA9IHguc2hhcGUKICAgICAgICB4ID0geC5yZXNoYXBlKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpICMgKHNlcV9sZW4sKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpICMgKHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgaWR4X3RoZXRhID0gaWR4X3RoZXRhLnZpZXcoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIHgxID0geFs6LCA6LCA6ZF9tb2RlbC8vMl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgeDIgPSB4WzosIDosIGRfbW9kZWwvLzI6XSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICBuZXdfeDEgPSB4MSAqIGlkeF90aGV0YS5jb3MoKSAtIHgyICogaWR4X3RoZXRhLnNpbigpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIG5ld194MiA9IHgxICogaWR4X3RoZXRhLnNpbigpICsgeDIgKiBpZHhfdGhldGEuY29zKCkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgbmV3X3ggPSB0b3JjaC5jYXQoW25ld194MSwgbmV3X3gyXSwgZGltPS0xKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICBuZXdfeCA9IG5ld194LnZpZXcob2xkX3NoYXBlKSAjIChiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsKQogICAgICAgIHJldHVybiBuZXdfeAogICAgICAgIAogICAgICAgIApjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCiAgICAKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYucV9sb3JhX3JhbmssIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNlbGYuS1ZfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLmt2X2xvcmFfcmFuayArIHNlbGYucm9wZV9oZWFkX2RpbSwgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCgogICAgICAgICMgVXAtcHJvamVjdGlvbiBhbmQgcm9wZSBwcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5xX2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBNeVJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHNlbGYua19yb3BlID0gTXlSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKCiAgICAgICAgIyBPdXRwdXQgcHJvamVjdGlvbgogICAgICAgIHNlbGYud28gPSBubi5MaW5lYXIoc2VsZi52X2hlYWRfZGltICogc2VsZi5uX2hlYWRzLCBzZWxmLmRpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgogICAgICAgICMgc2VxX2xlbiA9IDEgYWx3YXlzIGhlcmUKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgIFN0ZXAgMTogSGFuZGxlIGRvd24tcHJvamVjdGlvbiArIEtWIGNhY2hlICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxX2xvcmEgPSBzZWxmLlFfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSA9IHNlbGYuS1ZfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSwga3ZfbGVuID0ga3ZfY2FjaGUoa3ZfbG9yYSkKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgIFN0ZXAgMjogVXAtcHJvamVjdCBhbmQgcHJlcGFyZSBOb1BFICsgUm9QRSAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIEhhbmRsZSBxdWVyaWVzIFEgZmlyc3QKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSBzZWxmLlFfcHJval91cChxX2xvcmEpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAga3Zfbm9wZSA9IHNlbGYuS1ZfcHJval91cChrdl9ub3BlKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBrdl9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKQogICAgICAgIGtfbm9wZSwgdiA9IHRvcmNoLnNwbGl0KGt2X25vcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgICBTdGVwIDM6IEhhbmRsZSBSb1BFIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgQ29tcHV0ZSBSb1BFIGZvciBxdWVyaWVzIGFuZCBjb21iaW5lIHdpdGggbm8tUm9QRSBwYXJ0CiAgICAgICAgcV9yb3BlID0gcV9yb3BlLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBzZXFfbGVuLCBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgcV9yb3BlID0gc2VsZi5xX3JvcGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHEgPSB0b3JjaC5jb25jYXQoW3Ffbm9wZSwgcV9yb3BlXSwgZGltPS0xKQoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3Iga2V5cyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XQogICAgICAgIGtfcm9wZSA9IHNlbGYua19yb3BlKGtfcm9wZSkuZXhwYW5kKC0xLC0xLHNlbGYubl9oZWFkcywtMSkKICAgICAgICBrID0gdG9yY2guY29uY2F0KFtrX25vcGUsIGtfcm9wZV0sIGRpbT0tMSkKICAgICAgICAgICAgICAgIAogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgTXVsdGktaGVhZCBBdHRlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHEgPSBxLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAxLCBzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgayA9IGsucmVzaGFwZShiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIGt2X2xlbiwgc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIHYgPSB2LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAtMSwgc2VsZi52X2hlYWRfZGltKQogICAgICAgIHNjb3JlcyA9IHRvcmNoLm1hdG11bChxLCBrLnRyYW5zcG9zZSgtMSwgLTIpKSAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgYXR0biA9IEYuc29mdG1heChzY29yZXMsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgeSA9IHRvcmNoLm1hdG11bChhdHRuLCB2KS52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQogICAgICAgIHkgPSBzZWxmLndvKHkpCgogICAgICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgpkZWYgcHJpbnRfY29uZmlnKGNvbmZpZzogQ29uZmlnKToKICAgIGZvciBrZXkgaW4gY29uZmlnLl9fZGljdF9fOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29uZmlnLl9fZGljdF9fW2tleV0sIHRvcmNoLlRlbnNvcik6CiAgICAgICAgICAgIHByaW50KGYie2tleX06IHtjb25maWcuX19kaWN0X19ba2V5XS5zaGFwZX0iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KGYie2tleX06IHtjb25maWcuX19kaWN0X19ba2V5XX0iKQoKCmRlZiBmYXN0X21sYV9kZWNvZGUoCiAgICBjb25maWc6IENvbmZpZywKICAgIHg6IHRvcmNoLlRlbnNvciwKICAgIGt2X2NhY2hlOiBLVkNhY2hlLAopIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgS1ZDYWNoZV06CiAgICAjIGRpbTogICAgICAgICAgICAgICAgNzE2OAogICAgIyBuX2hlYWRzOiAgICAgICAgICAgICAxMjgKICAgICMgcV9sb3JhX3Jhbms6ICAgICAgICAxNTM2CiAgICAjIGt2X2xvcmFfcmFuazogICAgICAgNTEyCiAgICAjIHFrX25vcGVfaGVhZF9kaW06ICAgMTI4CiAgICAjIHFrX3JvcGVfaGVhZF9kaW06ICAgNjQKICAgICMgdl9oZWFkX2RpbTogICAgICAgIDEyOAogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKDE1MzYsIDcxNjgpCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKDEyOCArIDY0KSAqIDEyOCwgMTUzNikgPSAoMjQ1NzYsIDE1MzYpCiAgICAjIEtWX3Byb2pfZG93bl93ZWlnaHQ6ICAoNTEyICsgNjQsIDcxNjgpID0gKDU3NiwgNzE2OCkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgoMTI4ICsgMTI4KSAqIDEyOCwgNTEyKSA9ICgzMjc2OCwgNTEyKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKDcxNjgsIDEyOCAqIDEyOCkgPSAoNzE2OCwgMTYzODQpCiAgICAjIGt2X2NhY2hlX3NoYXBlOiAgICAgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIFFfcHJval9kb3duX3dlaWdodDogICAocV9sb3JhX3JhbmssIGRpbSkKICAgICMgUV9wcm9qX3VwX3dlaWdodDogICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pICogbl9oZWFkcywgcV9sb3JhX3JhbmspCiAgICAjIEtWX3Byb2pfZG93bl93ZWlnaHQ6ICAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSwgZGltKQogICAgIyBLVl9wcm9qX3VwX3dlaWdodDogICAgKChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAjIHdvX3dlaWdodDogICAgICAgICAgICAoZGltLCB2X2hlYWRfZGltICogbl9oZWFkcykKICAgICMgeDogICAgICAgICAgICAgICAgKGJhdGNoc2l6ZSwgMSwgZGltKQogICAgcV9sb3JhID0geCBAIGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIHFfbG9yYV9yYW5rKQogICAgY3VyX2t2X2xvcmEgPSB4IEAgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCmRlZiBtbGFfZGVjb2RlKAogICAgY29uZmlnOiBDb25maWcsCiAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICBrdl9jYWNoZTogS1ZDYWNoZSwKKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIEtWQ2FjaGVdOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHFfbG9yYSA9IHggQCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBxX2xvcmFfcmFuaykKICAgIGN1cl9rdl9sb3JhID0geCBAIGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICAjIHN0b3JlIGt2X2xvcmEgaW4gY2FjaGUgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBjYWNoZQogICAga3ZfY2FjaGVfZGF0YSA9IGt2X2NhY2hlLmdldF9kYXRhKCkgIyAoYmF0Y2hzaXplLCBtYXhfc2VxX2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGt2X2NhY2hlLnNlcV9sZW4gKz0gMSAKICAgICMgVE9ETzogISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEsIGN1cl9rdl9sb3JhJ3MgcWtfcm9wZV9oZWFkX2RpbSBzaG91bGQgY2FsbCByb3BlIGJlZm9yZSBzdG9yaW5nLiBEbyBpbiBwbGFjZSBSb1BSCiAgICBrdl9jYWNoZV9kYXRhWzosIGt2X2NhY2hlLnNlcV9sZW4gLSAxLCA6XSA9IGN1cl9rdl9sb3JhLnNxdWVlemUoMSkgCiAgICBrdl9sZW4gPSBrdl9jYWNoZS5zZXFfbGVuICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAga3ZfY2FjaGVfZGF0YSA9IGt2X2NhY2hlLmdldF9kYXRhKCkgIyAoYmF0Y2hzaXplLCBtYXhfc2VxX2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGt2X2xvcmEgPSBrdl9jYWNoZV9kYXRhWzosIDprdl9jYWNoZS5zZXFfbGVuLCA6XSAjIChiYXRjaHNpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkgOiAobWF4X3NlcV9sZW4gKiAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSksIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0gLDEpCiAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxICMKICAgIAogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9sb3JhIEAgY29uZmlnLlFfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9ub3BlX2FuZF9yb3BlLnZpZXcoY29uZmlnLmJhdGNoX3NpemUsIDEsIGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pIDogCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCgogICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW2NvbmZpZy5rdl9sb3JhX3JhbmssIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwgZGltPS0xKSAKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmspCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAga3Zfbm9wZSA9IGt2X25vcGUgQCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIGt2X2xlbiwgKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIG5faGVhZHMpCiAgICBrdl9ub3BlID0ga3Zfbm9wZS52aWV3KGNvbmZpZy5iYXRjaF9zaXplLCBrdl9sZW4sIGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy52X2hlYWRfZGltKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pCiAgICBrX25vcGUsIHYgPSB0b3JjaC5zcGxpdChrdl9ub3BlLCBbY29uZmlnLnFrX25vcGVfaGVhZF9kaW0sIGNvbmZpZy52X2hlYWRfZGltXSwgZGltPS0xKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgdl9oZWFkX2RpbSkKICAgIAogICAgcm9wZV9tb2R1bGUgPSBNeVJvUEUoY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIHByZXBhcmUgcQogICAgcV9yb3BlID0gcV9yb3BlLnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCAxLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBxa19yb3BlX2hlYWRfZGltKQogICAgcV9yb3BlID0gcm9wZV9tb2R1bGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKSAjIChiYXRjaHNpemUsIG5faGVhZHMsIDEsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxX3JvcGUgPSBxX3JvcGUucmVzaGFwZShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgIyBwcmVwYXJlIGsKICAgICMgISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEKICAgIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XSAjISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEgKGJhdGNoc2l6ZSwga3ZfbGVuLCAxLCBxa19yb3BlX2hlYWRfZGltKQogICAga19yb3BlID0gcm9wZV9tb2R1bGUoa19yb3BlKS5leHBhbmQoLTEsLTEsY29uZmlnLm5faGVhZHMsLTEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKQogICAgayA9IHRvcmNoLmNvbmNhdChba19ub3BlLCBrX3JvcGVdLCBkaW09LTEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgIyAhISFjb3JyZWN0IGltcGxlbWVudGF0aW9uISEhCiAgICAjIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XSAjIChiYXRjaHNpemUsIGt2X2xlbiwgMSwgcWtfcm9wZV9oZWFkX2RpbSkKICAgICMga19yb3BlID0ga19yb3BlLmV4cGFuZCgtMSwgLTEsIGNvbmZpZy5uX2hlYWRzLCAtMSkgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIGsgPSB0b3JjaC5jb25jYXQoW2tfbm9wZSwga19yb3BlXSwgZGltPS0xKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKCiAgICAjICEhIXdyb25nIGltcGxlbWVudGF0aW9uISEhCiAgICBxID0gcS5yZXNoYXBlKGNvbmZpZy5iYXRjaF9zaXplLCBjb25maWcubl9oZWFkcywgMSwgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGsgPSBrLnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCBrdl9sZW4sIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbGVuLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIHYgPSB2LnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCAtMSwgY29uZmlnLnZfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbGVuLCB2X2hlYWRfZGltKQogICAgc2NvcmUgPSB0b3JjaC5tYXRtdWwocSwgay50cmFuc3Bvc2UoLTEsIC0yKSkgLyBtYXRoLnNxcnQoY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBrdl9sZW4pCiAgICBhdHRuID0gRi5zb2Z0bWF4KHNjb3JlLCBkaW09LTEpLnRvKHRvcmNoLmJmbG9hdDE2KSAjIChiYXRjaHNpemUsIG5faGVhZHMsIDEsIGt2X2xlbikKICAgIHkgPSB0b3JjaC5tYXRtdWwoYXR0biwgdikudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwgMSwgLTEpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcyAqIHZfaGVhZF9kaW0pCiAgICB5ID0geSBAIGNvbmZpZy53b193ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgogICAgIyAhISFjb3JyZWN0IGltcGxlbWVudGF0aW9uISEhCiAgICAKICAgICMgcHJpbnRfY29uZmlnKGNvbmZpZykKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCk6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgIyBwcmludF9jb25maWcoY29uZmlnKQogICAgb3V0ID0gbWxhX2RlY29kZSgKICAgICAgICBjb25maWcsCiAgICAgICAgeCwKICAgICAgICBrdl9jYWNoZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHRpbWUuc2xlZXAoMC44KQogICAgcmV0dXJuIG91dAogICAgCiAgICAjIG1vZGVsID0gTUxBKGNvbmZpZykKICAgICMgbW9kZWwuUV9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodCkKICAgICMgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgIyBvdXRwdXQsIGt2X2NhY2hlID0gbW9kZWwoeCwga3ZfY2FjaGUpCiAgICAjIHJldHVybiBvdXRwdXQsIGt2X2NhY2hlCiAgICAKCmRlZiBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpOgogICAgIyBTaXplcyBkZXJpdmVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9kZWVwc2Vlay1haS9EZWVwU2Vlay1WMy9ibG9iL21haW4vaW5mZXJlbmNlL21vZGVsLnB5CiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQogICAgCiAgICAjIEdlbmVyYXRlIHdlaWdodHMgZm9yIGxpbmVhciBsYXllcnMKICAgIFFfcHJval9kb3duX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkcSwgZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKDUxMiArIDY0LCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIFFfcHJval91cF93ZWlnaHQgPSB0b3JjaC5yYW5kbigoKDEyOCArIDY0KSAqIDEyOCwgZHEpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2gucmFuZG4oKCgxMjggKyAxMjgpICogMTI4LCA1MTIpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIHdvX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkaW0sIDEyOCAqIDEyOCksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQoKICAgIGNvbmZpZyA9IENvbmZpZygKICAgICAgICBiYXRjaF9zaXplPWJhdGNoc2l6ZSwKICAgICAgICBkaW09ZGltLAogICAgICAgIHFfbG9yYV9yYW5rPWRxLAogICAgICAgIG5faGVhZHM9MTI4LAogICAgICAgIGt2X2xvcmFfcmFuaz01MTIsCiAgICAgICAgcWtfbm9wZV9oZWFkX2RpbT0xMjgsCiAgICAgICAgcWtfcm9wZV9oZWFkX2RpbT02NCwKICAgICAgICB2X2hlYWRfZGltPTEyOCwKICAgICAgICBzZXFfbGVuPTEsCiAgICAgICAgbWF4X3NlcV9sZW49ODE5MiwKICAgICAgICBrdl9jYWNoZV9zaGFwZT0oYmF0Y2hzaXplLCA4MTkyLCA1MTIgKyA2NCksCiAgICAgICAgUV9wcm9qX2Rvd25fd2VpZ2h0PVFfcHJval9kb3duX3dlaWdodCwKICAgICAgICBRX3Byb2pfdXBfd2VpZ2h0PVFfcHJval91cF93ZWlnaHQsCiAgICAgICAgS1ZfcHJval9kb3duX3dlaWdodD1LVl9wcm9qX2Rvd25fd2VpZ2h0LAogICAgICAgIEtWX3Byb2pfdXBfd2VpZ2h0PUtWX3Byb2pfdXBfd2VpZ2h0LAogICAgICAgIHdvX3dlaWdodD13b193ZWlnaHQsCiAgICApCiAgICB4ID0gdG9yY2gucmFuZG4oKGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcuZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICAKICAgICMgUHJlLWZpbGwgS1YgY2FjaGUKICAgIGt2X2NhY2hlID0gS1ZDYWNoZSgoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5tYXhfc2VxX2xlbiwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSkudG8oJ2N1ZGEnKQogICAgcHJlX2ZpbGxlZF9jYWNoZSA9IHRvcmNoLnJhbmRuKChjb25maWcuYmF0Y2hfc2l6ZSwgcHJlZmlsbCwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAga3ZfY2FjaGUocHJlX2ZpbGxlZF9jYWNoZSkKCiAgICByZXR1cm4gY29uZmlnLCB4LCBrdl9jYWNoZQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAjIEV4YW1wbGUgdXNhZ2UKICAgIGJhdGNoc2l6ZSA9IDEyOAogICAgZGltID0gNzE2OAogICAgZHEgPSAxNTM2CiAgICBwcmVmaWxsID0gNDA5NgogICAgc2VlZCA9IDk4MTcKICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpCiAgICBjdXN0b21fa2VybmVsKChjb25maWcsIHgsIGt2X2NhY2hlKSk=No newline at end of file+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCmltcG9ydCB0aW1lCmltcG9ydCB0cml0b24KaW1wb3J0IHRyaXRvbi5sYW5ndWFnZSBhcyB0bApjbGFzcyBSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcigidGhldGEiLCB0aGV0YSkKCiAgICBkZWYgcm90YXRlX2hhbGYoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgeDEsIHgyID0geC5jaHVuaygyLCBkaW09LTEpCiAgICAgICAgcmV0dXJuIHRvcmNoLmNhdCgoLXgyLCB4MSksIGRpbT0tMSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpCiAgICAgICAgaWR4X3RoZXRhMiA9IHRvcmNoLmNhdChbaWR4X3RoZXRhLCBpZHhfdGhldGFdLCBkaW09LTEpCiAgICAgICAgdG9yY2guY29zCiAgICAgICAgY29zID0gaWR4X3RoZXRhMi5jb3MoKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICBzaW4gPSBpZHhfdGhldGEyLnNpbigpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHJldHVybiB4ICogY29zICsgc2VsZi5yb3RhdGVfaGFsZih4KSAqIHNpbgoKY2xhc3MgTXlSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnRoZXRhID0gdGhldGEuY3VkYSgpIAogICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBvbGRfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeCA9IHgucmVzaGFwZSgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKSAjIChzZXFfbGVuLCkKICAgICAgICBwcmludChmInNlcV9pZHg6IHtzZXFfaWR4fSBkdHlwZToge3NlcV9pZHguZHR5cGV9IHNoYXBlOiB7c2VxX2lkeC5zaGFwZX0iKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpICMgKHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgcHJpbnQoZiJpZHhfdGhldGEgZHR5cGU6IHtpZHhfdGhldGEuZHR5cGV9ICIpCiAgICAgICAgaWR4X3RoZXRhID0gaWR4X3RoZXRhLnZpZXcoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIHgxID0geFs6LCA6LCA6ZF9tb2RlbC8vMl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgeDIgPSB4WzosIDosIGRfbW9kZWwvLzI6XSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICBwcmludChmImNvc2luZSBkdHlwZToge2lkeF90aGV0YS5jb3MoKS5kdHlwZX0gIikKICAgICAgICBwcmludChmIngxICogaWR4X3RoZXRhLmNvcygpIGR0eXBlOiB7KHgxICogaWR4X3RoZXRhLmNvcygpKS5kdHlwZX0gIikKICAgICAgICBuZXdfeDEgPSB4MSAqIGlkeF90aGV0YS5jb3MoKSAtIHgyICogaWR4X3RoZXRhLnNpbigpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIG5ld194MiA9IHgxICogaWR4X3RoZXRhLnNpbigpICsgeDIgKiBpZHhfdGhldGEuY29zKCkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgcHJpbnQoZiJuZXdfeDEgZHR5cGU6IHtuZXdfeDEuZHR5cGV9IG5ld194MiBkdHlwZToge25ld194Mi5kdHlwZX0iKQogICAgICAgIG5ld194ID0gdG9yY2guY2F0KFtuZXdfeDEsIG5ld194Ml0sIGRpbT0tMSkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwpCiAgICAgICAgbmV3X3ggPSBuZXdfeC52aWV3KG9sZF9zaGFwZSkgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICByZXR1cm4gbmV3X3gKICAgICAgICAKICAgICAgICAKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYucV9sb3JhX3JhbmssIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuS1ZfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLmt2X2xvcmFfcmFuayArIHNlbGYucm9wZV9oZWFkX2RpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCgogICAgICAgICMgVXAtcHJvamVjdGlvbiBhbmQgcm9wZSBwcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5xX2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQoKICAgICAgICAjIE91dHB1dCBwcm9qZWN0aW9uCiAgICAgICAgc2VsZi53byA9IG5uLkxpbmVhcihzZWxmLnZfaGVhZF9kaW0gKiBzZWxmLm5faGVhZHMsIHNlbGYuZGltLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLmVwcyA9IDFlLTYKICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIGt2X2NhY2hlOiBLVkNhY2hlKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgIyBzZXFfbGVuID0gMSBhbHdheXMgaGVyZQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIG1vZGVsX2RpbSA9IHguc2l6ZSgpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgU3RlcCAxOiBIYW5kbGUgZG93bi1wcm9qZWN0aW9uICsgS1YgY2FjaGUgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHFfbG9yYSA9IHNlbGYuUV9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhID0gc2VsZi5LVl9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhLCBrdl9sZW4gPSBrdl9jYWNoZShrdl9sb3JhKQogICAgICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgU3RlcCAyOiBVcC1wcm9qZWN0IGFuZCBwcmVwYXJlIE5vUEUgKyBSb1BFICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgSGFuZGxlIHF1ZXJpZXMgUSBmaXJzdAogICAgICAgIHFfbm9wZV9hbmRfcm9wZSA9IHNlbGYuUV9wcm9qX3VwKHFfbG9yYSkudmlldygKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgc2VsZi5uX2hlYWRzLCBzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgcV9ub3BlLCBxX3JvcGUgPSB0b3JjaC5zcGxpdChxX25vcGVfYW5kX3JvcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyBIYW5kbGUga2V5cyBhbmQgdmFsdWVzIEsvVi4gViBkb2VzIG5vdCBuZWVkIFJvUEUKICAgICAgICBrdl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICAgICBrdl9ub3BlID0gc2VsZi5LVl9wcm9qX3VwKGt2X25vcGUpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIGt2X2xlbiwgc2VsZi5uX2hlYWRzLCBzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAga19ub3BlLCB2ID0gdG9yY2guc3BsaXQoa3Zfbm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi52X2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgIFN0ZXAgMzogSGFuZGxlIFJvUEUgU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIHF1ZXJpZXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBxX3JvcGUgPSBxX3JvcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHggbl9oZWFkcyB4IHNlcV9sZW4geCByb3BlX2hlYWRfZGltCiAgICAgICAgcV9yb3BlID0gc2VsZi5xX3JvcGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQoKICAgICAgICBxX25vcGUgPSBxX25vcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHggbl9oZWFkcyB4IHNlcV9sZW4geCByb3BlX2hlYWRfZGltCiAgICAgICAgcSA9IHRvcmNoLmNvbmNhdChbcV9ub3BlLCBxX3JvcGVdLCBkaW09LTEpCgoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3Iga2V5cyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIGtfcm9wZSA9IGtfcm9wZVs6LCBOb25lLCA6LCA6XQogICAgICAgIGtfcm9wZSA9IHNlbGYua19yb3BlKGtfcm9wZSkuZXhwYW5kKC0xLHNlbGYubl9oZWFkcywtMSwtMSkKICAgICAgICBrX25vcGUgPSBrX25vcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHgga3ZfbGVuIHggbl9oZWFkcyB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBrID0gdG9yY2guY29uY2F0KFtrX25vcGUsIGtfcm9wZV0sIGRpbT0tMSkKICAgICAgICAgICAgICAgIAogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgTXVsdGktaGVhZCBBdHRlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHYgPSB2LnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBrdl9sZW4geCB2X2hlYWRfZGltCiAgICAgICAgc2NvcmVzID0gdG9yY2gubWF0bXVsKHEsIGsudHJhbnNwb3NlKC0xLCAtMikpIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICBhdHRuID0gRi5zb2Z0bWF4KHNjb3JlcywgZGltPS0xKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICB5ID0gdG9yY2gubWF0bXVsKGF0dG4sIHYpLnZpZXcoYmF0Y2hfc2l6ZSwgMSwgLTEpCiAgICAgICAgeSA9IHNlbGYud28oeSkKCiAgICAgICAgcmV0dXJuIHksIGt2X2NhY2hlLmdldF9kYXRhKCkKCmRlZiBwcmludF9jb25maWcoY29uZmlnOiBDb25maWcpOgogICAgZm9yIGtleSBpbiBjb25maWcuX19kaWN0X186CiAgICAgICAgaWYgaXNpbnN0YW5jZShjb25maWcuX19kaWN0X19ba2V5XSwgdG9yY2guVGVuc29yKToKICAgICAgICAgICAgcHJpbnQoZiJ7a2V5fToge2NvbmZpZy5fX2RpY3RfX1trZXldLnNoYXBlfSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoZiJ7a2V5fToge2NvbmZpZy5fX2RpY3RfX1trZXldfSIpCgpkZWYgdG9yY2hfcm9wZSgKICAgIHRoZXRhOiB0b3JjaC5UZW5zb3IsCiAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICBzdGFydF9wb3M6IGludCA9IDAsCik6CiAgICAjIHg6ICgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgb2xkX3NoYXBlID0geC5zaGFwZQogICAgeCA9IHgucmVzaGFwZSgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpICMgKHNlcV9sZW4sKQogICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgdGhldGEpICMgKHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAKICAgIGNvcyA9IGlkeF90aGV0YS5jb3MoKQogICAgc2luID0gaWR4X3RoZXRhLnNpbigpCiAgICB4MCA9IHhbOiwgOiwgOmRfbW9kZWwvLzJdICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgeDEgPSB4WzosIDosIGRfbW9kZWwvLzI6XSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgIG5ld194MCA9IHgwICogY29zIC0geDEgKiBzaW4gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICBuZXdfeDEgPSB4MCAqIHNpbiArIHgxICogY29zICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgbmV3X3ggPSB0b3JjaC5jYXQoW25ld194MCwgbmV3X3gxXSwgZGltPS0xKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIG5ld194ID0gbmV3X3gudmlldyhvbGRfc2hhcGUpICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWwpCiAgICByZXR1cm4gbmV3X3gKQHRyaXRvbi5qaXQKZGVmIHJvcGVfa2VybmVsKAogICAgeCwKICAgIHksCiAgICB0aGV0YSwKICAgIHN0YXJ0X3Bvc2l0aW9uLAogICAgYmF0Y2hzaXplLAogICAgc2VxX2xlbiwKICAgIG5faGVhZHMsCiAgICByb3BlX2hlYWRfZGltOiB0bC5jb25zdGV4cHIsCiAgICB4X2JhdGNoX3N0cmlkZSwKICAgIHhfc2VxX3N0cmlkZSwKICAgIHhfaGVhZF9zdHJpZGUsCiAgICB5X2JhdGNoX3N0cmlkZSwKICAgIHlfc2VxX3N0cmlkZSwKICAgIHlfaGVhZF9zdHJpZGUsCiAgICBoZWFkX2Jsb2NrX3NpemU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgeDogIChiYXRjaHNpemUsIHNlcV9sZW4sIG5faGVhZHMsIHJvcGVfaGVhZF9kaW0pIAogICAgIyB5OiAgKGJhdGNoc2l6ZSwgc2VxX2xlbiwgbl9oZWFkcywgcm9wZV9oZWFkX2RpbSkKICAgICMgdGhldGE6IChyb3BlX2hlYWRfZGltIC8vIDIsICkKICAgICMgZ3JpZDogKGNkaXYobl9oZWFkcywgaGVhZF9ibG9ja19zaXplKSwgc2VxX2xlbiwgYmF0Y2hzaXplKQogICAgCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBzZXFfaWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgaGVhZF9iZWdpbiA9IHRsLnByb2dyYW1faWQoMCkgKiBoZWFkX2Jsb2NrX3NpemUKICAgIAogICAgeDBfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeCArIGJhdGNoX2lkeCAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB4X2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh4X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB4ICsgYmF0Y2hfaWR4ICogeF9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeF9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHhfaGVhZF9zdHJpZGUgKyByb3BlX2hlYWRfZGltLy8yLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh4X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB5MF9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB5ICsgYmF0Y2hfaWR4ICogeV9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeV9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHlfaGVhZF9zdHJpZGUsCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oaGVhZF9ibG9ja19zaXplLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KHlfaGVhZF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShoZWFkX2Jsb2NrX3NpemUsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHkxX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHkgKyBiYXRjaF9pZHggKiB5X2JhdGNoX3N0cmlkZSArIHNlcV9pZHggKiB5X3NlcV9zdHJpZGUgKyBoZWFkX2JlZ2luICogeV9oZWFkX3N0cmlkZSArIHJvcGVfaGVhZF9kaW0vLzIsCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oaGVhZF9ibG9ja19zaXplLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KHlfaGVhZF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShoZWFkX2Jsb2NrX3NpemUsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHRoZXRhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHRoZXRhLAogICAgICAgIHNoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yLCApLAogICAgICAgIHN0cmlkZXM9KDAsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MCA9IHRsLmxvYWQoeDBfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHgxID0gdGwubG9hZCh4MV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgdGhldGEgPSB0bC5sb2FkKHRoZXRhX2Jsb2NrX3B0cikgIyAoMSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHBvc2l0aW9uID0gKHN0YXJ0X3Bvc2l0aW9uICsgc2VxX2lkeCkudG8odGwuaW50NjQpICMgKDEsICkKICAgICMgcHJlY2lzaW9uISEhIQogICAgdGhldGEgPSAodGhldGEgKiBwb3NpdGlvbikgIyAoMSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIGNvcyA9IHRsLmNvcyh0aGV0YSkudG8odGwuYmZsb2F0MTYpICMgKDEsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICBzaW4gPSB0bC5zaW4odGhldGEpLnRvKHRsLmJmbG9hdDE2KSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgCiAgICB5MCA9ICh4MCAqIGNvcykgLSAoeDEgKiBzaW4pICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHkxID0gKHgwICogc2luKSArICh4MSAqIGNvcykgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQoKCnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKSBmb3IgZF9tb2RlbCBpbiBbNjQsXQp9CnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IHRoZXRhLmN1ZGEoKSBmb3IgZF9tb2RlbCwgdGhldGEgaW4gdGhldGFzLml0ZW1zKCkKfQpkZWYgbWxhX2RlY29kZV92MCgKICAgIGNvbmZpZzogQ29uZmlnLAogICAgeDogdG9yY2guVGVuc29yLAogICAga3ZfY2FjaGU6IEtWQ2FjaGUsCikgLT4gVHVwbGVbdG9yY2guVGVuc29yLCBLVkNhY2hlXToKICAgICMgZGltOiAgICAgICAgICAgICAgICA3MTY4CiAgICAjIG5faGVhZHM6ICAgICAgICAgICAgIDEyOAogICAgIyBxX2xvcmFfcmFuazogICAgICAgIDE1MzYKICAgICMga3ZfbG9yYV9yYW5rOiAgICAgICA1MTIKICAgICMgcWtfbm9wZV9oZWFkX2RpbTogICAxMjgKICAgICMgcWtfcm9wZV9oZWFkX2RpbTogICA2NAogICAgIyB2X2hlYWRfZGltOiAgICAgICAgMTI4CiAgICAjIFFfcHJval9kb3duX3dlaWdodDogICAoMTUzNiwgNzE2OCkKICAgICMgUV9wcm9qX3VwX3dlaWdodDogICAgICgoMTI4ICsgNjQpICogMTI4LCAxNTM2KSA9ICgyNDU3NiwgMTUzNikKICAgICMgS1ZfcHJval9kb3duX3dlaWdodDogICg1MTIgKyA2NCwgNzE2OCkgPSAoNTc2LCA3MTY4KQogICAgIyBLVl9wcm9qX3VwX3dlaWdodDogICAgKCgxMjggKyAxMjgpICogMTI4LCA1MTIpID0gKDMyNzY4LCA1MTIpCiAgICAjIHdvX3dlaWdodDogICAgICAgICAgICAoNzE2OCwgMTI4ICogMTI4KSA9ICg3MTY4LCAxNjM4NCkKICAgICMga3ZfY2FjaGVfc2hhcGU6ICAgICAoYmF0Y2hzaXplLCBtYXhfc2VxX2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgIChxX2xvcmFfcmFuaywgZGltKQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkgKiBuX2hlYWRzLCBxX2xvcmFfcmFuaykKICAgICMgS1ZfcHJval9kb3duX3dlaWdodDogIChrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltLCBkaW0pCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgIChkaW0sIHZfaGVhZF9kaW0gKiBuX2hlYWRzKQogICAgIyB4OiAgICAgICAgICAgICAgICAoYmF0Y2hzaXplLCAxLCBkaW0pCiAgICBxX2xvcmEgPSB4IEAgY29uZmlnLlFfcHJval9kb3duX3dlaWdodC5UICMgKGJhdGNoc2l6ZSwgMSwgcV9sb3JhX3JhbmspCiAgICBjdXJfa3ZfbG9yYSA9IHggQCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5UICMgKGJhdGNoc2l6ZSwgMSwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgIyBzdG9yZSBrdl9sb3JhIGluIGNhY2hlIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgY2FjaGUKICAgIGt2X2NhY2hlX2RhdGEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpICMgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBrdl9jYWNoZS5zZXFfbGVuICs9IDEKICAgIGt2X2NhY2hlX2RhdGFbOiwga3ZfY2FjaGUuc2VxX2xlbiAtIDEsIDpdID0gY3VyX2t2X2xvcmEuc3F1ZWV6ZSgxKSAKICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4gIyAoYmF0Y2hzaXplLCBrdl9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBrdl9jYWNoZV9kYXRhID0ga3ZfY2FjaGUuZ2V0X2RhdGEoKSAjIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAga3ZfbG9yYSA9IGt2X2NhY2hlX2RhdGFbOiwgOmt2X2NhY2hlLnNlcV9sZW4sIDpdICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSA6IChtYXhfc2VxX2xlbiAqIChrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSAsMSkKICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEgIwogICAgCiAgICBxX25vcGVfYW5kX3JvcGUgPSBxX2xvcmEgQCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5UICMgKGJhdGNoc2l6ZSwgMSwgKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMpCiAgICBxX25vcGVfYW5kX3JvcGUgPSBxX25vcGVfYW5kX3JvcGUudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbY29uZmlnLnFrX25vcGVfaGVhZF9kaW0sIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwgZGltPS0xKSAKICAgICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSkgOiAobl9oZWFkcyAqIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSksIG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAxKSAKICAgICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfcm9wZV9oZWFkX2RpbSkgOiAobl9oZWFkcyAqIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSksIG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAxKQogICAgIyBwcmludChmInFfbm9wZSBzaGFwZToge3Ffbm9wZS5zaGFwZX0gc3RyaWRlOiB7cV9ub3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7cV9ub3BlLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmInFfcm9wZSBzaGFwZToge3Ffcm9wZS5zaGFwZX0gc3RyaWRlOiB7cV9yb3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7cV9yb3BlLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBUT0RPOiBpbnBsYWNlIHJvcGUgZm9yIHFfcm9wZQogICAgIyByb3BlX21vZHVsZSA9IE15Um9QRShjb25maWcucWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgcV9yb3BlX3JlZiA9IHRvcmNoX3JvcGUoCiAgICAgICAgdGhldGFzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwKICAgICAgICBxX3JvcGUucGVybXV0ZSgwLCAyLCAxLCAzKSwgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBxa19yb3BlX2hlYWRfZGltKQogICAgICAgIHN0YXJ0X3Bvcz1xdWVyeV9wb3MsCiAgICApLnBlcm11dGUoMCwgMiwgMSwgMykgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKQogICAgcV9yb3BlX291dCA9IHFfcm9wZV9yZWYKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnZpZXcoY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnZfaGVhZF9kaW0sIGNvbmZpZy5rdl9sb3JhX3JhbmspICMgKG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltLCBrdl9sb3JhX3JhbmspCiAgICBrX25vcGVfcHJval91cF93ZWlnaHQsIHZfcHJval91cF93ZWlnaHQgPSB0b3JjaC5zcGxpdChLVl9wcm9qX3VwX3dlaWdodCwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcudl9oZWFkX2RpbV0sIGRpbT0tMikgCiAgICAjIChuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltLCBrdl9sb3JhX3JhbmspIDogKChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBrdl9sb3JhX3JhbmssIGt2X2xvcmFfcmFuaywgMSkKICAgICMgKG5faGVhZHMsIHZfaGVhZF9kaW0sIGt2X2xvcmFfcmFuaykgOiAoKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIGt2X2xvcmFfcmFuaywga3ZfbG9yYV9yYW5rLCAxKQogICAgIyBwcmludChmImtfbm9wZV9wcm9qX3VwX3dlaWdodCBzaGFwZToge2tfbm9wZV9wcm9qX3VwX3dlaWdodC5zaGFwZX0gc3RyaWRlOiB7a19ub3BlX3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a19ub3BlX3Byb2pfdXBfd2VpZ2h0LmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmInZfcHJval91cF93ZWlnaHQgc2hhcGU6IHt2X3Byb2pfdXBfd2VpZ2h0LnNoYXBlfSBzdHJpZGU6IHt2X3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7dl9wcm9qX3VwX3dlaWdodC5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogY2hlY2sgaWYgY29udGlndW91cyBpcyBjYWxsZWQgb3Igbm90CiAgICBxX25vcGVfcHJvamVkID0gdG9yY2guZWluc3VtKCdic2hkLGhkYy0+YnNoYycsIHFfbm9wZSwga19ub3BlX3Byb2pfdXBfd2VpZ2h0KSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgICMgcHJpbnQoZiJxX25vcGVfcHJvamVkIHNoYXBlOiB7cV9ub3BlX3Byb2plZC5zaGFwZX0gc3RyaWRlOiB7cV9ub3BlX3Byb2plZC5zdHJpZGUoKX0gaXNfY29udGlndW91czoge3Ffbm9wZV9wcm9qZWQuaXNfY29udGlndW91cygpfSIpCiAgICAKICAgIAogICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW2NvbmZpZy5rdl9sb3JhX3JhbmssIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwgZGltPS0xKSAKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmspIDogKG1heF9zZXFfbGVuICogKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltICwxKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIHFrX3JvcGVfaGVhZF9kaW0pIDogKG1heF9zZXFfbGVuICogKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltICwxKQogICAgIyBwcmludChmImt2X25vcGUgc2hhcGU6IHtrdl9ub3BlLnNoYXBlfSBzdHJpZGU6IHtrdl9ub3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a3Zfbm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgcHJpbnQoZiJrX3JvcGUgc2hhcGU6IHtrX3JvcGUuc2hhcGV9IHN0cmlkZToge2tfcm9wZS5zdHJpZGUoKX0gaXNfY29udGlndW91czoge2tfcm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogb3V0IG9mIHBsYWNlIHJvcGUgZm9yIGtfcm9wZQogICAga19yb3BlX3JlZiA9IHRvcmNoX3JvcGUoCiAgICAgICAgdGhldGFzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwKICAgICAgICBrX3JvcGUsCiAgICAgICAgc3RhcnRfcG9zPTAsICAgIAogICAgKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAga19yb3BlX291dCA9IGtfcm9wZV9yZWYKICAgICMgcHJpbnQoZiJrX3JvcGUgZHR5cGU6IHtrX3JvcGUuZHR5cGV9IHNoYXBlOiB7a19yb3BlLnNoYXBlfSBzdHJpZGU6IHtrX3JvcGUuc3RyaWRlKCl9IGlzX2NvbnRpZ3VvdXM6IHtrX3JvcGUuaXNfY29udGlndW91cygpfSIpCiAgICAjIFRPRE86IE1MQQogICAgc2NvcmUgPSB0b3JjaC5laW5zdW0oJ2JzaGMsYnZjLT5ic2h2JywgcV9ub3BlX3Byb2plZCwga3Zfbm9wZSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sZW4pCiAgICBzY29yZSArPSB0b3JjaC5laW5zdW0oJ2JzaGQsYnZkLT5ic2h2JywgcV9yb3BlX291dCwga19yb3BlX291dCkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sZW4pCiAgICBzY29yZSA9IHNjb3JlIC8gbWF0aC5zcXJ0KGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywga3ZfbGVuKQogICAgYXR0biA9IEYuc29mdG1heChzY29yZSwgZGltPS0xKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xlbikKICAgIHkgPSB0b3JjaC5laW5zdW0oJ2JzaHYsYnZjLT5ic2hjJywgYXR0biwga3Zfbm9wZSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAKICAgIAogICAgeSA9IHRvcmNoLmVpbnN1bSgnYnNoYyxoZGMtPmJzaGQnLCB5LCB2X3Byb2pfdXBfd2VpZ2h0KSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHZfaGVhZF9kaW0pCiAgICB5ID0gdG9yY2guZWluc3VtKCdic2hkLG9oZC0+YnNvJywgeSwgY29uZmlnLndvX3dlaWdodC52aWV3KGNvbmZpZy5kaW0sIGNvbmZpZy5uX2hlYWRzLCBjb25maWcudl9oZWFkX2RpbSkpICMgKGJhdGNoc2l6ZSwgMSwgZGltKQogICAgcmV0dXJuIHksIGt2X2NhY2hlX2RhdGEKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KToKICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBkYXRhCiAgICAjIHByaW50X2NvbmZpZyhjb25maWcpCiAgICBvdXQgPSBtbGFfZGVjb2RlX3YwKAogICAgICAgIGNvbmZpZywKICAgICAgICB4LAogICAgICAgIGt2X2NhY2hlLAogICAgKQogICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICB0aW1lLnNsZWVwKDAuMDA2KQogICAgcmV0dXJuIG91dAogICAgCiAgICAjIG1vZGVsID0gTUxBKGNvbmZpZykKICAgICMgbW9kZWwuUV9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodCkKICAgICMgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgIyBvdXRwdXQsIGt2X2NhY2hlID0gbW9kZWwoeCwga3ZfY2FjaGUpCiAgICAjIHJldHVybiBvdXRwdXQsIGt2X2NhY2hlCiAgICAKCmRlZiBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpOgogICAgIyBTaXplcyBkZXJpdmVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9kZWVwc2Vlay1haS9EZWVwU2Vlay1WMy9ibG9iL21haW4vaW5mZXJlbmNlL21vZGVsLnB5CiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQogICAgCiAgICAjIEdlbmVyYXRlIHdlaWdodHMgZm9yIGxpbmVhciBsYXllcnMKICAgIFFfcHJval9kb3duX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkcSwgZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKDUxMiArIDY0LCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIFFfcHJval91cF93ZWlnaHQgPSB0b3JjaC5yYW5kbigoKDEyOCArIDY0KSAqIDEyOCwgZHEpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2gucmFuZG4oKCgxMjggKyAxMjgpICogMTI4LCA1MTIpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIHdvX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkaW0sIDEyOCAqIDEyOCksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQoKICAgIGNvbmZpZyA9IENvbmZpZygKICAgICAgICBiYXRjaF9zaXplPWJhdGNoc2l6ZSwKICAgICAgICBkaW09ZGltLAogICAgICAgIHFfbG9yYV9yYW5rPWRxLAogICAgICAgIG5faGVhZHM9MTI4LAogICAgICAgIGt2X2xvcmFfcmFuaz01MTIsCiAgICAgICAgcWtfbm9wZV9oZWFkX2RpbT0xMjgsCiAgICAgICAgcWtfcm9wZV9oZWFkX2RpbT02NCwKICAgICAgICB2X2hlYWRfZGltPTEyOCwKICAgICAgICBzZXFfbGVuPTEsCiAgICAgICAgbWF4X3NlcV9sZW49ODE5MiwKICAgICAgICBrdl9jYWNoZV9zaGFwZT0oYmF0Y2hzaXplLCA4MTkyLCA1MTIgKyA2NCksCiAgICAgICAgUV9wcm9qX2Rvd25fd2VpZ2h0PVFfcHJval9kb3duX3dlaWdodCwKICAgICAgICBRX3Byb2pfdXBfd2VpZ2h0PVFfcHJval91cF93ZWlnaHQsCiAgICAgICAgS1ZfcHJval9kb3duX3dlaWdodD1LVl9wcm9qX2Rvd25fd2VpZ2h0LAogICAgICAgIEtWX3Byb2pfdXBfd2VpZ2h0PUtWX3Byb2pfdXBfd2VpZ2h0LAogICAgICAgIHdvX3dlaWdodD13b193ZWlnaHQsCiAgICApCiAgICB4ID0gdG9yY2gucmFuZG4oKGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcuZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICAKICAgICMgUHJlLWZpbGwgS1YgY2FjaGUKICAgIGt2X2NhY2hlID0gS1ZDYWNoZSgoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5tYXhfc2VxX2xlbiwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSkudG8oJ2N1ZGEnKQogICAgcHJlX2ZpbGxlZF9jYWNoZSA9IHRvcmNoLnJhbmRuKChjb25maWcuYmF0Y2hfc2l6ZSwgcHJlZmlsbCwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAga3ZfY2FjaGUocHJlX2ZpbGxlZF9jYWNoZSkKCiAgICByZXR1cm4gY29uZmlnLCB4LCBrdl9jYWNoZQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAjIEV4YW1wbGUgdXNhZ2UKICAgIGJhdGNoc2l6ZSA9IDEyOAogICAgZGltID0gNzE2OAogICAgZHEgPSAxNTM2CiAgICBwcmVmaWxsID0gNDA5NgogICAgc2VlZCA9IDk4MTcKICAgIHdpdGggdG9yY2gucHJvZmlsZXIucHJvZmlsZSgKICAgICAgICBhY3Rpdml0aWVzPVt0b3JjaC5wcm9maWxlci5Qcm9maWxlckFjdGl2aXR5LkNQVSwgdG9yY2gucHJvZmlsZXIuUHJvZmlsZXJBY3Rpdml0eS5DVURBXSwKICAgICAgICAjIHNjaGVkdWxlPXRvcmNoLnByb2ZpbGVyLnNjaGVkdWxlKHdhaXQ9MSwgd2FybXVwPTEsIGFjdGl2ZT0zKSwgICMg5o6n5Yi25YiG5p6Q5q2l6aqkCiAgICAgICAgcmVjb3JkX3NoYXBlcz1UcnVlLAogICAgICAgIHByb2ZpbGVfbWVtb3J5PVRydWUsCiAgICAgICAgd2l0aF9zdGFjaz1UcnVlLAogICAgKSBhcyBwcm9mOgogICAgICAgIGZvciBpIGluIHJhbmdlKDIpOgogICAgICAgICAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZ2VuZXJhdGVfaW5wdXQoYmF0Y2hzaXplLCBkaW0sIGRxLCBwcmVmaWxsLCBzZWVkKQogICAgICAgICAgICBjdXN0b21fa2VybmVsKChjb25maWcsIHgsIGt2X2NhY2hlKSkKICAgIHByb2YuZXhwb3J0X2Nocm9tZV90cmFjZSgibWxhX3RyYWNlLmpzb24iKQogICAgcHJpbnQocHJvZi5rZXlfYXZlcmFnZXMoKS50YWJsZShzb3J0X2J5PSJjdWRhX3RpbWVfdG90YWwiLCByb3dfbGltaXQ9NSkpNo newline at end of file
Best evidence level for this revision: reported
JSON