Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 29643

KernelBot user 7 · 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.

amd-moe-submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-29643?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
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
5.37ms
#30 of 118
2025-05-31
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
12.2ms
#25 of 118
2025-05-31

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:3438651ddc33e39c09551ecd9033180f50a82dc4df5ffd6cf95decd1ad3f0e19
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

amd-moe-submission.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfdXAsIHRvcmNoOjpUZW5zb3IgdF9kb3duLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlLCB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9rZW5fY291bnQsIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pOw0KaW50IG1vZTIodG9yY2g6OlRlbnNvciB0X2lucHV0LCB0b3JjaDo6VGVuc29yIHRfcm91dGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bik7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCg0KX19nbG9iYWxfXyB2b2lkIHNvZnRtYXhfZnAzMl9mcDE2KGNvbnN0IGZsb2F0ICppbnB1dCwgX19oYWxmICpvdXRwdXQsIGludCBtLCBpbnQgbikgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIF9faGFsZiBtYXhfdmFsID0gX19mbG9hdDJoYWxmKC1JTkZJTklUWSk7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBfX2hhbGYgdmFsID0gX19mbG9hdDJoYWxmKGlucHV0W2lkeCAqIG4gKyBpXSk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gdmFsOw0KICAgICAgICAgICAgbWF4X3ZhbCA9IF9faGd0KHZhbCwgbWF4X3ZhbCkgPyB2YWwgOiBtYXhfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHN1bSA9IDAuMGY7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gX19leHBmKF9faGFsZjJmbG9hdChvdXRwdXRbaWR4ICogbiArIGldKSAtIF9faGFsZjJmbG9hdChtYXhfdmFsKSk7DQogICAgICAgICAgICBzdW0gKz0gZXhwX3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IF9fZXhwZihfX2hhbGYyZmxvYXQob3V0cHV0W2lkeCAqIG4gKyBpXSkgLSBfX2hhbGYyZmxvYXQobWF4X3ZhbCkpOw0KICAgICAgICAgICAgb3V0cHV0W2lkeCAqIG4gKyBpXSA9IF9fZmxvYXQyaGFsZihleHBfdmFsIC8gc3VtKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRvcGsoY29uc3QgX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0sIGludCBuLCBpbnQgaykgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIC8vIEZpbmQgdG9wLWsgaW5kaWNlcyBmb3Igcm93IGlkeA0KICAgICAgICAvLyBTaW1wbGUgc2VsZWN0aW9uIHNvcnQgZm9yIHNtYWxsIGsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIHsNCiAgICAgICAgICAgIF9faGFsZiBtYXhfdmFsID0gX19mbG9hdDJoYWxmKC1JTkZJTklUWSk7DQogICAgICAgICAgICBpbnQgbWF4X2lkeCA9IC0xOw0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opIHsNCiAgICAgICAgICAgICAgICBpZiAoX19oZ3QoaW5wdXRbaWR4ICogbiArIGpdLCBtYXhfdmFsKSkgew0KICAgICAgICAgICAgICAgICAgICBpbnQgZm91bmQgPSAwOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGk7ICsrbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBsXSA9PSBqKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfdmFsID0gaW5wdXRbaWR4ICogbiArIGpdOw0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lkeCA9IGo7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0b3BfaW5kaWNlc1tpZHggKiBrICsgaV0gPSBtYXhfaWR4Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgY2FsY3VsYXRlX2luZGV4KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXB0OyArK2opIHsNCiAgICAgICAgICAgIGludCBleHBlcnQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBqXTsNCiAgICAgICAgICAgIGludCBvZmZzZXQgPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W2V4cGVydF0sIDEpOw0KICAgICAgICAgICAgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGpdID0gb2Zmc2V0Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcmVvcmRlcl9pbnB1dChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfb2Zmc2V0W2V4cGVydF9pZF0gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lng7IGogPCBkaDsgaiArPSA2NCkgew0KICAgICAgICAgICAgICAgIGlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdID0gaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHBhY2tfb3V0cHV0KGhhbGYgKm91dHB1dF9kb3duLCBfX2hhbGYgKm91dHB1dF9wdHIsIGNvbnN0IF9faGFsZiAqc2NvcmUsIGludCAqdG9wX2luZGljZXMsIGludCAqZXhwZXJ0X29mZnNldCwgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lng7IGogPCBkaDsgaiArPSA2NCkgew0KICAgICAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wZjsNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXB0OyArK2kpIHsNCiAgICAgICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICAgICAgaW50IHRva2VuX2xvY2F0aW9uID0gZXhwZXJ0X29mZnNldFtleHBlcnRfaWRdICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBfX2hhbGYyZmxvYXQoc2NvcmVbaWR4ICogbnJlICsgZXhwZXJ0X2lkXSkgKiBfX2hhbGYyZmxvYXQob3V0cHV0X2Rvd25bdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNlOyArK2kpIHsNCiAgICAgICAgICAgICAgICByZXN1bHQgKz0gX19oYWxmMmZsb2F0KG91dHB1dF9kb3duWyhuICogKG5yZSArIGkpICsgaWR4KSAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gX19mbG9hdDJoYWxmKHJlc3VsdCk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfdXAsIHRvcmNoOjpUZW5zb3IgdF9kb3duLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlLCB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9rZW5fY291bnQsIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pIHsNCg0KICAgIGlmIChkaCAlIDEyOCAhPSAwIHx8IGRlICUgMTI4ICE9IDApIHJldHVybiAwOw0KDQogICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgIF9faGFsZiAqcm91dGVyX3B0ciAgPSAoX19oYWxmICopdF9yb3V0ZXIuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9wdHIgICAgPSAoX19oYWxmICopdF9nYXRlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKnVwX3B0ciAgICAgID0gKF9faGFsZiAqKXRfdXAuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpkb3duX3B0ciAgICA9IChfX2hhbGYgKil0X2Rvd24uZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X3B0ciAgPSAoX19oYWxmICopdF9vdXRwdXQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBkaF0NCg0KICAgIF9faGFsZiAqc2NvcmUgPSAoX19oYWxmICopdF9zY29yZS5kYXRhX3B0cigpOyAgICAgICAgICAgICAgICAgLy8gW24sIG5yZV0NCiAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgaW50ICp0b2tlbl9jb3VudCA9IChpbnQgKil0X3Rva2VuX2NvdW50LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlXQ0KICAgIGludCAqaW5kZXhfaW5fZXhwZXJ0ID0gKGludCAqKXRfaW5kZXhfaW5fZXhwZXJ0LmRhdGFfcHRyKCk7ICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKmV4cGVydF9vZmZzZXQgPSAoaW50ICopdF9leHBlcnRfb2Zmc2V0LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtucmVdDQogICAgX19oYWxmICppbnB1dF9yZW9yZGVyID0gKF9faGFsZiAqKXRfaW5wdXRfcmVvcmRlci5kYXRhX3B0cigpOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgX19oYWxmICpoaWRkZW4gPSAoX19oYWxmICopdF9oaWRkZW4uZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkZV0NCiAgICBfX2hhbGYgKm91dHB1dF9kb3duID0gKF9faGFsZiAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCg0KICAgIC8vIGludCAqdG9rZW5fY291bnQ7IC8vIFtucmVdLCB0b2tlbiBjb3VudCBvZiBlYWNoIGV4cGVydA0KICAgIC8vIGludCAqaW5kZXhfaW5fZXhwZXJ0OyAvLyBbbiwgZXB0XSwgaW5kZXggaW4gZXhwZXJ0IG9mIGVhY2ggdG9rZW4sIGkgLT4gZXhwZXJ0IHRva2VuIGluZGV4DQogICAgaGlwTWVtc2V0KHRva2VuX2NvdW50LCAwLCBucmUgKiBzaXplb2YoaW50KSk7DQogICAgY2FsY3VsYXRlX2luZGV4PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUpOw0KICAgIGhpcERldmljZVN5bmNocm9uaXplKCk7DQoNCiAgICAvLyBleHBlcnQgb2Zmc2V0DQogICAgLy8gaW50ICpleHBlcnRfb2Zmc2V0OyAvLyBbbnJlXQ0KICAgIHsNCiAgICAgICAgaW50IG9mZnNldCA9IDA7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgICAgIGV4cGVydF9vZmZzZXRbaV0gPSBpICogbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIHJlb3JkZXIgaW5wdXQNCiAgICAvLyBfX2hhbGYgKmlucHV0X3Jlb3JkZXI7IC8vIFtuICogZXB0LCBkaF0NCiAgICByZW9yZGVyX2lucHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4oaW5wdXRfcHRyLCB0b3BfaW5kaWNlcywgZXhwZXJ0X29mZnNldCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyLCBuLCBlcHQsIG5yZSwgZGgpOw0KDQogICAgaW50IG1heF90b2tlbl9jb3VudCA9IDA7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgew0KICAgICAgICBpZiAodG9rZW5fY291bnRbaV0gPiBtYXhfdG9rZW5fY291bnQpIG1heF90b2tlbl9jb3VudCA9IHRva2VuX2NvdW50W2ldOw0KICAgIH0NCg0KICAgIHJldHVybiBtYXhfdG9rZW5fY291bnQ7DQp9DQoNCnZvaWQgbW9lMih0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9yb3V0ZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2V4cGVydF9vZmZzZXQsIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2hpZGRlbiwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duKSB7DQoNCiAgICBpZiAoZGggJSAxMjggIT0gMCB8fCBkZSAlIDEyOCAhPSAwKSByZXR1cm47DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpyb3V0ZXJfcHRyICA9IChfX2hhbGYgKil0X3JvdXRlci5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSwgZGhdDQogICAgX19oYWxmICpnYXRlX3B0ciAgICA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqdXBfcHRyICAgICAgPSAoX19oYWxmICopdF91cC5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKmRvd25fcHRyICAgID0gKF9faGFsZiAqKXRfZG93bi5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqZXhwZXJ0X29mZnNldCA9IChpbnQgKil0X2V4cGVydF9vZmZzZXQuZGF0YV9wdHIoKTsgICAgICAgLy8gW25yZV0NCiAgICBfX2hhbGYgKmlucHV0X3Jlb3JkZXIgPSAoX19oYWxmICopdF9pbnB1dF9yZW9yZGVyLmRhdGFfcHRyKCk7IC8vIFtuICogZXB0LCBkaF0NCiAgICBfX2hhbGYgKmhpZGRlbiA9IChfX2hhbGYgKil0X2hpZGRlbi5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd24gPSAoX19oYWxmICopdF9vdXRwdXRfZG93bi5kYXRhX3B0cigpOyAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGhdDQoNCiAgICBwYWNrX291dHB1dDw8PGRpbTMobiksIGRpbTMoNjQpPj4+KG91dHB1dF9kb3duLCBvdXRwdXRfcHRyLCBzY29yZSwgdG9wX2luZGljZXMsIGV4cGVydF9vZmZzZXQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgpOw0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgID0gaW5wdXRfdGVuc29yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyID0gd2VpZ2h0c1sncm91dGVyLndlaWdodCddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZSAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkaCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIHVwICAgICA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBkb3duICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRlLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guemVyb3MoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bltpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQogICAgZm9yIGkgaW4gcmFuZ2UobnNlKToNCiAgICAgICAgZ2F0ZVtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J11bOiwgaSAqIGRlOihpICsgMSkgKiBkZV0NCiAgICAgICAgdXBbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIGRvd25bbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddW2kgKiBkZTooaSArIDEpICogZGUsIDpdDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBleHBlcnRfb2Zmc2V0ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlXQ0KICAgIGlucHV0X3Jlb3JkZXIgPSB0b3JjaC5lbXB0eShucmUsIGJzKnNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAjIFtucmUsIGJzICogc2wsIGRoXQ0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRoXQ0KDQogICAgc2NvcmUgPSB0b3JjaC5zb2Z0bWF4KGlucHV0LnZpZXcoYnMqc2wsIGRoKSBAIHJvdXRlci5ULCBkaW09MSkgICMgW2JzICogc2wsIG5yZV0NCg0KICAgIG1heF9jb3VudCA9IG1vZHVsZS5tb2UxKGlucHV0LCByb3V0ZXIsIGdhdGUsIHVwLCBkb3duLCBvdXRwdXQsDQogICAgICAgIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgZXhwZXJ0X29mZnNldCwNCiAgICAgICAgaW5wdXRfcmVvcmRlciwgaGlkZGVuLCBvdXRwdXRfZG93bikNCg0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZVs6bnJlLCA6LCA6XSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwWzpucmUsIDosIDpdKQ0KICAgIGhpZGRlbltucmU6LCA6LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCBnYXRlW25yZTosIDosIDpdKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cFtucmU6LCA6LCA6XSkNCiAgICBvdXRwdXRfZG93biA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRoXQ0KICAgIG91dHB1dF9kb3duWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2guYm1tKGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSwgZG93bls6bnJlLCA6LCA6XSkNCiAgICBvdXRwdXRfZG93bltucmU6LCA6LCA6XSA9IHRvcmNoLmJtbShoaWRkZW5bbnJlOiwgOiwgOl0sIGRvd25bbnJlOiwgOiwgOl0pDQoNCiAgICBtb2R1bGUubW9lMihpbnB1dCwgcm91dGVyLCBnYXRlLCB1cCwgZG93biwgb3V0cHV0LA0KICAgICAgICBkaCwgZGUsIG5yZSwgbnNlLCBlcHQsIGJzKnNsLA0KICAgICAgICBzY29yZSwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIGV4cGVydF9vZmZzZXQsDQogICAgICAgIGlucHV0X3Jlb3JkZXIsIGhpZGRlbiwgb3V0cHV0X2Rvd24pDQogICAgcmV0dXJuIG91dHB1dA==

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

