Skip to content
KernelIndex
Search⌘K

submission 18833

KernelBot user 160 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.

submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-18833?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, 512]
AMD Instinct MI300X
40.3µs
#26 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
42.2µs
#31 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
58.6µs
#34 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
121.3µs
#54 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
132.2µs
#57 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
138.7µs
#52 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
153.3µs
#56 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
176.5µs
#68 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
177.1µs
#68 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
181.2µs
#59 of 98
2025-05-09
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
191.5µs
#40 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
204.6µs
#38 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
217.6µs
#63 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
228.8µs
#43 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
434.4µs
#54 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
590.9µs
#63 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
663.2µs
#63 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
1.31ms
#64 of 98
2025-05-09

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:2e2b780a5ff217fe8cf3c282c93c6df25ef65d36632666cca5b7a2ff95f7bde6
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX00oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MTZfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE0sIEJNKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1syXVtCTl1bQksgKyA0XSwgQnNbMl1bQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzWzJdW0JOICsgMV07CgogICAgaW50IGN1cnIgPSAwLCBuZXh0ID0gMTsKCiAgICBmbG9hdHgxNiBkW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKCiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKyAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMSkgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAodyAmIDB4ZmYpIDw8IDI0IHwgKHogJiAweGZmKSA8PCAxNiB8ICh5ICYgMHhmZikgPDwgOCB8ICh4ICYgMHhmZik7CgogICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgJkFzW2N1cnJdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgJkFzW2N1cnJdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICB9CiAgICB9CiAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQ0ICo+KCZXc1tjdXJyXVt0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICZBX3NjYWxlWyhjb2xPZmZzZXRBICsgdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRSldKTsKICAgIH0KICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewoKICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKyAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMSkgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKCiAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAodyAmIDB4ZmYpIDw8IDI0IHwgKHogJiAweGZmKSA8PCAxNiB8ICh5ICYgMHhmZikgPDwgOCB8ICh4ICYgMHhmZik7CgogICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgJkJzW2N1cnJdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSBwYWNrOwogICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgJkJzW2N1cnJdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSAwLjBmOwogICAgICB9CiAgICB9CiAgICBpZiAodGhyZWFkSWR4LnggPT0gbnVtVGhyZWFkcyAtIDEpIHsgLy8gbG9hZCB1c2luZyBkaWZmZXJlbnQgd2FycAogICAgICBXc1tjdXJyXVtCTl0gPSBCX3NjYWxlWyhjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICB9CgogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHVpbnQzMl90IEFfdGVtcDFbMl0sIEFfdGVtcDJbMl0sIEFfdGVtcDNbMl0sIEFfdGVtcDRbMl07CiAgICB1aW50MzJfdCBCX3RlbXAxWzJdLCBCX3RlbXAyWzJdLCBCX3RlbXAzWzJdLCBCX3RlbXA0WzJdOwogICAgZmxvYXQ0IEFfc2NhbGVfdGVtcDsKICAgIGZsb2F0IEJfc2NhbGVfdGVtcDsKCiAgICBmb3IgKHVpbnQxNl90IHRpbGVPZmZzZXQgPSBCSzsgdGlsZU9mZnNldCA8IEsgKyBCSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBsb2FkIGZyb20gZ2xvYmFsIHRvIHNoYXJlZCBtZW1vcnkgaW4gY29hbGVzY2VkIG1hbm5lcgogICAgICBpZiAodGlsZU9mZnNldCA8IEspIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAgIEFfc2NhbGVfdGVtcCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgICBCX3NjYWxlX3RlbXAgPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiAvIEJMT0NLX0RJTSldOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbG9uZyBhW1dJVEVSTl0sIGJbV0lURVJNXTsKICAgICAgZmxvYXQgYl9zY2FsZSA9IFdzW2N1cnJdW0JOXTsKICAgICAgZmxvYXR4MTYgY1tXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgICBmb3IgKHVpbnQxNl90IEJLT2Zmc2V0ID0gMDsgQktPZmZzZXQgPCBCSzsgQktPZmZzZXQgKz0gMTYpIHsKICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGFbd25dID0gKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPigKICAgICAgICAgICAgICAmQXNbY3Vycl1bd2FycFJvd09mZnNldCArIHduICogMzIgKyB3YXJwWF1bQktPZmZzZXQgKyB3YXJwWSAqIDhdKTsKICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBiW3dtXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkJzW2N1cnJdW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICAgIGNbd25dW3dtXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgICAgIGFbd25dLCBiW3dtXSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqCiAgICAgICAgICAgICAgICAgIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh0aWxlT2Zmc2V0IDwgSykgewogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSkgPCBOICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICAgICAoQV90ZW1wNFtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDI0IHwKICAgICAgICAgICAgICAgIChBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgKEFfdGVtcDJbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCA4IHwKICAgICAgICAgICAgICAgIChBX3RlbXAxW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZik7CgogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgICAmQXNbbmV4dF1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IHBhY2s7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAmQXNbbmV4dF1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IDAuMGY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA8IChCTiAvIFZFQ1RPUl9TSVpFKSkgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQ0ICo+KCZXc1tuZXh0XVt0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgICAgIEFfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEIgPSAwOyBpbm5lclJvd09mZnNldEIgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKSA8IE0gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgICAgIChCX3RlbXA0W2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgMjQgfAogICAgICAgICAgICAgICAgKEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCAxNiB8CiAgICAgICAgICAgICAgICAoQl90ZW1wMltpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDggfAogICAgICAgICAgICAgICAgKEJfdGVtcDFbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKTsKCiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAgICZCc1tuZXh0XVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gcGFjazsKICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAgICZCc1tuZXh0XVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gMC4wZjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgICAgIFdzW25leHRdW0JOXSA9IEJfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGN1cnIgPSAxIC0gY3VycjsKICAgICAgbmV4dCA9IDEgLSBuZXh0OwogICAgfQoKICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICBmb3IgKHVpbnQxNl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgIGlmICgocm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSA8CiAgICAgICAgICAgICAgICAgICAgTiAmJgogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKSA8IE0pCiAgICAgICAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSAqCiAgICAgICAgICAgICAgICAgICAgTSArCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpXSA9CiAgICAgICAgICAgICAgICAgIChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjb25zdCB1aW50MzJfdCBCTiwgY29uc3QgdWludDMyX3QgQkssIGNvbnN0IHVpbnQzMl90IEJNLAogICAgICAgICAgY29uc3QgdWludDMyX3QgV0lURVJOLCBjb25zdCB1aW50MzJfdCBXSVRFUk0sIGNvbnN0IHVpbnQzMl90IFNNX0NPVU5UPgpfX2dsb2JhbF9fIHZvaWQKZnA4X21tX2tlcm5lbF9OKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkEsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkIsCiAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgICAgdWludDMyX3QgTiwgdWludDMyX3QgSywgdWludDMyX3QgTSkgewogIHVzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBWRUNUT1JfU0laRSA9IDQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXQVJQU0laRSA9IDY0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV04gPSAzMiAqIFdJVEVSTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdNID0gMzIgKiBXSVRFUk07CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBudW1UaHJlYWRzID0gKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUEgPSAobnVtVGhyZWFkcyAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQiA9IChudW1UaHJlYWRzIC8gQk0pICogVkVDVE9SX1NJWkU7CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MzJfdCBudW1UaWxlcyA9IGNkaXYoTiwgQk4pICogY2RpdihNLCBCTSk7CgogIGZvciAodWludDE2X3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgdWludDMyX3Qgcm93T2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihOLCBCTikpICogQk47CiAgICB1aW50MzJfdCBjb2xPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE4sIEJOKSkgKiBCTTsKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSAodGhyZWFkSWR4LnggLyBCTikgKiBWRUNUT1JfU0laRTsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSAodGhyZWFkSWR4LnggLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgICB1aW50MzJfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBJZHggPSB0aHJlYWRJZHgueCAvIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycENvbE9mZnNldCA9ICh3YXJwSWR4ICUgKEJNIC8gV00pKSAqIFdNOwogICAgdWludDMyX3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gV00pKSAqIFdOOwogICAgdWludDMyX3Qgd2FycFggPSBsYW5lSWR4ICUgMzI7CiAgICB1aW50MzJfdCB3YXJwWSA9IGxhbmVJZHggLyAzMjsKCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogQXNbMl1bQk5dW0JLICsgNF0sIEJzWzJdW0JNXVtCSyArIDRdOwogICAgX19zaGFyZWRfXyBmbG9hdCBXc1syXVtCTiArIDFdOwoKICAgIGludCBjdXJyID0gMCwgbmV4dCA9IDE7CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJiAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSkgPCBOICYmCiAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDEpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgeiA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CgogICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfCAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICZBc1tjdXJyXVtpbm5lckNvbEFdW2lubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QV0pID0gcGFjazsKICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICZBc1tjdXJyXVtpbm5lckNvbEFdW2lubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QV0pID0gMC4wZjsKICAgICAgfQogICAgfQogICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbY3Vycl1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICB9CiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKSA8IE0gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgKiBNICsgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgeiA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAyKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMykgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CgogICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfCAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICZCc1tjdXJyXVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gcGFjazsKICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICZCc1tjdXJyXVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gMC4wZjsKICAgICAgfQogICAgfQogICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgV3NbY3Vycl1bQk5dID0gQl9zY2FsZVsoY29sT2Zmc2V0QiAvIEJMT0NLX0RJTSldOwogICAgfQoKICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICB1aW50MzJfdCBBX3RlbXAxWzJdLCBBX3RlbXAyWzJdLCBBX3RlbXAzWzJdLCBBX3RlbXA0WzJdOwogICAgdWludDMyX3QgQl90ZW1wMVsyXSwgQl90ZW1wMlsyXSwgQl90ZW1wM1syXSwgQl90ZW1wNFsyXTsKICAgIGZsb2F0NCBBX3NjYWxlX3RlbXA7CiAgICBmbG9hdCBCX3NjYWxlX3RlbXA7CgogICAgZm9yICh1aW50MTZfdCB0aWxlT2Zmc2V0ID0gQks7IHRpbGVPZmZzZXQgPCBLICsgQks7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wMltpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMikgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wNFtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICBBX3RlbXAxW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wMltpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDNbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICAgICBBX3NjYWxlX3RlbXAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdDQgKj4oCiAgICAgICAgICAgICAgJkFfc2NhbGVbKHRpbGVPZmZzZXQgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAxKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAyKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXA0W2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAgIEJfdGVtcDFbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wM1tpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPT0gbnVtVGhyZWFkcyAtIDEpIHsgLy8gbG9hZCB1c2luZyBkaWZmZXJlbnQgd2FycAogICAgICAgICAgQl9zY2FsZV90ZW1wID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tjdXJyXVtCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MTZfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1tjdXJyXVt3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1tjdXJyXVt3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKgogICAgICAgICAgICAgICAgICBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAodGlsZU9mZnNldCA8IEspIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbbmV4dF1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgICBBX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICAgICAoQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDI0IHwKICAgICAgICAgICAgICAgIChCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgKEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCA4IHwKICAgICAgICAgICAgICAgIChCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZik7CgogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgICAmQnNbbmV4dF1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAmQnNbbmV4dF1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgICBXc1tuZXh0XVtCTl0gPSBCX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICBjdXJyID0gMSAtIGN1cnI7CiAgICAgIG5leHQgPSAxIC0gbmV4dDsKICAgIH0KCiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICBpZiAoKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgPAogICAgICAgICAgICAgICAgICAgIE4gJiYKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCkgPCBNKQogICAgICAgICAgICAgIENbKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgKgogICAgICAgICAgICAgICAgICAgIE0gKwogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKV0gPQogICAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYpZFt3bl1bd21dW2kgKyBqICogNF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgphdDo6VGVuc29yIGZwOF9tbShhdDo6VGVuc29yIEEsIGF0OjpUZW5zb3IgQiwgYXQ6OlRlbnNvciBBX3NjYWxlLAogICAgICAgICAgICAgICAgICBhdDo6VGVuc29yIEJfc2NhbGUsIGF0OjpUZW5zb3IgQykgewogIGludCBOID0gQS5zaXplKDApLCBLID0gQS5zaXplKDEpLCBNID0gQi5zaXplKDApOwoKICBjb25zdCBpbnQgQksgPSA2NDsKICBjb25zdCBpbnQgQk4gPSAxMjg7CiAgY29uc3QgaW50IEJNID0gMTI4OwogIGNvbnN0IGludCBXSVRFUk4gPSAxOwogIGNvbnN0IGludCBXSVRFUk0gPSAxOwogIGNvbnN0IGludCBTTV9DT1VOVCA9IDMwNDsKICBkaW0zIG51bVRocmVhZHMoKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKSk7CiAgZGltMyBudW1CbG9ja3MoU01fQ09VTlQpOwogIC8vZGltMyBudW1CbG9ja3MoY2RpdihNLCBCTSksIGNkaXYoTiwgQk4pKTsKICBpZiAoTiA+IE0pIHsKICAgICAgZnA4X21tX2tlcm5lbF9OPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVD48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsX008Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0KICByZXR1cm4gQzsKfQoiIiIKCmNwcF9zcmMgPSByIiIiCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKTsKIiIiCgppZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICBzeXMuc3Rkb3V0ID0gb3BlbigiL2Rldi9zdGRvdXQiLCAidyIpCmlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgIHN5cy5zdGRlcnIgPSBvcGVuKCIvZGV2L3N0ZGVyciIsICJ3IikKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bCiAgICAgICAgIi1PZmFzdCIsCiAgICAgICAgIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsCiAgICAgICAgIi1zdGQ9YysrMjAiLAogICAgICAgICItZmZwLWNvbnRyYWN0PWZhc3QiLAogICAgICAgICItbGhpcF9oY2MiLAogICAgICAgICAiLW1jdW1vZGUiLAogICAgXSwKKQoKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCiAgICByZXR1cm4gbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQo=

Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0

