submission 18889
KernelBot user 376 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.
baguette_2.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-18889?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz
Benchmark evidence
18 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
145.2µs
#58 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
146.6µs
#35 of 98
2025-05-09
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
150.9µs
#17 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
150.9µs
#60 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
162.1µs
#17 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
174.3µs
#15 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
249.8µs
#12 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
718.0µs
#17 of 98
2025-05-09
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:418dce6a873bca1ee14a0ea998553e2e00e8e6afac1b55a7183a5811c1fb84c8
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
baguette_2.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnR5cGVkZWYgX19oaXBfZnA4X2U0bTNfZm51eiBmcDg7CnVzaW5nIHZlYzRmID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKI2RlZmluZSBXQVJQX1NJWkUgNjQKI2RlZmluZSBOX1dBUlBfWV9ERUYgMgojZGVmaW5lIE5fV0FSUF9YX0RFRiA0Ci8vIE91dHB1dCBUaWxlIGNvbmZpZwojZGVmaW5lIFRJTEVfU0laRV9ZX0RFRiAxMjgKI2RlZmluZSBUSUxFX1NJWkVfWF9ERUYgMTI4CiNkZWZpbmUgVElMRV9LX0RJTV9ERUYgMTI4CiNkZWZpbmUgS19TUExJVCAxCgpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9ZID0gVElMRV9TSVpFX1lfREVGOwpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9YID0gVElMRV9TSVpFX1hfREVGOwpjb25zdGV4cHIgaW50IEtfRElNID0gVElMRV9LX0RJTV9ERUY7CmNvbnN0ZXhwciBpbnQgTkJXQVJQU19ZID0gTl9XQVJQX1lfREVGOyAvLyA0CmNvbnN0ZXhwciBpbnQgTkJXQVJQU19YID0gTl9XQVJQX1hfREVGOyAvLyAyCi8vIGludHJpbnNpYyBjb25maWcKY29uc3RleHByIGludCBNQVRNVUxfRElNX0sgPSAzMjsKY29uc3RleHByIGludCBNQVRNVUxfRElNX05NID0gMTY7CmNvbnN0ZXhwciBpbnQgQkxPQ0tfRElNID0gTkJXQVJQU19YICogTkJXQVJQU19ZICogV0FSUF9TSVpFOyAvLyA1MTIKCnVzaW5nIHZlYzR1ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YodWludDMyX3QpKSkpIHVpbnQzMl90Owp1c2luZyB2ZWMydSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnNob3J0ID0KICAgIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQxNl90KSkpKSB1aW50MTZfdDsKCl9fZGV2aWNlX18gdm9pZCBtYXRtdWwxNngxNihjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICphLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYiwgaW50IGssIGludCBhX2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX2NvbCwgdmVjNGYgJmMsIGludCBtLCBpbnQgbikgewogIGludCB0aWQgPSB0aHJlYWRJZHgueCAlIFdBUlBfU0laRTsKICBpbnQgcm93ID0gayArIHRpZCAlIDggKyAodGlkIC8gMTYpICogODsKICBpbnQgY29sID0gKCh0aWQgJSAxNikgLyA4KTsKICBpbnQgYV9jb2xfcyA9IChhX2NvbCAvIDggKyBjb2wpOwogIGludCBiX2NvbF9zID0gKGJfY29sIC8gOCArIGNvbCk7CiAgaW50IGNvbF9hX3N3aXp6bGVkID0gKChhX2NvbF9zIC8gMikgXiAocm93ICUgOCkpICogMiArIGFfY29sX3MgJSAyOwogIGludCBjb2xfYl9zd2l6emxlZCA9ICgoYl9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBiX2NvbF9zICUgMjsKCiAgYXV0byBwYWNrZWRBID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPihhICsgcm93ICogbSlbY29sX2Ffc3dpenpsZWRdOwogIGF1dG8gcGFja2VkQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYiArIHJvdyAqIG0pW2NvbF9iX3N3aXp6bGVkXTsKCiAgYyA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOChwYWNrZWRBLCBwYWNrZWRCLCBjLCAwLCAwLCAwKTsKfQoKdGVtcGxhdGU8Ym9vbCBib3VuZENoZWNrPgpfX2RldmljZV9fIHZvaWQgbG9hZExEUyhpbnQgd2FycElkLCBpbnQgbGFuZUlkLCBpbnQga0lkLCBmcDggKnNfYSwgZnA4ICpzX2IsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZwOCAqYSwgY29uc3QgZnA4ICpiLCBpbnQgTSwgaW50IE4pIHsKICAKICBjb25zdCBmcDggKnB0ciA9IGE7CiAgZnA4ICpkc3QgPSBzX2E7CiAgaW50IHdhcnBJZExvY2FsID0gd2FycElkJTQ7CiAgaW50IHN0cmlkZSA9IE07CiAgCiAgdWludDMyX3QgY29sX29mZnNldCA9IFRJTEVfU0laRV9YICogYmxvY2tJZHgueDsKICBpZiAod2FycElkPj00KXsKICAgIHB0cj1iOwogICAgY29sX29mZnNldCA9IFRJTEVfU0laRV9ZICogYmxvY2tJZHgueTsKICAgIGRzdD1zX2I7CiAgICBzdHJpZGU9IE47CiAgfQogIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgIGJfY2hlY2sgPSBjb2xfb2Zmc2V0IDwgc3RyaWRlOwogIH0KICAKICAgIGNvbnN0ZXhwciBpbnQgRElNWSA9IFRJTEVfU0laRV9ZIC8gODsKICAgIHZlYzJ1IGJfdmFsdWVbOF0gPSB7MH07CiAgICBpZiAoYl9jaGVjayl7CiAgICB1aW50MzJfdCByb3dfb2Zmc2V0ID0ga0lkOwogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIERJTVk7CiAgICAgIGludCByb3cgPSByICsgMzIgKiB3YXJwSWRMb2NhbCArIDggKiAobGFuZUlkIC8gRElNWSk7CiAgICAgIAogIAogICAgICAgIGJfdmFsdWVbcl0gPSAocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2ZWMydSAqPihwdHIgKyAocm93X29mZnNldCArIHJvdykgKiBzdHJpZGUgKyAoY29sX29mZnNldCArIGNvbCAqIDgpKSlbMF07CiAgICB9CiAgfQogICAgdmVjMnUgcmVzdWx0X2JbOF07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyArK2opIHsKICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJnJlc3VsdF9iW2ldKVtqXSA9CiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigmYl92YWx1ZVtqXSlbaV07CiAgICAgIH0KCiAgICBmb3IgKGludCByID0gMDsgciA8IDg7IHIrKykgewoKICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIERJTVk7CiAgICAgIGludCByb3cgPSByICsgMzIgKiB3YXJwSWRMb2NhbCArIDggKiAobGFuZUlkIC8gRElNWSk7CiAgICAgIGludCBjb2xfc3dpenpsZWQgPSAyICogKChjb2wgLyAyKSBeIChyb3cgJSA4KSkgKyBjb2wgJSAyOwoKICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8dmVjMnUgKj4oZHN0KSlbKERJTVkpKnJvdyArIGNvbF9zd2l6emxlZF0gPSByZXN1bHRfYltyXTsKICAgIH0KICAKfQoKX19kZXZpY2VfXyBmbG9hdCBtb3ZlX2RwcChmbG9hdCB2LCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgewogIGZsb2F0IHJlc3VsdDsKICBhc20gdm9sYXRpbGUoInZfbW92X2IzMiAlMCwgJTEgcXVhZF9wZXJtOlslMiwlMywlNCwlNV0iCiAgICAgICAgICAgICAgIDogIj12IihyZXN1bHQpIC8vICUwOiBvdXRwdXQgcmVnaXN0ZXIKICAgICAgICAgICAgICAgOiAidiIodiksICJpIihhKSwgImkiKGIpLCAiaSIoYyksICJpIihkKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKdGVtcGxhdGUgPGJvb2wgYm91bmRDaGVjaz4KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKE5fV0FSUF9YX0RFRiAqTl9XQVJQX1lfREVGICpXQVJQX1NJWkUpCiAgICBjdXN0b21fa2VybmVsKGNvbnN0IGZwOCAqYSwgY29uc3QgZnA4ICpiLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicywKICAgICAgICAgICAgICAgICAgX19oaXBfYmZsb2F0MTYgKmMsIGludCBNLCBpbnQgTiwgaW50IEspIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CiAgaW50IGxhbmVJZCA9IHRpZCAlIFdBUlBfU0laRTsKCiAgaW50IHNwbGl0SyA9IEsgLyBLX1NQTElUOwogIGludCBrSWRTdGFydCA9IGJsb2NrSWR4LnogKiBzcGxpdEs7CiAgaW50IGtJZFN0b3AgPSBzcGxpdEsgKyBibG9ja0lkeC56ICogc3BsaXRLOwoKICBpbnQgU04gPSAoTiArIDEyOCAtIDEpIC8gMTI4OwoKICBpbnQgd2FycElkID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7CiAgaW50IHdhcnBJZHggPSB3YXJwSWQgLyBOQldBUlBTX1k7IAogIGludCB3YXJwSWR5ID0gd2FycElkICUgTkJXQVJQU19ZOwoKICBfX3NoYXJlZF9fIGZwOCBzX2FbS19ESU1dW1RJTEVfU0laRV9YXTsKICBfX3NoYXJlZF9fIGZwOCBzX2JbS19ESU1dW1RJTEVfU0laRV9ZXTsKCiAgY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9ZID0gVElMRV9TSVpFX1kgLyBOQldBUlBTX1kgLyBNQVRNVUxfRElNX05NOyAvLyAyCiAgY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9YID0gVElMRV9TSVpFX1ggLyBOQldBUlBTX1ggLyBNQVRNVUxfRElNX05NOyAvLyA0CiAgdmVjNGYgY19zW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwoKICBmb3IgKGludCBrSWQgPSBrSWRTdGFydDsga0lkIDwga0lkU3RvcDsga0lkICs9IEtfRElNKSB7CgogICAgbG9hZExEUzxib3VuZENoZWNrPih3YXJwSWQsIGxhbmVJZCwga0lkLCAmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBhLCBiLCBNLCBOKTsKICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICB2ZWM0ZiBjX3RtcFtXQVJQX1RJTEVfU0laRV9YXVtXQVJQX1RJTEVfU0laRV9ZXSA9IHswfTsKI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CiAgICAgIGZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CiAgICAgICAgY29uc3RleHByIGludCBzdGVwWCA9IFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWDsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBZID0gVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZOwoKICAgICAgICB2ZWM0ZiBjX3RtcCA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjBmfTsKI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IEtfRElNO2sgKz0gTUFUTVVMX0RJTV9LKSAvLyBNQVRNVUxfRElNX0sgbXVzdCBiZSBhIG11bHRpcGxlIG9mIEtfRElNCiAgICAgICAgewogICAgICAgICAgaW50IGFfY29sID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgICAgaW50IGJfY29sID0gKHRfd0lkeSAqIHN0ZXBZKSArIHdhcnBJZHkgKiBNQVRNVUxfRElNX05NOwogICAgICAgICAgbWF0bXVsMTZ4MTYoJnNfYVswXVswXSwgJnNfYlswXVswXSwgaywgYV9jb2wsIGJfY29sLCBjX3RtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElMRV9TSVpFX1gsIFRJTEVfU0laRV9ZKTsKICAgICAgICB9CgogICAgICAgIGludCBhX3JvdyA9ICh0X3dJZHggKiBzdGVwWCkgKyB3YXJwSWR4ICogTUFUTVVMX0RJTV9OTTsKICAgICAgICAvLyBBcHBseSBzY2FsaW5nCiAgICAgICAgaW50IGFzX2NvbCA9IGtJZCAvIDEyODsKICAgICAgICBpbnQgYXNfcm93ID0gYV9yb3cgKyBibG9ja0lkeC54ICogVElMRV9TSVpFX1g7CiAgICAgICAgaW50IGJzX2NvbCA9IGJsb2NrSWR4Lnk7CiAgICAgICAgaW50IGJzX3JvdyA9IGtJZCAvIDEyODsKICAgICAgICBmbG9hdCBic192YWwgPSBic1tic19yb3cgKiBTTiArIGJzX2NvbF07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgIGludCByb3cgPSBhc19yb3cgKyBpICsgKGxhbmVJZCAvIDE2KSAqIDQ7CiAgICAgICAgICBmbG9hdCBhc192YWwgPSBhc1thc19jb2wgKiBNICsgcm93XTsKICAgICAgICAgIGNfc1t0X3dJZHhdW3Rfd0lkeV1baV0gKz0gY190bXBbaV0gKiBhc192YWwgKiBic192YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgX19zeW5jdGhyZWFkcygpOwogIH0KICAKCiAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgIGZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CiAgICAgIC8vIG9mZnNldCBwb2ludGluZyB0byB0aGUgYWNjdW11bGF0ZWQgMTZ4MTYgYmxvY2sKICAgICAgaW50IGNvbF9vZmZzZXQgPQogICAgICAgICAgYmxvY2tJZHgueSAqIFRJTEVfU0laRV9ZICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0CiAgICAgICAgICAod2FycElkeSAqIE1BVE1VTF9ESU1fTk0pICsgICAgICAgICAgICAgICAgLy8gV2FycCBvZmZzZXQKICAgICAgICAgIHRfd0lkeSAqIChUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1kpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgogICAgICBpbnQgcm93X29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC54ICogVElMRV9TSVpFX1ggKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR4ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR4ICogKFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWCk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGF1dG8gcmVzID0gY19zW3Rfd0lkeF1bdF93SWR5XTsKCiAgICAgIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgICAgIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICAgICAgYl9jaGVjayA9IChyb3dfb2Zmc2V0KSA8IE0gJiYgKGNvbF9vZmZzZXQpIDwgTjsKICAgICAgfQogICAgICBpZiAoYl9jaGVjaykgewogICAgICAgICAgLy8gQyBpcyBzdG9yZWQgb24gNCBWR1BScwogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIDE2OwogICAgICAgICAgICAgIGludCByb3cgPSBpICsgKGxhbmVJZCAvIDE2KSAqIDQ7CiAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgIH0KICAgICAgICAKICAgICAgfQogICAgfQogIH0KfQoKCnN0cnVjdCBMYXVuY2hDb25maWcgewogIGJvb2wgYm91bmRDaGVjazsKfTsKCgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgS19TUExJVCk7CgogIGlmIChjb25maWcuYm91bmRDaGVjaykgewogICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPHRydWU+KSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLCBNLCBOLCBLKTsKICB9IGVsc2UgewogICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPGZhbHNlPiksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwKICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwogIH0KfQoKCnZvaWQgbGF1bmNoX2tlcm5lbChjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsIGNvbnN0IGZsb2F0ICpkX0FzLAogICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsIGludCBNLCBpbnQgTiwKICAgICAgICAgICAgICAgICAgIGludCBLKSB7CiAgTGF1bmNoQ29uZmlnIGNvbmZpZzsKICAgIAogIGlmIChNICUgMTI4ID09MCAmJiBOICUxMjggPT0wKQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSBmYWxzZTsKICBlbHNlCiAgICBjb25maWcuYm91bmRDaGVjayA9IHRydWU7CiAgCiAgbGF1bmNoX2tlcm5lbChjb25maWcsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwp9CgoKCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgTSwKICAgIGludCBOLAogICAgaW50IEsKKSB7CiAgICBjb25zdCBhdXRvKiBkX0EgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGFfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogZF9BcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogZF9CcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihic19wdHIpOwogICAgYXV0byogZF9DID0gcmVpbnRlcnByZXRfY2FzdDxfX2hpcF9iZmxvYXQxNio+KGNfcHRyKTsKCiAgICBkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUYgKiBOX1dBUlBfWV9ERUYgKiBXQVJQX1NJWkUpOwogICAgZGltMyBibG9ja3NQZXJHcmlkKChNICsgVElMRV9TSVpFX1hfREVGIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUYsCiAgICAgICAgICAgICAgICAgICAgIChOICsgVElMRV9TSVpFX1lfREVGIC0gMSkgLyBUSUxFX1NJWkVfWV9ERUYpOwogICAgCiAgICBpZiAoTSUxMjg9PTAgJiYgTiUxMjg9PTApewogICAgICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoY3VzdG9tX2tlcm5lbDxmYWxzZT4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwogICAgfWVsc2V7CiAgICAgICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPHRydWU+KSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLCBNLCBOLCBLKTt9CgogICAgSElQX0NIRUNLKGhpcEdldExhc3RFcnJvcigpKTsKfQoKUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewogIG0uZGVmKCJmcDgiLCAmcnVuLCAiSElQIGtlcm5lbCIpOwp9CiIiIgoKaGlwX21vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4IiwKICAgIGNwcF9zb3VyY2VzPSIiLAogICAgY3VkYV9zb3VyY2VzPWtlcm5lbF9jcHAucmVwbGFjZSgnQCcsIGNocig5MikpLAogICAgd2l0aF9jdWRhPVRydWUsCiAgICB2ZXJib3NlPUZhbHNlLAogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItZyAtLXNhdmUtdGVtcHMgLVJwYXNzLWFuYWx5c2lzPWtlcm5lbC1yZXNvdXJjZS11c2FnZSAtc3RkPWMrKzIwIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmZpcnN0ID0gVHJ1ZQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBibG9jay1zY2FsZSBmcDggZ2VtbQogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSB0aGF0IGV4cGFuZHMgdG86CiAgICAgICAgICAgIGE6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFttLCBrXSwKICAgICAgICAgICAgYjogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW24sIGtdLAogICAgICAgICAgICBhX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW20sIGsgLy8gMTI4XSwKICAgICAgICAgICAgYl9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFtuIC8vIDEyOCwgayAvLyAxMjhdLAogICAgICAgICAgICBjOiB0b3JjaC5UZW5zb3JbYmZsb2F0MTZdIG9mIHNoYXBlIFttLCBuXQogICAgUmV0dXJuczoKICAgICAgICBUZW5zb3IgY29udGFpbmluZyBvdXRwdXQgaW4gYmYxNgogICAgIiIiCgogICAgZ2xvYmFsIGZpcnN0CiAgICBpZiBmaXJzdDoKICAgICAgICBwcmludCgiZXhlY3V0aW5nIG9uIiwgdG9yY2guY3VkYS5nZXRfZGV2aWNlX25hbWUoKSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIGZpcnN0ID0gRmFsc2UKCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQoKICAgIG0sIG4gPSBjLnNoYXBlCiAgICBrID0gYS5zaGFwZVsxXQoKICAgIGhpcF9tb2R1bGUuZnA4KAogICAgICAgIGEuZGF0YV9wdHIoKSwKICAgICAgICBiLmRhdGFfcHRyKCksCiAgICAgICAgYV9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGJfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBjLmRhdGFfcHRyKCksCiAgICAgICAgbSwKICAgICAgICBuLAogICAgICAgIGssCiAgICApCgogICAgcmV0dXJuIGMKSource 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 18667.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnR5cGVkZWYgX19oaXBfZnA4X2U0bTNfZm51eiBmcDg7CnVzaW5nIHZlYzRmID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKI2RlZmluZSBXQVJQX1NJWkUgNjQKI2RlZmluZSBOX1dBUlBfWV9ERUYgNAojZGVmaW5lIE5fV0FSUF9YX0RFRiA0Ci8vIE91dHB1dCBUaWxlIGNvbmZpZwojZGVmaW5lIFRJTEVfU0laRV9ZX0RFRiAxMjgKI2RlZmluZSBUSUxFX1NJWkVfWF9ERUYgMTI4CiNkZWZpbmUgVElMRV9LX0RJTV9ERUYgMTI4CgpfX2RldmljZV9fIHZvaWQgbWF0bXVsMTZ4MTZUZXN0KGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGYgJmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbSwgaW50IG4pCnsKICAgIGludCB0aWQgPSB0aHJlYWRJZHgueCAlIFdBUlBfU0laRTsKICAgIGF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYSArICh0aWQgJSAxNikgKiAobSApICsgKHRpZCAvIDE2KSAqIDgpWzBdOwogICAgYXV0byBwYWNrZWRCID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPihiICsgKHRpZCAlIDE2KSAqIChuICkgKyAodGlkIC8gMTYpICogOClbMF07CiAgICBjID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KHBhY2tlZEEsIHBhY2tlZEIsIGMsIDAsIDAsIDApOwp9CgoKdGVtcGxhdGU8Ym9vbCBib3VuZENoZWNrPgpfX2dsb2JhbF9fIHZvaWQgX19sYXVuY2hfYm91bmRzX18oTl9XQVJQX1hfREVGICpOX1dBUlBfWV9ERUYgKldBUlBfU0laRSkgY3VzdG9tX2tlcm5lbChjb25zdCBmcDggKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZwOCAqYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmFzLCBjb25zdCBmbG9hdCAqYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpjLCBpbnQgTSwgaW50IE4sIGludCBLKQp7CiAgICBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CiAgICBpbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwogICAgZmxvYXQgcmVzdWx0ID0gMDsKCiAgICBjb25zdGV4cHIgaW50IFRJTEVfU0laRV9ZID0gVElMRV9TSVpFX1lfREVGOwogICAgY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRjsKICAgIGNvbnN0ZXhwciBpbnQgS19ESU0gPSBUSUxFX0tfRElNX0RFRjsKICAgIGNvbnN0ZXhwciBpbnQgTkJXQVJQU19ZID0gTl9XQVJQX1lfREVGOyAvLyA0CiAgICBjb25zdGV4cHIgaW50IE5CV0FSUFNfWCA9IE5fV0FSUF9YX0RFRjsgLy8gMgogICAgLy8gaW50cmluc2ljIGNvbmZpZwogICAgY29uc3RleHByIGludCBNQVRNVUxfRElNX0sgPSAzMjsKICAgIGNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2OwogICAgY29uc3RleHByIGludCBCTE9DS19ESU0gPSBOQldBUlBTX1ggKiBOQldBUlBTX1kgKiBXQVJQX1NJWkU7IC8vIDUxMgoKICAgIGludCBTTiA9IChOICsgMTI4IC0gMSkgLyAxMjg7CgogICAgaW50IHdhcnBJZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwogICAgaW50IHdhcnBJZHggPSB3YXJwSWQgLyBOQldBUlBTX1k7IC8vIDAgLSA+IDMKICAgIGludCB3YXJwSWR5ID0gd2FycElkICUgTkJXQVJQU19ZOwoKICAgIGNvbnN0ZXhwciBpbnQgS19ESU1fUEFEID0gS19ESU0gKyA4OwoKICAgIF9fc2hhcmVkX18gZnA4IHNfYVtUSUxFX1NJWkVfWF1bS19ESU1fUEFEXTsKICAgIF9fc2hhcmVkX18gZnA4IHNfYltUSUxFX1NJWkVfWV1bS19ESU1fUEFEXTsKICAgIC8vX19zaGFyZWRfXyBmcDggc19iW0tfRElNXVtUSUxFX1NJWkVfWSs4XTsKICAgIAogICAgY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9ZID0gVElMRV9TSVpFX1kgLyBOQldBUlBTX1kgLyBNQVRNVUxfRElNX05NOyAvLyAyCiAgICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKICAgIHZlYzRmIGNfc1tXQVJQX1RJTEVfU0laRV9YXVtXQVJQX1RJTEVfU0laRV9ZXSA9IHswfTsKCiAgIC8vICNwcmFnbWEgdW5yb2xsIDEKICAgIGZvciAoaW50IGtJZCA9IDA7IGtJZCA8IEs7IGtJZCArPSBLX0RJTSkKICAgIHsKICAgICAgICBhdXRvIHN0YXJ0ID0gIHdhbGxfY2xvY2s2NCgpOwogICAgICAgIC8vIG5iIHJvd3MgcmVhZCBwZXIgYmxvY2sKICAgICAgICBpbnQgbmJSb3dzWSA9IEJMT0NLX0RJTSAvIFRJTEVfU0laRV9ZOyAvLyA0CiAgICAgICAgLy8gQgogICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgS19ESU07IHIgKz0gbmJSb3dzWSkgLy8xNiBsb2FkcwogICAgICAgIHsKICAgICAgICB1aW50MzJfdCByb3dfb2Zmc2V0ID0ga0lkOwogICAgICAgICAgICB1aW50MzJfdCBjb2xfb2Zmc2V0ID0gVElMRV9TSVpFX1kgKiBibG9ja0lkeC55OwoKICAgICAgICAgICAgdWludDMyX3Qgcm93ID0gciArICh0aWQgLyBUSUxFX1NJWkVfWSk7CiAgICAgICAgICAgIHVpbnQzMl90IGNvbCA9ICh0aWQgJSBUSUxFX1NJWkVfWSk7CgogICAgICAgICAgICB1aW50MzJfdCBpbmRleCA9IChyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCk7CiAgICAgICAgICAgIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgICAgICAgICAgIGlmIGNvbnN0ZXhwcihib3VuZENoZWNrKXsKICAgICAgICAgICAgICBiX2NoZWNrID0gKGNvbCA8IE4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiX2NoZWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3NfYltyb3ddW2NvbF0gPSBiW2luZGV4XTsKICAgICAgICAgICAgICAgIHNfYltjb2xdW3Jvd10gPSBiW2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbnQgbmJSb3dzWCA9IEJMT0NLX0RJTSAvIFRJTEVfU0laRV9YOyAvLyA0CiAgICAgICAgLy8gQQogICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgS19ESU07IHIgKz0gbmJSb3dzWCkKICAgICAgICB7CiAgICAgICAgICAgIHVpbnQzMl90IHJvd19vZmZzZXQgPSBrSWQ7CiAgICAgICAgICAgIHVpbnQzMl90IGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWCAqIGJsb2NrSWR4Lng7IC8vIGNvbHVtbiBtYWpvcgoKICAgICAgICAgICAgdWludDMyX3Qgcm93ID0gciArICh0aWQgLyBUSUxFX1NJWkVfWCk7CiAgICAgICAgICAgIHVpbnQzMl90IGNvbCA9ICh0aWQgJSBUSUxFX1NJWkVfWCk7CgogICAgICAgICAgICB1aW50MzJfdCBpbmRleCA9IChyb3dfb2Zmc2V0ICsgcm93KSAqIE0gKyAoY29sX29mZnNldCArIGNvbCk7CiAgICAgICAgICAgIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgICAgICAgICAgIGlmIGNvbnN0ZXhwcihib3VuZENoZWNrKXsKICAgICAgICAgICAgICBiX2NoZWNrID0gKGNvbCA8IE0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiX2NoZWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3NfYVtyb3ddW2NvbF0gPSBhW2luZGV4XTsKICAgICAgICAgICAgICAgIHNfYVtjb2xdW3Jvd10gPSBhW2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgCiAgICAgICAgX19zeW5jdGhyZWFkcygpOwoKICAgICAgIAogICAgICAgIHZlYzRmIGNfdG1wW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwogICAgICAgICNwcmFnbWEgdW5yb2xsCgogICAgICAgIGZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFggPSBUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1g7CiAgICAgICAgICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBZID0gVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZOyAvLzEyOC8yPTY0CgogICAgICAgICAgICAgICAgdmVjNGYgY190bXAgPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CgogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBLX0RJTTsgays9TUFUTVVMX0RJTV9LKSAvLyBNQVRNVUxfRElNX0sgbXVzdCBiZSBhIG11bHRpcGxlIG9mIEtfRElNCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW50IGFfY29sID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgICAgICAgICAgICAgIGludCBiX2NvbCA9ICh0X3dJZHkgKiBzdGVwWSkgKyB3YXJwSWR5ICogTUFUTVVMX0RJTV9OTTsKICAgICAgICAgICAgICAgICAgICBtYXRtdWwxNngxNlRlc3QoJnNfYVthX2NvbF1ba10sICZzX2JbYl9jb2xdW2tdLCBjX3RtcCwgS19ESU1fUEFELCBLX0RJTV9QQUQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGludCBhX3JvdyA9ICh0X3dJZHggKiBzdGVwWCkgKyB3YXJwSWR4ICogTUFUTVVMX0RJTV9OTTsgCiAgICAgICAgICAgICAgICAvLyBBcHBseSBzY2FsaW5nCiAgICAgICAgICAgICAgICBpbnQgYXNfY29sID0ga0lkIC8gMTI4OwogICAgICAgICAgICAgICAgaW50IGFzX3JvdyA9IGFfcm93ICsgYmxvY2tJZHgueCAqIFRJTEVfU0laRV9YOwogICAgICAgICAgICAgICAgaW50IGJzX2NvbCA9IGJsb2NrSWR4Lnk7CiAgICAgICAgICAgICAgICBpbnQgYnNfcm93ID0ga0lkIC8gMTI4OwogICAgICAgICAgICAgICAgZmxvYXQgYnNfdmFsID0gYnNbYnNfcm93ICogU04gKyBic19jb2xdOyAvLyByb3cgbWFqb3Igc2FtZSBhcyBCdCA/CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgcm93ID0gYXNfcm93ICsgaSArIChsYW5lSWQgLyAxNikgKiA0OwogICAgICAgICAgICAgICAgICAgIGZsb2F0IGFzX3ZhbCA9IGFzW2FzX2NvbCAqIE0gKyByb3ddOwogICAgICAgICAgICAgICAgICAgIGNfc1t0X3dJZHhdW3Rfd0lkeV1baV0gKz0gY190bXBbaV0gKiBhc192YWwgKiBic192YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgCiAgICAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgICAgCiAgICB9CiAgICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykKICAgIHsKICAgICAgICBmb3IgKGludCB0X3dJZHkgPSAwOyB0X3dJZHkgPCBXQVJQX1RJTEVfU0laRV9ZOyB0X3dJZHkrKykKICAgICAgICB7CiAgICAgICAgICAgIC8vIG9mZnNldCBwb2ludGluZyB0byB0aGUgYWNjdW11bGF0ZWQgMTZ4MTYgYmxvY2sKICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQgPSBibG9ja0lkeC55ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FycElkeSAqIE1BVE1VTF9ESU1fTk0pICsgICAgICAgICAgICAgICAgLy8gV2FycCBvZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3dJZHkgKiAoVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZKTsgICAvLyBXYXJwIHRpbGUgb2Zmc2V0CgogICAgICAgICAgICBpbnQgcm93X29mZnNldCA9IGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWCArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXJwSWR4ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfd0lkeCAqIChUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1gpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgogICAgICAgICAgICBhdXRvIHJlcyA9IGNfc1t0X3dJZHhdW3Rfd0lkeV07CiAgICAgICAgICAgIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICAgICAgICAgICAgYl9jaGVjayA9IChyb3dfb2Zmc2V0KSA8IE0gJiYgKGNvbF9vZmZzZXQpIDwgTjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYl9jaGVjayl7CiAgICAgICAgICAgICAgLy8gQyBpcyBzdG9yZWQgb24gNCBWR1BScwogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIDE2OwogICAgICAgICAgICAgICAgICBpbnQgcm93ID0gaSArIChsYW5lSWQgLyAxNikgKiA0OwogICAgICAgICAgICAgICAgICAvL2lmICgocm93X29mZnNldCArIHJvdykgPCBNICYmIChjb2xfb2Zmc2V0ICsgY29sKSA8IE4pCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIGNbKHJvd19vZmZzZXQgKyByb3cpICogTiArIChjb2xfb2Zmc2V0ICsgY29sKV0gPSAoX19oaXBfYmZsb2F0MTYpKHJlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAvL2NbKHJvd19vZmZzZXQgKyByb3cpICogTiArIChjb2xfb2Zmc2V0ICsgY29sKV0gPSAoX19oaXBfYmZsb2F0MTYpKDY0KnRfd0lkeSsxNip3YXJwSWR5KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgTSwKICAgIGludCBOLAogICAgaW50IEsKKSB7CiAgICBjb25zdCBhdXRvKiBkX0EgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGFfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogZF9BcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogZF9CcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihic19wdHIpOwogICAgYXV0byogZF9DID0gcmVpbnRlcnByZXRfY2FzdDxfX2hpcF9iZmxvYXQxNio+KGNfcHRyKTsKCiAgICBkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUYgKiBOX1dBUlBfWV9ERUYgKiBXQVJQX1NJWkUpOwogICAgZGltMyBibG9ja3NQZXJHcmlkKChNICsgVElMRV9TSVpFX1hfREVGIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUYsCiAgICAgICAgICAgICAgICAgICAgIChOICsgVElMRV9TSVpFX1lfREVGIC0gMSkgLyBUSUxFX1NJWkVfWV9ERUYpOwogICAgCiAgICBpZiAoTSUxMjg9PTAgJiYgTiUxMjg9PTApewogICAgICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoY3VzdG9tX2tlcm5lbDxmYWxzZT4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwogICAgfWVsc2V7CiAgICAgICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPHRydWU+KSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLCBNLCBOLCBLKTt9CgogICAgSElQX0NIRUNLKGhpcEdldExhc3RFcnJvcigpKTsKfQoKUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewogIG0uZGVmKCJmcDgiLCAmcnVuLCAiSElQIGtlcm5lbCIpOwp9CiIiIgoKaGlwX21vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4IiwKICAgIGNwcF9zb3VyY2VzPSIiLAogICAgY3VkYV9zb3VyY2VzPWtlcm5lbF9jcHAucmVwbGFjZSgnQCcsIGNocig5MikpLAogICAgd2l0aF9jdWRhPVRydWUsCiAgICB2ZXJib3NlPUZhbHNlLAogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItZyAtLXNhdmUtdGVtcHMgLVJwYXNzLWFuYWx5c2lzPWtlcm5lbC1yZXNvdXJjZS11c2FnZSAtc3RkPWMrKzIwIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmZpcnN0ID0gVHJ1ZQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBibG9jay1zY2FsZSBmcDggZ2VtbQogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSB0aGF0IGV4cGFuZHMgdG86CiAgICAgICAgICAgIGE6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFttLCBrXSwKICAgICAgICAgICAgYjogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW24sIGtdLAogICAgICAgICAgICBhX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW20sIGsgLy8gMTI4XSwKICAgICAgICAgICAgYl9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFtuIC8vIDEyOCwgayAvLyAxMjhdLAogICAgICAgICAgICBjOiB0b3JjaC5UZW5zb3JbYmZsb2F0MTZdIG9mIHNoYXBlIFttLCBuXQogICAgUmV0dXJuczoKICAgICAgICBUZW5zb3IgY29udGFpbmluZyBvdXRwdXQgaW4gYmYxNgogICAgIiIiCgogICAgZ2xvYmFsIGZpcnN0CiAgICBpZiBmaXJzdDoKICAgICAgICBwcmludCgiZXhlY3V0aW5nIG9uIiwgdG9yY2guY3VkYS5nZXRfZGV2aWNlX25hbWUoKSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIGZpcnN0ID0gRmFsc2UKCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQoKICAgIG0sIG4gPSBjLnNoYXBlCiAgICBrID0gYS5zaGFwZVsxXQoKICAgIGhpcF9tb2R1bGUuZnA4KAogICAgICAgIGEuZGF0YV9wdHIoKSwKICAgICAgICBiLmRhdGFfcHRyKCksCiAgICAgICAgYV9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGJfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBjLmRhdGFfcHRyKCksCiAgICAgICAgbSwKICAgICAgICBuLAogICAgICAgIGssCiAgICApCgogICAgcmV0dXJuIGMKNo newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnR5cGVkZWYgX19oaXBfZnA4X2U0bTNfZm51eiBmcDg7CnVzaW5nIHZlYzRmID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKI2RlZmluZSBXQVJQX1NJWkUgNjQKI2RlZmluZSBOX1dBUlBfWV9ERUYgMgojZGVmaW5lIE5fV0FSUF9YX0RFRiA0Ci8vIE91dHB1dCBUaWxlIGNvbmZpZwojZGVmaW5lIFRJTEVfU0laRV9ZX0RFRiAxMjgKI2RlZmluZSBUSUxFX1NJWkVfWF9ERUYgMTI4CiNkZWZpbmUgVElMRV9LX0RJTV9ERUYgMTI4CiNkZWZpbmUgS19TUExJVCAxCgpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9ZID0gVElMRV9TSVpFX1lfREVGOwpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9YID0gVElMRV9TSVpFX1hfREVGOwpjb25zdGV4cHIgaW50IEtfRElNID0gVElMRV9LX0RJTV9ERUY7CmNvbnN0ZXhwciBpbnQgTkJXQVJQU19ZID0gTl9XQVJQX1lfREVGOyAvLyA0CmNvbnN0ZXhwciBpbnQgTkJXQVJQU19YID0gTl9XQVJQX1hfREVGOyAvLyAyCi8vIGludHJpbnNpYyBjb25maWcKY29uc3RleHByIGludCBNQVRNVUxfRElNX0sgPSAzMjsKY29uc3RleHByIGludCBNQVRNVUxfRElNX05NID0gMTY7CmNvbnN0ZXhwciBpbnQgQkxPQ0tfRElNID0gTkJXQVJQU19YICogTkJXQVJQU19ZICogV0FSUF9TSVpFOyAvLyA1MTIKCnVzaW5nIHZlYzR1ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YodWludDMyX3QpKSkpIHVpbnQzMl90Owp1c2luZyB2ZWMydSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnNob3J0ID0KICAgIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQxNl90KSkpKSB1aW50MTZfdDsKCl9fZGV2aWNlX18gdm9pZCBtYXRtdWwxNngxNihjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICphLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYiwgaW50IGssIGludCBhX2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX2NvbCwgdmVjNGYgJmMsIGludCBtLCBpbnQgbikgewogIGludCB0aWQgPSB0aHJlYWRJZHgueCAlIFdBUlBfU0laRTsKICBpbnQgcm93ID0gayArIHRpZCAlIDggKyAodGlkIC8gMTYpICogODsKICBpbnQgY29sID0gKCh0aWQgJSAxNikgLyA4KTsKICBpbnQgYV9jb2xfcyA9IChhX2NvbCAvIDggKyBjb2wpOwogIGludCBiX2NvbF9zID0gKGJfY29sIC8gOCArIGNvbCk7CiAgaW50IGNvbF9hX3N3aXp6bGVkID0gKChhX2NvbF9zIC8gMikgXiAocm93ICUgOCkpICogMiArIGFfY29sX3MgJSAyOwogIGludCBjb2xfYl9zd2l6emxlZCA9ICgoYl9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBiX2NvbF9zICUgMjsKCiAgYXV0byBwYWNrZWRBID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPihhICsgcm93ICogbSlbY29sX2Ffc3dpenpsZWRdOwogIGF1dG8gcGFja2VkQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYiArIHJvdyAqIG0pW2NvbF9iX3N3aXp6bGVkXTsKCiAgYyA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOChwYWNrZWRBLCBwYWNrZWRCLCBjLCAwLCAwLCAwKTsKfQoKdGVtcGxhdGU8Ym9vbCBib3VuZENoZWNrPgpfX2RldmljZV9fIHZvaWQgbG9hZExEUyhpbnQgd2FycElkLCBpbnQgbGFuZUlkLCBpbnQga0lkLCBmcDggKnNfYSwgZnA4ICpzX2IsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZwOCAqYSwgY29uc3QgZnA4ICpiLCBpbnQgTSwgaW50IE4pIHsKICAKICBjb25zdCBmcDggKnB0ciA9IGE7CiAgZnA4ICpkc3QgPSBzX2E7CiAgaW50IHdhcnBJZExvY2FsID0gd2FycElkJTQ7CiAgaW50IHN0cmlkZSA9IE07CiAgCiAgdWludDMyX3QgY29sX29mZnNldCA9IFRJTEVfU0laRV9YICogYmxvY2tJZHgueDsKICBpZiAod2FycElkPj00KXsKICAgIHB0cj1iOwogICAgY29sX29mZnNldCA9IFRJTEVfU0laRV9ZICogYmxvY2tJZHgueTsKICAgIGRzdD1zX2I7CiAgICBzdHJpZGU9IE47CiAgfQogIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgIGJfY2hlY2sgPSBjb2xfb2Zmc2V0IDwgc3RyaWRlOwogIH0KICAKICAgIGNvbnN0ZXhwciBpbnQgRElNWSA9IFRJTEVfU0laRV9ZIC8gODsKICAgIHZlYzJ1IGJfdmFsdWVbOF0gPSB7MH07CiAgICBpZiAoYl9jaGVjayl7CiAgICB1aW50MzJfdCByb3dfb2Zmc2V0ID0ga0lkOwogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIERJTVk7CiAgICAgIGludCByb3cgPSByICsgMzIgKiB3YXJwSWRMb2NhbCArIDggKiAobGFuZUlkIC8gRElNWSk7CiAgICAgIAogIAogICAgICAgIGJfdmFsdWVbcl0gPSAocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2ZWMydSAqPihwdHIgKyAocm93X29mZnNldCArIHJvdykgKiBzdHJpZGUgKyAoY29sX29mZnNldCArIGNvbCAqIDgpKSlbMF07CiAgICB9CiAgfQogICAgdmVjMnUgcmVzdWx0X2JbOF07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyArK2opIHsKICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJnJlc3VsdF9iW2ldKVtqXSA9CiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigmYl92YWx1ZVtqXSlbaV07CiAgICAgIH0KCiAgICBmb3IgKGludCByID0gMDsgciA8IDg7IHIrKykgewoKICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIERJTVk7CiAgICAgIGludCByb3cgPSByICsgMzIgKiB3YXJwSWRMb2NhbCArIDggKiAobGFuZUlkIC8gRElNWSk7CiAgICAgIGludCBjb2xfc3dpenpsZWQgPSAyICogKChjb2wgLyAyKSBeIChyb3cgJSA4KSkgKyBjb2wgJSAyOwoKICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8dmVjMnUgKj4oZHN0KSlbKERJTVkpKnJvdyArIGNvbF9zd2l6emxlZF0gPSByZXN1bHRfYltyXTsKICAgIH0KICAKfQoKX19kZXZpY2VfXyBmbG9hdCBtb3ZlX2RwcChmbG9hdCB2LCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgewogIGZsb2F0IHJlc3VsdDsKICBhc20gdm9sYXRpbGUoInZfbW92X2IzMiAlMCwgJTEgcXVhZF9wZXJtOlslMiwlMywlNCwlNV0iCiAgICAgICAgICAgICAgIDogIj12IihyZXN1bHQpIC8vICUwOiBvdXRwdXQgcmVnaXN0ZXIKICAgICAgICAgICAgICAgOiAidiIodiksICJpIihhKSwgImkiKGIpLCAiaSIoYyksICJpIihkKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKdGVtcGxhdGUgPGJvb2wgYm91bmRDaGVjaz4KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKE5fV0FSUF9YX0RFRiAqTl9XQVJQX1lfREVGICpXQVJQX1NJWkUpCiAgICBjdXN0b21fa2VybmVsKGNvbnN0IGZwOCAqYSwgY29uc3QgZnA4ICpiLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicywKICAgICAgICAgICAgICAgICAgX19oaXBfYmZsb2F0MTYgKmMsIGludCBNLCBpbnQgTiwgaW50IEspIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CiAgaW50IGxhbmVJZCA9IHRpZCAlIFdBUlBfU0laRTsKCiAgaW50IHNwbGl0SyA9IEsgLyBLX1NQTElUOwogIGludCBrSWRTdGFydCA9IGJsb2NrSWR4LnogKiBzcGxpdEs7CiAgaW50IGtJZFN0b3AgPSBzcGxpdEsgKyBibG9ja0lkeC56ICogc3BsaXRLOwoKICBpbnQgU04gPSAoTiArIDEyOCAtIDEpIC8gMTI4OwoKICBpbnQgd2FycElkID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7CiAgaW50IHdhcnBJZHggPSB3YXJwSWQgLyBOQldBUlBTX1k7IAogIGludCB3YXJwSWR5ID0gd2FycElkICUgTkJXQVJQU19ZOwoKICBfX3NoYXJlZF9fIGZwOCBzX2FbS19ESU1dW1RJTEVfU0laRV9YXTsKICBfX3NoYXJlZF9fIGZwOCBzX2JbS19ESU1dW1RJTEVfU0laRV9ZXTsKCiAgY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9ZID0gVElMRV9TSVpFX1kgLyBOQldBUlBTX1kgLyBNQVRNVUxfRElNX05NOyAvLyAyCiAgY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9YID0gVElMRV9TSVpFX1ggLyBOQldBUlBTX1ggLyBNQVRNVUxfRElNX05NOyAvLyA0CiAgdmVjNGYgY19zW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwoKICBmb3IgKGludCBrSWQgPSBrSWRTdGFydDsga0lkIDwga0lkU3RvcDsga0lkICs9IEtfRElNKSB7CgogICAgbG9hZExEUzxib3VuZENoZWNrPih3YXJwSWQsIGxhbmVJZCwga0lkLCAmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBhLCBiLCBNLCBOKTsKICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICB2ZWM0ZiBjX3RtcFtXQVJQX1RJTEVfU0laRV9YXVtXQVJQX1RJTEVfU0laRV9ZXSA9IHswfTsKI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CiAgICAgIGZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CiAgICAgICAgY29uc3RleHByIGludCBzdGVwWCA9IFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWDsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBZID0gVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZOwoKICAgICAgICB2ZWM0ZiBjX3RtcCA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjBmfTsKI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IEtfRElNO2sgKz0gTUFUTVVMX0RJTV9LKSAvLyBNQVRNVUxfRElNX0sgbXVzdCBiZSBhIG11bHRpcGxlIG9mIEtfRElNCiAgICAgICAgewogICAgICAgICAgaW50IGFfY29sID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgICAgaW50IGJfY29sID0gKHRfd0lkeSAqIHN0ZXBZKSArIHdhcnBJZHkgKiBNQVRNVUxfRElNX05NOwogICAgICAgICAgbWF0bXVsMTZ4MTYoJnNfYVswXVswXSwgJnNfYlswXVswXSwgaywgYV9jb2wsIGJfY29sLCBjX3RtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElMRV9TSVpFX1gsIFRJTEVfU0laRV9ZKTsKICAgICAgICB9CgogICAgICAgIGludCBhX3JvdyA9ICh0X3dJZHggKiBzdGVwWCkgKyB3YXJwSWR4ICogTUFUTVVMX0RJTV9OTTsKICAgICAgICAvLyBBcHBseSBzY2FsaW5nCiAgICAgICAgaW50IGFzX2NvbCA9IGtJZCAvIDEyODsKICAgICAgICBpbnQgYXNfcm93ID0gYV9yb3cgKyBibG9ja0lkeC54ICogVElMRV9TSVpFX1g7CiAgICAgICAgaW50IGJzX2NvbCA9IGJsb2NrSWR4Lnk7CiAgICAgICAgaW50IGJzX3JvdyA9IGtJZCAvIDEyODsKICAgICAgICBmbG9hdCBic192YWwgPSBic1tic19yb3cgKiBTTiArIGJzX2NvbF07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgIGludCByb3cgPSBhc19yb3cgKyBpICsgKGxhbmVJZCAvIDE2KSAqIDQ7CiAgICAgICAgICBmbG9hdCBhc192YWwgPSBhc1thc19jb2wgKiBNICsgcm93XTsKICAgICAgICAgIGNfc1t0X3dJZHhdW3Rfd0lkeV1baV0gKz0gY190bXBbaV0gKiBhc192YWwgKiBic192YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgX19zeW5jdGhyZWFkcygpOwogIH0KICAKCiAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgIGZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CiAgICAgIC8vIG9mZnNldCBwb2ludGluZyB0byB0aGUgYWNjdW11bGF0ZWQgMTZ4MTYgYmxvY2sKICAgICAgaW50IGNvbF9vZmZzZXQgPQogICAgICAgICAgYmxvY2tJZHgueSAqIFRJTEVfU0laRV9ZICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0CiAgICAgICAgICAod2FycElkeSAqIE1BVE1VTF9ESU1fTk0pICsgICAgICAgICAgICAgICAgLy8gV2FycCBvZmZzZXQKICAgICAgICAgIHRfd0lkeSAqIChUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1kpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgogICAgICBpbnQgcm93X29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC54ICogVElMRV9TSVpFX1ggKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR4ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR4ICogKFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWCk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGF1dG8gcmVzID0gY19zW3Rfd0lkeF1bdF93SWR5XTsKCiAgICAgIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgICAgIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICAgICAgYl9jaGVjayA9IChyb3dfb2Zmc2V0KSA8IE0gJiYgKGNvbF9vZmZzZXQpIDwgTjsKICAgICAgfQogICAgICBpZiAoYl9jaGVjaykgewogICAgICAgICAgLy8gQyBpcyBzdG9yZWQgb24gNCBWR1BScwogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIDE2OwogICAgICAgICAgICAgIGludCByb3cgPSBpICsgKGxhbmVJZCAvIDE2KSAqIDQ7CiAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgIH0KICAgICAgICAKICAgICAgfQogICAgfQogIH0KfQoKCnN0cnVjdCBMYXVuY2hDb25maWcgewogIGJvb2wgYm91bmRDaGVjazsKfTsKCgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgS19TUExJVCk7CgogIGlmIChjb25maWcuYm91bmRDaGVjaykgewogICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPHRydWU+KSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLCBNLCBOLCBLKTsKICB9IGVsc2UgewogICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPGZhbHNlPiksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwKICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwogIH0KfQoKCnZvaWQgbGF1bmNoX2tlcm5lbChjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsIGNvbnN0IGZsb2F0ICpkX0FzLAogICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsIGludCBNLCBpbnQgTiwKICAgICAgICAgICAgICAgICAgIGludCBLKSB7CiAgTGF1bmNoQ29uZmlnIGNvbmZpZzsKICAgIAogIGlmIChNICUgMTI4ID09MCAmJiBOICUxMjggPT0wKQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSBmYWxzZTsKICBlbHNlCiAgICBjb25maWcuYm91bmRDaGVjayA9IHRydWU7CiAgCiAgbGF1bmNoX2tlcm5lbChjb25maWcsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwp9CgoKCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgTSwKICAgIGludCBOLAogICAgaW50IEsKKSB7CiAgICBjb25zdCBhdXRvKiBkX0EgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGFfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogZF9BcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogZF9CcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihic19wdHIpOwogICAgYXV0byogZF9DID0gcmVpbnRlcnByZXRfY2FzdDxfX2hpcF9iZmxvYXQxNio+KGNfcHRyKTsKCiAgICBkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUYgKiBOX1dBUlBfWV9ERUYgKiBXQVJQX1NJWkUpOwogICAgZGltMyBibG9ja3NQZXJHcmlkKChNICsgVElMRV9TSVpFX1hfREVGIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUYsCiAgICAgICAgICAgICAgICAgICAgIChOICsgVElMRV9TSVpFX1lfREVGIC0gMSkgLyBUSUxFX1NJWkVfWV9ERUYpOwogICAgCiAgICBpZiAoTSUxMjg9PTAgJiYgTiUxMjg9PTApewogICAgICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoY3VzdG9tX2tlcm5lbDxmYWxzZT4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwogICAgfWVsc2V7CiAgICAgICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPHRydWU+KSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLCBNLCBOLCBLKTt9CgogICAgSElQX0NIRUNLKGhpcEdldExhc3RFcnJvcigpKTsKfQoKUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewogIG0uZGVmKCJmcDgiLCAmcnVuLCAiSElQIGtlcm5lbCIpOwp9CiIiIgoKaGlwX21vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4IiwKICAgIGNwcF9zb3VyY2VzPSIiLAogICAgY3VkYV9zb3VyY2VzPWtlcm5lbF9jcHAucmVwbGFjZSgnQCcsIGNocig5MikpLAogICAgd2l0aF9jdWRhPVRydWUsCiAgICB2ZXJib3NlPUZhbHNlLAogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItZyAtLXNhdmUtdGVtcHMgLVJwYXNzLWFuYWx5c2lzPWtlcm5lbC1yZXNvdXJjZS11c2FnZSAtc3RkPWMrKzIwIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmZpcnN0ID0gVHJ1ZQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBibG9jay1zY2FsZSBmcDggZ2VtbQogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSB0aGF0IGV4cGFuZHMgdG86CiAgICAgICAgICAgIGE6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFttLCBrXSwKICAgICAgICAgICAgYjogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW24sIGtdLAogICAgICAgICAgICBhX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW20sIGsgLy8gMTI4XSwKICAgICAgICAgICAgYl9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFtuIC8vIDEyOCwgayAvLyAxMjhdLAogICAgICAgICAgICBjOiB0b3JjaC5UZW5zb3JbYmZsb2F0MTZdIG9mIHNoYXBlIFttLCBuXQogICAgUmV0dXJuczoKICAgICAgICBUZW5zb3IgY29udGFpbmluZyBvdXRwdXQgaW4gYmYxNgogICAgIiIiCgogICAgZ2xvYmFsIGZpcnN0CiAgICBpZiBmaXJzdDoKICAgICAgICBwcmludCgiZXhlY3V0aW5nIG9uIiwgdG9yY2guY3VkYS5nZXRfZGV2aWNlX25hbWUoKSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIGZpcnN0ID0gRmFsc2UKCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQoKICAgIG0sIG4gPSBjLnNoYXBlCiAgICBrID0gYS5zaGFwZVsxXQoKICAgIGhpcF9tb2R1bGUuZnA4KAogICAgICAgIGEuZGF0YV9wdHIoKSwKICAgICAgICBiLmRhdGFfcHRyKCksCiAgICAgICAgYV9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGJfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBjLmRhdGFfcHRyKCksCiAgICAgICAgbSwKICAgICAgICBuLAogICAgICAgIGssCiAgICApCgogICAgcmV0dXJuIGMKNo newline at end of file
Best evidence level for this revision: reported
JSON