amd-mixture-of-experts · submission 28488
KernelBot user 415 · 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.
3-amd-fp8-moe-hip-myhgemm.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-28488?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16
Benchmark evidence
2 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:bda85d28b80bd7cf28d705ba4950fe299e333745a1bb073aae2b8a6b5cb2bb98
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
3-amd-fp8-moe-hip-myhgemm.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgbW9lKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlX1QsIHRvcmNoOjpUZW5zb3IgdF91cF9ULCB0b3JjaDo6VGVuc29yIHRfZG93bl9ULA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAzMiwgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMTYsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9pbmRleCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF91cCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bik7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXBibGFzL2hpcGJsYXMuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCg0KI2RlZmluZSBPRkZTRVQocm93LCBjb2wsIGxkKSAoKHJvdykgKiAobGQpICsgKGNvbCkpDQojZGVmaW5lIFNXWihtLCBuKSAoKChtKSAqIDQgKyAobikpICUgNjQpIC8vIGJ5IGhhbGYNCg0KX19nbG9iYWxfXyB2b2lkIHNvZnRtYXhfZnAzMihjb25zdCBmbG9hdCAqaW5wdXQsIGZsb2F0ICpvdXRwdXQsIGludCBtLCBpbnQgbikgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIGZsb2F0IG1heF92YWwgPSBpbnB1dFtpZHggKiBuXTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IHZhbCA9IGlucHV0W2lkeCAqIG4gKyBpXTsNCiAgICAgICAgICAgIG1heF92YWwgPSB2YWwgPiBtYXhfdmFsID8gdmFsIDogbWF4X3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICBmbG9hdCBzdW0gPSAwLjBmOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IF9fZXhwZihpbnB1dFtpZHggKiBuICsgaV0gLSBtYXhfdmFsKTsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSBleHBfdmFsOw0KICAgICAgICAgICAgc3VtICs9IGV4cF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSBvdXRwdXRbaWR4ICogbiArIGldIC8gc3VtOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgc29mdG1heF9mcDMyX2ZwMTYoY29uc3QgZmxvYXQgKmlucHV0LCBfX2hhbGYgKm91dHB1dCwgaW50IG0sIGludCBuKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIF9faGFsZiB2YWwgPSBfX2Zsb2F0MmhhbGYoaW5wdXRbaWR4ICogbiArIGldKTsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSB2YWw7DQogICAgICAgICAgICBtYXhfdmFsID0gX19oZ3QodmFsLCBtYXhfdmFsKSA/IHZhbCA6IG1heF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgc3VtID0gMC4wZjsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IGV4cF92YWwgPSBfX2V4cGYoX19oYWxmMmZsb2F0KG91dHB1dFtpZHggKiBuICsgaV0pIC0gX19oYWxmMmZsb2F0KG1heF92YWwpKTsNCiAgICAgICAgICAgIHN1bSArPSBleHBfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gX19leHBmKF9faGFsZjJmbG9hdChvdXRwdXRbaWR4ICogbiArIGldKSAtIF9faGFsZjJmbG9hdChtYXhfdmFsKSk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gX19mbG9hdDJoYWxmKGV4cF92YWwgLyBzdW0pOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wa19mcDMyKGNvbnN0IGZsb2F0ICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0sIGludCBuLCBpbnQgaykgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIC8vIEZpbmQgdG9wLWsgaW5kaWNlcyBmb3Igcm93IGlkeA0KICAgICAgICAvLyBTaW1wbGUgc2VsZWN0aW9uIHNvcnQgZm9yIHNtYWxsIGsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIHsNCiAgICAgICAgICAgIGZsb2F0IG1heF92YWwgPSAtSU5GSU5JVFk7DQogICAgICAgICAgICBpbnQgbWF4X2lkeCA9IC0xOw0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opIHsNCiAgICAgICAgICAgICAgICBpZiAoaW5wdXRbaWR4ICogbiArIGpdID4gbWF4X3ZhbCkgew0KICAgICAgICAgICAgICAgICAgICBpbnQgZm91bmQgPSAwOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGk7ICsrbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBsXSA9PSBqKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfdmFsID0gaW5wdXRbaWR4ICogbiArIGpdOw0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lkeCA9IGo7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0b3BfaW5kaWNlc1tpZHggKiBrICsgaV0gPSBtYXhfaWR4Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wa19mcDE2KGNvbnN0IF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbSkgew0KICAgICAgICAvLyBGaW5kIHRvcC1rIGluZGljZXMgZm9yIHJvdyBpZHgNCiAgICAgICAgLy8gU2ltcGxlIHNlbGVjdGlvbiBzb3J0IGZvciBzbWFsbCBrDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7DQogICAgICAgICAgICBfX2hhbGYgbWF4X3ZhbCA9IF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpOw0KICAgICAgICAgICAgaW50IG1heF9pZHggPSAtMTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7DQogICAgICAgICAgICAgICAgaWYgKF9faGd0KGlucHV0W2lkeCAqIG4gKyBqXSwgbWF4X3ZhbCkpIHsNCiAgICAgICAgICAgICAgICAgICAgaW50IGZvdW5kID0gMDsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBpOyArK2wpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BfaW5kaWNlc1tpZHggKiBrICsgbF0gPT0gaikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IGlucHV0W2lkeCAqIG4gKyBqXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pZHggPSBqOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdG9wX2luZGljZXNbaWR4ICogayArIGldID0gbWF4X2lkeDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleChpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKnRva2VuX2luZGV4LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbnJlKSB7DQogICAgICAgIGludCBjb3VudCA9IDA7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICAgICAgaWYgKHRvcF9pbmRpY2VzW2kgKiBlcHQgKyBqXSA9PSBpZHgpIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5faW5kZXhbaWR4ICogbiArIGNvdW50XSA9IGk7DQogICAgICAgICAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpICogZXB0ICsgal0gPSBjb3VudDsNCiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5fY291bnRbaWR4XSA9IGNvdW50Ow0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9vZmZzZXQoaW50ICp0b2tlbl9jb3VudCwgaW50ICpleHBlcnRfb2Zmc2V0LCBpbnQgbnJlKSB7DQogICAgaW50IG9mZnNldCA9IDA7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7ICsraSkgew0KICAgICAgICBleHBlcnRfb2Zmc2V0W2ldID0gb2Zmc2V0Ow0KICAgICAgICBvZmZzZXQgKz0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcmVvcmRlcl9pbnB1dChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfb2Zmc2V0W2V4cGVydF9pZF0gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lng7IGogPCBkaDsgaiArPSA2NCkgew0KICAgICAgICAgICAgICAgIGlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdID0gaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHNpbHVfZ2F0ZV9tdWxfdXAoZmxvYXQgKmdhdGUsIGZsb2F0ICp1cCwgX19oYWxmICpoaWRkZW4sIGludCBuLCBpbnQgZGUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlOyArK2kpIHsNCiAgICAgICAgICAgIGZsb2F0IGdhdGVfdmFsID0gZ2F0ZVtpZHggKiBkZSArIGldOw0KICAgICAgICAgICAgZmxvYXQgc2lsdV92YWwgPSBnYXRlX3ZhbCAqICgxLjBmIC8gKDEuMGYgKyBfX2V4cGYoLWdhdGVfdmFsKSkpOw0KICAgICAgICAgICAgaGlkZGVuW2lkeCAqIGRlICsgaV0gPSBfX2Zsb2F0MmhhbGYoc2lsdV92YWwgKiB1cFtpZHggKiBkZSArIGldKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHBhY2tfb3V0cHV0KGZsb2F0ICpvdXRwdXRfZG93biwgX19oYWxmICpvdXRwdXRfcHRyLCBjb25zdCBfX2hhbGYgKnNjb3JlLCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSwgaW50IG5zZSwgaW50IGRoKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4Lng7DQogICAgaWYgKGlkeCA8IG4pIHsNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54OyBqIDwgZGg7IGogKz0gNjQpIHsNCiAgICAgICAgICAgIGZsb2F0IHJlc3VsdCA9IDAuMGY7DQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICAgICAgaW50IGV4cGVydF9pZCA9IHRvcF9pbmRpY2VzW2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9vZmZzZXRbZXhwZXJ0X2lkXSArIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgICAgICByZXN1bHQgKz0gX19oYWxmMmZsb2F0KHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF0pICogb3V0cHV0X2Rvd25bdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7ICsraSkgew0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBvdXRwdXRfZG93blsobiAqIChlcHQgKyBpKSArIGlkeCkgKiBkaCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gX19mbG9hdDJoYWxmKHJlc3VsdCk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCnZvaWQgaGdlbW1fbWtfa25fbW5fZnAxNmFjYyhoaXBibGFzSGFuZGxlX3QgaGFuZGxlLA0KICAgIF9faGFsZiAqYSwgX19oYWxmICpiLCBfX2hhbGYgKmMsIGludCBtLCBpbnQgbiwgaW50IGssIF9faGFsZiAqYWxwaGEsIF9faGFsZiAqYmV0YSkgew0KDQogICAgaGlwYmxhc0hnZW1tKGhhbmRsZSwgSElQQkxBU19PUF9OLCBISVBCTEFTX09QX04sIG4sIG0sIGssDQogICAgICAgIChjb25zdCBoaXBibGFzSGFsZiAqKWFscGhhLCAoY29uc3QgaGlwYmxhc0hhbGYgKiliLCBuLCAoY29uc3QgaGlwYmxhc0hhbGYgKilhLCBrLA0KICAgICAgICAoY29uc3QgaGlwYmxhc0hhbGYgKiliZXRhLCAoaGlwYmxhc0hhbGYgKiljLCBuKTsNCn0NCg0Kdm9pZCBoZ2VtbV9ta19ua19tbl9mcDE2YWNjKGhpcGJsYXNIYW5kbGVfdCBoYW5kbGUsDQogICAgX19oYWxmICphLCBfX2hhbGYgKmIsIF9faGFsZiAqYywgaW50IG0sIGludCBuLCBpbnQgaywgX19oYWxmICphbHBoYSwgX19oYWxmICpiZXRhKSB7DQoNCiAgICBoaXBibGFzSGdlbW0oaGFuZGxlLCBISVBCTEFTX09QX1QsIEhJUEJMQVNfT1BfTiwgbiwgbSwgaywNCiAgICAgICAgKGNvbnN0IGhpcGJsYXNIYWxmICopYWxwaGEsIChjb25zdCBoaXBibGFzSGFsZiAqKWIsIGssIChjb25zdCBoaXBibGFzSGFsZiAqKWEsIGssDQogICAgICAgIChjb25zdCBoaXBibGFzSGFsZiAqKWJldGEsIChoaXBibGFzSGFsZiAqKWMsIG4pOw0KfQ0KDQp2b2lkIGhnZW1tX21rX2tuX21uX2ZwMzJhY2MoaGlwYmxhc0hhbmRsZV90IGhhbmRsZSwNCiAgICBfX2hhbGYgKmEsIF9faGFsZiAqYiwgZmxvYXQgKmMsIGludCBtLCBpbnQgbiwgaW50IGssIGZsb2F0ICphbHBoYSwgZmxvYXQgKmJldGEpIHsNCg0KICAgIGhpcGJsYXNHZW1tRXgoaGFuZGxlLCBISVBCTEFTX09QX04sIEhJUEJMQVNfT1BfTiwgbiwgbSwgaywNCiAgICAgICAgYWxwaGEsIChjb25zdCBoaXBibGFzSGFsZiAqKWIsIEhJUF9SXzE2RiwgbiwgKGNvbnN0IGhpcGJsYXNIYWxmICopYSwgSElQX1JfMTZGLCBrLA0KICAgICAgICBiZXRhLCBjLCBISVBfUl8zMkYsIG4sIEhJUEJMQVNfQ09NUFVURV8zMkYsIEhJUEJMQVNfR0VNTV9ERUZBVUxUKTsNCn0NCg0Kdm9pZCBoZ2VtbV9ta19ua19tbl9mcDMyYWNjKGhpcGJsYXNIYW5kbGVfdCBoYW5kbGUsDQogICAgX19oYWxmICphLCBfX2hhbGYgKmIsIGZsb2F0ICpjLCBpbnQgbSwgaW50IG4sIGludCBrLCBmbG9hdCAqYWxwaGEsIGZsb2F0ICpiZXRhKSB7DQoNCiAgICBoaXBibGFzR2VtbUV4KGhhbmRsZSwgSElQQkxBU19PUF9ULCBISVBCTEFTX09QX04sIG4sIG0sIGssDQogICAgICAgIGFscGhhLCAoY29uc3QgaGlwYmxhc0hhbGYgKiliLCBISVBfUl8xNkYsIGssIChjb25zdCBoaXBibGFzSGFsZiAqKWEsIEhJUF9SXzE2RiwgaywNCiAgICAgICAgYmV0YSwgYywgSElQX1JfMzJGLCBuLCBISVBCTEFTX0NPTVBVVEVfMzJGLCBISVBCTEFTX0dFTU1fREVGQVVMVCk7DQp9DQoNCnZvaWQgc2dlbW1fbWtfa25fbW5fZnAzMmFjYyhoaXBibGFzSGFuZGxlX3QgaGFuZGxlLA0KICAgIGZsb2F0ICphLCBmbG9hdCAqYiwgZmxvYXQgKmMsIGludCBtLCBpbnQgbiwgaW50IGssIGZsb2F0ICphbHBoYSwgZmxvYXQgKmJldGEpIHsNCg0KICAgIGhpcGJsYXNTZ2VtbShoYW5kbGUsIEhJUEJMQVNfT1BfTiwgSElQQkxBU19PUF9OLCBuLCBtLCBrLA0KICAgICAgICBhbHBoYSwgKGNvbnN0IGZsb2F0ICopYiwgbiwgKGNvbnN0IGZsb2F0ICopYSwgaywNCiAgICAgICAgYmV0YSwgYywgbik7DQp9DQoNCnZvaWQgc2dlbW1fbWtfbmtfbW5fZnAzMmFjYyhoaXBibGFzSGFuZGxlX3QgaGFuZGxlLA0KICAgIGZsb2F0ICphLCBmbG9hdCAqYiwgZmxvYXQgKmMsIGludCBtLCBpbnQgbiwgaW50IGssIGZsb2F0ICphbHBoYSwgZmxvYXQgKmJldGEpIHsNCg0KICAgIGhpcGJsYXNTZ2VtbShoYW5kbGUsIEhJUEJMQVNfT1BfVCwgSElQQkxBU19PUF9OLCBuLCBtLCBrLA0KICAgICAgICBhbHBoYSwgKGNvbnN0IGZsb2F0ICopYiwgbiwgKGNvbnN0IGZsb2F0ICopYSwgaywNCiAgICAgICAgYmV0YSwgYywgbik7DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCB0cmFuc3Bvc2VfZXhwZXJ0X2ZwMTZfNjR4NjQoDQogICAgICAgIGludCBuX2V4cGVydHMsIGludCBtLCBpbnQgbiwgaGFsZiogX19yZXN0cmljdF9fIGRzdCwgaGFsZiogX19yZXN0cmljdF9fIHNyYykgew0KDQogICAgdXNpbmcgaGFsZjggPSBfX2ZwMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX2UgPSBibG9ja0lkeC56Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiA2NDsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX20gPSB0aHJlYWRJZHgueCAvIDg7DQogICAgaW50IHRocmVhZF9uID0gKHRocmVhZElkeC54ICUgOCkgKiA4Ow0KDQogICAgX19zaGFyZWRfXyBjaGFyIHNtZW1bNjRdWzEyOV07DQoNCiAgICBoYWxmOCBkYXRhWzhdOw0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7DQogICAgICAgIGRhdGFbaV0gPSAqKGhhbGY4ICopJnNyY1t0aHJlYWRfYmxvY2tfZSAqIG0gKiBuICsNCiAgICAgICAgICAgICh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tICsgaSo4KSAqIG4gKyB0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9uXTsNCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspIHsNCiAgICAgICAgICAgICooX19mcDE2ICopJnNtZW1bdGhyZWFkX24gKyBqXVsodGhyZWFkX20gKyA4KmkpICogMl0gPSBkYXRhW2ldW2pdOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgKihoYWxmOCAqKSZkc3RbdGhyZWFkX2Jsb2NrX2UgKiBtICogbiArDQogICAgICAgICAgICAodGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbSArIGkqOCkgKiBtICsgdGhyZWFkX2Jsb2NrX20gKyB0aHJlYWRfbl0gPQ0KICAgICAgICAgICAgKihoYWxmOCAqKSZzbWVtW3RocmVhZF9tICsgOCppXVt0aHJlYWRfbioyXTsNCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBtb2VfaGdlbW1fMTI4eDEyOHg2NCgNCiAgICBjb25zdCBoYWxmICphX3B0ciwgY29uc3QgaGFsZiAqYl9wdHIsIGZsb2F0ICpjX3B0ciwgaW50IG5yZSwgaW50ICp0b2tlbl9jb3VudCwgaW50ICpleHBlcnRfb2Zmc2V0LCBpbnQgTiwgaW50IEspIHsNCg0KICAgIHVzaW5nIGZsb2F0MTYgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7DQogICAgdXNpbmcgaGFsZjQgPSBfX2ZwMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgdHlwZWRlZiBzdHJ1Y3Qgew0KICAgICAgICBoYWxmNCB4Ow0KICAgICAgICBoYWxmNCB5Ow0KICAgIH0gaGFsZjR4MjsNCg0KICAgIGNvbnN0IGludCBNID0gdG9rZW5fY291bnRbYmxvY2tJZHguel07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQogICAgaWYgKHRocmVhZF9ibG9ja19tID49IE0pIHJldHVybjsNCg0KICAgIGNvbnN0IGhhbGYgKmEgPSBhX3B0ciArIGV4cGVydF9vZmZzZXRbYmxvY2tJZHguel0gKiBLOw0KICAgIGNvbnN0IGhhbGYgKmIgPSBiX3B0ciArIGJsb2NrSWR4LnogKiBOICogSzsNCiAgICBmbG9hdCAqYyA9IGNfcHRyICsgZXhwZXJ0X29mZnNldFtibG9ja0lkeC56XSAqIE47DQoNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19hWzEyOF1bNjRdOw0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2JbMTI4XVs2NF07DQoNCiAgICBpbnQgd2FycF9tID0gKHRocmVhZElkeC55IC8gMikgKiA2NDsNCiAgICBpbnQgd2FycF9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9IHRocmVhZElkeC54ICUgMzI7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX21uID0gdGhyZWFkSWR4LnkgKiA4ICsgdGhyZWFkSWR4LnggLyA4Ow0KICAgIGludCBzdHNfayA9ICh0aHJlYWRJZHgueCAlIDgpICogODsgLy8gYnkgaGFsZg0KICAgIGludCBsZGdfbSA9IHRocmVhZF9ibG9ja19tICsgc3RzX21uOw0KICAgIGludCBsZGdfbiA9IHRocmVhZF9ibG9ja19uICsgc3RzX21uOw0KICAgIGludCBsZGdfayA9IHN0c19rOw0KDQogICAgLy8gTERTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IGxkc19tID0gd2FycF9tICsgdGhyZWFkSWR4LnggJSAzMjsNCiAgICBpbnQgbGRzX24gPSB3YXJwX24gKyB0aHJlYWRJZHgueCAlIDMyOw0KICAgIGludCBsZHNfayA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7IC8vIGJ5IGhhbGYNCg0KICAgIC8vIEMmRCBQYXJhbWV0ZXJzDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNiB0aWxlX2RbMl1bMl0gPSB7MH07DQoNCiAgICBmb3IgKGludCBpYiA9IDA7IGliIDwgSy82NDsgaWIrKykgew0KICAgICAgICBoYWxmNHgyIGxkZ19hWzRdLCBsZGdfYls0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsNCiAgICAgICAgICAgIGxkZ19hW2lpXSA9IGxkZ19tICsgaWkqMzIgPCBNID8gKihoYWxmNHgyICopJmFbT0ZGU0VUKGxkZ19tICsgaWkqMzIsIGxkZ19rICsgaWIqNjQsIEspXSA6IGhhbGY0eDJ7MCwgMH07DQogICAgICAgICAgICBsZGdfYltpaV0gPSBsZGdfbiArIGlpKjMyIDwgTiA/ICooaGFsZjR4MiAqKSZiW09GRlNFVChsZGdfbiArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV0gOiBoYWxmNHgyezAsIDB9Ow0KICAgICAgICAgICAgLy8gbGRnX2FbaWldID0gKihoYWxmNHgyICopJmFbT0ZGU0VUKGxkZ19tICsgaWkqMzIsIGxkZ19rICsgaWIqNjQsIEspXTsNCiAgICAgICAgICAgIC8vIGxkZ19iW2lpXSA9ICooaGFsZjR4MiAqKSZiW09GRlNFVChsZGdfbiArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV07DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgNDsgaWkrKykgew0KICAgICAgICAgICAgKihoYWxmNCAqKSZzX2Fbc3RzX21uICsgaWkqMzJdW1NXWihzdHNfbW4sIHN0c19rICAgICldID0gbGRnX2FbaWldLng7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYVtzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgKyA0KV0gPSBsZGdfYVtpaV0ueTsNCiAgICAgICAgICAgICooaGFsZjQgKikmc19iW3N0c19tbiArIGlpKjMyXVtTV1ooc3RzX21uLCBzdHNfayAgICApXSA9IGxkZ19iW2lpXS54Ow0KICAgICAgICAgICAgKihoYWxmNCAqKSZzX2Jbc3RzX21uICsgaWkqMzJdW1NXWihzdHNfbW4sIHN0c19rICsgNCldID0gbGRnX2JbaWldLnk7DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgaGFsZjQgdGlsZV9hWzJdWzhdLCB0aWxlX2JbMl1bOF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgODsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihoYWxmNCAqKSZzX2FbbGRzX20gKyBpaSozMl1bU1daKGxkc19tLCBsZHNfayArIGtrKjgpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDg7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2JbaWldW2trXSA9ICooaGFsZjQgKikmc19iW2xkc19uICsgaWkqMzJdW1NXWihsZHNfbiwgbGRzX2sgKyBrayo4KV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDg7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDhmMTYodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCB0aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGxsID0gMDsgbGwgPCA0OyBsbCsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSozMiArIGtrKjggKyBsbCA8IE0pDQogICAgICAgICAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSozMiArIGtrKjggKyBsbCkgKiBOICsgY19uICsgamoqMzJdID0gdGlsZV9kW2lpXVtqal1ba2sqNCArIGxsXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjQoDQogICAgY29uc3QgaGFsZiAqYV9wdHIsIGNvbnN0IGhhbGYgKmJfcHRyLCBmbG9hdCAqY19wdHIsIGludCBicywgaW50IE0sIGludCBOLCBpbnQgSykgew0KDQogICAgdXNpbmcgZmxvYXQxNiA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsNCiAgICB1c2luZyBoYWxmNCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICB0eXBlZGVmIHN0cnVjdCB7DQogICAgICAgIGhhbGY0IHg7DQogICAgICAgIGhhbGY0IHk7DQogICAgfSBoYWxmNHgyOw0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgYmxvY2tJZHgueiAqIE0gKiBLOw0KICAgIGNvbnN0IGhhbGYgKmIgPSBiX3B0ciArIGJsb2NrSWR4LnogKiBOICogSzsNCiAgICBmbG9hdCAqYyA9IGNfcHRyICsgYmxvY2tJZHgueiAqIE0gKiBOOw0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19tbiA9IHRocmVhZElkeC55ICogOCArIHRocmVhZElkeC54IC8gODsNCiAgICBpbnQgc3RzX2sgPSAodGhyZWFkSWR4LnggJSA4KSAqIDg7IC8vIGJ5IGhhbGYNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhcnBfbSArIHRocmVhZElkeC54ICUgMzI7DQogICAgaW50IGxkc19uID0gd2FycF9uICsgdGhyZWFkSWR4LnggJSAzMjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAzMikgKiA0OyAvLyBieSBoYWxmDQoNCiAgICAvLyBDJkQgUGFyYW1ldGVycw0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhcnBfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2FycF9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGZsb2F0MTYgdGlsZV9kWzJdWzJdID0gezB9Ow0KDQogICAgZm9yIChpbnQgaWIgPSAwOyBpYiA8IEsvNjQ7IGliKyspIHsNCiAgICAgICAgaGFsZjR4MiBsZGdfYVs0XSwgbGRnX2JbNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7DQogICAgICAgICAgICBsZGdfYVtpaV0gPSBsZGdfbSArIGlpKjMyIDwgTSA/ICooaGFsZjR4MiAqKSZhW09GRlNFVChsZGdfbSArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV0gOiBoYWxmNHgyezAsIDB9Ow0KICAgICAgICAgICAgbGRnX2JbaWldID0gbGRnX24gKyBpaSozMiA8IE4gPyAqKGhhbGY0eDIgKikmYltPRkZTRVQobGRnX24gKyBpaSozMiwgbGRnX2sgKyBpYio2NCwgSyldIDogaGFsZjR4MnswLCAwfTsNCiAgICAgICAgICAgIC8vIGxkZ19hW2lpXSA9ICooaGFsZjR4MiAqKSZhW09GRlNFVChsZGdfbSArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV07DQogICAgICAgICAgICAvLyBsZGdfYltpaV0gPSAqKGhhbGY0eDIgKikmYltPRkZTRVQobGRnX24gKyBpaSozMiwgbGRnX2sgKyBpYio2NCwgSyldOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsNCiAgICAgICAgICAgICooaGFsZjQgKikmc19hW3N0c19tbiArIGlpKjMyXVtTV1ooc3RzX21uLCBzdHNfayAgICApXSA9IGxkZ19hW2lpXS54Ow0KICAgICAgICAgICAgKihoYWxmNCAqKSZzX2Fbc3RzX21uICsgaWkqMzJdW1NXWihzdHNfbW4sIHN0c19rICsgNCldID0gbGRnX2FbaWldLnk7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYltzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgICAgKV0gPSBsZGdfYltpaV0ueDsNCiAgICAgICAgICAgICooaGFsZjQgKikmc19iW3N0c19tbiArIGlpKjMyXVtTV1ooc3RzX21uLCBzdHNfayArIDQpXSA9IGxkZ19iW2lpXS55Ow0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGhhbGY0IHRpbGVfYVsyXVs4XSwgdGlsZV9iWzJdWzhdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDg7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2FbaWldW2trXSA9ICooaGFsZjQgKikmc19hW2xkc19tICsgaWkqMzJdW1NXWihsZHNfbSwgbGRzX2sgKyBrayo4KV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA4OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2lpXVtra10gPSAqKGhhbGY0ICopJnNfYltsZHNfbiArIGlpKjMyXVtTV1oobGRzX24sIGxkc19rICsga2sqOCldOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA4OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMng4ZjE2KHRpbGVfYVtpaV1ba2tdLCB0aWxlX2JbampdW2trXSwgdGlsZV9kW2lpXVtqal0sIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBsbCA9IDA7IGxsIDwgNDsgbGwrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMzIgKyBrayo4ICsgbGwgPCBNKQ0KICAgICAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSA9IHRpbGVfZFtpaV1bampdW2trKjQgKyBsbF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQp2b2lkIG1vZSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9yb3V0ZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZV9ULCB0b3JjaDo6VGVuc29yIHRfdXBfVCwgdG9yY2g6OlRlbnNvciB0X2Rvd25fVCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfdXAsIHRvcmNoOjpUZW5zb3IgdF9kb3duLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMzIsIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDE2LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLCB0b3JjaDo6VGVuc29yIHRfdG9rZW5fY291bnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9rZW5faW5kZXgsIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfdXAsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pIHsNCg0KICAgICAgICBpZiAoZGggJSAxMjggIT0gMCB8fCBkZSAlIDEyOCAhPSAwKSByZXR1cm47DQoNCiAgICAgICAgdXNpbmcgdWludDY0X3QgPSB1bnNpZ25lZCBsb25nIGxvbmc7DQoNCiAgICAgICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgICAgICBfX2hhbGYgKnJvdXRlcl9wdHIgID0gKF9faGFsZiAqKXRfcm91dGVyLmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlLCBkaF0NCiAgICAgICAgX19oYWxmICpnYXRlX1RfcHRyICA9IChfX2hhbGYgKil0X2dhdGVfVC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgICAgICBfX2hhbGYgKnVwX1RfcHRyICAgID0gKF9faGFsZiAqKXRfdXBfVC5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgICAgIF9faGFsZiAqZG93bl9UX3B0ciAgPSAoX19oYWxmICopdF9kb3duX1QuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICAgICAgX19oYWxmICpnYXRlX3B0ciAgICA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgICAgICBfX2hhbGYgKnVwX3B0ciAgICAgID0gKF9faGFsZiAqKXRfdXAuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgICAgIF9faGFsZiAqZG93bl9wdHIgICAgPSAoX19oYWxmICopdF9kb3duLmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICAgICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgICAgIGZsb2F0ICpzY29yZV9mcDMyID0gKGZsb2F0ICopdF9zY29yZV9mcDMyLmRhdGFfcHRyKCk7ICAgICAgICAgLy8gW24sIG5yZV0NCiAgICAgICAgX19oYWxmICpzY29yZV9mcDE2ID0gKF9faGFsZiAqKXRfc2NvcmVfZnAxNi5kYXRhX3B0cigpOyAgICAgICAvLyBbbiwgbnJlXQ0KICAgICAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgICAgIGludCAqdG9rZW5fY291bnQgPSAoaW50ICopdF90b2tlbl9jb3VudC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZV0NCiAgICAgICAgaW50ICp0b2tlbl9pbmRleCA9IChpbnQgKil0X3Rva2VuX2luZGV4LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlLCBuXQ0KICAgICAgICBpbnQgKmluZGV4X2luX2V4cGVydCA9IChpbnQgKil0X2luZGV4X2luX2V4cGVydC5kYXRhX3B0cigpOyAgIC8vIFtuLCBlcHRdDQogICAgICAgIGludCAqZXhwZXJ0X29mZnNldCA9IChpbnQgKil0X2V4cGVydF9vZmZzZXQuZGF0YV9wdHIoKTsgICAgICAgLy8gW25yZV0NCiAgICAgICAgX19oYWxmICppbnB1dF9yZW9yZGVyID0gKF9faGFsZiAqKXRfaW5wdXRfcmVvcmRlci5kYXRhX3B0cigpOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgICAgIGZsb2F0ICpvdXRwdXRfZ2F0ZSA9IChmbG9hdCAqKXRfb3V0cHV0X2dhdGUuZGF0YV9wdHIoKTsgICAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgICAgIGZsb2F0ICpvdXRwdXRfdXAgPSAoZmxvYXQgKil0X291dHB1dF91cC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgICAgIF9faGFsZiAqaGlkZGVuID0gKF9faGFsZiAqKXRfaGlkZGVuLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgICAgIGZsb2F0ICpvdXRwdXRfZG93biA9IChmbG9hdCAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGhdDQoNCiAgICAgICAgLy8gdHJhbnNwb3NlDQogICAgICAgIHRyYW5zcG9zZV9leHBlcnRfZnAxNl82NHg2NDw8PGRpbTMoZGgvNjQsIGRlLzY0LCBucmUgKyBuc2UpLCBkaW0zKDY0KT4+PihucmUgKyBuc2UsIGRoLCBkZSwgZ2F0ZV9wdHIsIGdhdGVfVF9wdHIpOw0KICAgICAgICB0cmFuc3Bvc2VfZXhwZXJ0X2ZwMTZfNjR4NjQ8PDxkaW0zKGRoLzY0LCBkZS82NCwgbnJlICsgbnNlKSwgZGltMyg2NCk+Pj4obnJlICsgbnNlLCBkaCwgZGUsIHVwX3B0ciAgLCB1cF9UX3B0ciAgKTsNCiAgICAgICAgdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkZS82NCwgZGgvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGUsIGRoLCBkb3duX3B0ciwgZG93bl9UX3B0cik7DQoNCiAgICAgICAgaGlwYmxhc0hhbmRsZV90IGhhbmRsZTsNCiAgICAgICAgaGlwYmxhc0NyZWF0ZSgmaGFuZGxlKTsNCiAgICAgICAgZmxvYXQgYWxwaGFfZnAzMiA9IDEuMGYsIGJldGFfZnAzMiA9IDAuMGY7DQogICAgICAgIF9faGFsZiBhbHBoYV9mcDE2ID0gX19mbG9hdDJoYWxmKDEuMGYpLCBiZXRhX2ZwMTYgPSBfX2Zsb2F0MmhhbGYoMC4wZik7DQogICAgICAgIC8vIGhpcGJsYXNIZ2VtbToNCiAgICAgICAgLy8gMS4gYSBbbSwga10sIGJbaywgbl0sIGNbbSwgbl0NCiAgICAgICAgLy8gICAgSElQQkxBU19PUF9OLCBISVBCTEFTX09QX04sIG4sIG0sIGssIGFscGhhLCBiLCBuLCBhLCBrLCBiZXRhLCBjLCBuDQogICAgICAgIC8vIDIuIGEgW20sIGtdLCBiW24sIGtdLCBjW20sIG5dDQogICAgICAgIC8vICAgIEhJUEJMQVNfT1BfVCwgSElQQkxBU19PUF9OLCBuLCBtLCBrLCBhbHBoYSwgYiwgaywgYSwgaywgYmV0YSwgYywgbg0KDQogICAgICAgIC8vIGV4cGVydCBzY29yZQ0KICAgICAgICAvLyBmbG9hdCAqc2NvcmVfZnAzMjsgLy8gW24sIG5yZV0NCiAgICAgICAgLy8gaGlwTWFsbG9jKCh2b2lkKiopJnNjb3JlX2ZwMzIsIG4gKiBucmUgKiBzaXplb2YoZmxvYXQpKTsNCiAgICAgICAgLy8gaW5wdXRfcHRyIFtuLCBkaF0gQCByb3V0ZXJfcHRyIFtucmUsIGRoXSAtPiBzY29yZSBbbiwgbnJlXSwgTSA9IG4sIE4gPSBucmUsIEsgPSBkaA0KICAgICAgICBoZ2VtbV9ta19ua19tbl9mcDMyYWNjKGhhbmRsZSwgaW5wdXRfcHRyLCByb3V0ZXJfcHRyLCBzY29yZV9mcDMyLCBuLCBucmUsIGRoLCAmYWxwaGFfZnAzMiwgJmJldGFfZnAzMik7DQogICAgICAgIC8vIF9faGFsZiAqc2NvcmVfZnAxNjsgLy8gW24sIG5yZV0NCiAgICAgICAgLy8gaGlwTWFsbG9jKCh2b2lkKiopJnNjb3JlX2ZwMTYsIG4gKiBucmUgKiBzaXplb2YoX19oYWxmKSk7DQogICAgICAgIHNvZnRtYXhfZnAzMl9mcDE2PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZV9mcDMyLCBzY29yZV9mcDE2LCBuLCBucmUpOw0KDQogICAgICAgIC8vIHRvcGsgc2NvcmUNCiAgICAgICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0NCiAgICAgICAgLy8gaGlwTWFsbG9jKCh2b2lkKiopJnRvcF9pbmRpY2VzLCBuICogZXB0ICogc2l6ZW9mKGludCkpOw0KICAgICAgICB0b3BrX2ZwMTY8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHNjb3JlX2ZwMTYsIHRvcF9pbmRpY2VzLCBuLCBucmUsIGVwdCk7DQoNCiAgICAgICAgLy8gdG9rZW4gY291bnQgb2YgZWFjaCBleHBlcnQNCiAgICAgICAgLy8gaW50ICp0b2tlbl9jb3VudDsgLy8gW25yZV0NCiAgICAgICAgLy8gaGlwTWFsbG9jKCh2b2lkKiopJnRva2VuX2NvdW50LCBucmUgKiBzaXplb2YoaW50KSk7DQoNCiAgICAgICAgLy8gdG9rZW4gaW5kZXggb2YgZWFjaCBleHBlcnQsIGkgLT4gdG9rZW5faWQNCiAgICAgICAgLy8gaW50ICp0b2tlbl9pbmRleDsgLy8gW25yZSwgbl0NCiAgICAgICAgLy8gaGlwTWFsbG9jKCh2b2lkKiopJnRva2VuX2luZGV4LCBucmUgKiBuICogc2l6ZW9mKGludCkpOw0KDQogICAgICAgIC8vIGluZGV4IGluIGV4cGVydCBvZiBlYWNoIHRva2VuLCBpIC0+IGV4cGVydCB0b2tlbiBpbmRleA0KICAgICAgICAvLyBpbnQgKmluZGV4X2luX2V4cGVydDsgLy8gW24sIGVwdF0NCiAgICAgICAgLy8gaGlwTWFsbG9jKCh2b2lkKiopJmluZGV4X2luX2V4cGVydCwgbiAqIGVwdCAqIHNpemVvZihpbnQpKTsNCiAgICAgICAgY2FsY3VsYXRlX2luZGV4PDw8ZGltMygobnJlKzYzKS82NCksIGRpbTMoNjQpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgdG9rZW5faW5kZXgsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUpOw0KICAgICAgICBoaXBEZXZpY2VTeW5jaHJvbml6ZSgpOyAvLyBiZWNhdXNlIHRva2VuX2NvdW50IGlzIHVzZWQgYnkgaG9zdCBjb2RlDQoNCiAgICAgICAgLy8gZXhwZXJ0IG9mZnNldA0KICAgICAgICAvLyBpbnQgKmV4cGVydF9vZmZzZXQ7IC8vIFtucmVdDQogICAgICAgIC8vIGhpcE1hbGxvYygodm9pZCoqKSZleHBlcnRfb2Zmc2V0LCBucmUgKiBzaXplb2YoaW50KSk7DQogICAgICAgIGNhbGN1bGF0ZV9vZmZzZXQ8PDxkaW0zKDEpLCBkaW0zKDEpPj4+KHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBucmUpOw0KDQogICAgICAgIC8vIHJlb3JkZXIgaW5wdXQNCiAgICAgICAgLy8gX19oYWxmICppbnB1dF9yZW9yZGVyOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgICAgIC8vIGhpcE1hbGxvYygodm9pZCoqKSZpbnB1dF9yZW9yZGVyLCBuICogZXB0ICogZGggKiBzaXplb2YoX19oYWxmKSk7DQogICAgICAgIHJlb3JkZXJfaW5wdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBleHBlcnRfb2Zmc2V0LCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQoNCiAgICAgICAgaW50IG1heF90b2tlbl9jb3VudCA9IDA7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgICAgIGlmICh0b2tlbl9jb3VudFtpXSA+IG1heF90b2tlbl9jb3VudCkgbWF4X3Rva2VuX2NvdW50ID0gdG9rZW5fY291bnRbaV07DQogICAgICAgIH0NCg0KICAgICAgICAvLyBnYXRlIG91dHB1dA0KICAgICAgICAvLyBmbG9hdCAqb3V0cHV0X2dhdGU7IC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgICAgICAvLyBoaXBNYWxsb2MoKHZvaWQqKikmb3V0cHV0X2dhdGUsIG4gKiAoZXB0ICsgbnNlKSAqIGRlICogc2l6ZW9mKGZsb2F0KSk7DQogICAgICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyArK2kpIHsNCiAgICAgICAgLy8gICAgIGhnZW1tX21rX25rX21uX2ZwMzJhY2MoaGFuZGxlLA0KICAgICAgICAvLyAgICAgICAgIGlucHV0X3Jlb3JkZXIgKyBleHBlcnRfb2Zmc2V0W2ldICogZGgsDQogICAgICAgIC8vICAgICAgICAgZ2F0ZV9wdHIgKyBpICogZGggKiBkZSwNCiAgICAgICAgLy8gICAgICAgICBvdXRwdXRfZ2F0ZSArIGV4cGVydF9vZmZzZXRbaV0gKiBkZSwNCiAgICAgICAgLy8gICAgICAgICB0b2tlbl9jb3VudFtpXSwgZGUsIGRoLCAmYWxwaGFfZnAzMiwgJmJldGFfZnAzMik7DQogICAgICAgIC8vIH0NCiAgICAgICAgLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7ICsraSkgew0KICAgICAgICAvLyAgICAgaGdlbW1fbWtfbmtfbW5fZnAzMmFjYyhoYW5kbGUsDQogICAgICAgIC8vICAgICAgICAgaW5wdXRfcHRyLA0KICAgICAgICAvLyAgICAgICAgIGdhdGVfcHRyICsgKG5yZSArIGkpICogZGggKiBkZSwNCiAgICAgICAgLy8gICAgICAgICBvdXRwdXRfZ2F0ZSArIChuICogKGVwdCArIGkpKSAqIGRlLA0KICAgICAgICAvLyAgICAgICAgIG4sIGRlLCBkaCwgJmFscGhhX2ZwMzIsICZiZXRhX2ZwMzIpOw0KICAgICAgICAvLyB9DQogICAgICAgIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkZS8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgICAgICAgICAoaW5wdXRfcmVvcmRlciwgZ2F0ZV9wdHIsIG91dHB1dF9nYXRlLCBucmUsIHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBkZSwgZGgpOw0KICAgICAgICBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjQ8PDxkaW0zKChuKzEyNykvMTI4LCBkZS8xMjgsIG5zZSksIGRpbTMoNjQsIDQpPj4+DQogICAgICAgICAgICAoaW5wdXRfcHRyLCBnYXRlX3B0ciArIG5yZSAqIGRoICogZGUsIG91dHB1dF9nYXRlICsgbiAqIGVwdCAqIGRlLCBuc2UsIG4sIGRlLCBkaCk7DQoNCiAgICAgICAgLy8gdXAgb3V0cHV0DQogICAgICAgIC8vIGZsb2F0ICpvdXRwdXRfdXA7IC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgICAgICAvLyBoaXBNYWxsb2MoKHZvaWQqKikmb3V0cHV0X3VwLCBuICogKGVwdCArIG5zZSkgKiBkZSAqIHNpemVvZihmbG9hdCkpOw0KICAgICAgICAvLyBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgKytpKSB7DQogICAgICAgIC8vICAgICBoZ2VtbV9ta19ua19tbl9mcDMyYWNjKGhhbmRsZSwNCiAgICAgICAgLy8gICAgICAgICBpbnB1dF9yZW9yZGVyICsgZXhwZXJ0X29mZnNldFtpXSAqIGRoLA0KICAgICAgICAvLyAgICAgICAgIHVwX3B0ciArIGkgKiBkaCAqIGRlLA0KICAgICAgICAvLyAgICAgICAgIG91dHB1dF91cCArIGV4cGVydF9vZmZzZXRbaV0gKiBkZSwNCiAgICAgICAgLy8gICAgICAgICB0b2tlbl9jb3VudFtpXSwgZGUsIGRoLCAmYWxwaGFfZnAzMiwgJmJldGFfZnAzMik7DQogICAgICAgIC8vIH0NCiAgICAgICAgLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7ICsraSkgew0KICAgICAgICAvLyAgICAgaGdlbW1fbWtfbmtfbW5fZnAzMmFjYyhoYW5kbGUsDQogICAgICAgIC8vICAgICAgICAgaW5wdXRfcHRyLA0KICAgICAgICAvLyAgICAgICAgIHVwX3B0ciArIChucmUgKyBpKSAqIGRoICogZGUsDQogICAgICAgIC8vICAgICAgICAgb3V0cHV0X3VwICsgKG4gKiAoZXB0ICsgaSkpICogZGUsDQogICAgICAgIC8vICAgICAgICAgbiwgZGUsIGRoLCAmYWxwaGFfZnAzMiwgJmJldGFfZnAzMik7DQogICAgICAgIC8vIH0NCiAgICAgICAgbW9lX2hnZW1tXzEyOHgxMjh4NjQ8PDxkaW0zKChtYXhfdG9rZW5fY291bnQrMTI3KS8xMjgsIGRlLzEyOCwgbnJlKSwgZGltMyg2NCwgNCk+Pj4NCiAgICAgICAgICAgIChpbnB1dF9yZW9yZGVyLCB1cF9wdHIsIG91dHB1dF91cCwgbnJlLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgZGUsIGRoKTsNCiAgICAgICAgYmF0Y2hlZF9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobisxMjcpLzEyOCwgZGUvMTI4LCBuc2UpLCBkaW0zKDY0LCA0KT4+Pg0KICAgICAgICAgICAgKGlucHV0X3B0ciwgdXBfcHRyICsgbnJlICogZGggKiBkZSwgb3V0cHV0X3VwICsgbiAqIGVwdCAqIGRlLCBuc2UsIG4sIGRlLCBkaCk7DQoNCiAgICAgICAgLy8gaGlkZGVuIHN0YXRlOiBzaWx1KG91dHB1dF9nYXRlKSAqIG91dHB1dF91cA0KICAgICAgICAvLyBfX2hhbGYgKmhpZGRlbjsgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgICAgIC8vIGhpcE1hbGxvYygodm9pZCoqKSZoaWRkZW4sIG4gKiAoZXB0ICsgbnNlKSAqIGRlICogc2l6ZW9mKF9faGFsZikpOw0KICAgICAgICBzaWx1X2dhdGVfbXVsX3VwPDw8ZGltMygobiAqIChlcHQgKyBuc2UpICsgNjMpIC8gNjQpLCBkaW0zKDY0KT4+PihvdXRwdXRfZ2F0ZSwgb3V0cHV0X3VwLCBoaWRkZW4sIG4gKiAoZXB0ICsgbnNlKSwgZGUpOw0KDQogICAgICAgIC8vIGRvd24gb3V0cHV0DQogICAgICAgIC8vIGZsb2F0ICpvdXRwdXRfZG93bjsgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGhdDQogICAgICAgIC8vIGhpcE1hbGxvYygodm9pZCoqKSZvdXRwdXRfZG93biwgbiAqIChlcHQgKyBuc2UpICogZGggKiBzaXplb2YoZmxvYXQpKTsNCiAgICAgICAgLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7ICsraSkgew0KICAgICAgICAvLyAgICAgaGdlbW1fbWtfbmtfbW5fZnAzMmFjYyhoYW5kbGUsDQogICAgICAgIC8vICAgICAgICAgaGlkZGVuICsgZXhwZXJ0X29mZnNldFtpXSAqIGRlLA0KICAgICAgICAvLyAgICAgICAgIGRvd25fcHRyICsgaSAqIGRlICogZGgsDQogICAgICAgIC8vICAgICAgICAgb3V0cHV0X2Rvd24gKyBleHBlcnRfb2Zmc2V0W2ldICogZGgsDQogICAgICAgIC8vICAgICAgICAgdG9rZW5fY291bnRbaV0sIGRoLCBkZSwgJmFscGhhX2ZwMzIsICZiZXRhX2ZwMzIpOw0KICAgICAgICAvLyB9DQogICAgICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgbnNlOyArK2kpIHsNCiAgICAgICAgLy8gICAgIGhnZW1tX21rX25rX21uX2ZwMzJhY2MoaGFuZGxlLA0KICAgICAgICAvLyAgICAgICAgIGhpZGRlbiArIChuICogKGVwdCArIGkpKSAqIGRlLA0KICAgICAgICAvLyAgICAgICAgIGRvd25fcHRyICsgKG5yZSArIGkpICogZGUgKiBkaCwNCiAgICAgICAgLy8gICAgICAgICBvdXRwdXRfZG93biArIChuICogKGVwdCArIGkpKSAqIGRoLA0KICAgICAgICAvLyAgICAgICAgIG4sIGRoLCBkZSwgJmFscGhhX2ZwMzIsICZiZXRhX2ZwMzIpOw0KICAgICAgICAvLyB9DQogICAgICAgIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkaC8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgICAgICAgICAoaGlkZGVuLCBkb3duX3B0ciwgb3V0cHV0X2Rvd24sIG5yZSwgdG9rZW5fY291bnQsIGV4cGVydF9vZmZzZXQsIGRoLCBkZSk7DQogICAgICAgIGJhdGNoZWRfaGdlbW1fMTI4eDEyOHg2NDw8PGRpbTMoKG4rMTI3KS8xMjgsIGRoLzEyOCwgbnNlKSwgZGltMyg2NCwgNCk+Pj4NCiAgICAgICAgICAgIChoaWRkZW4gKyBuICogZXB0ICogZGUsIGRvd25fcHRyICsgbnJlICogZGUgKiBkaCwgb3V0cHV0X2Rvd24gKyBuICogZXB0ICogZGgsIG5zZSwgbiwgZGgsIGRlKTsNCg0KICAgICAgICAvLyBwYWNrIG91dHB1dA0KICAgICAgICBwYWNrX291dHB1dDw8PGRpbTMobiksIGRpbTMoNjQpPj4+KG91dHB1dF9kb3duLCBvdXRwdXRfcHRyLCBzY29yZV9mcDE2LCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGV4cGVydF9vZmZzZXQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgpOw0KDQogICAgICAgIGhpcGJsYXNEZXN0cm95KGhhbmRsZSk7DQoNCiAgICAgICAgaGlwRGV2aWNlU3luY2hyb25pemUoKTsNCiAgICB9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdtb2UnLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnbW9lJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8zIiwgIi13Il0sDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQ0KDQogICAgZGggPSBjb25maWdbImRfaGlkZGVuIl0NCiAgICBkZSA9IGNvbmZpZ1siZF9leHBlcnQiXQ0KICAgIG5yZSA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdDQogICAgbnNlID0gY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0NCiAgICBlcHQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQ0KICAgIGJzID0gY29uZmlnWyJiYXRjaF9zaXplIl0NCiAgICBzbCA9IGNvbmZpZ1sic2VxX2xlbiJdDQoNCiAgICBpbnB1dCAgPSBpbnB1dF90ZW5zb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIHNsLCBkaF0NCiAgICByb3V0ZXIgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBkaF0NCiAgICBnYXRlX1QgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgdXBfVCAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkaCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIGRvd25fVCA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGUsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBnYXRlICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRlLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgdXAgICAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIGRvd24gICA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBvdXRwdXQgPSB0b3JjaC56ZXJvcyhicywgc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgIyBbYnMsIHNsLCBkaF0NCiAgICBmb3IgaSBpbiByYW5nZShucmUpOg0KICAgICAgICBnYXRlX1RbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQ0KICAgICAgICB1cF9UW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9UW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10NCiAgICBmb3IgaSBpbiByYW5nZShuc2UpOg0KICAgICAgICBnYXRlX1RbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIHVwX1RbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIGRvd25fVFtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J11baSAqIGRlOihpICsgMSkgKiBkZSwgOl0NCg0KICAgIHNjb3JlX2ZwMzIgPSB0b3JjaC5lbXB0eShicyAqIHNsICogbnJlLCBkdHlwZT10b3JjaC5mbG9hdDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAjIFticyAqIHNsLCBucmVdDQogICAgc2NvcmVfZnAxNiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBucmUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICAgICMgW2JzICogc2wsIG5yZV0NCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgdG9rZW5faW5kZXggPSB0b3JjaC5lbXB0eShucmUgKiBicyAqIHNsLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICMgW25yZSwgYnMgKiBzbF0NCiAgICBpbmRleF9pbl9leHBlcnQgPSB0b3JjaC5lbXB0eShicyAqIHNsICogZXB0LCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIGV4cGVydF9vZmZzZXQgPSB0b3JjaC5lbXB0eShucmUsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5wdXRfcmVvcmRlciA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICMgW2JzICogc2wgKiBlcHQsIGRoXQ0KICAgIG91dHB1dF9nYXRlID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGUsIGR0eXBlPXRvcmNoLmZsb2F0MzIsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF91cCA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGgsIGR0eXBlPXRvcmNoLmZsb2F0MzIsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRoXQ0KDQogICAgbW9kdWxlLm1vZShpbnB1dCwgcm91dGVyLCBnYXRlX1QsIHVwX1QsIGRvd25fVCwgZ2F0ZSwgdXAsIGRvd24sIG91dHB1dCwNCiAgICAgICAgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCB0b2tlbl9pbmRleCwgaW5kZXhfaW5fZXhwZXJ0LCBleHBlcnRfb2Zmc2V0LA0KICAgICAgICBpbnB1dF9yZW9yZGVyLCBvdXRwdXRfZ2F0ZSwgb3V0cHV0X3VwLCBoaWRkZW4sIG91dHB1dF9kb3duKQ0KICAgIHJldHVybiBvdXRwdXQ=Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Best evidence level for this revision: reported
JSON