Changes from previous submission

Against this author's previous submission amd-mixture-of-experts · submission 29599.

- IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgbW9lMSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9yb3V0ZXIsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGVfVCwgdG9yY2g6OlRlbnNvciB0X3VwX1QsIHRvcmNoOjpUZW5zb3IgdF9kb3duX1QsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDMyLCB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAxNiwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pOw0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZV9ULCB0b3JjaDo6VGVuc29yIHRfdXBfVCwgdG9yY2g6OlRlbnNvciB0X2Rvd25fVCwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMzIsIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDE2LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2V4cGVydF9vZmZzZXQsIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyLA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bik7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXBibGFzL2hpcGJsYXMuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCg0KI2RlZmluZSBPRkZTRVQocm93LCBjb2wsIGxkKSAoKHJvdykgKiAobGQpICsgKGNvbCkpDQojZGVmaW5lIFNXWihtLCBuKSAoKChtKSAqIDQgKyAobikpICUgNjQpIC8vIGJ5IGhhbGYNCg0KdXNpbmcgZmxvYXQxNiA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsNCnR5cGVkZWYgc3RydWN0IHsNCiAgICBmbG9hdDE2IHZhbFsyXVsyXTsNCn0gZmxvYXQxNl8yeDJfdDsNCnVzaW5nIGhhbGY0ID0gX19mcDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KdHlwZWRlZiBzdHJ1Y3Qgew0KICAgIGhhbGY0IHg7DQogICAgaGFsZjQgeTsNCn0gaGFsZjR4MjsNCg0KX19nbG9iYWxfXyB2b2lkIHNvZnRtYXhfZnAzMihjb25zdCBmbG9hdCAqaW5wdXQsIGZsb2F0ICpvdXRwdXQsIGludCBtLCBpbnQgbikgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIGZsb2F0IG1heF92YWwgPSBpbnB1dFtpZHggKiBuXTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IHZhbCA9IGlucHV0W2lkeCAqIG4gKyBpXTsNCiAgICAgICAgICAgIG1heF92YWwgPSB2YWwgPiBtYXhfdmFsID8gdmFsIDogbWF4X3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICBmbG9hdCBzdW0gPSAwLjBmOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IF9fZXhwZihpbnB1dFtpZHggKiBuICsgaV0gLSBtYXhfdmFsKTsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSBleHBfdmFsOw0KICAgICAgICAgICAgc3VtICs9IGV4cF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSBvdXRwdXRbaWR4ICogbiArIGldIC8gc3VtOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgc29mdG1heF9mcDMyX2ZwMTYoY29uc3QgZmxvYXQgKmlucHV0LCBfX2hhbGYgKm91dHB1dCwgaW50IG0sIGludCBuKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIF9faGFsZiB2YWwgPSBfX2Zsb2F0MmhhbGYoaW5wdXRbaWR4ICogbiArIGldKTsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSB2YWw7DQogICAgICAgICAgICBtYXhfdmFsID0gX19oZ3QodmFsLCBtYXhfdmFsKSA/IHZhbCA6IG1heF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgc3VtID0gMC4wZjsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IGV4cF92YWwgPSBfX2V4cGYoX19oYWxmMmZsb2F0KG91dHB1dFtpZHggKiBuICsgaV0pIC0gX19oYWxmMmZsb2F0KG1heF92YWwpKTsNCiAgICAgICAgICAgIHN1bSArPSBleHBfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gX19leHBmKF9faGFsZjJmbG9hdChvdXRwdXRbaWR4ICogbiArIGldKSAtIF9faGFsZjJmbG9hdChtYXhfdmFsKSk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gX19mbG9hdDJoYWxmKGV4cF92YWwgLyBzdW0pOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wayhjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBjYWxjdWxhdGVfaW5kZXgoDQogICAgY29uc3QgaW50ICp0b3BfaW5kaWNlcywgaW50ICp0b2tlbl9jb3VudCwgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG4pIHsNCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlcHQ7ICsraikgew0KICAgICAgICAgICAgaW50IGV4cGVydCA9IHRvcF9pbmRpY2VzW2lkeCAqIGVwdCArIGpdOw0KICAgICAgICAgICAgaW50IG9mZnNldCA9IGF0b21pY0FkZCgmdG9rZW5fY291bnRbZXhwZXJ0XSwgMSk7DQogICAgICAgICAgICBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgal0gPSBvZmZzZXQ7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqZXhwZXJ0X29mZnNldCwgaW50ICppbmRleF9pbl9leHBlcnQsIF9faGFsZiAqaW5wdXRfcmVvcmRlciwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBkaCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXB0OyArK2kpIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9vZmZzZXRbZXhwZXJ0X2lkXSArIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueDsgaiA8IGRoOyBqICs9IDY0KSB7DQogICAgICAgICAgICAgICAgaW5wdXRfcmVvcmRlclt0b2tlbl9sb2NhdGlvbiAqIGRoICsgal0gPSBpbnB1dFtpZHggKiBkaCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcGFja19vdXRwdXQoaGFsZiAqb3V0cHV0X2Rvd24sIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICp0b2tlbl9jb3VudCwgaW50ICpleHBlcnRfb2Zmc2V0LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBuc2UsIGludCBkaCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueDsgaiA8IGRoOyBqICs9IDY0KSB7DQogICAgICAgICAgICBmbG9hdCByZXN1bHQgPSAwLjBmOw0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcHQ7ICsraSkgew0KICAgICAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfb2Zmc2V0W2V4cGVydF9pZF0gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICAgICAgcmVzdWx0ICs9IF9faGFsZjJmbG9hdChzY29yZVtpZHggKiBucmUgKyBleHBlcnRfaWRdKSAqIF9faGFsZjJmbG9hdChvdXRwdXRfZG93blt0b2tlbl9sb2NhdGlvbiAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7ICsraSkgew0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBfX2hhbGYyZmxvYXQob3V0cHV0X2Rvd25bKG4gKiAobnJlICsgaSkgKyBpZHgpICogZGggKyBqXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2Zsb2F0MmhhbGYocmVzdWx0KTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRyYW5zcG9zZV9leHBlcnRfZnAxNl82NHg2NCgNCiAgICAgICAgaW50IG5fZXhwZXJ0cywgaW50IG0sIGludCBuLCBoYWxmKiBfX3Jlc3RyaWN0X18gZHN0LCBoYWxmKiBfX3Jlc3RyaWN0X18gc3JjKSB7DQoNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfZSA9IGJsb2NrSWR4Lno7DQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDY0Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfbSA9IHRocmVhZElkeC54IC8gODsNCiAgICBpbnQgdGhyZWFkX24gPSAodGhyZWFkSWR4LnggJSA4KSAqIDg7DQoNCiAgICBfX3NoYXJlZF9fIGNoYXIgc21lbVs2NF1bMTI5XTsNCg0KICAgIGhhbGY4IGRhdGFbOF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgZGF0YVtpXSA9ICooaGFsZjggKikmc3JjW3RocmVhZF9ibG9ja19lICogbSAqIG4gKw0KICAgICAgICAgICAgKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20gKyBpKjgpICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dOw0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgKihfX2ZwMTYgKikmc21lbVt0aHJlYWRfbiArIGpdWyh0aHJlYWRfbSArIDgqaSkgKiAyXSA9IGRhdGFbaV1bal07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgew0KICAgICAgICAqKGhhbGY4ICopJmRzdFt0aHJlYWRfYmxvY2tfZSAqIG0gKiBuICsNCiAgICAgICAgICAgICh0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9tICsgaSo4KSAqIG0gKyB0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9uXSA9DQogICAgICAgICAgICAqKGhhbGY4ICopJnNtZW1bdGhyZWFkX20gKyA4KmldW3RocmVhZF9uKjJdOw0KICAgIH0NCn0NCg0KX19kZXZpY2VfXyBfX2lubGluZV9fIGZsb2F0MTZfMngyX3QgaGdlbW1fMTI4eDEyOHg2NF9jbGVhbigNCiAgICBjb25zdCBoYWxmICphLCBjb25zdCBoYWxmICpiLCBpbnQgTSwgaW50IE4sIGludCBLLA0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2FbMTI4XVs2NF0sIF9fc2hhcmVkX18gaGFsZiBzX2JbMTI4XVs2NF0pIHsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXJwX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDY0Ow0KICAgIGludCB3YXJwX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAzMikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gdGhyZWFkSWR4LnggJSAzMjsNCg0KICAgIC8vIExER1NUUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBzdHNfbW4gPSB0aHJlYWRJZHgueSAqIDggKyB0aHJlYWRJZHgueCAvIDg7DQogICAgaW50IHN0c19rID0gKHRocmVhZElkeC54ICUgOCkgKiA4OyAvLyBieSBoYWxmDQogICAgaW50IGxkZ19tID0gdGhyZWFkX2Jsb2NrX20gKyBzdHNfbW47DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfbW47DQogICAgaW50IGxkZ19rID0gc3RzX2s7DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXJwX20gKyB0aHJlYWRJZHgueCAlIDMyOw0KICAgIGludCBsZHNfbiA9IHdhcnBfbiArIHRocmVhZElkeC54ICUgMzI7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMzIpICogNDsgLy8gYnkgaGFsZg0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXJwX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhcnBfbiArIHRocmVhZF9jX247DQoNCiAgICBmbG9hdDE2XzJ4Ml90IHRpbGVfZCA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBLLzY0OyBpYisrKSB7DQogICAgICAgIGhhbGY0eDIgbGRnX2FbNF0sIGxkZ19iWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgNDsgaWkrKykgew0KICAgICAgICAgICAgLy8gbGRnX2FbaWldID0gKihoYWxmNHgyICopJmFbT0ZGU0VUKGxkZ19tICsgaWkqMzIsIGxkZ19rICsgaWIqNjQsIEspXTsNCiAgICAgICAgICAgIC8vIGxkZ19iW2lpXSA9ICooaGFsZjR4MiAqKSZiW09GRlNFVChsZGdfbiArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV07DQogICAgICAgICAgICBsZGdfYVtpaV0gPSBsZGdfbSArIGlpKjMyIDwgTSA/ICooaGFsZjR4MiAqKSZhW09GRlNFVChsZGdfbSArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV0gOiBoYWxmNHgyezAsIDB9Ow0KICAgICAgICAgICAgbGRnX2JbaWldID0gbGRnX24gKyBpaSozMiA8IE4gPyAqKGhhbGY0eDIgKikmYltPRkZTRVQobGRnX24gKyBpaSozMiwgbGRnX2sgKyBpYio2NCwgSyldIDogaGFsZjR4MnswLCAwfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYVtzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgICAgKV0gPSBsZGdfYVtpaV0ueDsNCiAgICAgICAgICAgICooaGFsZjQgKikmc19hW3N0c19tbiArIGlpKjMyXVtTV1ooc3RzX21uLCBzdHNfayArIDQpXSA9IGxkZ19hW2lpXS55Ow0KICAgICAgICAgICAgKihoYWxmNCAqKSZzX2Jbc3RzX21uICsgaWkqMzJdW1NXWihzdHNfbW4sIHN0c19rICAgICldID0gbGRnX2JbaWldLng7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYltzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgKyA0KV0gPSBsZGdfYltpaV0ueTsNCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBoYWxmNCB0aWxlX2FbMl1bOF0sIHRpbGVfYlsyXVs4XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA4OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGhhbGY0ICopJnNfYVtsZHNfbSArIGlpKjMyXVtTV1oobGRzX20sIGxkc19rICsga2sqOCldOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgODsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYltpaV1ba2tdID0gKihoYWxmNCAqKSZzX2JbbGRzX24gKyBpaSozMl1bU1daKGxkc19uLCBsZHNfayArIGtrKjgpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgODsga2srKykgew0KICAgICAgICAgICAgICAgICAgICB0aWxlX2QudmFsW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDhmMTYodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCB0aWxlX2QudmFsW2lpXVtqal0sIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICByZXR1cm4gdGlsZV9kOw0KfQ0KDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDIpDQpfX2dsb2JhbF9fIHZvaWQgaGdlbW1fMTI4eDEyOHg2NCgNCiAgICBjb25zdCBoYWxmICphLCBjb25zdCBoYWxmICpiLCBmbG9hdCAqYywgaW50IE0sIGludCBOLCBpbnQgSykgew0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKCBhLCBiLCBNLCBOLCBLLCBzX2EsIHNfYik7DQoNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBsbCA9IDA7IGxsIDwgNDsgbGwrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMzIgKyBrayo4ICsgbGwgPCBNICYmIGNfbiArIGpqKjMyIDwgTikNCiAgICAgICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0gPSB0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBtb2VfaGdlbW1fMTI4eDEyOHg2NCgNCiAgICBjb25zdCBoYWxmICphX3B0ciwgY29uc3QgaGFsZiAqYl9wdHIsIGhhbGYgKmNfcHRyLCBpbnQgbnJlLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaW50IE0gPSB0b2tlbl9jb3VudFtibG9ja0lkeC56XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCiAgICBpZiAodGhyZWFkX2Jsb2NrX20gPj0gTSkgcmV0dXJuOw0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgZXhwZXJ0X29mZnNldFtibG9ja0lkeC56XSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGV4cGVydF9vZmZzZXRbYmxvY2tJZHguel0gKiBOOw0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKGEsIGIsIE0sIE4sIEssIHNfYSwgc19iKTsNCg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGxsID0gMDsgbGwgPCA0OyBsbCsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSozMiArIGtrKjggKyBsbCA8IE0gJiYgY19uICsgamoqMzIgPCBOKQ0KICAgICAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSA9IF9fZmxvYXQyaGFsZih0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDIpDQpfX2dsb2JhbF9fIHZvaWQgYmF0Y2hlZF9oZ2VtbV8xMjh4MTI4eDY0KA0KICAgIGNvbnN0IGhhbGYgKmFfcHRyLCBjb25zdCBoYWxmICpiX3B0ciwgaGFsZiAqY19wdHIsIGludCBicywgaW50IE0sIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgYmxvY2tJZHgueiAqIE0gKiBLOw0KICAgIGNvbnN0IGhhbGYgKmIgPSBiX3B0ciArIGJsb2NrSWR4LnogKiBOICogSzsNCiAgICBoYWxmICpjID0gY19wdHIgKyBibG9ja0lkeC56ICogTSAqIE47DQoNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19hWzEyOF1bNjRdOw0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2JbMTI4XVs2NF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgd2FycF9tID0gKHRocmVhZElkeC55IC8gMikgKiA2NDsNCiAgICBpbnQgd2FycF9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9IHRocmVhZElkeC54ICUgMzI7DQoNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXJwX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhcnBfbiArIHRocmVhZF9jX247DQoNCiAgICBmbG9hdDE2XzJ4Ml90IHRpbGVfZCA9IGhnZW1tXzEyOHgxMjh4NjRfY2xlYW4oYSwgYiwgTSwgTiwgSywgc19hLCBzX2IpOw0KDQogICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQgbGwgPSAwOyBsbCA8IDQ7IGxsKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNfbSArIGlpKjMyICsga2sqOCArIGxsIDwgTSAmJiBjX24gKyBqaiozMiA8IE4pDQogICAgICAgICAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSozMiArIGtrKjggKyBsbCkgKiBOICsgY19uICsgamoqMzJdID0gX19mbG9hdDJoYWxmKHRpbGVfZC52YWxbaWldW2pqXVtrayo0ICsgbGxdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBtb2VfaGdlbW1fMTI4eDEyOHg2NF9zaWx1X211bCgNCiAgICBjb25zdCBoYWxmICphX3B0ciwgY29uc3QgaGFsZiAqYl9wdHIsIGhhbGYgKmNfcHRyLCBpbnQgbnJlLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaW50IE0gPSB0b2tlbl9jb3VudFtibG9ja0lkeC56XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCiAgICBpZiAodGhyZWFkX2Jsb2NrX20gPj0gTSkgcmV0dXJuOw0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgZXhwZXJ0X29mZnNldFtibG9ja0lkeC56XSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGV4cGVydF9vZmZzZXRbYmxvY2tJZHguel0gKiBOOw0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKGEsIGIsIE0sIE4sIEssIHNfYSwgc19iKTsNCg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGxsID0gMDsgbGwgPCA0OyBsbCsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSozMiArIGtrKjggKyBsbCA8IE0gJiYgY19uICsgamoqMzIgPCBOKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvcmkgPSBfX2hhbGYyZmxvYXQoY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNpbHVfdmFsID0gdmFsICogKDEuMGYgLyAoMS4wZiArIF9fZXhwZigtdmFsKSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSA9IF9fZmxvYXQyaGFsZihvcmkgKiBzaWx1X3ZhbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjRfc2lsdV9tdWwoDQogICAgY29uc3QgaGFsZiAqYV9wdHIsIGNvbnN0IGhhbGYgKmJfcHRyLCBoYWxmICpjX3B0ciwgaW50IGJzLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQoNCiAgICBjb25zdCBoYWxmICphID0gYV9wdHIgKyBibG9ja0lkeC56ICogTSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGJsb2NrSWR4LnogKiBNICogTjsNCg0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2FbMTI4XVs2NF07DQogICAgX19zaGFyZWRfXyBoYWxmIHNfYlsxMjhdWzY0XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXJwX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDY0Ow0KICAgIGludCB3YXJwX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAzMikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gdGhyZWFkSWR4LnggJSAzMjsNCg0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhcnBfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2FycF9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGZsb2F0MTZfMngyX3QgdGlsZV9kID0gaGdlbW1fMTI4eDEyOHg2NF9jbGVhbihhLCBiLCBNLCBOLCBLLCBzX2EsIHNfYik7DQoNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBsbCA9IDA7IGxsIDwgNDsgbGwrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMzIgKyBrayo4ICsgbGwgPCBNICYmIGNfbiArIGpqKjMyIDwgTikgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3JpID0gX19oYWxmMmZsb2F0KGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsID0gdGlsZV9kLnZhbFtpaV1bampdW2trKjQgKyBsbF07DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzaWx1X3ZhbCA9IHZhbCAqICgxLjBmIC8gKDEuMGYgKyBfX2V4cGYoLXZhbCkpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0gPSBfX2Zsb2F0MmhhbGYob3JpICogc2lsdV92YWwpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQp2b2lkIG1vZTEodG9yY2g6OlRlbnNvciB0X2lucHV0LCB0b3JjaDo6VGVuc29yIHRfcm91dGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGVfVCwgdG9yY2g6OlRlbnNvciB0X3VwX1QsIHRvcmNoOjpUZW5zb3IgdF9kb3duX1QsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDMyLCB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAxNiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bikgew0KDQogICAgaWYgKGRoICUgMTI4ICE9IDAgfHwgZGUgJSAxMjggIT0gMCkgcmV0dXJuOw0KDQogICAgdXNpbmcgdWludDY0X3QgPSB1bnNpZ25lZCBsb25nIGxvbmc7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpyb3V0ZXJfcHRyICA9IChfX2hhbGYgKil0X3JvdXRlci5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSwgZGhdDQogICAgX19oYWxmICpnYXRlX1RfcHRyICA9IChfX2hhbGYgKil0X2dhdGVfVC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqdXBfVF9wdHIgICAgPSAoX19oYWxmICopdF91cF9ULmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBfX2hhbGYgKmRvd25fVF9wdHIgID0gKF9faGFsZiAqKXRfZG93bl9ULmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpnYXRlX3B0ciAgICA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqdXBfcHRyICAgICAgPSAoX19oYWxmICopdF91cC5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKmRvd25fcHRyICAgID0gKF9faGFsZiAqKXRfZG93bi5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgZmxvYXQgKnNjb3JlX2ZwMzIgPSAoZmxvYXQgKil0X3Njb3JlX2ZwMzIuZGF0YV9wdHIoKTsgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIF9faGFsZiAqc2NvcmVfZnAxNiA9IChfX2hhbGYgKil0X3Njb3JlX2ZwMTYuZGF0YV9wdHIoKTsgICAgICAgLy8gW24sIG5yZV0NCiAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgaW50ICp0b2tlbl9jb3VudCA9IChpbnQgKil0X3Rva2VuX2NvdW50LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlXQ0KICAgIGludCAqaW5kZXhfaW5fZXhwZXJ0ID0gKGludCAqKXRfaW5kZXhfaW5fZXhwZXJ0LmRhdGFfcHRyKCk7ICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKmV4cGVydF9vZmZzZXQgPSAoaW50ICopdF9leHBlcnRfb2Zmc2V0LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtucmVdDQogICAgX19oYWxmICppbnB1dF9yZW9yZGVyID0gKF9faGFsZiAqKXRfaW5wdXRfcmVvcmRlci5kYXRhX3B0cigpOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgX19oYWxmICpoaWRkZW4gPSAoX19oYWxmICopdF9oaWRkZW4uZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkZV0NCiAgICBfX2hhbGYgKm91dHB1dF9kb3duID0gKF9faGFsZiAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgLy8gdHJhbnNwb3NlDQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkaC82NCwgZGUvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGgsIGRlLCBnYXRlX3B0ciwgZ2F0ZV9UX3B0cik7DQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkaC82NCwgZGUvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGgsIGRlLCB1cF9wdHIgICwgdXBfVF9wdHIgICk7DQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkZS82NCwgZGgvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGUsIGRoLCBkb3duX3B0ciwgZG93bl9UX3B0cik7DQoNCiAgICAvLyBleHBlcnQgc2NvcmUNCiAgICAvLyBmbG9hdCAqc2NvcmVfZnAzMjsgLy8gW24sIG5yZV0NCiAgICBoZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobisxMjcpLzEyOCwgKG5yZSsxMjcpLzEyOCksIGRpbTMoNjQsIDQpPj4+DQogICAgICAgIChpbnB1dF9wdHIsIHJvdXRlcl9wdHIsIHNjb3JlX2ZwMzIsIG4sIG5yZSwgZGgpOw0KICAgIC8vIF9faGFsZiAqc2NvcmVfZnAxNjsgLy8gW24sIG5yZV0NCiAgICBzb2Z0bWF4X2ZwMzJfZnAxNjw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgbiwgbnJlKTsNCg0KICAgIC8vIGludCAqdG9wX2luZGljZXM7IC8vIFtuLCBlcHRdLCB0b3BrIHNjb3JlDQogICAgdG9wazw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCg0KICAgIC8vIGludCAqdG9rZW5fY291bnQ7IC8vIFtucmVdLCB0b2tlbiBjb3VudCBvZiBlYWNoIGV4cGVydA0KICAgIC8vIGludCAqaW5kZXhfaW5fZXhwZXJ0OyAvLyBbbiwgZXB0XSwgaW5kZXggaW4gZXhwZXJ0IG9mIGVhY2ggdG9rZW4sIGkgLT4gZXhwZXJ0IHRva2VuIGluZGV4DQogICAgaGlwTWVtc2V0KHRva2VuX2NvdW50LCAwLCBucmUgKiBzaXplb2YoaW50KSk7DQogICAgY2FsY3VsYXRlX2luZGV4PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUpOw0KDQogICAgLy8gZXhwZXJ0IG9mZnNldA0KICAgIC8vIGludCAqZXhwZXJ0X29mZnNldDsgLy8gW25yZV0NCiAgICB7DQogICAgICAgIGludCBvZmZzZXQgPSAwOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgICAgICBleHBlcnRfb2Zmc2V0W2ldID0gaSAqIG47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyByZW9yZGVyIGlucHV0DQogICAgLy8gX19oYWxmICppbnB1dF9yZW9yZGVyOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgcmVvcmRlcl9pbnB1dDw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGV4cGVydF9vZmZzZXQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCg0KICAgIC8vIGludCBtYXhfdG9rZW5fY291bnQgPSAwOw0KICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAvLyAgICAgaWYgKHRva2VuX2NvdW50W2ldID4gbWF4X3Rva2VuX2NvdW50KSBtYXhfdG9rZW5fY291bnQgPSB0b2tlbl9jb3VudFtpXTsNCiAgICAvLyB9DQoNCiAgICAvLyBoaWRkZW4gc3RhdGU6IHNpbHUob3V0cHV0X2dhdGUpICogb3V0cHV0X3VwDQogICAgLy8gX19oYWxmICpoaWRkZW47IC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkZS8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9yZW9yZGVyLCB1cF9wdHIsIGhpZGRlbiwgbnJlLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgZGUsIGRoKTsNCiAgICAvLyBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjQ8PDxkaW0zKChuKzEyNykvMTI4LCBkZS8xMjgsIG5zZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9wdHIsIHVwX3B0ciArIG5yZSAqIGRoICogZGUsIGhpZGRlbiArIG4gKiBlcHQgKiBkZSwgbnNlLCBuLCBkZSwgZGgpOw0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0X3NpbHVfbXVsPDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkZS8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9yZW9yZGVyLCBnYXRlX3B0ciwgaGlkZGVuLCBucmUsIHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBkZSwgZGgpOw0KICAgIC8vIGJhdGNoZWRfaGdlbW1fMTI4eDEyOHg2NF9zaWx1X211bDw8PGRpbTMoKG4rMTI3KS8xMjgsIGRlLzEyOCwgbnNlKSwgZGltMyg2NCwgNCk+Pj4NCiAgICAvLyAgICAgKGlucHV0X3B0ciwgZ2F0ZV9wdHIgKyBucmUgKiBkaCAqIGRlLCBoaWRkZW4gKyBuICogZXB0ICogZGUsIG5zZSwgbiwgZGUsIGRoKTsNCg0KICAgIC8vIGRvd24gb3V0cHV0DQogICAgLy8gaGFsZiAqb3V0cHV0X2Rvd247IC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkaC8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChoaWRkZW4sIGRvd25fcHRyLCBvdXRwdXRfZG93biwgbnJlLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgZGgsIGRlKTsNCiAgICAvLyBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjQ8PDxkaW0zKChuKzEyNykvMTI4LCBkaC8xMjgsIG5zZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChoaWRkZW4gKyBuICogZXB0ICogZGUsIGRvd25fcHRyICsgbnJlICogZGUgKiBkaCwgb3V0cHV0X2Rvd24gKyBuICogZXB0ICogZGgsIG5zZSwgbiwgZGgsIGRlKTsNCg0KICAgIC8vIHBhY2sgb3V0cHV0DQogICAgLy8gcGFja19vdXRwdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93biwgb3V0cHV0X3B0ciwgc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlLCBuc2UsIGRoKTsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlX1QsIHRvcmNoOjpUZW5zb3IgdF91cF9ULCB0b3JjaDo6VGVuc29yIHRfZG93bl9ULA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAzMiwgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMTYsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pIHsNCg0KICAgIGlmIChkaCAlIDEyOCAhPSAwIHx8IGRlICUgMTI4ICE9IDApIHJldHVybjsNCg0KICAgIHVzaW5nIHVpbnQ2NF90ID0gdW5zaWduZWQgbG9uZyBsb25nOw0KDQogICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgIF9faGFsZiAqcm91dGVyX3B0ciAgPSAoX19oYWxmICopdF9yb3V0ZXIuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9UX3B0ciAgPSAoX19oYWxmICopdF9nYXRlX1QuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBfX2hhbGYgKnVwX1RfcHRyICAgID0gKF9faGFsZiAqKXRfdXBfVC5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpkb3duX1RfcHRyICA9IChfX2hhbGYgKil0X2Rvd25fVC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9wdHIgICAgPSAoX19oYWxmICopdF9nYXRlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKnVwX3B0ciAgICAgID0gKF9faGFsZiAqKXRfdXAuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpkb3duX3B0ciAgICA9IChfX2hhbGYgKil0X2Rvd24uZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X3B0ciAgPSAoX19oYWxmICopdF9vdXRwdXQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBkaF0NCg0KICAgIGZsb2F0ICpzY29yZV9mcDMyID0gKGZsb2F0ICopdF9zY29yZV9mcDMyLmRhdGFfcHRyKCk7ICAgICAgICAgLy8gW24sIG5yZV0NCiAgICBfX2hhbGYgKnNjb3JlX2ZwMTYgPSAoX19oYWxmICopdF9zY29yZV9mcDE2LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtuLCBucmVdDQogICAgaW50ICp0b3BfaW5kaWNlcyA9IChpbnQgKil0X3RvcF9pbmRpY2VzLmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqdG9rZW5fY291bnQgPSAoaW50ICopdF90b2tlbl9jb3VudC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZV0NCiAgICBpbnQgKmluZGV4X2luX2V4cGVydCA9IChpbnQgKil0X2luZGV4X2luX2V4cGVydC5kYXRhX3B0cigpOyAgIC8vIFtuLCBlcHRdDQogICAgaW50ICpleHBlcnRfb2Zmc2V0ID0gKGludCAqKXRfZXhwZXJ0X29mZnNldC5kYXRhX3B0cigpOyAgICAgICAvLyBbbnJlXQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIF9faGFsZiAqaGlkZGVuID0gKF9faGFsZiAqKXRfaGlkZGVuLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfZG93biA9IChfX2hhbGYgKil0X291dHB1dF9kb3duLmRhdGFfcHRyKCk7ICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkaF0NCg0KICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd24sIG91dHB1dF9wdHIsIHNjb3JlX2ZwMTYsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCk7DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdtb2UnLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnbW9lMScsICdtb2UyJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8zIiwgIi13Il0sDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQ0KDQogICAgZGggPSBjb25maWdbImRfaGlkZGVuIl0NCiAgICBkZSA9IGNvbmZpZ1siZF9leHBlcnQiXQ0KICAgIG5yZSA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdDQogICAgbnNlID0gY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0NCiAgICBlcHQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQ0KICAgIGJzID0gY29uZmlnWyJiYXRjaF9zaXplIl0NCiAgICBzbCA9IGNvbmZpZ1sic2VxX2xlbiJdDQoNCiAgICBpbnB1dCAgPSBpbnB1dF90ZW5zb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIHNsLCBkaF0NCiAgICByb3V0ZXIgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBkaF0NCiAgICBnYXRlX1QgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgdXBfVCAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkaCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIGRvd25fVCA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGUsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBnYXRlICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRlLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgdXAgICAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIGRvd24gICA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBvdXRwdXQgPSB0b3JjaC56ZXJvcyhicywgc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgIyBbYnMsIHNsLCBkaF0NCiAgICBmb3IgaSBpbiByYW5nZShucmUpOg0KICAgICAgICBnYXRlX1RbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQ0KICAgICAgICB1cF9UW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9UW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10NCiAgICBmb3IgaSBpbiByYW5nZShuc2UpOg0KICAgICAgICBnYXRlX1RbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIHVwX1RbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIGRvd25fVFtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J11baSAqIGRlOihpICsgMSkgKiBkZSwgOl0NCg0KICAgIHNjb3JlX2ZwMzIgPSB0b3JjaC5lbXB0eShicyAqIHNsICogbnJlLCBkdHlwZT10b3JjaC5mbG9hdDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAjIFticyAqIHNsLCBucmVdDQogICAgc2NvcmVfZnAxNiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBucmUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICAgICMgW2JzICogc2wsIG5yZV0NCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBleHBlcnRfb2Zmc2V0ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlXQ0KICAgICMgaW5wdXRfcmVvcmRlciA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICMgW2JzICogc2wgKiBlcHQsIGRoXQ0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRoXQ0KDQogICAgaW5wdXRfcmVvcmRlciA9IHRvcmNoLmVtcHR5KG5yZSwgYnMqc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KDQogICAgbW9kdWxlLm1vZTEoaW5wdXQsIHJvdXRlciwgZ2F0ZV9ULCB1cF9ULCBkb3duX1QsIGdhdGUsIHVwLCBkb3duLCBvdXRwdXQsDQogICAgICAgIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlX2ZwMzIsIHNjb3JlX2ZwMTYsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBleHBlcnRfb2Zmc2V0LA0KICAgICAgICBpbnB1dF9yZW9yZGVyLCBoaWRkZW4sIG91dHB1dF9kb3duKQ0KDQogICAgbWF4X2NvdW50ID0gdG9yY2gubWF4KHRva2VuX2NvdW50KS5pdGVtKCkNCg0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9UWzpucmUsIDosIDpdKSkgKiB0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgdXBfVFs6bnJlLCA6LCA6XSkNCiAgICBoaWRkZW5bbnJlOiwgOiwgOl0gPSB0b3JjaC5ubi5mdW5jdGlvbmFsLnNpbHUodG9yY2gubWF0bXVsKGlucHV0LnZpZXcoYnMqc2wsIGRoKSwgZ2F0ZV9UW25yZTosIDosIDpdKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cF9UW25yZTosIDosIDpdKQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBicyAqIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW25yZSArIG5zZSwgYnMgKiBzbCwgZGhdDQogICAgb3V0cHV0X2Rvd25bOm5yZSwgOm1heF9jb3VudCwgOl0gPSB0b3JjaC5ibW0oaGlkZGVuWzpucmUsIDptYXhfY291bnQsIDpdLCBkb3duX1RbOm5yZSwgOiwgOl0pDQogICAgb3V0cHV0X2Rvd25bbnJlOiwgOiwgOl0gPSB0b3JjaC5ibW0oaGlkZGVuW25yZTosIDosIDpdLCBkb3duX1RbbnJlOiwgOiwgOl0pDQoNCiAgICBtb2R1bGUubW9lMihpbnB1dCwgcm91dGVyLCBnYXRlX1QsIHVwX1QsIGRvd25fVCwgZ2F0ZSwgdXAsIGRvd24sIG91dHB1dCwNCiAgICAgICAgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIGV4cGVydF9vZmZzZXQsDQogICAgICAgIGlucHV0X3Jlb3JkZXIsIGhpZGRlbiwgb3V0cHV0X2Rvd24pDQogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file
+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfdXAsIHRvcmNoOjpUZW5zb3IgdF9kb3duLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlLCB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9rZW5fY291bnQsIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pOw0KaW50IG1vZTIodG9yY2g6OlRlbnNvciB0X2lucHV0LCB0b3JjaDo6VGVuc29yIHRfcm91dGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bik7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCg0KX19nbG9iYWxfXyB2b2lkIHNvZnRtYXhfZnAzMl9mcDE2KGNvbnN0IGZsb2F0ICppbnB1dCwgX19oYWxmICpvdXRwdXQsIGludCBtLCBpbnQgbikgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIF9faGFsZiBtYXhfdmFsID0gX19mbG9hdDJoYWxmKC1JTkZJTklUWSk7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBfX2hhbGYgdmFsID0gX19mbG9hdDJoYWxmKGlucHV0W2lkeCAqIG4gKyBpXSk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gdmFsOw0KICAgICAgICAgICAgbWF4X3ZhbCA9IF9faGd0KHZhbCwgbWF4X3ZhbCkgPyB2YWwgOiBtYXhfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHN1bSA9IDAuMGY7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gX19leHBmKF9faGFsZjJmbG9hdChvdXRwdXRbaWR4ICogbiArIGldKSAtIF9faGFsZjJmbG9hdChtYXhfdmFsKSk7DQogICAgICAgICAgICBzdW0gKz0gZXhwX3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IF9fZXhwZihfX2hhbGYyZmxvYXQob3V0cHV0W2lkeCAqIG4gKyBpXSkgLSBfX2hhbGYyZmxvYXQobWF4X3ZhbCkpOw0KICAgICAgICAgICAgb3V0cHV0W2lkeCAqIG4gKyBpXSA9IF9fZmxvYXQyaGFsZihleHBfdmFsIC8gc3VtKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRvcGsoY29uc3QgX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0sIGludCBuLCBpbnQgaykgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIC8vIEZpbmQgdG9wLWsgaW5kaWNlcyBmb3Igcm93IGlkeA0KICAgICAgICAvLyBTaW1wbGUgc2VsZWN0aW9uIHNvcnQgZm9yIHNtYWxsIGsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIHsNCiAgICAgICAgICAgIF9faGFsZiBtYXhfdmFsID0gX19mbG9hdDJoYWxmKC1JTkZJTklUWSk7DQogICAgICAgICAgICBpbnQgbWF4X2lkeCA9IC0xOw0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opIHsNCiAgICAgICAgICAgICAgICBpZiAoX19oZ3QoaW5wdXRbaWR4ICogbiArIGpdLCBtYXhfdmFsKSkgew0KICAgICAgICAgICAgICAgICAgICBpbnQgZm91bmQgPSAwOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGk7ICsrbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBsXSA9PSBqKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfdmFsID0gaW5wdXRbaWR4ICogbiArIGpdOw0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lkeCA9IGo7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0b3BfaW5kaWNlc1tpZHggKiBrICsgaV0gPSBtYXhfaWR4Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgY2FsY3VsYXRlX2luZGV4KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXB0OyArK2opIHsNCiAgICAgICAgICAgIGludCBleHBlcnQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBqXTsNCiAgICAgICAgICAgIGludCBvZmZzZXQgPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W2V4cGVydF0sIDEpOw0KICAgICAgICAgICAgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGpdID0gb2Zmc2V0Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcmVvcmRlcl9pbnB1dChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfb2Zmc2V0W2V4cGVydF9pZF0gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lng7IGogPCBkaDsgaiArPSA2NCkgew0KICAgICAgICAgICAgICAgIGlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdID0gaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHBhY2tfb3V0cHV0KGhhbGYgKm91dHB1dF9kb3duLCBfX2hhbGYgKm91dHB1dF9wdHIsIGNvbnN0IF9faGFsZiAqc2NvcmUsIGludCAqdG9wX2luZGljZXMsIGludCAqZXhwZXJ0X29mZnNldCwgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lng7IGogPCBkaDsgaiArPSA2NCkgew0KICAgICAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wZjsNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXB0OyArK2kpIHsNCiAgICAgICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICAgICAgaW50IHRva2VuX2xvY2F0aW9uID0gZXhwZXJ0X29mZnNldFtleHBlcnRfaWRdICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBfX2hhbGYyZmxvYXQoc2NvcmVbaWR4ICogbnJlICsgZXhwZXJ0X2lkXSkgKiBfX2hhbGYyZmxvYXQob3V0cHV0X2Rvd25bdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNlOyArK2kpIHsNCiAgICAgICAgICAgICAgICByZXN1bHQgKz0gX19oYWxmMmZsb2F0KG91dHB1dF9kb3duWyhuICogKG5yZSArIGkpICsgaWR4KSAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gX19mbG9hdDJoYWxmKHJlc3VsdCk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfdXAsIHRvcmNoOjpUZW5zb3IgdF9kb3duLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlLCB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9rZW5fY291bnQsIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pIHsNCg0KICAgIGlmIChkaCAlIDEyOCAhPSAwIHx8IGRlICUgMTI4ICE9IDApIHJldHVybiAwOw0KDQogICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgIF9faGFsZiAqcm91dGVyX3B0ciAgPSAoX19oYWxmICopdF9yb3V0ZXIuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9wdHIgICAgPSAoX19oYWxmICopdF9nYXRlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKnVwX3B0ciAgICAgID0gKF9faGFsZiAqKXRfdXAuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpkb3duX3B0ciAgICA9IChfX2hhbGYgKil0X2Rvd24uZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X3B0ciAgPSAoX19oYWxmICopdF9vdXRwdXQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBkaF0NCg0KICAgIF9faGFsZiAqc2NvcmUgPSAoX19oYWxmICopdF9zY29yZS5kYXRhX3B0cigpOyAgICAgICAgICAgICAgICAgLy8gW24sIG5yZV0NCiAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgaW50ICp0b2tlbl9jb3VudCA9IChpbnQgKil0X3Rva2VuX2NvdW50LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlXQ0KICAgIGludCAqaW5kZXhfaW5fZXhwZXJ0ID0gKGludCAqKXRfaW5kZXhfaW5fZXhwZXJ0LmRhdGFfcHRyKCk7ICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKmV4cGVydF9vZmZzZXQgPSAoaW50ICopdF9leHBlcnRfb2Zmc2V0LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtucmVdDQogICAgX19oYWxmICppbnB1dF9yZW9yZGVyID0gKF9faGFsZiAqKXRfaW5wdXRfcmVvcmRlci5kYXRhX3B0cigpOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgX19oYWxmICpoaWRkZW4gPSAoX19oYWxmICopdF9oaWRkZW4uZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkZV0NCiAgICBfX2hhbGYgKm91dHB1dF9kb3duID0gKF9faGFsZiAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCg0KICAgIC8vIGludCAqdG9rZW5fY291bnQ7IC8vIFtucmVdLCB0b2tlbiBjb3VudCBvZiBlYWNoIGV4cGVydA0KICAgIC8vIGludCAqaW5kZXhfaW5fZXhwZXJ0OyAvLyBbbiwgZXB0XSwgaW5kZXggaW4gZXhwZXJ0IG9mIGVhY2ggdG9rZW4sIGkgLT4gZXhwZXJ0IHRva2VuIGluZGV4DQogICAgaGlwTWVtc2V0KHRva2VuX2NvdW50LCAwLCBucmUgKiBzaXplb2YoaW50KSk7DQogICAgY2FsY3VsYXRlX2luZGV4PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUpOw0KICAgIGhpcERldmljZVN5bmNocm9uaXplKCk7DQoNCiAgICAvLyBleHBlcnQgb2Zmc2V0DQogICAgLy8gaW50ICpleHBlcnRfb2Zmc2V0OyAvLyBbbnJlXQ0KICAgIHsNCiAgICAgICAgaW50IG9mZnNldCA9IDA7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgICAgIGV4cGVydF9vZmZzZXRbaV0gPSBpICogbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIHJlb3JkZXIgaW5wdXQNCiAgICAvLyBfX2hhbGYgKmlucHV0X3Jlb3JkZXI7IC8vIFtuICogZXB0LCBkaF0NCiAgICByZW9yZGVyX2lucHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4oaW5wdXRfcHRyLCB0b3BfaW5kaWNlcywgZXhwZXJ0X29mZnNldCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyLCBuLCBlcHQsIG5yZSwgZGgpOw0KDQogICAgaW50IG1heF90b2tlbl9jb3VudCA9IDA7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgew0KICAgICAgICBpZiAodG9rZW5fY291bnRbaV0gPiBtYXhfdG9rZW5fY291bnQpIG1heF90b2tlbl9jb3VudCA9IHRva2VuX2NvdW50W2ldOw0KICAgIH0NCg0KICAgIHJldHVybiBtYXhfdG9rZW5fY291bnQ7DQp9DQoNCnZvaWQgbW9lMih0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9yb3V0ZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2V4cGVydF9vZmZzZXQsIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2hpZGRlbiwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duKSB7DQoNCiAgICBpZiAoZGggJSAxMjggIT0gMCB8fCBkZSAlIDEyOCAhPSAwKSByZXR1cm47DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpyb3V0ZXJfcHRyICA9IChfX2hhbGYgKil0X3JvdXRlci5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSwgZGhdDQogICAgX19oYWxmICpnYXRlX3B0ciAgICA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqdXBfcHRyICAgICAgPSAoX19oYWxmICopdF91cC5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKmRvd25fcHRyICAgID0gKF9faGFsZiAqKXRfZG93bi5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqZXhwZXJ0X29mZnNldCA9IChpbnQgKil0X2V4cGVydF9vZmZzZXQuZGF0YV9wdHIoKTsgICAgICAgLy8gW25yZV0NCiAgICBfX2hhbGYgKmlucHV0X3Jlb3JkZXIgPSAoX19oYWxmICopdF9pbnB1dF9yZW9yZGVyLmRhdGFfcHRyKCk7IC8vIFtuICogZXB0LCBkaF0NCiAgICBfX2hhbGYgKmhpZGRlbiA9IChfX2hhbGYgKil0X2hpZGRlbi5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd24gPSAoX19oYWxmICopdF9vdXRwdXRfZG93bi5kYXRhX3B0cigpOyAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGhdDQoNCiAgICBwYWNrX291dHB1dDw8PGRpbTMobiksIGRpbTMoNjQpPj4+KG91dHB1dF9kb3duLCBvdXRwdXRfcHRyLCBzY29yZSwgdG9wX2luZGljZXMsIGV4cGVydF9vZmZzZXQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgpOw0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgID0gaW5wdXRfdGVuc29yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyID0gd2VpZ2h0c1sncm91dGVyLndlaWdodCddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZSAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkaCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIHVwICAgICA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBkb3duICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRlLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guemVyb3MoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bltpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQogICAgZm9yIGkgaW4gcmFuZ2UobnNlKToNCiAgICAgICAgZ2F0ZVtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J11bOiwgaSAqIGRlOihpICsgMSkgKiBkZV0NCiAgICAgICAgdXBbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIGRvd25bbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddW2kgKiBkZTooaSArIDEpICogZGUsIDpdDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBleHBlcnRfb2Zmc2V0ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlXQ0KICAgIGlucHV0X3Jlb3JkZXIgPSB0b3JjaC5lbXB0eShucmUsIGJzKnNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAjIFtucmUsIGJzICogc2wsIGRoXQ0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRoXQ0KDQogICAgc2NvcmUgPSB0b3JjaC5zb2Z0bWF4KGlucHV0LnZpZXcoYnMqc2wsIGRoKSBAIHJvdXRlci5ULCBkaW09MSkgICMgW2JzICogc2wsIG5yZV0NCg0KICAgIG1heF9jb3VudCA9IG1vZHVsZS5tb2UxKGlucHV0LCByb3V0ZXIsIGdhdGUsIHVwLCBkb3duLCBvdXRwdXQsDQogICAgICAgIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgZXhwZXJ0X29mZnNldCwNCiAgICAgICAgaW5wdXRfcmVvcmRlciwgaGlkZGVuLCBvdXRwdXRfZG93bikNCg0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZVs6bnJlLCA6LCA6XSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwWzpucmUsIDosIDpdKQ0KICAgIGhpZGRlbltucmU6LCA6LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCBnYXRlW25yZTosIDosIDpdKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cFtucmU6LCA6LCA6XSkNCiAgICBvdXRwdXRfZG93biA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRoXQ0KICAgIG91dHB1dF9kb3duWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2guYm1tKGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSwgZG93bls6bnJlLCA6LCA6XSkNCiAgICBvdXRwdXRfZG93bltucmU6LCA6LCA6XSA9IHRvcmNoLmJtbShoaWRkZW5bbnJlOiwgOiwgOl0sIGRvd25bbnJlOiwgOiwgOl0pDQoNCiAgICBtb2R1bGUubW9lMihpbnB1dCwgcm91dGVyLCBnYXRlLCB1cCwgZG93biwgb3V0cHV0LA0KICAgICAgICBkaCwgZGUsIG5yZSwgbnNlLCBlcHQsIGJzKnNsLA0KICAgICAgICBzY29yZSwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIGV4cGVydF9vZmZzZXQsDQogICAgICAgIGlucHV0X3Jlb3JkZXIsIGhpZGRlbiwgb3V0cHV0X2Rvd24pDQogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file

Best evidence level for this revision: reported

JSON