Changes from previous submission

Against this author's previous submission submission 18398.

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX00oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MzJfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE0sIEJNKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCTl1bQksgKyA0XSwgQnNbQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MzJfdCB0aWxlT2Zmc2V0ID0gMDsgdGlsZU9mZnNldCA8IEs7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgZm9yICh1aW50MzJfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9ICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0gKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1t3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1t3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKiBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB9CgogICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpIDwKICAgICAgICAgICAgICAgICAgICBOICYmCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpIDwgTSkKICAgICAgICAgICAgICBDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgICBNICsKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCldID0KICAgICAgICAgICAgICAgICAgKF9faGlwX2JmbG9hdDE2KWRbd25dW3dtXVtpICsgaiAqIDRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX04oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MzJfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggJSBjZGl2KE4sIEJOKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAvIGNkaXYoTiwgQk4pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCTl1bQksgKyA0XSwgQnNbQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MzJfdCB0aWxlT2Zmc2V0ID0gMDsgdGlsZU9mZnNldCA8IEs7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgZm9yICh1aW50MzJfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9ICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0gKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1t3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1t3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKiBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB9CgogICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpIDwKICAgICAgICAgICAgICAgICAgICBOICYmCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpIDwgTSkKICAgICAgICAgICAgICBDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgICBNICsKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCldID0KICAgICAgICAgICAgICAgICAgKF9faGlwX2JmbG9hdDE2KWRbd25dW3dtXVtpICsgaiAqIDRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICBpbnQgTiA9IEEuc2l6ZSgwKSwgSyA9IEEuc2l6ZSgxKSwgTSA9IEIuc2l6ZSgwKTsKCiAgY29uc3QgaW50IEJLID0gMTI4OwogIGNvbnN0IGludCBCTiA9IDEyODsKICBjb25zdCBpbnQgQk0gPSAxMjg7CiAgY29uc3QgaW50IFdJVEVSTiA9IDE7CiAgY29uc3QgaW50IFdJVEVSTSA9IDE7CiAgY29uc3QgaW50IFNNX0NPVU5UID0gMzA0OwogIGRpbTMgbnVtVGhyZWFkcygoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pKTsKICBkaW0zIG51bUJsb2NrcyhTTV9DT1VOVCk7CiAgLy9kaW0zIG51bUJsb2NrcyhjZGl2KE0sIEJNKSwgY2RpdihOLCBCTikpOwogIGlmIChOID4gTSkgewogICAgICBmcDhfbW1fa2VybmVsX048Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0gZWxzZSB7CiAgICAgIGZwOF9tbV9rZXJuZWxfTTxCTiwgQkssIEJNLCBXSVRFUk4sIFdJVEVSTSwgU01fQ09VTlQ+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilBLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLAogICAgICAgICAgQV9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwgQl9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgICAgIChfX2hpcF9iZmxvYXQxNiAqKUMuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgfQogIHJldHVybiBDOwp9CiIiIgoKY3BwX3NyYyA9IHIiIiIKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpOwoiIiIKCmlmIHN5cy5zdGRvdXQgaXMgTm9uZToKICAgIHN5cy5zdGRvdXQgPSBvcGVuKCIvZGV2L3N0ZG91dCIsICJ3IikKaWYgc3lzLnN0ZGVyciBpcyBOb25lOgogICAgc3lzLnN0ZGVyciA9IG9wZW4oIi9kZXYvc3RkZXJyIiwgInciKQoKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDhfbW0iLAogICAgY3BwX3NvdXJjZXM9W2NwcF9zcmNdLAogICAgY3VkYV9zb3VyY2VzPVtjdWRhX3NyY10sCiAgICBmdW5jdGlvbnM9WyJmcDhfbW0iXSwKICAgIHZlcmJvc2U9VHJ1ZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsKICAgICAgICAiLU9mYXN0IiwKICAgICAgICAiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwKICAgICAgICAiLXN0ZD1jKysyMCIsCiAgICAgICAgIi1mZnAtY29udHJhY3Q9ZmFzdCIsCiAgICAgICAgIi1saGlwX2hjYyIsCiAgICAgICAgICItbWN1bW9kZSIsCiAgICBdLAopCgoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIHJldHVybiBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpCg==
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX00oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MTZfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE0sIEJNKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1syXVtCTl1bQksgKyA0XSwgQnNbMl1bQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzWzJdW0JOICsgMV07CgogICAgaW50IGN1cnIgPSAwLCBuZXh0ID0gMTsKCiAgICBmbG9hdHgxNiBkW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKCiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKyAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMSkgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAodyAmIDB4ZmYpIDw8IDI0IHwgKHogJiAweGZmKSA8PCAxNiB8ICh5ICYgMHhmZikgPDwgOCB8ICh4ICYgMHhmZik7CgogICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgJkFzW2N1cnJdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgJkFzW2N1cnJdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICB9CiAgICB9CiAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQ0ICo+KCZXc1tjdXJyXVt0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICZBX3NjYWxlWyhjb2xPZmZzZXRBICsgdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRSldKTsKICAgIH0KICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewoKICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKyAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMSkgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKCiAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAodyAmIDB4ZmYpIDw8IDI0IHwgKHogJiAweGZmKSA8PCAxNiB8ICh5ICYgMHhmZikgPDwgOCB8ICh4ICYgMHhmZik7CgogICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgJkJzW2N1cnJdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSBwYWNrOwogICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgJkJzW2N1cnJdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSAwLjBmOwogICAgICB9CiAgICB9CiAgICBpZiAodGhyZWFkSWR4LnggPT0gbnVtVGhyZWFkcyAtIDEpIHsgLy8gbG9hZCB1c2luZyBkaWZmZXJlbnQgd2FycAogICAgICBXc1tjdXJyXVtCTl0gPSBCX3NjYWxlWyhjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICB9CgogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHVpbnQzMl90IEFfdGVtcDFbMl0sIEFfdGVtcDJbMl0sIEFfdGVtcDNbMl0sIEFfdGVtcDRbMl07CiAgICB1aW50MzJfdCBCX3RlbXAxWzJdLCBCX3RlbXAyWzJdLCBCX3RlbXAzWzJdLCBCX3RlbXA0WzJdOwogICAgZmxvYXQ0IEFfc2NhbGVfdGVtcDsKICAgIGZsb2F0IEJfc2NhbGVfdGVtcDsKCiAgICBmb3IgKHVpbnQxNl90IHRpbGVPZmZzZXQgPSBCSzsgdGlsZU9mZnNldCA8IEsgKyBCSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBsb2FkIGZyb20gZ2xvYmFsIHRvIHNoYXJlZCBtZW1vcnkgaW4gY29hbGVzY2VkIG1hbm5lcgogICAgICBpZiAodGlsZU9mZnNldCA8IEspIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAgIEFfc2NhbGVfdGVtcCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgICBCX3NjYWxlX3RlbXAgPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiAvIEJMT0NLX0RJTSldOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbG9uZyBhW1dJVEVSTl0sIGJbV0lURVJNXTsKICAgICAgZmxvYXQgYl9zY2FsZSA9IFdzW2N1cnJdW0JOXTsKICAgICAgZmxvYXR4MTYgY1tXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgICBmb3IgKHVpbnQxNl90IEJLT2Zmc2V0ID0gMDsgQktPZmZzZXQgPCBCSzsgQktPZmZzZXQgKz0gMTYpIHsKICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGFbd25dID0gKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPigKICAgICAgICAgICAgICAmQXNbY3Vycl1bd2FycFJvd09mZnNldCArIHduICogMzIgKyB3YXJwWF1bQktPZmZzZXQgKyB3YXJwWSAqIDhdKTsKICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBiW3dtXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkJzW2N1cnJdW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICAgIGNbd25dW3dtXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgICAgIGFbd25dLCBiW3dtXSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqCiAgICAgICAgICAgICAgICAgIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh0aWxlT2Zmc2V0IDwgSykgewogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSkgPCBOICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICAgICAoQV90ZW1wNFtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDI0IHwKICAgICAgICAgICAgICAgIChBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgKEFfdGVtcDJbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCA4IHwKICAgICAgICAgICAgICAgIChBX3RlbXAxW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZik7CgogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgICAmQXNbbmV4dF1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IHBhY2s7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAmQXNbbmV4dF1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IDAuMGY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA8IChCTiAvIFZFQ1RPUl9TSVpFKSkgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQ0ICo+KCZXc1tuZXh0XVt0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgICAgIEFfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEIgPSAwOyBpbm5lclJvd09mZnNldEIgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKSA8IE0gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgICAgIChCX3RlbXA0W2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgMjQgfAogICAgICAgICAgICAgICAgKEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCAxNiB8CiAgICAgICAgICAgICAgICAoQl90ZW1wMltpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDggfAogICAgICAgICAgICAgICAgKEJfdGVtcDFbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKTsKCiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAgICZCc1tuZXh0XVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gcGFjazsKICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAgICZCc1tuZXh0XVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gMC4wZjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgICAgIFdzW25leHRdW0JOXSA9IEJfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGN1cnIgPSAxIC0gY3VycjsKICAgICAgbmV4dCA9IDEgLSBuZXh0OwogICAgfQoKICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICBmb3IgKHVpbnQxNl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgIGlmICgocm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSA8CiAgICAgICAgICAgICAgICAgICAgTiAmJgogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKSA8IE0pCiAgICAgICAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSAqCiAgICAgICAgICAgICAgICAgICAgTSArCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpXSA9CiAgICAgICAgICAgICAgICAgIChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjb25zdCB1aW50MzJfdCBCTiwgY29uc3QgdWludDMyX3QgQkssIGNvbnN0IHVpbnQzMl90IEJNLAogICAgICAgICAgY29uc3QgdWludDMyX3QgV0lURVJOLCBjb25zdCB1aW50MzJfdCBXSVRFUk0sIGNvbnN0IHVpbnQzMl90IFNNX0NPVU5UPgpfX2dsb2JhbF9fIHZvaWQKZnA4X21tX2tlcm5lbF9OKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkEsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkIsCiAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgICAgdWludDMyX3QgTiwgdWludDMyX3QgSywgdWludDMyX3QgTSkgewogIHVzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBWRUNUT1JfU0laRSA9IDQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXQVJQU0laRSA9IDY0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV04gPSAzMiAqIFdJVEVSTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdNID0gMzIgKiBXSVRFUk07CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBudW1UaHJlYWRzID0gKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUEgPSAobnVtVGhyZWFkcyAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQiA9IChudW1UaHJlYWRzIC8gQk0pICogVkVDVE9SX1NJWkU7CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MzJfdCBudW1UaWxlcyA9IGNkaXYoTiwgQk4pICogY2RpdihNLCBCTSk7CgogIGZvciAodWludDE2X3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgdWludDMyX3Qgcm93T2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihOLCBCTikpICogQk47CiAgICB1aW50MzJfdCBjb2xPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE4sIEJOKSkgKiBCTTsKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSAodGhyZWFkSWR4LnggLyBCTikgKiBWRUNUT1JfU0laRTsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSAodGhyZWFkSWR4LnggLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgICB1aW50MzJfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBJZHggPSB0aHJlYWRJZHgueCAvIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycENvbE9mZnNldCA9ICh3YXJwSWR4ICUgKEJNIC8gV00pKSAqIFdNOwogICAgdWludDMyX3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gV00pKSAqIFdOOwogICAgdWludDMyX3Qgd2FycFggPSBsYW5lSWR4ICUgMzI7CiAgICB1aW50MzJfdCB3YXJwWSA9IGxhbmVJZHggLyAzMjsKCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogQXNbMl1bQk5dW0JLICsgNF0sIEJzWzJdW0JNXVtCSyArIDRdOwogICAgX19zaGFyZWRfXyBmbG9hdCBXc1syXVtCTiArIDFdOwoKICAgIGludCBjdXJyID0gMCwgbmV4dCA9IDE7CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJiAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSkgPCBOICYmCiAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDEpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgeiA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CgogICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfCAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICZBc1tjdXJyXVtpbm5lckNvbEFdW2lubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QV0pID0gcGFjazsKICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICZBc1tjdXJyXVtpbm5lckNvbEFdW2lubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QV0pID0gMC4wZjsKICAgICAgfQogICAgfQogICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbY3Vycl1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICB9CiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKSA8IE0gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgKiBNICsgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgeiA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAyKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMykgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CgogICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfCAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICZCc1tjdXJyXVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gcGFjazsKICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICZCc1tjdXJyXVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gMC4wZjsKICAgICAgfQogICAgfQogICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgV3NbY3Vycl1bQk5dID0gQl9zY2FsZVsoY29sT2Zmc2V0QiAvIEJMT0NLX0RJTSldOwogICAgfQoKICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICB1aW50MzJfdCBBX3RlbXAxWzJdLCBBX3RlbXAyWzJdLCBBX3RlbXAzWzJdLCBBX3RlbXA0WzJdOwogICAgdWludDMyX3QgQl90ZW1wMVsyXSwgQl90ZW1wMlsyXSwgQl90ZW1wM1syXSwgQl90ZW1wNFsyXTsKICAgIGZsb2F0NCBBX3NjYWxlX3RlbXA7CiAgICBmbG9hdCBCX3NjYWxlX3RlbXA7CgogICAgZm9yICh1aW50MTZfdCB0aWxlT2Zmc2V0ID0gQks7IHRpbGVPZmZzZXQgPCBLICsgQks7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wMltpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMikgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wNFtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICBBX3RlbXAxW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wMltpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDNbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICAgICBBX3NjYWxlX3RlbXAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdDQgKj4oCiAgICAgICAgICAgICAgJkFfc2NhbGVbKHRpbGVPZmZzZXQgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAxKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAyKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXA0W2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAgIEJfdGVtcDFbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wM1tpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPT0gbnVtVGhyZWFkcyAtIDEpIHsgLy8gbG9hZCB1c2luZyBkaWZmZXJlbnQgd2FycAogICAgICAgICAgQl9zY2FsZV90ZW1wID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tjdXJyXVtCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MTZfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1tjdXJyXVt3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1tjdXJyXVt3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKgogICAgICAgICAgICAgICAgICBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAodGlsZU9mZnNldCA8IEspIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbbmV4dF1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgICBBX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICAgICAoQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDI0IHwKICAgICAgICAgICAgICAgIChCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgKEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCA4IHwKICAgICAgICAgICAgICAgIChCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZik7CgogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgICAmQnNbbmV4dF1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAmQnNbbmV4dF1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgICBXc1tuZXh0XVtCTl0gPSBCX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICBjdXJyID0gMSAtIGN1cnI7CiAgICAgIG5leHQgPSAxIC0gbmV4dDsKICAgIH0KCiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICBpZiAoKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgPAogICAgICAgICAgICAgICAgICAgIE4gJiYKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCkgPCBNKQogICAgICAgICAgICAgIENbKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgKgogICAgICAgICAgICAgICAgICAgIE0gKwogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKV0gPQogICAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYpZFt3bl1bd21dW2kgKyBqICogNF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgphdDo6VGVuc29yIGZwOF9tbShhdDo6VGVuc29yIEEsIGF0OjpUZW5zb3IgQiwgYXQ6OlRlbnNvciBBX3NjYWxlLAogICAgICAgICAgICAgICAgICBhdDo6VGVuc29yIEJfc2NhbGUsIGF0OjpUZW5zb3IgQykgewogIGludCBOID0gQS5zaXplKDApLCBLID0gQS5zaXplKDEpLCBNID0gQi5zaXplKDApOwoKICBjb25zdCBpbnQgQksgPSA2NDsKICBjb25zdCBpbnQgQk4gPSAxMjg7CiAgY29uc3QgaW50IEJNID0gMTI4OwogIGNvbnN0IGludCBXSVRFUk4gPSAxOwogIGNvbnN0IGludCBXSVRFUk0gPSAxOwogIGNvbnN0IGludCBTTV9DT1VOVCA9IDMwNDsKICBkaW0zIG51bVRocmVhZHMoKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKSk7CiAgZGltMyBudW1CbG9ja3MoU01fQ09VTlQpOwogIC8vZGltMyBudW1CbG9ja3MoY2RpdihNLCBCTSksIGNkaXYoTiwgQk4pKTsKICBpZiAoTiA+IE0pIHsKICAgICAgZnA4X21tX2tlcm5lbF9OPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVD48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsX008Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0KICByZXR1cm4gQzsKfQoiIiIKCmNwcF9zcmMgPSByIiIiCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKTsKIiIiCgppZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICBzeXMuc3Rkb3V0ID0gb3BlbigiL2Rldi9zdGRvdXQiLCAidyIpCmlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgIHN5cy5zdGRlcnIgPSBvcGVuKCIvZGV2L3N0ZGVyciIsICJ3IikKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bCiAgICAgICAgIi1PZmFzdCIsCiAgICAgICAgIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsCiAgICAgICAgIi1zdGQ9YysrMjAiLAogICAgICAgICItZmZwLWNvbnRyYWN0PWZhc3QiLAogICAgICAgICItbGhpcF9oY2MiLAogICAgICAgICAiLW1jdW1vZGUiLAogICAgXSwKKQoKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCiAgICByZXR1cm4gbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQo=
No newline at end of file

Best evidence level for this revision: reported

JSON