Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 31029

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.

amd-moe-submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-31029?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
4.48ms
#8 of 118
2025-06-03
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
10.7ms
#9 of 118
2025-06-03

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:3904e9e9fa873407db4bf8eb7abba712b6519b9e71e486f9149914bee5d81cd7
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

amd-moe-submission.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnR5cGVkZWYgdG9yY2g6OlRlbnNvciB0dDsNCmludCBtb2UxKHR0IHRfaW5wdXQsIHR0IHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0dCB0X3Njb3JlLCB0dCB0X3RvcF9pbmRpY2VzLCB0dCB0X3Rva2VuX2NvdW50LCB0dCB0X2luZGV4X2luX2V4cGVydCwgdHQgdF9pbnB1dF9yZW9yZGVyKTsNCnZvaWQgcGFjayh0dCB0X2lucHV0LCB0dCB0X291dHB1dCwNCiAgICAgICAgICBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICAgdHQgdF9zY29yZSwgdHQgdF90b3BfaW5kaWNlcywgdHQgdF90b2tlbl9jb3VudCwgdHQgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICAgdHQgdF9vdXRwdXRfZG93bl9yZSwgdHQgdF9vdXRwdXRfZG93bl9zZSwgaW50IG1heF9jb3VudCk7DQp2b2lkIHJlX3NpbHVfbXVsKHR0IHRfZ2F0ZSwgdHQgdF91cCwgaW50IG5lLCBpbnQgbiwgaW50IGQsIHR0IHRfdG9rZW5fY291bnQpOw0Kdm9pZCBzZV9zaWx1X211bCh0dCB0X2dhdGUsIHR0IHRfdXAsIGludCBuZSwgaW50IG4sIGludCBkKTsNCnZvaWQgY29weV93ZWlnaHRzKA0KICAgIHR0IGdhdGVfcmUsIHR0IHVwX3JlLCB0dCBkb3duX3JlLCB0dCBwb2ludGVyLCBpbnQgbnJlLCBpbnQgZGgsIGludCBkZSwNCiAgICB0dCBnMCwgdHQgZzEsIHR0IGcyLCB0dCBnMywgdHQgZzQsIHR0IGc1LCB0dCBnNiwgdHQgZzcsIHR0IGc4LCB0dCBnOSwgdHQgZzEwLCB0dCBnMTEsIHR0IGcxMiwgdHQgZzEzLCB0dCBnMTQsIHR0IGcxNSwNCiAgICB0dCBnMTYsIHR0IGcxNywgdHQgZzE4LCB0dCBnMTksIHR0IGcyMCwgdHQgZzIxLCB0dCBnMjIsIHR0IGcyMywgdHQgZzI0LCB0dCBnMjUsIHR0IGcyNiwgdHQgZzI3LCB0dCBnMjgsIHR0IGcyOSwgdHQgZzMwLCB0dCBnMzEsDQogICAgdHQgdTAsIHR0IHUxLCB0dCB1MiwgdHQgdTMsIHR0IHU0LCB0dCB1NSwgdHQgdTYsIHR0IHU3LCB0dCB1OCwgdHQgdTksIHR0IHUxMCwgdHQgdTExLCB0dCB1MTIsIHR0IHUxMywgdHQgdTE0LCB0dCB1MTUsDQogICAgdHQgdTE2LCB0dCB1MTcsIHR0IHUxOCwgdHQgdTE5LCB0dCB1MjAsIHR0IHUyMSwgdHQgdTIyLCB0dCB1MjMsIHR0IHUyNCwgdHQgdTI1LCB0dCB1MjYsIHR0IHUyNywgdHQgdTI4LCB0dCB1MjksIHR0IHUzMCwgdHQgdTMxLA0KICAgIHR0IGQwLCB0dCBkMSwgdHQgZDIsIHR0IGQzLCB0dCBkNCwgdHQgZDUsIHR0IGQ2LCB0dCBkNywgdHQgZDgsIHR0IGQ5LCB0dCBkMTAsIHR0IGQxMSwgdHQgZDEyLCB0dCBkMTMsIHR0IGQxNCwgdHQgZDE1LA0KICAgIHR0IGQxNiwgdHQgZDE3LCB0dCBkMTgsIHR0IGQxOSwgdHQgZDIwLCB0dCBkMjEsIHR0IGQyMiwgdHQgZDIzLCB0dCBkMjQsIHR0IGQyNSwgdHQgZDI2LCB0dCBkMjcsIHR0IGQyOCwgdHQgZDI5LCB0dCBkMzAsIHR0IGQzMSk7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCnR5cGVkZWYgdG9yY2g6OlRlbnNvciB0dDsNCg0KX19nbG9iYWxfXyB2b2lkIHRvcGsoY29uc3QgX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0sIGludCBuLCBpbnQgaykgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7DQogICAgICAgICAgICBfX2hhbGYgbWF4X3ZhbCA9IF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpOw0KICAgICAgICAgICAgaW50IG1heF9pZHggPSAtMTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7DQogICAgICAgICAgICAgICAgaWYgKF9faGd0KGlucHV0W2lkeCAqIG4gKyBqXSwgbWF4X3ZhbCkpIHsNCiAgICAgICAgICAgICAgICAgICAgaW50IGZvdW5kID0gMDsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBpOyArK2wpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BfaW5kaWNlc1tpZHggKiBrICsgbF0gPT0gaikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IGlucHV0W2lkeCAqIG4gKyBqXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pZHggPSBqOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdG9wX2luZGljZXNbaWR4ICogayArIGldID0gbWF4X2lkeDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRvcDRfbnJlMzIoY29uc3QgX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0pIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4ID49IG0pIHJldHVybjsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KICAgIF9faGFsZiByb3dbMzJdOw0KICAgICooZmxvYXQ0ICopJnJvd1swXSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMF07DQogICAgKihmbG9hdDQgKikmcm93WzhdID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogMzIgKyA4XTsNCiAgICAqKGZsb2F0NCAqKSZyb3dbMTZdID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogMzIgKyAxNl07DQogICAgKihmbG9hdDQgKikmcm93WzI0XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMjRdOw0KDQogICAgaW50IHRvcF9pZHhbNF07DQogICAgX19oYWxmIHRvcF92YWxbNF0gPSB7X19mbG9hdDJoYWxmKC1JTkZJTklUWSksIF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpLCBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKSwgX19mbG9hdDJoYWxmKC1JTkZJTklUWSl9Ow0KDQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFswXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMF0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzBdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFsxXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMV0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzFdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdIHx8IGogPT0gdG9wX2lkeFsxXSkgY29udGludWU7DQogICAgICAgIGlmIChfX2hndChyb3dbal0sIHRvcF92YWxbMl0pKSB7DQogICAgICAgICAgICB0b3BfdmFsWzJdID0gcm93W2pdOw0KICAgICAgICAgICAgdG9wX2lkeFsyXSA9IGo7DQogICAgICAgIH0NCiAgICB9DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKGogPT0gdG9wX2lkeFswXSB8fCBqID09IHRvcF9pZHhbMV0gfHwgaiA9PSB0b3BfaWR4WzJdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFszXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbM10gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzNdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJnRvcF9pbmRpY2VzW2lkeCAqIDRdID0gKihmbG9hdDQgKikmdG9wX2lkeFswXTsNCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleCgNCiAgICBjb25zdCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0ID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgal07DQogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXRvbWljQWRkKCZ0b2tlbl9jb3VudFtleHBlcnRdLCAxKTsNCiAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBqXSA9IG9mZnNldDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbikgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBjb25zdCBpbnQgTlJFID0gMzI7DQogICAgY29uc3QgaW50IEVQVCA9IDQ7DQogICAgX19zaGFyZWRfXyBpbnQgYmxvY2tfY291bnRbTlJFXTsNCiAgICBfX3NoYXJlZF9fIGludCBibG9ja19vZmZzZXRbTlJFXTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IE5SRSkgew0KICAgICAgICBibG9ja19jb3VudFt0aHJlYWRJZHgueF0gPSAwOw0KICAgIH0NCg0KICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIGludCB0aHJlYWRfb2Zmc2V0W0VQVF07DQogICAgaW50IHRocmVhZF9leHBlcnRbRVBUXTsNCiAgICAqKGZsb2F0NCAqKSZ0aHJlYWRfZXhwZXJ0WzBdID0gKihmbG9hdDQgKikmdG9wX2luZGljZXNbaWR4ICogRVBUICsgMF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFUFQ7IGkrKykgew0KICAgICAgICB0aHJlYWRfb2Zmc2V0W2ldID0gYXRvbWljQWRkKCZibG9ja19jb3VudFt0aHJlYWRfZXhwZXJ0W2ldXSwgMSk7DQogICAgfQ0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgaWYgKHRocmVhZElkeC54IDwgTlJFKSB7DQogICAgICAgIGJsb2NrX29mZnNldFt0aHJlYWRJZHgueF0gPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W3RocmVhZElkeC54XSwgYmxvY2tfY291bnRbdGhyZWFkSWR4LnhdKTsNCiAgICB9DQoNCiAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEVQVDsgaSsrKSB7DQogICAgICAgIHRocmVhZF9vZmZzZXRbaV0gKz0gYmxvY2tfb2Zmc2V0W3RocmVhZF9leHBlcnRbaV1dOw0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJmluZGV4X2luX2V4cGVydFtpZHggKiBFUFQgKyAwXSA9ICooZmxvYXQ0ICopJnRocmVhZF9vZmZzZXRbMF07DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0NCAqKSZpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IHZhbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHJlb3JkZXJfaW5wdXRfZXB0NG5yZTMyZGg3MTY4KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBmbG9hdDQgdmFsWzE0XTsNCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTQ7IGkrKykgew0KICAgICAgICB2YWxbaV0gPSAqKGZsb2F0NCAqKSZpbnB1dFtibG9ja0lkeC54ICogNzE2OCArIHRocmVhZElkeC54ICogOCArIGkgKiA1MTJdOw0KICAgIH0NCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7DQogICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9pZCAqIG4gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDE0OyBqKyspIHsNCiAgICAgICAgICAgICooZmxvYXQ0ICopJmlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgdGhyZWFkSWR4LnggKiA4ICsgaiAqIDUxMl0gPSB2YWxbal07DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmludCBtb2UxKHR0IHRfaW5wdXQsIHR0IHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0dCB0X3Njb3JlLCB0dCB0X3RvcF9pbmRpY2VzLCB0dCB0X3Rva2VuX2NvdW50LCB0dCB0X2luZGV4X2luX2V4cGVydCwgdHQgdF9pbnB1dF9yZW9yZGVyKSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgew0KICAgICAgICB0b2tlbl9jb3VudFtpXSA9IDA7DQogICAgfQ0KDQogICAgaWYgKGVwdCA9PSA0ICYmIG5yZSA9PSAzMikgew0KICAgICAgICB0b3A0X25yZTMyPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4pOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgdG9wazw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmUsIHRvcF9pbmRpY2VzLCBuLCBucmUsIGVwdCk7DQogICAgfQ0KDQogICAgaWYgKG5yZSA9PSAzMiAmJiBlcHQgPT0gNCAmJiBuICUgNTEyID09IDApIHsNCiAgICAgICAgY2FsY3VsYXRlX2luZGV4X25yZTMyX2VwdDQ8PDxkaW0zKG4vNTEyKSwgZGltMyg1MTIpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBuKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIGNhbGN1bGF0ZV9pbmRleDw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4odG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlKTsNCiAgICB9DQoNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyICYmIGRoID09IDcxNjgpIHsNCiAgICAgICAgcmVvcmRlcl9pbnB1dF9lcHQ0bnJlMzJkaDcxNjg8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICByZW9yZGVyX2lucHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4oaW5wdXRfcHRyLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyLCBuLCBlcHQsIG5yZSwgZGgpOw0KICAgIH0NCg0KICAgIGhpcERldmljZVN5bmNocm9uaXplKCk7DQogICAgaW50IG1heF90b2tlbl9jb3VudCA9IDA7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgew0KICAgICAgICBpZiAodG9rZW5fY291bnRbaV0gPiBtYXhfdG9rZW5fY291bnQpIG1heF90b2tlbl9jb3VudCA9IHRva2VuX2NvdW50W2ldOw0KICAgIH0NCg0KICAgIHJldHVybiBtYXhfdG9rZW5fY291bnQ7DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgaSsrKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBfX2hhbGYgdGhpc19zY29yZSA9IHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgemVyb3NbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKil6ZXJvczsNCiAgICAgICAgICAgICAgICBfX2hhbGYgdmFsWzhdLCByZXNbOF07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zZTsgaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICAgICAgX19oYWxmIHZhbFs4XSwgcmVzWzhdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duX3NlWyhuICogaSArIGlkeCkgKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQodmFsW2tdLCByZXNba10pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKilyZXM7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dF9lcHQ0bnJlMzJuc2UxZGg3MTY4KGhhbGYgKm91dHB1dF9kb3duX3JlLCBoYWxmICpvdXRwdXRfZG93bl9zZSwgX19oYWxmICpvdXRwdXRfcHRyLCBjb25zdCBfX2hhbGYgKnNjb3JlLCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBuc2UsIGludCBkaCwgaW50IG1heF9jb3VudCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIHVzaW5nIGhhbGY4ID0gX19mcDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOw0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgIF9faGFsZiByZXNbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAgICAgX19oYWxmIHRoaXNfc2NvcmUgPSBzY29yZVtpZHggKiAzMiArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgdmFsWzhdOw0KICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal07DQogICAgICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOyBpKyspIHsNCiAgICAgICAgICAgIF9faGFsZiB2YWxbOF07DQogICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93bl9zZVsobiAqIGkgKyBpZHgpICogNzE2OCArIGpdOw0KICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQodmFsW2tdLCByZXNba10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiA3MTY4ICsgal0gPSAqKGhhbGY4ICopcmVzOw0KICAgIH0NCn0NCg0Kdm9pZCBwYWNrKHR0IHRfaW5wdXQsIHR0IHRfb3V0cHV0LA0KICAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgICB0dCB0X3Njb3JlLCB0dCB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgIHR0IHRfdG9rZW5fY291bnQsIHR0IHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgIHR0IHRfb3V0cHV0X2Rvd25fcmUsIHR0IHRfb3V0cHV0X2Rvd25fc2UsIGludCBtYXhfY291bnQpIHsNCg0KICAgIF9faGFsZiAqaW5wdXRfcHRyICAgPSAoX19oYWxmICopdF9pbnB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgIC8vIFtuLCBkaF0NCiAgICBfX2hhbGYgKm91dHB1dF9wdHIgID0gKF9faGFsZiAqKXRfb3V0cHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbiwgZGhdDQoNCiAgICBfX2hhbGYgKnNjb3JlID0gKF9faGFsZiAqKXRfc2NvcmUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAgIC8vIFtuLCBucmVdDQogICAgaW50ICp0b3BfaW5kaWNlcyA9IChpbnQgKil0X3RvcF9pbmRpY2VzLmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqdG9rZW5fY291bnQgPSAoaW50ICopdF90b2tlbl9jb3VudC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZV0NCiAgICBpbnQgKmluZGV4X2luX2V4cGVydCA9IChpbnQgKil0X2luZGV4X2luX2V4cGVydC5kYXRhX3B0cigpOyAgIC8vIFtuLCBlcHRdDQogICAgX19oYWxmICpvdXRwdXRfZG93bl9yZSA9IChfX2hhbGYgKil0X291dHB1dF9kb3duX3JlLmRhdGFfcHRyKCk7DQogICAgX19oYWxmICpvdXRwdXRfZG93bl9zZSA9IChfX2hhbGYgKil0X291dHB1dF9kb3duX3NlLmRhdGFfcHRyKCk7DQoNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyICYmIG5zZSA9PSAxICYmIGRoID09IDcxNjgpIHsNCiAgICAgICAgcGFja19vdXRwdXRfZXB0NG5yZTMybnNlMWRoNzE2ODw8PGRpbTMobiksIGRpbTMoNjQpPj4+KG91dHB1dF9kb3duX3JlLCBvdXRwdXRfZG93bl9zZSwgb3V0cHV0X3B0ciwgc2NvcmUsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlLCBuc2UsIGRoLCBtYXhfY291bnQpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgcGFja19vdXRwdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93bl9yZSwgb3V0cHV0X2Rvd25fc2UsIG91dHB1dF9wdHIsIHNjb3JlLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCwgbWF4X2NvdW50KTsNCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBzZV9zaWx1X211bF9rZXJuZWwoX19oYWxmICpnYXRlX3B0ciwgY29uc3QgX19oYWxmICp1cF9wdHIsIGludCBuZSwgaW50IG4sIGludCBkKSB7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnkgKiBuICsgYmxvY2tJZHgueDsNCiAgICBfX2hhbGYgZ2F0ZV92YWxbOF0sIHVwX3ZhbFs4XSwgcmVzWzhdOw0KICAgIGZvciAoaW50IGkgPSB0aHJlYWRJZHgueCAqIDg7IGkgPCBkOyBpICs9IDI1NiAqIDgpIHsNCiAgICAgICAgKihmbG9hdDQgKikmZ2F0ZV92YWxbMF0gPSAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiBkICsgaV07DQogICAgICAgICooZmxvYXQ0ICopJnVwX3ZhbFswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiBkICsgaV07DQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKSB7DQogICAgICAgICAgICBmbG9hdCBzaWx1X3ZhbCA9IF9faGFsZjJmbG9hdChnYXRlX3ZhbFtqXSkgKiAoMS4wZiAvICgxLjBmICsgZXhwZigtX19oYWxmMmZsb2F0KGdhdGVfdmFsW2pdKSkpKTsNCiAgICAgICAgICAgIHJlc1tqXSA9IF9faG11bChfX2Zsb2F0MmhhbGYoc2lsdV92YWwpLCB1cF92YWxbal0pOw0KICAgICAgICB9DQogICAgICAgICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIGQgKyBpXSA9ICooZmxvYXQ0ICopJnJlc1swXTsNCiAgICB9DQp9DQpfX2dsb2JhbF9fIHZvaWQgc2Vfc2lsdV9tdWxfa2VybmVsX2QyMDQ4KF9faGFsZiAqZ2F0ZV9wdHIsIGNvbnN0IF9faGFsZiAqdXBfcHRyLCBpbnQgbmUsIGludCBuLCBpbnQgZCkgew0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KICAgIGludCBpZHggPSBibG9ja0lkeC55ICogbiArIGJsb2NrSWR4Lng7DQogICAgX19oYWxmIGdhdGVfdmFsWzhdLCB1cF92YWxbOF0sIHJlc1s4XTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3ZhbFswXSA9ICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIDIwNDggKyB0aHJlYWRJZHgueCAqIDhdOw0KICAgICooZmxvYXQ0ICopJnVwX3ZhbFswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4XTsNCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKSB7DQogICAgICAgIGZsb2F0IHNpbHVfdmFsID0gX19oYWxmMmZsb2F0KGdhdGVfdmFsW2pdKSAqICgxLjBmIC8gKDEuMGYgKyBleHBmKC1fX2hhbGYyZmxvYXQoZ2F0ZV92YWxbal0pKSkpOw0KICAgICAgICByZXNbal0gPSBfX2htdWwoX19mbG9hdDJoYWxmKHNpbHVfdmFsKSwgdXBfdmFsW2pdKTsNCiAgICB9DQogICAgKihmbG9hdDQgKikmZ2F0ZV9wdHJbaWR4ICogMjA0OCArIHRocmVhZElkeC54ICogOF0gPSAqKGZsb2F0NCAqKSZyZXNbMF07DQp9DQp2b2lkIHNlX3NpbHVfbXVsKHR0IHRfZ2F0ZSwgdHQgdF91cCwgaW50IG5lLCBpbnQgbiwgaW50IGQpIHsNCiAgICBfX2hhbGYgKmdhdGVfcHRyID0gKF9faGFsZiAqKXRfZ2F0ZS5kYXRhX3B0cigpOyAvLyBbbmUsIG4sIGRdDQogICAgX19oYWxmICp1cF9wdHIgICA9IChfX2hhbGYgKil0X3VwLmRhdGFfcHRyKCk7ICAgLy8gW25lLCBuLCBkXQ0KICAgIGlmIChkID09IDIwNDgpIHsNCiAgICAgICAgc2Vfc2lsdV9tdWxfa2VybmVsX2QyMDQ4PDw8ZGltMyhuLCBuZSksIGRpbTMoMjU2KT4+PihnYXRlX3B0ciwgdXBfcHRyLCBuZSwgbiwgZCk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBzZV9zaWx1X211bF9rZXJuZWw8PDxkaW0zKG4sIG5lKSwgZGltMygyNTYpPj4+KGdhdGVfcHRyLCB1cF9wdHIsIG5lLCBuLCBkKTsNCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZV9zaWx1X211bF9rZXJuZWwoX19oYWxmICpnYXRlX3B0ciwgY29uc3QgX19oYWxmICp1cF9wdHIsIGludCBuZSwgaW50IG4sIGludCBkLCBpbnQgKnRva2VuX2NvdW50KSB7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgaWYgKGJsb2NrSWR4LnggPj0gdG9rZW5fY291bnRbYmxvY2tJZHgueV0pIHJldHVybjsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueSAqIG4gKyBibG9ja0lkeC54Ow0KICAgIF9faGFsZiBnYXRlX3ZhbFs4XSwgdXBfdmFsWzhdLCByZXNbOF07DQogICAgZm9yIChpbnQgaSA9IHRocmVhZElkeC54ICogODsgaSA8IGQ7IGkgKz0gNjQgKiA4KSB7DQogICAgICAgICooZmxvYXQ0ICopJmdhdGVfdmFsWzBdID0gKihmbG9hdDQgKikmZ2F0ZV9wdHJbaWR4ICogZCArIGldOw0KICAgICAgICAqKGZsb2F0NCAqKSZ1cF92YWxbMF0gPSAqKGZsb2F0NCAqKSZ1cF9wdHJbaWR4ICogZCArIGldOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgZmxvYXQgc2lsdV92YWwgPSBfX2hhbGYyZmxvYXQoZ2F0ZV92YWxbal0pICogKDEuMGYgLyAoMS4wZiArIGV4cGYoLV9faGFsZjJmbG9hdChnYXRlX3ZhbFtqXSkpKSk7DQogICAgICAgICAgICByZXNbal0gPSBfX2htdWwoX19mbG9hdDJoYWxmKHNpbHVfdmFsKSwgdXBfdmFsW2pdKTsNCiAgICAgICAgfQ0KICAgICAgICAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiBkICsgaV0gPSAqKGZsb2F0NCAqKSZyZXNbMF07DQogICAgfQ0KfQ0KX19nbG9iYWxfXyB2b2lkIHJlX3NpbHVfbXVsX2tlcm5lbF9kMjA0OChfX2hhbGYgKmdhdGVfcHRyLCBjb25zdCBfX2hhbGYgKnVwX3B0ciwgaW50IG5lLCBpbnQgbiwgaW50IGQsIGludCAqdG9rZW5fY291bnQpIHsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoYmxvY2tJZHgueCA+PSB0b2tlbl9jb3VudFtibG9ja0lkeC55XSkgcmV0dXJuOw0KICAgIGludCBpZHggPSBibG9ja0lkeC55ICogbiArIGJsb2NrSWR4Lng7DQogICAgX19oYWxmIGdhdGVfdmFsWzRdWzhdLCB1cF92YWxbNF1bOF0sIHJlc1s0XVs4XTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3ZhbFswXVswXSA9ICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIDIwNDggKyB0aHJlYWRJZHgueCAqIDhdOw0KICAgICooZmxvYXQ0ICopJnVwX3ZhbFswXVswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4XTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3ZhbFsxXVswXSA9ICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIDIwNDggKyB0aHJlYWRJZHgueCAqIDggKyA1MTJdOw0KICAgICooZmxvYXQ0ICopJnVwX3ZhbFsxXVswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4ICsgNTEyXTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3ZhbFsyXVswXSA9ICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIDIwNDggKyB0aHJlYWRJZHgueCAqIDggKyAxMDI0XTsNCiAgICAqKGZsb2F0NCAqKSZ1cF92YWxbMl1bMF0gPSAqKGZsb2F0NCAqKSZ1cF9wdHJbaWR4ICogMjA0OCArIHRocmVhZElkeC54ICogOCArIDEwMjRdOw0KICAgICooZmxvYXQ0ICopJmdhdGVfdmFsWzNdWzBdID0gKihmbG9hdDQgKikmZ2F0ZV9wdHJbaWR4ICogMjA0OCArIHRocmVhZElkeC54ICogOCArIDE1MzZdOw0KICAgICooZmxvYXQ0ICopJnVwX3ZhbFszXVswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4ICsgMTUzNl07DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgZmxvYXQgc2lsdV92YWwgPSBfX2hhbGYyZmxvYXQoZ2F0ZV92YWxbaV1bal0pICogKDEuMGYgLyAoMS4wZiArIGV4cGYoLV9faGFsZjJmbG9hdChnYXRlX3ZhbFtpXVtqXSkpKSk7DQogICAgICAgICAgICByZXNbaV1bal0gPSBfX2htdWwoX19mbG9hdDJoYWxmKHNpbHVfdmFsKSwgdXBfdmFsW2ldW2pdKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4XSA9ICooZmxvYXQ0ICopJnJlc1swXVswXTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4ICsgNTEyXSA9ICooZmxvYXQ0ICopJnJlc1sxXVswXTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4ICsgMTAyNF0gPSAqKGZsb2F0NCAqKSZyZXNbMl1bMF07DQogICAgKihmbG9hdDQgKikmZ2F0ZV9wdHJbaWR4ICogMjA0OCArIHRocmVhZElkeC54ICogOCArIDE1MzZdID0gKihmbG9hdDQgKikmcmVzWzNdWzBdOw0KfQ0Kdm9pZCByZV9zaWx1X211bCh0dCB0X2dhdGUsIHR0IHRfdXAsIGludCBuZSwgaW50IG4sIGludCBkLCB0dCB0X3Rva2VuX2NvdW50KSB7DQogICAgX19oYWxmICpnYXRlX3B0ciA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgLy8gW25lLCBuLCBkXQ0KICAgIF9faGFsZiAqdXBfcHRyICAgPSAoX19oYWxmICopdF91cC5kYXRhX3B0cigpOyAgIC8vIFtuZSwgbiwgZF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgLy8gW25lXQ0KICAgIGlmIChkID09IDIwNDgpIHsNCiAgICAgICAgcmVfc2lsdV9tdWxfa2VybmVsX2QyMDQ4PDw8ZGltMyhuLCBuZSksIGRpbTMoNjQpPj4+KGdhdGVfcHRyLCB1cF9wdHIsIG5lLCBuLCBkLCB0b2tlbl9jb3VudCk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICByZV9zaWx1X211bF9rZXJuZWw8PDxkaW0zKG4sIG5lKSwgZGltMyg2NCk+Pj4oZ2F0ZV9wdHIsIHVwX3B0ciwgbmUsIG4sIGQsIHRva2VuX2NvdW50KTsNCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBjb3B5X3dlaWdodHNfa2VybmVsKHVuc2lnbmVkIGxvbmcgbG9uZyAqcHRyKSB7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgX19oYWxmICpzcmNfcHRyID0gKF9faGFsZiAqKShwdHJbYmxvY2tJZHgueCAgICAgXSkgKyBibG9ja0lkeC55ICogMzIgKiA3MTY4Ow0KICAgIF9faGFsZiAqZHN0X3B0ciA9IChfX2hhbGYgKikocHRyW2Jsb2NrSWR4LnggKyA5Nl0pICsgYmxvY2tJZHgueSAqIDMyICogNzE2ODsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspIHsNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKSZkc3RfcHRyW2kgKiA3MTY4ICsgal0gPSAqKGZsb2F0NCAqKSZzcmNfcHRyW2kgKiA3MTY4ICsgal07DQogICAgICAgIH0NCiAgICB9DQp9DQp2b2lkIGNvcHlfd2VpZ2h0cygNCiAgICB0dCBnYXRlX3JlLCB0dCB1cF9yZSwgdHQgZG93bl9yZSwgdHQgcG9pbnRlciwgaW50IG5yZSwgaW50IGRoLCBpbnQgZGUsDQogICAgdHQgZzAsIHR0IGcxLCB0dCBnMiwgdHQgZzMsIHR0IGc0LCB0dCBnNSwgdHQgZzYsIHR0IGc3LCB0dCBnOCwgdHQgZzksIHR0IGcxMCwgdHQgZzExLCB0dCBnMTIsIHR0IGcxMywgdHQgZzE0LCB0dCBnMTUsDQogICAgdHQgZzE2LCB0dCBnMTcsIHR0IGcxOCwgdHQgZzE5LCB0dCBnMjAsIHR0IGcyMSwgdHQgZzIyLCB0dCBnMjMsIHR0IGcyNCwgdHQgZzI1LCB0dCBnMjYsIHR0IGcyNywgdHQgZzI4LCB0dCBnMjksIHR0IGczMCwgdHQgZzMxLA0KICAgIHR0IHUwLCB0dCB1MSwgdHQgdTIsIHR0IHUzLCB0dCB1NCwgdHQgdTUsIHR0IHU2LCB0dCB1NywgdHQgdTgsIHR0IHU5LCB0dCB1MTAsIHR0IHUxMSwgdHQgdTEyLCB0dCB1MTMsIHR0IHUxNCwgdHQgdTE1LA0KICAgIHR0IHUxNiwgdHQgdTE3LCB0dCB1MTgsIHR0IHUxOSwgdHQgdTIwLCB0dCB1MjEsIHR0IHUyMiwgdHQgdTIzLCB0dCB1MjQsIHR0IHUyNSwgdHQgdTI2LCB0dCB1MjcsIHR0IHUyOCwgdHQgdTI5LCB0dCB1MzAsIHR0IHUzMSwNCiAgICB0dCBkMCwgdHQgZDEsIHR0IGQyLCB0dCBkMywgdHQgZDQsIHR0IGQ1LCB0dCBkNiwgdHQgZDcsIHR0IGQ4LCB0dCBkOSwgdHQgZDEwLCB0dCBkMTEsIHR0IGQxMiwgdHQgZDEzLCB0dCBkMTQsIHR0IGQxNSwNCiAgICB0dCBkMTYsIHR0IGQxNywgdHQgZDE4LCB0dCBkMTksIHR0IGQyMCwgdHQgZDIxLCB0dCBkMjIsIHR0IGQyMywgdHQgZDI0LCB0dCBkMjUsIHR0IGQyNiwgdHQgZDI3LCB0dCBkMjgsIHR0IGQyOSwgdHQgZDMwLCB0dCBkMzEpIHsNCg0KICAgIHVzaW5nIHU2NCA9IHVuc2lnbmVkIGxvbmcgbG9uZzsNCiAgICB1NjQgKnB0ciA9ICh1NjQgKilwb2ludGVyLmRhdGFfcHRyKCk7DQogICAgcHRyWzBdID0gKHU2NClnMC5kYXRhX3B0cigpOw0KICAgIHB0clsxXSA9ICh1NjQpZzEuZGF0YV9wdHIoKTsNCiAgICBwdHJbMl0gPSAodTY0KWcyLmRhdGFfcHRyKCk7DQogICAgcHRyWzNdID0gKHU2NClnMy5kYXRhX3B0cigpOw0KICAgIHB0cls0XSA9ICh1NjQpZzQuZGF0YV9wdHIoKTsNCiAgICBwdHJbNV0gPSAodTY0KWc1LmRhdGFfcHRyKCk7DQogICAgcHRyWzZdID0gKHU2NClnNi5kYXRhX3B0cigpOw0KICAgIHB0cls3XSA9ICh1NjQpZzcuZGF0YV9wdHIoKTsNCiAgICBwdHJbOF0gPSAodTY0KWc4LmRhdGFfcHRyKCk7DQogICAgcHRyWzldID0gKHU2NClnOS5kYXRhX3B0cigpOw0KICAgIHB0clsxMF0gPSAodTY0KWcxMC5kYXRhX3B0cigpOw0KICAgIHB0clsxMV0gPSAodTY0KWcxMS5kYXRhX3B0cigpOw0KICAgIHB0clsxMl0gPSAodTY0KWcxMi5kYXRhX3B0cigpOw0KICAgIHB0clsxM10gPSAodTY0KWcxMy5kYXRhX3B0cigpOw0KICAgIHB0clsxNF0gPSAodTY0KWcxNC5kYXRhX3B0cigpOw0KICAgIHB0clsxNV0gPSAodTY0KWcxNS5kYXRhX3B0cigpOw0KICAgIHB0clsxNl0gPSAodTY0KWcxNi5kYXRhX3B0cigpOw0KICAgIHB0clsxN10gPSAodTY0KWcxNy5kYXRhX3B0cigpOw0KICAgIHB0clsxOF0gPSAodTY0KWcxOC5kYXRhX3B0cigpOw0KICAgIHB0clsxOV0gPSAodTY0KWcxOS5kYXRhX3B0cigpOw0KICAgIHB0clsyMF0gPSAodTY0KWcyMC5kYXRhX3B0cigpOw0KICAgIHB0clsyMV0gPSAodTY0KWcyMS5kYXRhX3B0cigpOw0KICAgIHB0clsyMl0gPSAodTY0KWcyMi5kYXRhX3B0cigpOw0KICAgIHB0clsyM10gPSAodTY0KWcyMy5kYXRhX3B0cigpOw0KICAgIHB0clsyNF0gPSAodTY0KWcyNC5kYXRhX3B0cigpOw0KICAgIHB0clsyNV0gPSAodTY0KWcyNS5kYXRhX3B0cigpOw0KICAgIHB0clsyNl0gPSAodTY0KWcyNi5kYXRhX3B0cigpOw0KICAgIHB0clsyN10gPSAodTY0KWcyNy5kYXRhX3B0cigpOw0KICAgIHB0clsyOF0gPSAodTY0KWcyOC5kYXRhX3B0cigpOw0KICAgIHB0clsyOV0gPSAodTY0KWcyOS5kYXRhX3B0cigpOw0KICAgIHB0clszMF0gPSAodTY0KWczMC5kYXRhX3B0cigpOw0KICAgIHB0clszMV0gPSAodTY0KWczMS5kYXRhX3B0cigpOw0KICAgIHB0clszMl0gPSAodTY0KXUwLmRhdGFfcHRyKCk7DQogICAgcHRyWzMzXSA9ICh1NjQpdTEuZGF0YV9wdHIoKTsNCiAgICBwdHJbMzRdID0gKHU2NCl1Mi5kYXRhX3B0cigpOw0KICAgIHB0clszNV0gPSAodTY0KXUzLmRhdGFfcHRyKCk7DQogICAgcHRyWzM2XSA9ICh1NjQpdTQuZGF0YV9wdHIoKTsNCiAgICBwdHJbMzddID0gKHU2NCl1NS5kYXRhX3B0cigpOw0KICAgIHB0clszOF0gPSAodTY0KXU2LmRhdGFfcHRyKCk7DQogICAgcHRyWzM5XSA9ICh1NjQpdTcuZGF0YV9wdHIoKTsNCiAgICBwdHJbNDBdID0gKHU2NCl1OC5kYXRhX3B0cigpOw0KICAgIHB0cls0MV0gPSAodTY0KXU5LmRhdGFfcHRyKCk7DQogICAgcHRyWzQyXSA9ICh1NjQpdTEwLmRhdGFfcHRyKCk7DQogICAgcHRyWzQzXSA9ICh1NjQpdTExLmRhdGFfcHRyKCk7DQogICAgcHRyWzQ0XSA9ICh1NjQpdTEyLmRhdGFfcHRyKCk7DQogICAgcHRyWzQ1XSA9ICh1NjQpdTEzLmRhdGFfcHRyKCk7DQogICAgcHRyWzQ2XSA9ICh1NjQpdTE0LmRhdGFfcHRyKCk7DQogICAgcHRyWzQ3XSA9ICh1NjQpdTE1LmRhdGFfcHRyKCk7DQogICAgcHRyWzQ4XSA9ICh1NjQpdTE2LmRhdGFfcHRyKCk7DQogICAgcHRyWzQ5XSA9ICh1NjQpdTE3LmRhdGFfcHRyKCk7DQogICAgcHRyWzUwXSA9ICh1NjQpdTE4LmRhdGFfcHRyKCk7DQogICAgcHRyWzUxXSA9ICh1NjQpdTE5LmRhdGFfcHRyKCk7DQogICAgcHRyWzUyXSA9ICh1NjQpdTIwLmRhdGFfcHRyKCk7DQogICAgcHRyWzUzXSA9ICh1NjQpdTIxLmRhdGFfcHRyKCk7DQogICAgcHRyWzU0XSA9ICh1NjQpdTIyLmRhdGFfcHRyKCk7DQogICAgcHRyWzU1XSA9ICh1NjQpdTIzLmRhdGFfcHRyKCk7DQogICAgcHRyWzU2XSA9ICh1NjQpdTI0LmRhdGFfcHRyKCk7DQogICAgcHRyWzU3XSA9ICh1NjQpdTI1LmRhdGFfcHRyKCk7DQogICAgcHRyWzU4XSA9ICh1NjQpdTI2LmRhdGFfcHRyKCk7DQogICAgcHRyWzU5XSA9ICh1NjQpdTI3LmRhdGFfcHRyKCk7DQogICAgcHRyWzYwXSA9ICh1NjQpdTI4LmRhdGFfcHRyKCk7DQogICAgcHRyWzYxXSA9ICh1NjQpdTI5LmRhdGFfcHRyKCk7DQogICAgcHRyWzYyXSA9ICh1NjQpdTMwLmRhdGFfcHRyKCk7DQogICAgcHRyWzYzXSA9ICh1NjQpdTMxLmRhdGFfcHRyKCk7DQogICAgcHRyWzY0XSA9ICh1NjQpZDAuZGF0YV9wdHIoKTsNCiAgICBwdHJbNjVdID0gKHU2NClkMS5kYXRhX3B0cigpOw0KICAgIHB0cls2Nl0gPSAodTY0KWQyLmRhdGFfcHRyKCk7DQogICAgcHRyWzY3XSA9ICh1NjQpZDMuZGF0YV9wdHIoKTsNCiAgICBwdHJbNjhdID0gKHU2NClkNC5kYXRhX3B0cigpOw0KICAgIHB0cls2OV0gPSAodTY0KWQ1LmRhdGFfcHRyKCk7DQogICAgcHRyWzcwXSA9ICh1NjQpZDYuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzFdID0gKHU2NClkNy5kYXRhX3B0cigpOw0KICAgIHB0cls3Ml0gPSAodTY0KWQ4LmRhdGFfcHRyKCk7DQogICAgcHRyWzczXSA9ICh1NjQpZDkuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzRdID0gKHU2NClkMTAuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzVdID0gKHU2NClkMTEuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzZdID0gKHU2NClkMTIuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzddID0gKHU2NClkMTMuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzhdID0gKHU2NClkMTQuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzldID0gKHU2NClkMTUuZGF0YV9wdHIoKTsNCiAgICBwdHJbODBdID0gKHU2NClkMTYuZGF0YV9wdHIoKTsNCiAgICBwdHJbODFdID0gKHU2NClkMTcuZGF0YV9wdHIoKTsNCiAgICBwdHJbODJdID0gKHU2NClkMTguZGF0YV9wdHIoKTsNCiAgICBwdHJbODNdID0gKHU2NClkMTkuZGF0YV9wdHIoKTsNCiAgICBwdHJbODRdID0gKHU2NClkMjAuZGF0YV9wdHIoKTsNCiAgICBwdHJbODVdID0gKHU2NClkMjEuZGF0YV9wdHIoKTsNCiAgICBwdHJbODZdID0gKHU2NClkMjIuZGF0YV9wdHIoKTsNCiAgICBwdHJbODddID0gKHU2NClkMjMuZGF0YV9wdHIoKTsNCiAgICBwdHJbODhdID0gKHU2NClkMjQuZGF0YV9wdHIoKTsNCiAgICBwdHJbODldID0gKHU2NClkMjUuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTBdID0gKHU2NClkMjYuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTFdID0gKHU2NClkMjcuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTJdID0gKHU2NClkMjguZGF0YV9wdHIoKTsNCiAgICBwdHJbOTNdID0gKHU2NClkMjkuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTRdID0gKHU2NClkMzAuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTVdID0gKHU2NClkMzEuZGF0YV9wdHIoKTsNCiAgICBfX2hhbGYgKmdhdGVfcmVfcHRyID0gKF9faGFsZiAqKWdhdGVfcmUuZGF0YV9wdHIoKTsNCiAgICBfX2hhbGYgKnVwX3JlX3B0ciAgID0gKF9faGFsZiAqKXVwX3JlLmRhdGFfcHRyKCk7DQogICAgX19oYWxmICpkb3duX3JlX3B0ciA9IChfX2hhbGYgKilkb3duX3JlLmRhdGFfcHRyKCk7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgcHRyW2kgKyA5Nl0gPSAodTY0KSgmZ2F0ZV9yZV9wdHJbaSAqIGRoICogZGVdKTsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSBwdHJbaSArIDEyOF0gPSAodTY0KSgmdXBfcmVfcHRyW2kgKiBkaCAqIGRlXSk7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgcHRyW2kgKyAxNjBdID0gKHU2NCkoJmRvd25fcmVfcHRyW2kgKiBkZSAqIGRoXSk7DQogICAgY29weV93ZWlnaHRzX2tlcm5lbDw8PGRpbTMoOTYsIDY0KSwgZGltMyg2NCk+Pj4ocHRyKTsNCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdtb2UnLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnbW9lMScsICdwYWNrJywgJ3JlX3NpbHVfbXVsJywgJ3NlX3NpbHVfbXVsJywgJ2NvcHlfd2VpZ2h0cyddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgZ2F0ZV9yZSA9IHRvcmNoLmVtcHR5KG5yZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgIHVwX3JlICAgPSB0b3JjaC5lbXB0eShucmUsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCiAgICBkb3duX3JlID0gdG9yY2guZW1wdHkobnJlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpDQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCg0KICAgIHRvcF9pbmRpY2VzID0gdG9yY2guZW1wdHkoYnMgKiBzbCwgZXB0LCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykNCiAgICB0b2tlbl9jb3VudCA9IHRvcmNoLmVtcHR5KG5yZSwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCwgZXB0LCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykNCiAgICBpbnB1dF9yZW9yZGVyID0gdG9yY2guZW1wdHkobnJlLCBicyAqIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCg0KICAgIGlucHV0ID0gaW5wdXRfdGVuc29yDQogICAgcm91dGVyICA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXQ0KICAgIGdsID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddIGZvciBpIGluIHJhbmdlKG5yZSldDQogICAgdWwgPSBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10gZm9yIGkgaW4gcmFuZ2UobnJlKV0NCiAgICBkbCA9IFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXSBmb3IgaSBpbiByYW5nZShucmUpXQ0KICAgIGlmIG5yZSA9PSAzMiBhbmQgZGggPT0gNzE2OCBhbmQgZGUgPT0gMjA0ODoNCiAgICAgICAgcG9pbnRlciA9IHRvcmNoLmVtcHR5KG5yZSAqIDYsIGR0eXBlPXRvcmNoLnVpbnQ2NCwgZGV2aWNlPSdjdWRhJykNCiAgICAgICAgbW9kdWxlLmNvcHlfd2VpZ2h0cyhnYXRlX3JlLCB1cF9yZSwgZG93bl9yZSwgcG9pbnRlciwgbnJlLCBkaCwgZGUsDQogICAgICAgICAgICBnbFswXSxnbFsxXSxnbFsyXSxnbFszXSxnbFs0XSxnbFs1XSxnbFs2XSxnbFs3XSxnbFs4XSxnbFs5XSxnbFsxMF0sZ2xbMTFdLGdsWzEyXSxnbFsxM10sZ2xbMTRdLGdsWzE1XSxnbFsxNl0sZ2xbMTddLGdsWzE4XSxnbFsxOV0sZ2xbMjBdLGdsWzIxXSxnbFsyMl0sZ2xbMjNdLGdsWzI0XSxnbFsyNV0sZ2xbMjZdLGdsWzI3XSxnbFsyOF0sZ2xbMjldLGdsWzMwXSxnbFszMV0sDQogICAgICAgICAgICB1bFswXSx1bFsxXSx1bFsyXSx1bFszXSx1bFs0XSx1bFs1XSx1bFs2XSx1bFs3XSx1bFs4XSx1bFs5XSx1bFsxMF0sdWxbMTFdLHVsWzEyXSx1bFsxM10sdWxbMTRdLHVsWzE1XSx1bFsxNl0sdWxbMTddLHVsWzE4XSx1bFsxOV0sdWxbMjBdLHVsWzIxXSx1bFsyMl0sdWxbMjNdLHVsWzI0XSx1bFsyNV0sdWxbMjZdLHVsWzI3XSx1bFsyOF0sdWxbMjldLHVsWzMwXSx1bFszMV0sDQogICAgICAgICAgICBkbFswXSxkbFsxXSxkbFsyXSxkbFszXSxkbFs0XSxkbFs1XSxkbFs2XSxkbFs3XSxkbFs4XSxkbFs5XSxkbFsxMF0sZGxbMTFdLGRsWzEyXSxkbFsxM10sZGxbMTRdLGRsWzE1XSxkbFsxNl0sZGxbMTddLGRsWzE4XSxkbFsxOV0sZGxbMjBdLGRsWzIxXSxkbFsyMl0sZGxbMjNdLGRsWzI0XSxkbFsyNV0sZGxbMjZdLGRsWzI3XSxkbFsyOF0sZGxbMjldLGRsWzMwXSxkbFszMV0pDQogICAgZWxzZToNCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgICAgIGdhdGVfcmVbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQ0KICAgICAgICAgICAgdXBfcmVbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQ0KICAgICAgICAgICAgZG93bl9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQogICAgZ2F0ZV9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpDQogICAgdXBfc2UgICA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpDQogICAgZG93bl9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udmlldyhuc2UsIGRlLCBkaCkNCg0KICAgIHNjb3JlID0gdG9yY2guc29mdG1heChpbnB1dC52aWV3KGJzICogc2wsIGRoKSBAIHJvdXRlci5ULCBkaW09MSkNCg0KICAgIG1heF9jb3VudCA9IG1vZHVsZS5tb2UxKGlucHV0LCBvdXRwdXQsIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMgKiBzbCwNCiAgICAgICAgc2NvcmUsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyKQ0KDQogICAgaGlkZGVuX3JlX2dhdGUgPSB0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkNCiAgICBoaWRkZW5fcmVfdXAgICA9IHRvcmNoLmJtbShpbnB1dF9yZW9yZGVyWzosIDptYXhfY291bnQsIDpdLCB1cF9yZSkNCiAgICBtb2R1bGUucmVfc2lsdV9tdWwoaGlkZGVuX3JlX2dhdGUsIGhpZGRlbl9yZV91cCwgbnJlLCBtYXhfY291bnQsIGRlLCB0b2tlbl9jb3VudCkNCiAgICBoaWRkZW5fc2VfZ2F0ZSA9IHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzICogc2wsIGRoKSwgZ2F0ZV9zZSkNCiAgICBoaWRkZW5fc2VfdXAgICA9IHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzICogc2wsIGRoKSwgdXBfc2UpDQogICAgbW9kdWxlLnNlX3NpbHVfbXVsKGhpZGRlbl9zZV9nYXRlLCBoaWRkZW5fc2VfdXAsIG5zZSwgYnMgKiBzbCwgZGUpDQogICAgb3V0cHV0X2Rvd25fcmUgPSB0b3JjaC5ibW0oaGlkZGVuX3JlX2dhdGUsIGRvd25fcmUpDQogICAgb3V0cHV0X2Rvd25fc2UgPSB0b3JjaC5ibW0oaGlkZGVuX3NlX2dhdGUsIGRvd25fc2UpDQoNCiAgICBtb2R1bGUucGFjayhpbnB1dCwgb3V0cHV0LCBkaCwgZGUsIG5yZSwgbnNlLCBlcHQsIGJzKnNsLA0KICAgICAgICBzY29yZSwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIG91dHB1dF9kb3duX3JlLCBvdXRwdXRfZG93bl9zZSwgbWF4X2NvdW50KQ0KDQogICAgcmV0dXJuIG91dHB1dA==

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 30338.

- IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIpOw0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnAxNi5oPg0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wayhjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCB0b3A0X25yZTMyKGNvbnN0IF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCBtKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA+PSBtKSByZXR1cm47DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBfX2hhbGYgcm93WzMyXTsNCiAgICAqKGZsb2F0NCAqKSZyb3dbMF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDBdOw0KICAgICooZmxvYXQ0ICopJnJvd1s4XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgOF07DQogICAgKihmbG9hdDQgKikmcm93WzE2XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMTZdOw0KICAgICooZmxvYXQ0ICopJnJvd1syNF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDI0XTsNCg0KICAgIGludCB0b3BfaWR4WzRdID0gey0xLCAtMSwgLTEsIC0xfTsNCiAgICBfX2hhbGYgdG9wX3ZhbFs0XSA9IHtfX2Zsb2F0MmhhbGYoLUlORklOSVRZKSwgX19mbG9hdDJoYWxmKC1JTkZJTklUWSksIF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpLCBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKX07DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFswXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMF0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzBdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFsxXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMV0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzFdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdIHx8IGogPT0gdG9wX2lkeFsxXSkgY29udGludWU7DQogICAgICAgIGlmIChfX2hndChyb3dbal0sIHRvcF92YWxbMl0pKSB7DQogICAgICAgICAgICB0b3BfdmFsWzJdID0gcm93W2pdOw0KICAgICAgICAgICAgdG9wX2lkeFsyXSA9IGo7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKGogPT0gdG9wX2lkeFswXSB8fCBqID09IHRvcF9pZHhbMV0gfHwgaiA9PSB0b3BfaWR4WzJdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFszXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbM10gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzNdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJnRvcF9pbmRpY2VzW2lkeCAqIDRdID0gKihmbG9hdDQgKikmdG9wX2lkeFswXTsNCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleCgNCiAgICBjb25zdCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0ID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgal07DQogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXRvbWljQWRkKCZ0b2tlbl9jb3VudFtleHBlcnRdLCAxKTsNCiAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBqXSA9IG9mZnNldDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbikgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBjb25zdCBpbnQgTlJFID0gMzI7DQogICAgY29uc3QgaW50IEVQVCA9IDQ7DQogICAgX19zaGFyZWRfXyBpbnQgYmxvY2tfY291bnRbTlJFXTsNCiAgICBfX3NoYXJlZF9fIGludCBibG9ja19vZmZzZXRbTlJFXTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4ID49IG4pIHJldHVybjsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IE5SRSkgew0KICAgICAgICBibG9ja19jb3VudFt0aHJlYWRJZHgueF0gPSAwOw0KICAgIH0NCg0KICAgIGludCB0aHJlYWRfb2Zmc2V0W0VQVF07DQogICAgaW50IHRocmVhZF9leHBlcnRbRVBUXTsNCiAgICAqKGZsb2F0NCAqKSZ0aHJlYWRfZXhwZXJ0WzBdID0gKihmbG9hdDQgKikmdG9wX2luZGljZXNbaWR4ICogRVBUICsgMF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFUFQ7IGkrKykgew0KICAgICAgICB0aHJlYWRfb2Zmc2V0W2ldID0gYXRvbWljQWRkKCZibG9ja19jb3VudFt0aHJlYWRfZXhwZXJ0W2ldXSwgMSk7DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54IDwgTlJFKSB7DQogICAgICAgIGJsb2NrX29mZnNldFt0aHJlYWRJZHgueF0gPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W3RocmVhZElkeC54XSwgYmxvY2tfY291bnRbdGhyZWFkSWR4LnhdKTsNCiAgICB9DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEVQVDsgaSsrKSB7DQogICAgICAgIHRocmVhZF9vZmZzZXRbaV0gKz0gYmxvY2tfb2Zmc2V0W3RocmVhZF9leHBlcnRbaV1dOw0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJmluZGV4X2luX2V4cGVydFtpZHggKiBFUFQgKyAwXSA9ICooZmxvYXQ0ICopJnRocmVhZF9vZmZzZXRbMF07DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0NCAqKSZpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IHZhbDsNCiAgICAgICAgICAgICAgICAvLyBpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IGlucHV0W2lkeCAqIGRoICsgal07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2OChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmluZGV4X2luX2V4cGVydCwgX19oYWxmICppbnB1dF9yZW9yZGVyLCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSwgaW50IGRoKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4Lng7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogNCArIGldOw0KICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIDQgKyBpXTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbYmxvY2tJZHgueCAqIDcxNjggKyBqXTsNCiAgICAgICAgICAgICooZmxvYXQ0ICopJmlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal0gPSB2YWw7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgaSsrKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBfX2hhbGYgdGhpc19zY29yZSA9IHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgemVyb3NbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKil6ZXJvczsNCiAgICAgICAgICAgICAgICBfX2hhbGYgdmFsWzhdLCByZXNbOF07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICAgICAgICAgICAgICAvLyBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIG91dHB1dF9kb3duW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSksIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7IGkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IGRoOyBqICs9IDY0ICogOCkgew0KICAgICAgICAgICAgICAgIF9faGFsZiB2YWxbOF0sIHJlc1s4XTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93bl9zZVsobiAqIGkgKyBpZHgpICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopcmVzID0gKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal07DQogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzW2tdID0gX19oYWRkKHZhbFtrXSwgcmVzW2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSAqKGhhbGY4ICopcmVzOw0KICAgICAgICAgICAgICAgIC8vIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9IF9faGFkZChvdXRwdXRfZG93blsobiAqIChucmUgKyBpKSArIGlkeCkgKiBkaCArIGpdLCBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcGFja19vdXRwdXRfZXB0NG5yZTMybnNlMWRoNzE2OChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgIF9faGFsZiByZXNbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAgICAgX19oYWxmIHRoaXNfc2NvcmUgPSBzY29yZVtpZHggKiAzMiArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgdmFsWzhdOw0KICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZChfX2htdWwodGhpc19zY29yZSwgdmFsW2tdKSwgcmVzW2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgew0KICAgICAgICAgICAgX19oYWxmIHZhbFs4XTsNCiAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duX3NlWyhuICogaSArIGlkeCkgKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZCh2YWxba10sIHJlc1trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIDcxNjggKyBqXSA9ICooaGFsZjggKilyZXM7DQogICAgfQ0KfQ0KDQppbnQgbW9lMSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsDQogICAgICAgICBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyKSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyKSB7DQogICAgICAgIHRvcDRfbnJlMzI8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHNjb3JlLCB0b3BfaW5kaWNlcywgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCiAgICB9DQoNCiAgICAvLyBpbnQgKnRva2VuX2NvdW50OyAvLyBbbnJlXSwgdG9rZW4gY291bnQgb2YgZWFjaCBleHBlcnQNCiAgICAvLyBpbnQgKmluZGV4X2luX2V4cGVydDsgLy8gW24sIGVwdF0sIGluZGV4IGluIGV4cGVydCBvZiBlYWNoIHRva2VuLCBpIC0+IGV4cGVydCB0b2tlbiBpbmRleA0KICAgIC8vIGhpcE1lbXNldCh0b2tlbl9jb3VudCwgMCwgbnJlICogc2l6ZW9mKGludCkpOw0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgdG9rZW5fY291bnRbaV0gPSAwOw0KICAgIH0NCiAgICBpZiAobnJlID09IDMyICYmIGVwdCA9PSA0KSB7DQogICAgICAgIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBjYWxjdWxhdGVfaW5kZXg8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSk7DQogICAgfQ0KDQogICAgLy8gcmVvcmRlciBpbnB1dA0KICAgIC8vIF9faGFsZiAqaW5wdXRfcmVvcmRlcjsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIGlmIChlcHQgPT0gNCAmJiBucmUgPT0gMzIgJiYgZGggPT0gNzE2OCkgew0KICAgICAgICByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2ODw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHJlb3JkZXJfaW5wdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQogICAgfQ0KDQogICAgaGlwRGV2aWNlU3luY2hyb25pemUoKTsNCiAgICBpbnQgbWF4X3Rva2VuX2NvdW50ID0gMDsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgIGlmICh0b2tlbl9jb3VudFtpXSA+IG1heF90b2tlbl9jb3VudCkgbWF4X3Rva2VuX2NvdW50ID0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KDQogICAgcmV0dXJuIG1heF90b2tlbl9jb3VudDsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fcmUgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9yZS5kYXRhX3B0cigpOw0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fc2UgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9zZS5kYXRhX3B0cigpOw0KDQogICAgaWYgKGVwdCA9PSA0ICYmIG5yZSA9PSAzMiAmJiBuc2UgPT0gMSAmJiBkaCA9PSA3MTY4KSB7DQogICAgICAgIHBhY2tfb3V0cHV0X2VwdDRucmUzMm5zZTFkaDcxNjg8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93bl9yZSwgb3V0cHV0X2Rvd25fc2UsIG91dHB1dF9wdHIsIHNjb3JlLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCwgbWF4X2NvdW50KTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBvdXRwdXRfcHRyLCBzY29yZSwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgsIG1heF9jb3VudCk7DQogICAgfQ0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgICA9IGlucHV0X3RlbnNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyICA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZV9yZSA9IHRvcmNoLmVtcHR5KG5yZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICMgW25yZSwgZGgsIGRlXQ0KICAgIHVwX3JlICAgPSB0b3JjaC5lbXB0eShucmUsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAjIFtucmUsIGRoLCBkZV0NCiAgICBkb3duX3JlID0gdG9yY2guZW1wdHkobnJlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgIyBbbnJlLCBkZSwgZGhdDQogICAgZ2F0ZV9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpICMgW25zZSwgZGgsIGRlXQ0KICAgIHVwX3NlICAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnZpZXcoZGgsIG5zZSwgZGUpLnRyYW5zcG9zZSgwLCAxKSAjIFtuc2UsIGRoLCBkZV0NCiAgICBkb3duX3NlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS52aWV3KG5zZSwgZGUsIGRoKSAgICAgICAgICAgICAgICAgIyBbbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZV9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwX3JlW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBpbnB1dF9yZW9yZGVyID0gdG9yY2guZW1wdHkobnJlLCBicypzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICAjIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShicyAqIHNsICogKG5yZSArIG5zZSkgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW2JzICogc2wgKiAobnJlICsgbnNlKSwgZGhdDQoNCiAgICBzY29yZSA9IHRvcmNoLnNvZnRtYXgoaW5wdXQudmlldyhicypzbCwgZGgpIEAgcm91dGVyLlQsIGRpbT0xKSAgIyBbYnMgKiBzbCwgbnJlXQ0KDQogICAgbWF4X2NvdW50ID0gbW9kdWxlLm1vZTEoaW5wdXQsIG91dHB1dCwgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmUsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyKQ0KDQogICAgIyBoaWRkZW4gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkZV0NCiAgICAjIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKQ0KICAgICMgaGlkZGVuW25yZTosIDosIDpdID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIGdhdGVfc2UpKSAqIHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIHVwX3NlKQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkaF0NCiAgICAjIG91dHB1dF9kb3duWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2guYm1tKGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSwgZG93bl9yZSkNCiAgICAjIG91dHB1dF9kb3duW25yZTosIDosIDpdID0gdG9yY2guYm1tKGhpZGRlbltucmU6LCA6LCA6XSwgZG93bl9zZSkNCg0KICAgIGhpZGRlbl9yZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKSAjIFtucmUsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbl9zZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCBnYXRlX3NlKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cF9zZSkNCiAgICBvdXRwdXRfZG93bl9yZSA9IHRvcmNoLmJtbShoaWRkZW5fcmUsIGRvd25fcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICBvdXRwdXRfZG93bl9zZSA9IHRvcmNoLmJtbShoaWRkZW5fc2UsIGRvd25fc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnNlLCBicyAqIHNsLCBkaF0NCg0KICAgIG1vZHVsZS5tb2UyKGlucHV0LCBvdXRwdXQsIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgb3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBtYXhfY291bnQpDQogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file
+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnR5cGVkZWYgdG9yY2g6OlRlbnNvciB0dDsNCmludCBtb2UxKHR0IHRfaW5wdXQsIHR0IHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0dCB0X3Njb3JlLCB0dCB0X3RvcF9pbmRpY2VzLCB0dCB0X3Rva2VuX2NvdW50LCB0dCB0X2luZGV4X2luX2V4cGVydCwgdHQgdF9pbnB1dF9yZW9yZGVyKTsNCnZvaWQgcGFjayh0dCB0X2lucHV0LCB0dCB0X291dHB1dCwNCiAgICAgICAgICBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICAgdHQgdF9zY29yZSwgdHQgdF90b3BfaW5kaWNlcywgdHQgdF90b2tlbl9jb3VudCwgdHQgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICAgdHQgdF9vdXRwdXRfZG93bl9yZSwgdHQgdF9vdXRwdXRfZG93bl9zZSwgaW50IG1heF9jb3VudCk7DQp2b2lkIHJlX3NpbHVfbXVsKHR0IHRfZ2F0ZSwgdHQgdF91cCwgaW50IG5lLCBpbnQgbiwgaW50IGQsIHR0IHRfdG9rZW5fY291bnQpOw0Kdm9pZCBzZV9zaWx1X211bCh0dCB0X2dhdGUsIHR0IHRfdXAsIGludCBuZSwgaW50IG4sIGludCBkKTsNCnZvaWQgY29weV93ZWlnaHRzKA0KICAgIHR0IGdhdGVfcmUsIHR0IHVwX3JlLCB0dCBkb3duX3JlLCB0dCBwb2ludGVyLCBpbnQgbnJlLCBpbnQgZGgsIGludCBkZSwNCiAgICB0dCBnMCwgdHQgZzEsIHR0IGcyLCB0dCBnMywgdHQgZzQsIHR0IGc1LCB0dCBnNiwgdHQgZzcsIHR0IGc4LCB0dCBnOSwgdHQgZzEwLCB0dCBnMTEsIHR0IGcxMiwgdHQgZzEzLCB0dCBnMTQsIHR0IGcxNSwNCiAgICB0dCBnMTYsIHR0IGcxNywgdHQgZzE4LCB0dCBnMTksIHR0IGcyMCwgdHQgZzIxLCB0dCBnMjIsIHR0IGcyMywgdHQgZzI0LCB0dCBnMjUsIHR0IGcyNiwgdHQgZzI3LCB0dCBnMjgsIHR0IGcyOSwgdHQgZzMwLCB0dCBnMzEsDQogICAgdHQgdTAsIHR0IHUxLCB0dCB1MiwgdHQgdTMsIHR0IHU0LCB0dCB1NSwgdHQgdTYsIHR0IHU3LCB0dCB1OCwgdHQgdTksIHR0IHUxMCwgdHQgdTExLCB0dCB1MTIsIHR0IHUxMywgdHQgdTE0LCB0dCB1MTUsDQogICAgdHQgdTE2LCB0dCB1MTcsIHR0IHUxOCwgdHQgdTE5LCB0dCB1MjAsIHR0IHUyMSwgdHQgdTIyLCB0dCB1MjMsIHR0IHUyNCwgdHQgdTI1LCB0dCB1MjYsIHR0IHUyNywgdHQgdTI4LCB0dCB1MjksIHR0IHUzMCwgdHQgdTMxLA0KICAgIHR0IGQwLCB0dCBkMSwgdHQgZDIsIHR0IGQzLCB0dCBkNCwgdHQgZDUsIHR0IGQ2LCB0dCBkNywgdHQgZDgsIHR0IGQ5LCB0dCBkMTAsIHR0IGQxMSwgdHQgZDEyLCB0dCBkMTMsIHR0IGQxNCwgdHQgZDE1LA0KICAgIHR0IGQxNiwgdHQgZDE3LCB0dCBkMTgsIHR0IGQxOSwgdHQgZDIwLCB0dCBkMjEsIHR0IGQyMiwgdHQgZDIzLCB0dCBkMjQsIHR0IGQyNSwgdHQgZDI2LCB0dCBkMjcsIHR0IGQyOCwgdHQgZDI5LCB0dCBkMzAsIHR0IGQzMSk7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCnR5cGVkZWYgdG9yY2g6OlRlbnNvciB0dDsNCg0KX19nbG9iYWxfXyB2b2lkIHRvcGsoY29uc3QgX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0sIGludCBuLCBpbnQgaykgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7DQogICAgICAgICAgICBfX2hhbGYgbWF4X3ZhbCA9IF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpOw0KICAgICAgICAgICAgaW50IG1heF9pZHggPSAtMTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7DQogICAgICAgICAgICAgICAgaWYgKF9faGd0KGlucHV0W2lkeCAqIG4gKyBqXSwgbWF4X3ZhbCkpIHsNCiAgICAgICAgICAgICAgICAgICAgaW50IGZvdW5kID0gMDsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBpOyArK2wpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BfaW5kaWNlc1tpZHggKiBrICsgbF0gPT0gaikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IGlucHV0W2lkeCAqIG4gKyBqXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pZHggPSBqOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdG9wX2luZGljZXNbaWR4ICogayArIGldID0gbWF4X2lkeDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRvcDRfbnJlMzIoY29uc3QgX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0pIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4ID49IG0pIHJldHVybjsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KICAgIF9faGFsZiByb3dbMzJdOw0KICAgICooZmxvYXQ0ICopJnJvd1swXSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMF07DQogICAgKihmbG9hdDQgKikmcm93WzhdID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogMzIgKyA4XTsNCiAgICAqKGZsb2F0NCAqKSZyb3dbMTZdID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogMzIgKyAxNl07DQogICAgKihmbG9hdDQgKikmcm93WzI0XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMjRdOw0KDQogICAgaW50IHRvcF9pZHhbNF07DQogICAgX19oYWxmIHRvcF92YWxbNF0gPSB7X19mbG9hdDJoYWxmKC1JTkZJTklUWSksIF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpLCBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKSwgX19mbG9hdDJoYWxmKC1JTkZJTklUWSl9Ow0KDQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFswXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMF0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzBdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFsxXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMV0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzFdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdIHx8IGogPT0gdG9wX2lkeFsxXSkgY29udGludWU7DQogICAgICAgIGlmIChfX2hndChyb3dbal0sIHRvcF92YWxbMl0pKSB7DQogICAgICAgICAgICB0b3BfdmFsWzJdID0gcm93W2pdOw0KICAgICAgICAgICAgdG9wX2lkeFsyXSA9IGo7DQogICAgICAgIH0NCiAgICB9DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKGogPT0gdG9wX2lkeFswXSB8fCBqID09IHRvcF9pZHhbMV0gfHwgaiA9PSB0b3BfaWR4WzJdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFszXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbM10gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzNdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJnRvcF9pbmRpY2VzW2lkeCAqIDRdID0gKihmbG9hdDQgKikmdG9wX2lkeFswXTsNCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleCgNCiAgICBjb25zdCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0ID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgal07DQogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXRvbWljQWRkKCZ0b2tlbl9jb3VudFtleHBlcnRdLCAxKTsNCiAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBqXSA9IG9mZnNldDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbikgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBjb25zdCBpbnQgTlJFID0gMzI7DQogICAgY29uc3QgaW50IEVQVCA9IDQ7DQogICAgX19zaGFyZWRfXyBpbnQgYmxvY2tfY291bnRbTlJFXTsNCiAgICBfX3NoYXJlZF9fIGludCBibG9ja19vZmZzZXRbTlJFXTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IE5SRSkgew0KICAgICAgICBibG9ja19jb3VudFt0aHJlYWRJZHgueF0gPSAwOw0KICAgIH0NCg0KICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIGludCB0aHJlYWRfb2Zmc2V0W0VQVF07DQogICAgaW50IHRocmVhZF9leHBlcnRbRVBUXTsNCiAgICAqKGZsb2F0NCAqKSZ0aHJlYWRfZXhwZXJ0WzBdID0gKihmbG9hdDQgKikmdG9wX2luZGljZXNbaWR4ICogRVBUICsgMF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFUFQ7IGkrKykgew0KICAgICAgICB0aHJlYWRfb2Zmc2V0W2ldID0gYXRvbWljQWRkKCZibG9ja19jb3VudFt0aHJlYWRfZXhwZXJ0W2ldXSwgMSk7DQogICAgfQ0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgaWYgKHRocmVhZElkeC54IDwgTlJFKSB7DQogICAgICAgIGJsb2NrX29mZnNldFt0aHJlYWRJZHgueF0gPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W3RocmVhZElkeC54XSwgYmxvY2tfY291bnRbdGhyZWFkSWR4LnhdKTsNCiAgICB9DQoNCiAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEVQVDsgaSsrKSB7DQogICAgICAgIHRocmVhZF9vZmZzZXRbaV0gKz0gYmxvY2tfb2Zmc2V0W3RocmVhZF9leHBlcnRbaV1dOw0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJmluZGV4X2luX2V4cGVydFtpZHggKiBFUFQgKyAwXSA9ICooZmxvYXQ0ICopJnRocmVhZF9vZmZzZXRbMF07DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0NCAqKSZpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IHZhbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHJlb3JkZXJfaW5wdXRfZXB0NG5yZTMyZGg3MTY4KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBmbG9hdDQgdmFsWzE0XTsNCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTQ7IGkrKykgew0KICAgICAgICB2YWxbaV0gPSAqKGZsb2F0NCAqKSZpbnB1dFtibG9ja0lkeC54ICogNzE2OCArIHRocmVhZElkeC54ICogOCArIGkgKiA1MTJdOw0KICAgIH0NCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7DQogICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9pZCAqIG4gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDE0OyBqKyspIHsNCiAgICAgICAgICAgICooZmxvYXQ0ICopJmlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgdGhyZWFkSWR4LnggKiA4ICsgaiAqIDUxMl0gPSB2YWxbal07DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmludCBtb2UxKHR0IHRfaW5wdXQsIHR0IHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0dCB0X3Njb3JlLCB0dCB0X3RvcF9pbmRpY2VzLCB0dCB0X3Rva2VuX2NvdW50LCB0dCB0X2luZGV4X2luX2V4cGVydCwgdHQgdF9pbnB1dF9yZW9yZGVyKSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgew0KICAgICAgICB0b2tlbl9jb3VudFtpXSA9IDA7DQogICAgfQ0KDQogICAgaWYgKGVwdCA9PSA0ICYmIG5yZSA9PSAzMikgew0KICAgICAgICB0b3A0X25yZTMyPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4pOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgdG9wazw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmUsIHRvcF9pbmRpY2VzLCBuLCBucmUsIGVwdCk7DQogICAgfQ0KDQogICAgaWYgKG5yZSA9PSAzMiAmJiBlcHQgPT0gNCAmJiBuICUgNTEyID09IDApIHsNCiAgICAgICAgY2FsY3VsYXRlX2luZGV4X25yZTMyX2VwdDQ8PDxkaW0zKG4vNTEyKSwgZGltMyg1MTIpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBuKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIGNhbGN1bGF0ZV9pbmRleDw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4odG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlKTsNCiAgICB9DQoNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyICYmIGRoID09IDcxNjgpIHsNCiAgICAgICAgcmVvcmRlcl9pbnB1dF9lcHQ0bnJlMzJkaDcxNjg8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICByZW9yZGVyX2lucHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4oaW5wdXRfcHRyLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyLCBuLCBlcHQsIG5yZSwgZGgpOw0KICAgIH0NCg0KICAgIGhpcERldmljZVN5bmNocm9uaXplKCk7DQogICAgaW50IG1heF90b2tlbl9jb3VudCA9IDA7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgew0KICAgICAgICBpZiAodG9rZW5fY291bnRbaV0gPiBtYXhfdG9rZW5fY291bnQpIG1heF90b2tlbl9jb3VudCA9IHRva2VuX2NvdW50W2ldOw0KICAgIH0NCg0KICAgIHJldHVybiBtYXhfdG9rZW5fY291bnQ7DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgaSsrKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBfX2hhbGYgdGhpc19zY29yZSA9IHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgemVyb3NbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKil6ZXJvczsNCiAgICAgICAgICAgICAgICBfX2hhbGYgdmFsWzhdLCByZXNbOF07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zZTsgaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICAgICAgX19oYWxmIHZhbFs4XSwgcmVzWzhdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duX3NlWyhuICogaSArIGlkeCkgKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQodmFsW2tdLCByZXNba10pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKilyZXM7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dF9lcHQ0bnJlMzJuc2UxZGg3MTY4KGhhbGYgKm91dHB1dF9kb3duX3JlLCBoYWxmICpvdXRwdXRfZG93bl9zZSwgX19oYWxmICpvdXRwdXRfcHRyLCBjb25zdCBfX2hhbGYgKnNjb3JlLCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBuc2UsIGludCBkaCwgaW50IG1heF9jb3VudCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIHVzaW5nIGhhbGY4ID0gX19mcDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOw0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgIF9faGFsZiByZXNbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAgICAgX19oYWxmIHRoaXNfc2NvcmUgPSBzY29yZVtpZHggKiAzMiArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgdmFsWzhdOw0KICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal07DQogICAgICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOyBpKyspIHsNCiAgICAgICAgICAgIF9faGFsZiB2YWxbOF07DQogICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93bl9zZVsobiAqIGkgKyBpZHgpICogNzE2OCArIGpdOw0KICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQodmFsW2tdLCByZXNba10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiA3MTY4ICsgal0gPSAqKGhhbGY4ICopcmVzOw0KICAgIH0NCn0NCg0Kdm9pZCBwYWNrKHR0IHRfaW5wdXQsIHR0IHRfb3V0cHV0LA0KICAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgICB0dCB0X3Njb3JlLCB0dCB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgIHR0IHRfdG9rZW5fY291bnQsIHR0IHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgIHR0IHRfb3V0cHV0X2Rvd25fcmUsIHR0IHRfb3V0cHV0X2Rvd25fc2UsIGludCBtYXhfY291bnQpIHsNCg0KICAgIF9faGFsZiAqaW5wdXRfcHRyICAgPSAoX19oYWxmICopdF9pbnB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgIC8vIFtuLCBkaF0NCiAgICBfX2hhbGYgKm91dHB1dF9wdHIgID0gKF9faGFsZiAqKXRfb3V0cHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbiwgZGhdDQoNCiAgICBfX2hhbGYgKnNjb3JlID0gKF9faGFsZiAqKXRfc2NvcmUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAgIC8vIFtuLCBucmVdDQogICAgaW50ICp0b3BfaW5kaWNlcyA9IChpbnQgKil0X3RvcF9pbmRpY2VzLmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqdG9rZW5fY291bnQgPSAoaW50ICopdF90b2tlbl9jb3VudC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZV0NCiAgICBpbnQgKmluZGV4X2luX2V4cGVydCA9IChpbnQgKil0X2luZGV4X2luX2V4cGVydC5kYXRhX3B0cigpOyAgIC8vIFtuLCBlcHRdDQogICAgX19oYWxmICpvdXRwdXRfZG93bl9yZSA9IChfX2hhbGYgKil0X291dHB1dF9kb3duX3JlLmRhdGFfcHRyKCk7DQogICAgX19oYWxmICpvdXRwdXRfZG93bl9zZSA9IChfX2hhbGYgKil0X291dHB1dF9kb3duX3NlLmRhdGFfcHRyKCk7DQoNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyICYmIG5zZSA9PSAxICYmIGRoID09IDcxNjgpIHsNCiAgICAgICAgcGFja19vdXRwdXRfZXB0NG5yZTMybnNlMWRoNzE2ODw8PGRpbTMobiksIGRpbTMoNjQpPj4+KG91dHB1dF9kb3duX3JlLCBvdXRwdXRfZG93bl9zZSwgb3V0cHV0X3B0ciwgc2NvcmUsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlLCBuc2UsIGRoLCBtYXhfY291bnQpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgcGFja19vdXRwdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93bl9yZSwgb3V0cHV0X2Rvd25fc2UsIG91dHB1dF9wdHIsIHNjb3JlLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCwgbWF4X2NvdW50KTsNCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBzZV9zaWx1X211bF9rZXJuZWwoX19oYWxmICpnYXRlX3B0ciwgY29uc3QgX19oYWxmICp1cF9wdHIsIGludCBuZSwgaW50IG4sIGludCBkKSB7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnkgKiBuICsgYmxvY2tJZHgueDsNCiAgICBfX2hhbGYgZ2F0ZV92YWxbOF0sIHVwX3ZhbFs4XSwgcmVzWzhdOw0KICAgIGZvciAoaW50IGkgPSB0aHJlYWRJZHgueCAqIDg7IGkgPCBkOyBpICs9IDI1NiAqIDgpIHsNCiAgICAgICAgKihmbG9hdDQgKikmZ2F0ZV92YWxbMF0gPSAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiBkICsgaV07DQogICAgICAgICooZmxvYXQ0ICopJnVwX3ZhbFswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiBkICsgaV07DQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKSB7DQogICAgICAgICAgICBmbG9hdCBzaWx1X3ZhbCA9IF9faGFsZjJmbG9hdChnYXRlX3ZhbFtqXSkgKiAoMS4wZiAvICgxLjBmICsgZXhwZigtX19oYWxmMmZsb2F0KGdhdGVfdmFsW2pdKSkpKTsNCiAgICAgICAgICAgIHJlc1tqXSA9IF9faG11bChfX2Zsb2F0MmhhbGYoc2lsdV92YWwpLCB1cF92YWxbal0pOw0KICAgICAgICB9DQogICAgICAgICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIGQgKyBpXSA9ICooZmxvYXQ0ICopJnJlc1swXTsNCiAgICB9DQp9DQpfX2dsb2JhbF9fIHZvaWQgc2Vfc2lsdV9tdWxfa2VybmVsX2QyMDQ4KF9faGFsZiAqZ2F0ZV9wdHIsIGNvbnN0IF9faGFsZiAqdXBfcHRyLCBpbnQgbmUsIGludCBuLCBpbnQgZCkgew0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KICAgIGludCBpZHggPSBibG9ja0lkeC55ICogbiArIGJsb2NrSWR4Lng7DQogICAgX19oYWxmIGdhdGVfdmFsWzhdLCB1cF92YWxbOF0sIHJlc1s4XTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3ZhbFswXSA9ICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIDIwNDggKyB0aHJlYWRJZHgueCAqIDhdOw0KICAgICooZmxvYXQ0ICopJnVwX3ZhbFswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4XTsNCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKSB7DQogICAgICAgIGZsb2F0IHNpbHVfdmFsID0gX19oYWxmMmZsb2F0KGdhdGVfdmFsW2pdKSAqICgxLjBmIC8gKDEuMGYgKyBleHBmKC1fX2hhbGYyZmxvYXQoZ2F0ZV92YWxbal0pKSkpOw0KICAgICAgICByZXNbal0gPSBfX2htdWwoX19mbG9hdDJoYWxmKHNpbHVfdmFsKSwgdXBfdmFsW2pdKTsNCiAgICB9DQogICAgKihmbG9hdDQgKikmZ2F0ZV9wdHJbaWR4ICogMjA0OCArIHRocmVhZElkeC54ICogOF0gPSAqKGZsb2F0NCAqKSZyZXNbMF07DQp9DQp2b2lkIHNlX3NpbHVfbXVsKHR0IHRfZ2F0ZSwgdHQgdF91cCwgaW50IG5lLCBpbnQgbiwgaW50IGQpIHsNCiAgICBfX2hhbGYgKmdhdGVfcHRyID0gKF9faGFsZiAqKXRfZ2F0ZS5kYXRhX3B0cigpOyAvLyBbbmUsIG4sIGRdDQogICAgX19oYWxmICp1cF9wdHIgICA9IChfX2hhbGYgKil0X3VwLmRhdGFfcHRyKCk7ICAgLy8gW25lLCBuLCBkXQ0KICAgIGlmIChkID09IDIwNDgpIHsNCiAgICAgICAgc2Vfc2lsdV9tdWxfa2VybmVsX2QyMDQ4PDw8ZGltMyhuLCBuZSksIGRpbTMoMjU2KT4+PihnYXRlX3B0ciwgdXBfcHRyLCBuZSwgbiwgZCk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBzZV9zaWx1X211bF9rZXJuZWw8PDxkaW0zKG4sIG5lKSwgZGltMygyNTYpPj4+KGdhdGVfcHRyLCB1cF9wdHIsIG5lLCBuLCBkKTsNCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZV9zaWx1X211bF9rZXJuZWwoX19oYWxmICpnYXRlX3B0ciwgY29uc3QgX19oYWxmICp1cF9wdHIsIGludCBuZSwgaW50IG4sIGludCBkLCBpbnQgKnRva2VuX2NvdW50KSB7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgaWYgKGJsb2NrSWR4LnggPj0gdG9rZW5fY291bnRbYmxvY2tJZHgueV0pIHJldHVybjsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueSAqIG4gKyBibG9ja0lkeC54Ow0KICAgIF9faGFsZiBnYXRlX3ZhbFs4XSwgdXBfdmFsWzhdLCByZXNbOF07DQogICAgZm9yIChpbnQgaSA9IHRocmVhZElkeC54ICogODsgaSA8IGQ7IGkgKz0gNjQgKiA4KSB7DQogICAgICAgICooZmxvYXQ0ICopJmdhdGVfdmFsWzBdID0gKihmbG9hdDQgKikmZ2F0ZV9wdHJbaWR4ICogZCArIGldOw0KICAgICAgICAqKGZsb2F0NCAqKSZ1cF92YWxbMF0gPSAqKGZsb2F0NCAqKSZ1cF9wdHJbaWR4ICogZCArIGldOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgZmxvYXQgc2lsdV92YWwgPSBfX2hhbGYyZmxvYXQoZ2F0ZV92YWxbal0pICogKDEuMGYgLyAoMS4wZiArIGV4cGYoLV9faGFsZjJmbG9hdChnYXRlX3ZhbFtqXSkpKSk7DQogICAgICAgICAgICByZXNbal0gPSBfX2htdWwoX19mbG9hdDJoYWxmKHNpbHVfdmFsKSwgdXBfdmFsW2pdKTsNCiAgICAgICAgfQ0KICAgICAgICAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiBkICsgaV0gPSAqKGZsb2F0NCAqKSZyZXNbMF07DQogICAgfQ0KfQ0KX19nbG9iYWxfXyB2b2lkIHJlX3NpbHVfbXVsX2tlcm5lbF9kMjA0OChfX2hhbGYgKmdhdGVfcHRyLCBjb25zdCBfX2hhbGYgKnVwX3B0ciwgaW50IG5lLCBpbnQgbiwgaW50IGQsIGludCAqdG9rZW5fY291bnQpIHsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoYmxvY2tJZHgueCA+PSB0b2tlbl9jb3VudFtibG9ja0lkeC55XSkgcmV0dXJuOw0KICAgIGludCBpZHggPSBibG9ja0lkeC55ICogbiArIGJsb2NrSWR4Lng7DQogICAgX19oYWxmIGdhdGVfdmFsWzRdWzhdLCB1cF92YWxbNF1bOF0sIHJlc1s0XVs4XTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3ZhbFswXVswXSA9ICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIDIwNDggKyB0aHJlYWRJZHgueCAqIDhdOw0KICAgICooZmxvYXQ0ICopJnVwX3ZhbFswXVswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4XTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3ZhbFsxXVswXSA9ICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIDIwNDggKyB0aHJlYWRJZHgueCAqIDggKyA1MTJdOw0KICAgICooZmxvYXQ0ICopJnVwX3ZhbFsxXVswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4ICsgNTEyXTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3ZhbFsyXVswXSA9ICooZmxvYXQ0ICopJmdhdGVfcHRyW2lkeCAqIDIwNDggKyB0aHJlYWRJZHgueCAqIDggKyAxMDI0XTsNCiAgICAqKGZsb2F0NCAqKSZ1cF92YWxbMl1bMF0gPSAqKGZsb2F0NCAqKSZ1cF9wdHJbaWR4ICogMjA0OCArIHRocmVhZElkeC54ICogOCArIDEwMjRdOw0KICAgICooZmxvYXQ0ICopJmdhdGVfdmFsWzNdWzBdID0gKihmbG9hdDQgKikmZ2F0ZV9wdHJbaWR4ICogMjA0OCArIHRocmVhZElkeC54ICogOCArIDE1MzZdOw0KICAgICooZmxvYXQ0ICopJnVwX3ZhbFszXVswXSA9ICooZmxvYXQ0ICopJnVwX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4ICsgMTUzNl07DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgZmxvYXQgc2lsdV92YWwgPSBfX2hhbGYyZmxvYXQoZ2F0ZV92YWxbaV1bal0pICogKDEuMGYgLyAoMS4wZiArIGV4cGYoLV9faGFsZjJmbG9hdChnYXRlX3ZhbFtpXVtqXSkpKSk7DQogICAgICAgICAgICByZXNbaV1bal0gPSBfX2htdWwoX19mbG9hdDJoYWxmKHNpbHVfdmFsKSwgdXBfdmFsW2ldW2pdKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4XSA9ICooZmxvYXQ0ICopJnJlc1swXVswXTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4ICsgNTEyXSA9ICooZmxvYXQ0ICopJnJlc1sxXVswXTsNCiAgICAqKGZsb2F0NCAqKSZnYXRlX3B0cltpZHggKiAyMDQ4ICsgdGhyZWFkSWR4LnggKiA4ICsgMTAyNF0gPSAqKGZsb2F0NCAqKSZyZXNbMl1bMF07DQogICAgKihmbG9hdDQgKikmZ2F0ZV9wdHJbaWR4ICogMjA0OCArIHRocmVhZElkeC54ICogOCArIDE1MzZdID0gKihmbG9hdDQgKikmcmVzWzNdWzBdOw0KfQ0Kdm9pZCByZV9zaWx1X211bCh0dCB0X2dhdGUsIHR0IHRfdXAsIGludCBuZSwgaW50IG4sIGludCBkLCB0dCB0X3Rva2VuX2NvdW50KSB7DQogICAgX19oYWxmICpnYXRlX3B0ciA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgLy8gW25lLCBuLCBkXQ0KICAgIF9faGFsZiAqdXBfcHRyICAgPSAoX19oYWxmICopdF91cC5kYXRhX3B0cigpOyAgIC8vIFtuZSwgbiwgZF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgLy8gW25lXQ0KICAgIGlmIChkID09IDIwNDgpIHsNCiAgICAgICAgcmVfc2lsdV9tdWxfa2VybmVsX2QyMDQ4PDw8ZGltMyhuLCBuZSksIGRpbTMoNjQpPj4+KGdhdGVfcHRyLCB1cF9wdHIsIG5lLCBuLCBkLCB0b2tlbl9jb3VudCk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICByZV9zaWx1X211bF9rZXJuZWw8PDxkaW0zKG4sIG5lKSwgZGltMyg2NCk+Pj4oZ2F0ZV9wdHIsIHVwX3B0ciwgbmUsIG4sIGQsIHRva2VuX2NvdW50KTsNCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBjb3B5X3dlaWdodHNfa2VybmVsKHVuc2lnbmVkIGxvbmcgbG9uZyAqcHRyKSB7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgX19oYWxmICpzcmNfcHRyID0gKF9faGFsZiAqKShwdHJbYmxvY2tJZHgueCAgICAgXSkgKyBibG9ja0lkeC55ICogMzIgKiA3MTY4Ow0KICAgIF9faGFsZiAqZHN0X3B0ciA9IChfX2hhbGYgKikocHRyW2Jsb2NrSWR4LnggKyA5Nl0pICsgYmxvY2tJZHgueSAqIDMyICogNzE2ODsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspIHsNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKSZkc3RfcHRyW2kgKiA3MTY4ICsgal0gPSAqKGZsb2F0NCAqKSZzcmNfcHRyW2kgKiA3MTY4ICsgal07DQogICAgICAgIH0NCiAgICB9DQp9DQp2b2lkIGNvcHlfd2VpZ2h0cygNCiAgICB0dCBnYXRlX3JlLCB0dCB1cF9yZSwgdHQgZG93bl9yZSwgdHQgcG9pbnRlciwgaW50IG5yZSwgaW50IGRoLCBpbnQgZGUsDQogICAgdHQgZzAsIHR0IGcxLCB0dCBnMiwgdHQgZzMsIHR0IGc0LCB0dCBnNSwgdHQgZzYsIHR0IGc3LCB0dCBnOCwgdHQgZzksIHR0IGcxMCwgdHQgZzExLCB0dCBnMTIsIHR0IGcxMywgdHQgZzE0LCB0dCBnMTUsDQogICAgdHQgZzE2LCB0dCBnMTcsIHR0IGcxOCwgdHQgZzE5LCB0dCBnMjAsIHR0IGcyMSwgdHQgZzIyLCB0dCBnMjMsIHR0IGcyNCwgdHQgZzI1LCB0dCBnMjYsIHR0IGcyNywgdHQgZzI4LCB0dCBnMjksIHR0IGczMCwgdHQgZzMxLA0KICAgIHR0IHUwLCB0dCB1MSwgdHQgdTIsIHR0IHUzLCB0dCB1NCwgdHQgdTUsIHR0IHU2LCB0dCB1NywgdHQgdTgsIHR0IHU5LCB0dCB1MTAsIHR0IHUxMSwgdHQgdTEyLCB0dCB1MTMsIHR0IHUxNCwgdHQgdTE1LA0KICAgIHR0IHUxNiwgdHQgdTE3LCB0dCB1MTgsIHR0IHUxOSwgdHQgdTIwLCB0dCB1MjEsIHR0IHUyMiwgdHQgdTIzLCB0dCB1MjQsIHR0IHUyNSwgdHQgdTI2LCB0dCB1MjcsIHR0IHUyOCwgdHQgdTI5LCB0dCB1MzAsIHR0IHUzMSwNCiAgICB0dCBkMCwgdHQgZDEsIHR0IGQyLCB0dCBkMywgdHQgZDQsIHR0IGQ1LCB0dCBkNiwgdHQgZDcsIHR0IGQ4LCB0dCBkOSwgdHQgZDEwLCB0dCBkMTEsIHR0IGQxMiwgdHQgZDEzLCB0dCBkMTQsIHR0IGQxNSwNCiAgICB0dCBkMTYsIHR0IGQxNywgdHQgZDE4LCB0dCBkMTksIHR0IGQyMCwgdHQgZDIxLCB0dCBkMjIsIHR0IGQyMywgdHQgZDI0LCB0dCBkMjUsIHR0IGQyNiwgdHQgZDI3LCB0dCBkMjgsIHR0IGQyOSwgdHQgZDMwLCB0dCBkMzEpIHsNCg0KICAgIHVzaW5nIHU2NCA9IHVuc2lnbmVkIGxvbmcgbG9uZzsNCiAgICB1NjQgKnB0ciA9ICh1NjQgKilwb2ludGVyLmRhdGFfcHRyKCk7DQogICAgcHRyWzBdID0gKHU2NClnMC5kYXRhX3B0cigpOw0KICAgIHB0clsxXSA9ICh1NjQpZzEuZGF0YV9wdHIoKTsNCiAgICBwdHJbMl0gPSAodTY0KWcyLmRhdGFfcHRyKCk7DQogICAgcHRyWzNdID0gKHU2NClnMy5kYXRhX3B0cigpOw0KICAgIHB0cls0XSA9ICh1NjQpZzQuZGF0YV9wdHIoKTsNCiAgICBwdHJbNV0gPSAodTY0KWc1LmRhdGFfcHRyKCk7DQogICAgcHRyWzZdID0gKHU2NClnNi5kYXRhX3B0cigpOw0KICAgIHB0cls3XSA9ICh1NjQpZzcuZGF0YV9wdHIoKTsNCiAgICBwdHJbOF0gPSAodTY0KWc4LmRhdGFfcHRyKCk7DQogICAgcHRyWzldID0gKHU2NClnOS5kYXRhX3B0cigpOw0KICAgIHB0clsxMF0gPSAodTY0KWcxMC5kYXRhX3B0cigpOw0KICAgIHB0clsxMV0gPSAodTY0KWcxMS5kYXRhX3B0cigpOw0KICAgIHB0clsxMl0gPSAodTY0KWcxMi5kYXRhX3B0cigpOw0KICAgIHB0clsxM10gPSAodTY0KWcxMy5kYXRhX3B0cigpOw0KICAgIHB0clsxNF0gPSAodTY0KWcxNC5kYXRhX3B0cigpOw0KICAgIHB0clsxNV0gPSAodTY0KWcxNS5kYXRhX3B0cigpOw0KICAgIHB0clsxNl0gPSAodTY0KWcxNi5kYXRhX3B0cigpOw0KICAgIHB0clsxN10gPSAodTY0KWcxNy5kYXRhX3B0cigpOw0KICAgIHB0clsxOF0gPSAodTY0KWcxOC5kYXRhX3B0cigpOw0KICAgIHB0clsxOV0gPSAodTY0KWcxOS5kYXRhX3B0cigpOw0KICAgIHB0clsyMF0gPSAodTY0KWcyMC5kYXRhX3B0cigpOw0KICAgIHB0clsyMV0gPSAodTY0KWcyMS5kYXRhX3B0cigpOw0KICAgIHB0clsyMl0gPSAodTY0KWcyMi5kYXRhX3B0cigpOw0KICAgIHB0clsyM10gPSAodTY0KWcyMy5kYXRhX3B0cigpOw0KICAgIHB0clsyNF0gPSAodTY0KWcyNC5kYXRhX3B0cigpOw0KICAgIHB0clsyNV0gPSAodTY0KWcyNS5kYXRhX3B0cigpOw0KICAgIHB0clsyNl0gPSAodTY0KWcyNi5kYXRhX3B0cigpOw0KICAgIHB0clsyN10gPSAodTY0KWcyNy5kYXRhX3B0cigpOw0KICAgIHB0clsyOF0gPSAodTY0KWcyOC5kYXRhX3B0cigpOw0KICAgIHB0clsyOV0gPSAodTY0KWcyOS5kYXRhX3B0cigpOw0KICAgIHB0clszMF0gPSAodTY0KWczMC5kYXRhX3B0cigpOw0KICAgIHB0clszMV0gPSAodTY0KWczMS5kYXRhX3B0cigpOw0KICAgIHB0clszMl0gPSAodTY0KXUwLmRhdGFfcHRyKCk7DQogICAgcHRyWzMzXSA9ICh1NjQpdTEuZGF0YV9wdHIoKTsNCiAgICBwdHJbMzRdID0gKHU2NCl1Mi5kYXRhX3B0cigpOw0KICAgIHB0clszNV0gPSAodTY0KXUzLmRhdGFfcHRyKCk7DQogICAgcHRyWzM2XSA9ICh1NjQpdTQuZGF0YV9wdHIoKTsNCiAgICBwdHJbMzddID0gKHU2NCl1NS5kYXRhX3B0cigpOw0KICAgIHB0clszOF0gPSAodTY0KXU2LmRhdGFfcHRyKCk7DQogICAgcHRyWzM5XSA9ICh1NjQpdTcuZGF0YV9wdHIoKTsNCiAgICBwdHJbNDBdID0gKHU2NCl1OC5kYXRhX3B0cigpOw0KICAgIHB0cls0MV0gPSAodTY0KXU5LmRhdGFfcHRyKCk7DQogICAgcHRyWzQyXSA9ICh1NjQpdTEwLmRhdGFfcHRyKCk7DQogICAgcHRyWzQzXSA9ICh1NjQpdTExLmRhdGFfcHRyKCk7DQogICAgcHRyWzQ0XSA9ICh1NjQpdTEyLmRhdGFfcHRyKCk7DQogICAgcHRyWzQ1XSA9ICh1NjQpdTEzLmRhdGFfcHRyKCk7DQogICAgcHRyWzQ2XSA9ICh1NjQpdTE0LmRhdGFfcHRyKCk7DQogICAgcHRyWzQ3XSA9ICh1NjQpdTE1LmRhdGFfcHRyKCk7DQogICAgcHRyWzQ4XSA9ICh1NjQpdTE2LmRhdGFfcHRyKCk7DQogICAgcHRyWzQ5XSA9ICh1NjQpdTE3LmRhdGFfcHRyKCk7DQogICAgcHRyWzUwXSA9ICh1NjQpdTE4LmRhdGFfcHRyKCk7DQogICAgcHRyWzUxXSA9ICh1NjQpdTE5LmRhdGFfcHRyKCk7DQogICAgcHRyWzUyXSA9ICh1NjQpdTIwLmRhdGFfcHRyKCk7DQogICAgcHRyWzUzXSA9ICh1NjQpdTIxLmRhdGFfcHRyKCk7DQogICAgcHRyWzU0XSA9ICh1NjQpdTIyLmRhdGFfcHRyKCk7DQogICAgcHRyWzU1XSA9ICh1NjQpdTIzLmRhdGFfcHRyKCk7DQogICAgcHRyWzU2XSA9ICh1NjQpdTI0LmRhdGFfcHRyKCk7DQogICAgcHRyWzU3XSA9ICh1NjQpdTI1LmRhdGFfcHRyKCk7DQogICAgcHRyWzU4XSA9ICh1NjQpdTI2LmRhdGFfcHRyKCk7DQogICAgcHRyWzU5XSA9ICh1NjQpdTI3LmRhdGFfcHRyKCk7DQogICAgcHRyWzYwXSA9ICh1NjQpdTI4LmRhdGFfcHRyKCk7DQogICAgcHRyWzYxXSA9ICh1NjQpdTI5LmRhdGFfcHRyKCk7DQogICAgcHRyWzYyXSA9ICh1NjQpdTMwLmRhdGFfcHRyKCk7DQogICAgcHRyWzYzXSA9ICh1NjQpdTMxLmRhdGFfcHRyKCk7DQogICAgcHRyWzY0XSA9ICh1NjQpZDAuZGF0YV9wdHIoKTsNCiAgICBwdHJbNjVdID0gKHU2NClkMS5kYXRhX3B0cigpOw0KICAgIHB0cls2Nl0gPSAodTY0KWQyLmRhdGFfcHRyKCk7DQogICAgcHRyWzY3XSA9ICh1NjQpZDMuZGF0YV9wdHIoKTsNCiAgICBwdHJbNjhdID0gKHU2NClkNC5kYXRhX3B0cigpOw0KICAgIHB0cls2OV0gPSAodTY0KWQ1LmRhdGFfcHRyKCk7DQogICAgcHRyWzcwXSA9ICh1NjQpZDYuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzFdID0gKHU2NClkNy5kYXRhX3B0cigpOw0KICAgIHB0cls3Ml0gPSAodTY0KWQ4LmRhdGFfcHRyKCk7DQogICAgcHRyWzczXSA9ICh1NjQpZDkuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzRdID0gKHU2NClkMTAuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzVdID0gKHU2NClkMTEuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzZdID0gKHU2NClkMTIuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzddID0gKHU2NClkMTMuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzhdID0gKHU2NClkMTQuZGF0YV9wdHIoKTsNCiAgICBwdHJbNzldID0gKHU2NClkMTUuZGF0YV9wdHIoKTsNCiAgICBwdHJbODBdID0gKHU2NClkMTYuZGF0YV9wdHIoKTsNCiAgICBwdHJbODFdID0gKHU2NClkMTcuZGF0YV9wdHIoKTsNCiAgICBwdHJbODJdID0gKHU2NClkMTguZGF0YV9wdHIoKTsNCiAgICBwdHJbODNdID0gKHU2NClkMTkuZGF0YV9wdHIoKTsNCiAgICBwdHJbODRdID0gKHU2NClkMjAuZGF0YV9wdHIoKTsNCiAgICBwdHJbODVdID0gKHU2NClkMjEuZGF0YV9wdHIoKTsNCiAgICBwdHJbODZdID0gKHU2NClkMjIuZGF0YV9wdHIoKTsNCiAgICBwdHJbODddID0gKHU2NClkMjMuZGF0YV9wdHIoKTsNCiAgICBwdHJbODhdID0gKHU2NClkMjQuZGF0YV9wdHIoKTsNCiAgICBwdHJbODldID0gKHU2NClkMjUuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTBdID0gKHU2NClkMjYuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTFdID0gKHU2NClkMjcuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTJdID0gKHU2NClkMjguZGF0YV9wdHIoKTsNCiAgICBwdHJbOTNdID0gKHU2NClkMjkuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTRdID0gKHU2NClkMzAuZGF0YV9wdHIoKTsNCiAgICBwdHJbOTVdID0gKHU2NClkMzEuZGF0YV9wdHIoKTsNCiAgICBfX2hhbGYgKmdhdGVfcmVfcHRyID0gKF9faGFsZiAqKWdhdGVfcmUuZGF0YV9wdHIoKTsNCiAgICBfX2hhbGYgKnVwX3JlX3B0ciAgID0gKF9faGFsZiAqKXVwX3JlLmRhdGFfcHRyKCk7DQogICAgX19oYWxmICpkb3duX3JlX3B0ciA9IChfX2hhbGYgKilkb3duX3JlLmRhdGFfcHRyKCk7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgcHRyW2kgKyA5Nl0gPSAodTY0KSgmZ2F0ZV9yZV9wdHJbaSAqIGRoICogZGVdKTsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSBwdHJbaSArIDEyOF0gPSAodTY0KSgmdXBfcmVfcHRyW2kgKiBkaCAqIGRlXSk7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgcHRyW2kgKyAxNjBdID0gKHU2NCkoJmRvd25fcmVfcHRyW2kgKiBkZSAqIGRoXSk7DQogICAgY29weV93ZWlnaHRzX2tlcm5lbDw8PGRpbTMoOTYsIDY0KSwgZGltMyg2NCk+Pj4ocHRyKTsNCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdtb2UnLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnbW9lMScsICdwYWNrJywgJ3JlX3NpbHVfbXVsJywgJ3NlX3NpbHVfbXVsJywgJ2NvcHlfd2VpZ2h0cyddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgZ2F0ZV9yZSA9IHRvcmNoLmVtcHR5KG5yZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgIHVwX3JlICAgPSB0b3JjaC5lbXB0eShucmUsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCiAgICBkb3duX3JlID0gdG9yY2guZW1wdHkobnJlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpDQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCg0KICAgIHRvcF9pbmRpY2VzID0gdG9yY2guZW1wdHkoYnMgKiBzbCwgZXB0LCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykNCiAgICB0b2tlbl9jb3VudCA9IHRvcmNoLmVtcHR5KG5yZSwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCwgZXB0LCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykNCiAgICBpbnB1dF9yZW9yZGVyID0gdG9yY2guZW1wdHkobnJlLCBicyAqIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCg0KICAgIGlucHV0ID0gaW5wdXRfdGVuc29yDQogICAgcm91dGVyICA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXQ0KICAgIGdsID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddIGZvciBpIGluIHJhbmdlKG5yZSldDQogICAgdWwgPSBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10gZm9yIGkgaW4gcmFuZ2UobnJlKV0NCiAgICBkbCA9IFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXSBmb3IgaSBpbiByYW5nZShucmUpXQ0KICAgIGlmIG5yZSA9PSAzMiBhbmQgZGggPT0gNzE2OCBhbmQgZGUgPT0gMjA0ODoNCiAgICAgICAgcG9pbnRlciA9IHRvcmNoLmVtcHR5KG5yZSAqIDYsIGR0eXBlPXRvcmNoLnVpbnQ2NCwgZGV2aWNlPSdjdWRhJykNCiAgICAgICAgbW9kdWxlLmNvcHlfd2VpZ2h0cyhnYXRlX3JlLCB1cF9yZSwgZG93bl9yZSwgcG9pbnRlciwgbnJlLCBkaCwgZGUsDQogICAgICAgICAgICBnbFswXSxnbFsxXSxnbFsyXSxnbFszXSxnbFs0XSxnbFs1XSxnbFs2XSxnbFs3XSxnbFs4XSxnbFs5XSxnbFsxMF0sZ2xbMTFdLGdsWzEyXSxnbFsxM10sZ2xbMTRdLGdsWzE1XSxnbFsxNl0sZ2xbMTddLGdsWzE4XSxnbFsxOV0sZ2xbMjBdLGdsWzIxXSxnbFsyMl0sZ2xbMjNdLGdsWzI0XSxnbFsyNV0sZ2xbMjZdLGdsWzI3XSxnbFsyOF0sZ2xbMjldLGdsWzMwXSxnbFszMV0sDQogICAgICAgICAgICB1bFswXSx1bFsxXSx1bFsyXSx1bFszXSx1bFs0XSx1bFs1XSx1bFs2XSx1bFs3XSx1bFs4XSx1bFs5XSx1bFsxMF0sdWxbMTFdLHVsWzEyXSx1bFsxM10sdWxbMTRdLHVsWzE1XSx1bFsxNl0sdWxbMTddLHVsWzE4XSx1bFsxOV0sdWxbMjBdLHVsWzIxXSx1bFsyMl0sdWxbMjNdLHVsWzI0XSx1bFsyNV0sdWxbMjZdLHVsWzI3XSx1bFsyOF0sdWxbMjldLHVsWzMwXSx1bFszMV0sDQogICAgICAgICAgICBkbFswXSxkbFsxXSxkbFsyXSxkbFszXSxkbFs0XSxkbFs1XSxkbFs2XSxkbFs3XSxkbFs4XSxkbFs5XSxkbFsxMF0sZGxbMTFdLGRsWzEyXSxkbFsxM10sZGxbMTRdLGRsWzE1XSxkbFsxNl0sZGxbMTddLGRsWzE4XSxkbFsxOV0sZGxbMjBdLGRsWzIxXSxkbFsyMl0sZGxbMjNdLGRsWzI0XSxkbFsyNV0sZGxbMjZdLGRsWzI3XSxkbFsyOF0sZGxbMjldLGRsWzMwXSxkbFszMV0pDQogICAgZWxzZToNCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgICAgIGdhdGVfcmVbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQ0KICAgICAgICAgICAgdXBfcmVbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQ0KICAgICAgICAgICAgZG93bl9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQogICAgZ2F0ZV9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpDQogICAgdXBfc2UgICA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpDQogICAgZG93bl9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udmlldyhuc2UsIGRlLCBkaCkNCg0KICAgIHNjb3JlID0gdG9yY2guc29mdG1heChpbnB1dC52aWV3KGJzICogc2wsIGRoKSBAIHJvdXRlci5ULCBkaW09MSkNCg0KICAgIG1heF9jb3VudCA9IG1vZHVsZS5tb2UxKGlucHV0LCBvdXRwdXQsIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMgKiBzbCwNCiAgICAgICAgc2NvcmUsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyKQ0KDQogICAgaGlkZGVuX3JlX2dhdGUgPSB0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkNCiAgICBoaWRkZW5fcmVfdXAgICA9IHRvcmNoLmJtbShpbnB1dF9yZW9yZGVyWzosIDptYXhfY291bnQsIDpdLCB1cF9yZSkNCiAgICBtb2R1bGUucmVfc2lsdV9tdWwoaGlkZGVuX3JlX2dhdGUsIGhpZGRlbl9yZV91cCwgbnJlLCBtYXhfY291bnQsIGRlLCB0b2tlbl9jb3VudCkNCiAgICBoaWRkZW5fc2VfZ2F0ZSA9IHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzICogc2wsIGRoKSwgZ2F0ZV9zZSkNCiAgICBoaWRkZW5fc2VfdXAgICA9IHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzICogc2wsIGRoKSwgdXBfc2UpDQogICAgbW9kdWxlLnNlX3NpbHVfbXVsKGhpZGRlbl9zZV9nYXRlLCBoaWRkZW5fc2VfdXAsIG5zZSwgYnMgKiBzbCwgZGUpDQogICAgb3V0cHV0X2Rvd25fcmUgPSB0b3JjaC5ibW0oaGlkZGVuX3JlX2dhdGUsIGRvd25fcmUpDQogICAgb3V0cHV0X2Rvd25fc2UgPSB0b3JjaC5ibW0oaGlkZGVuX3NlX2dhdGUsIGRvd25fc2UpDQoNCiAgICBtb2R1bGUucGFjayhpbnB1dCwgb3V0cHV0LCBkaCwgZGUsIG5yZSwgbnNlLCBlcHQsIGJzKnNsLA0KICAgICAgICBzY29yZSwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIG91dHB1dF9kb3duX3JlLCBvdXRwdXRfZG93bl9zZSwgbWF4X2NvdW50KQ0KDQogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file

Best evidence level for this revision: reported

JSON