Skip to content
KernelIndex
Search⌘K

submission 23187

KernelBot user 7 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

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

amd-fp8-mm-hip.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-23187?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz

Benchmark evidence

18 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 512]
AMD Instinct MI300X
42.9µs
#34 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
46.6µs
#45 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
58.4µs
#32 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
85.3µs
#31 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
88.6µs
#35 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
91.1µs
#21 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
91.9µs
#23 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
121.5µs
#35 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
132.7µs
#38 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
135.2µs
#17 of 98
2025-05-16
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
137.2µs
#34 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
166.2µs
#19 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
168.3µs
#30 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
190.4µs
#23 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
252.0µs
#15 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
327.0µs
#10 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
357.6µs
#10 of 98
2025-05-16
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
649.0µs
#13 of 98
2025-05-16

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:ba089f4c2c2aaabb778c1ca16d179c72c5a2ef64bb1019d3211b7fb1ee782904
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

amd-fp8-mm-hip.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCg0KY29uc3RleHByIGNvbnN0IGludCBCTE9DSyA9IDEyODsNCg0KI2RlZmluZSBTV1pfMzJmdDIobSwgbikgKCgobSkgKiA4ICsgKChtKSAvIDE2KSAqIDggKyAobikpICUgMTI4KQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV8zMngzMl8xNngxNl9mdDIoDQogICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwNCiAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYnMsDQogICAgICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzMyXVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYlszMl1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAzMjsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMzI7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAxNjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiAxNjsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19rICA9IHRocmVhZElkeC55ICogMzIgKyAodGhyZWFkSWR4LnggLyA4KSAqIDQ7DQogICAgaW50IHN0c19tbiA9ICh0aHJlYWRJZHgueCAlIDgpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsxXVsxXSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2EgIFsxXVs0XVs0XSwgbGRnX2IgIFsxXVs0XVs0XTsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYV90WzFdWzRdWzRdLCBsZGdfYl90WzFdWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2FbaWldW2pqXSA9ICooZmxvYXQgKikmYVsobGRnX2sgKyBpaSozMiArIGpqICsgaWIqQkxPQ0spICogbSArIGxkZ19tXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSozMiArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZsb2F0IHRoaXNfYXNbMV1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKXRoaXNfYXNbaWldID0gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl07DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzMyZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19hX3RbaWldW2pqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19iW3N0c19tbiArIGpqXVtTV1pfMzJmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2JfdFtpaV1bampdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMV1bMV0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzFdWzRdLCB0aWxlX2JbMV1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl8zMmZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDE7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzMyZnQyKGxkc19uICsgamoqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDE7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAxOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQojZGVmaW5lIFNXWl82NGZ0MihtLCBuKSAoKChtKSAqIDggKyAoKG0pIC8gMTYpICogOCArIChuKSkgJSAxMjgpDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDQpDQpfX2dsb2JhbF9fIHZvaWQgZnA4X21tXzY0eDY0XzMyeDMyX2Z0MigNCiAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGFzLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGJzLA0KICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzY0XVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYls2NF1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiA2NDsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogNjQ7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAzMjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiAzMjsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19rICA9IHRocmVhZElkeC55ICogMTYgKyAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCBzdHNfbW4gPSAodGhyZWFkSWR4LnggJSAxNikgKiA0Ow0KICAgIGludCBsZGdfbSA9IHRocmVhZF9ibG9ja19tICsgc3RzX21uOw0KICAgIGludCBsZGdfbiA9IHRocmVhZF9ibG9ja19uICsgc3RzX21uOw0KICAgIGludCBsZGdfayA9IHN0c19rOw0KDQogICAgLy8gTERTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IGxkc19tID0gd2F2ZV9tICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX24gPSB3YXZlX24gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfayA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDg7DQoNCiAgICAvLyBDJkQgUGFyYW1ldGVycw0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhdmVfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2F2ZV9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGludCBhc19tID0gY19tOw0KICAgIGludCBic19uID0gY19uIC8gQkxPQ0s7DQoNCiAgICBmbG9hdDQgdGlsZV9kWzJdWzJdID0gezB9Ow0KDQogICAgZm9yIChpbnQgaWIgPSAwOyBpYiA8IGsvQkxPQ0s7IGliKyspIHsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYSAgWzJdWzRdWzRdLCBsZGdfYiAgWzJdWzRdWzRdOw0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hX3RbMl1bNF1bNF0sIGxkZ19iX3RbMl1bNF1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKilsZGdfYVtpaV1bampdID0gbGRnX20gPCBtID8gKihmbG9hdCAqKSZhWyhsZGdfayArIGlpKjY0ICsgamogKyBpYipCTE9DSykgKiBtICsgbGRnX21dIDogMDsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9IGxkZ19uIDwgbiA/ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSo2NCArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXSA6IDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9IGFzX20gKyBpaSoxNiA8IG0gPyAqKGZsb2F0NCAqKSZhc1tpYiptICsgYXNfbSArIGlpKjE2XSA6IDA7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzY0ZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19hX3RbaWldW2pqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19iW3N0c19tbiArIGpqXVtTV1pfNjRmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2JfdFtpaV1bampdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMl1bMl0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzJdWzRdLCB0aWxlX2JbMl1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl82NGZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzY0ZnQyKGxkc19uICsgamoqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSoxNiA8IG0gJiYgY19uICsgamoqMTYgPCBuKSB7DQogICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjgoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsIGludCBtLCBpbnQgbikgew0KICAgIC8vIHRyYW5zcG9zZSBpbiBldmVyeSAxMjh4MTI4IGJsb2NrDQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB0aHJlYWRfbSA9IHRocmVhZElkeC54IC8gODsNCiAgICBpbnQgdGhyZWFkX24gPSAodGhyZWFkSWR4LnggJSA4KSAqIDE2Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHNtZW1bMTI4XVsxMjldOw0KDQogICAgX19oaXBfZnA4X2U0bTNfZm51eiBkYXRhWzE2XTsNCg0KICAgICooZmxvYXQ0ICopJmRhdGFbMF0gPSAqKGZsb2F0NCAqKSZhWyh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tKSAqIG4gKyB0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9uXTsNCg0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgew0KICAgICAgICBzbWVtW3RocmVhZF9uICsgaV1bdGhyZWFkX21dID0gZGF0YVtpXTsNCiAgICAgICAgLy8gc21lbVt0aHJlYWRfbiArIGldWygodGhyZWFkX24gLyAxNikgKiAxNiArIHRocmVhZF9tKSAlIDEyOF0gPSBkYXRhW2ldOyAvLyBzd2l6emxlDQogICAgfQ0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgKihmbG9hdDQgKikmYVsodGhyZWFkX2Jsb2NrX20gKyB0aHJlYWRfbSkgKiBuICsgdGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbl0gPSAqKGZsb2F0NCAqKSZzbWVtW3RocmVhZF9tXVt0aHJlYWRfbl07DQogICAgLy8gKihmbG9hdDQgKikmYVsodGhyZWFkX2Jsb2NrX20gKyB0aHJlYWRfbSkgKiBuICsgdGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbl0gPSAqKGZsb2F0NCAqKSZzbWVtW3RocmVhZF9tXVsoKHRocmVhZF9tIC8gMTYpICogMTYgKyB0aHJlYWRfbikgJSAxMjhdOyAvLyBzd2l6emxlDQp9DQoNCiNkZWZpbmUgU1daXzEyOHB0KG0sIG4pICgoKG0pICogOCArIChuKSkgJSAxMjgpDQpfX2xhdW5jaF9ib3VuZHNfXyg1MTIsIDIpDQpfX2dsb2JhbF9fIHZvaWQgZnA4X21tXzEyOHgxMjhfcHQoDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBicywNCiAgICAgICAgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVsxMjhdWzEyOF07DQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19iWzEyOF1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXZlX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDMyOw0KICAgIGludCB3YXZlX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gIHRocmVhZElkeC54ICUgMTY7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX21uID0gdGhyZWFkSWR4LnkgKiA4ICsgdGhyZWFkSWR4LnggLyA4Ow0KICAgIGludCBzdHNfayAgPSAodGhyZWFkSWR4LnggJSA4KSAqIDE2Ow0KICAgIGludCBsZGdfbSA9IHRocmVhZF9ibG9ja19tICsgc3RzX2s7DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfazsNCiAgICBpbnQgbGRnX2sgPSBzdHNfbW47DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXZlX20gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfbiA9IHdhdmVfbiArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMTYpICogODsNCg0KICAgIC8vIEMmRCBQYXJhbWV0ZXJzDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2F2ZV9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXZlX24gKyB0aHJlYWRfY19uOw0KDQogICAgaW50IGFzX20gPSBjX207DQogICAgaW50IGJzX24gPSBjX24gLyBCTE9DSzsNCg0KICAgIGZsb2F0NCB0aWxlX2RbMl1bNF0gPSB7MH07DQoNCiAgICBmb3IgKGludCBpYiA9IDA7IGliIDwgay9CTE9DSzsgaWIrKykgew0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hWzJdWzE2XSwgbGRnX2JbMl1bMTZdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKilsZGdfYVtpaV0gPSAqKGZsb2F0NCAqKSZhWyhsZGdfayArIGliKkJMT0NLICsgaWkqNjQpICogbSArIGxkZ19tXTsNCiAgICAgICAgICAgICooZmxvYXQ0ICopbGRnX2JbaWldID0gKihmbG9hdDQgKikmYlsobGRnX2sgKyBpYipCTE9DSyArIGlpKjY0KSAqIG4gKyBsZGdfbl07DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9ICooZmxvYXQ0ICopJmFzW2liKm0gKyBhc19tICsgaWkqMTZdOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHRoaXNfYnMgPSBic1tpYiAqICgobitCTE9DSy0xKS9CTE9DSykgKyBic19uXTsNCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihsb25nICopJmxkc19hW3N0c19tbiArIGlpKjY0XVtTV1pfMTI4cHQoc3RzX21uLCBzdHNfayAgICApXSA9ICoobG9uZyAqKSZsZGdfYVtpaV1bMF07DQogICAgICAgICAgICAqKGxvbmcgKikmbGRzX2Fbc3RzX21uICsgaWkqNjRdW1NXWl8xMjhwdChzdHNfbW4sIHN0c19rICsgOCldID0gKihsb25nICopJmxkZ19hW2lpXVs4XTsNCiAgICAgICAgICAgICoobG9uZyAqKSZsZHNfYltzdHNfbW4gKyBpaSo2NF1bU1daXzEyOHB0KHN0c19tbiwgc3RzX2sgICAgKV0gPSAqKGxvbmcgKikmbGRnX2JbaWldWzBdOw0KICAgICAgICAgICAgKihsb25nICopJmxkc19iW3N0c19tbiArIGlpKjY0XVtTV1pfMTI4cHQoc3RzX21uLCBzdHNfayArIDgpXSA9ICoobG9uZyAqKSZsZGdfYltpaV1bOF07DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgZmxvYXQ0IGJsb2NrX3RpbGVfZFsyXVs0XSA9IHswfTsNCiAgICAgICAgbG9uZyB0aWxlX2FbMl1bNF0sIHRpbGVfYls0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGxvbmcgKikmbGRzX2FbbGRzX20gKyBpaSoxNl1bU1daXzEyOHB0KGxkc19tLCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzEyOHB0KGxkc19uLCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCBibG9ja190aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdW2trXSArPSBibG9ja190aWxlX2RbaWldW2pqXVtra10gKiB0aGlzX2FzW2lpXVtra10gKiB0aGlzX2JzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgcmVzdWx0IGFzIGJmMTYNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSoxNiArIGtrKSAqIG4gKyBjX24gKyBqaioxNl0gPSAoX19oaXBfYmZsb2F0MTYpKHRpbGVfZFtpaV1bampdW2trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCiNkZWZpbmUgU1daXzEyOGZ0MihtLCBuKSAoKChtKSAqIDggKyAoKG0pIC8gMTYpICogOCArIChuKSkgJSAxMjgpDQpfX2xhdW5jaF9ib3VuZHNfXyg1MTIsIDIpDQpfX2dsb2JhbF9fIHZvaWQgZnA4X21tXzEyOHgxMjhfZnQyKA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwNCiAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGIsDQogICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYXMsDQogICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYnMsDQogICAgICAgIF9faGlwX2JmbG9hdDE2KiBfX3Jlc3RyaWN0X18gYywgaW50IG0sIGludCBuLCBpbnQgaykgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRzX2FbMTI4XVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYlsxMjhdWzEyOF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAzMjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19rICA9IHRocmVhZElkeC55ICogOCArICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHN0c19tbiA9ICh0aHJlYWRJZHgueCAlIDMyKSAqIDQ7DQogICAgaW50IGxkZ19tID0gdGhyZWFkX2Jsb2NrX20gKyBzdHNfbW47DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfbW47DQogICAgaW50IGxkZ19rID0gc3RzX2s7DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXZlX20gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfbiA9IHdhdmVfbiArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMTYpICogODsNCg0KICAgIC8vIEMmRCBQYXJhbWV0ZXJzDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2F2ZV9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXZlX24gKyB0aHJlYWRfY19uOw0KDQogICAgaW50IGFzX20gPSBjX207DQogICAgaW50IGJzX24gPSBjX24gLyBCTE9DSzsNCg0KICAgIGZsb2F0NCB0aWxlX2RbMl1bNF0gPSB7MH07DQoNCiAgICBmb3IgKGludCBpYiA9IDA7IGliIDwgay9CTE9DSzsgaWIrKykgew0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hICBbMl1bNF1bNF0sIGxkZ19iICBbMl1bNF1bNF07DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2FfdFsyXVs0XVs0XSwgbGRnX2JfdFsyXVs0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKWxkZ19hW2lpXVtqal0gPSBsZGdfbSA8IG0gPyAqKGZsb2F0ICopJmFbKGxkZ19rICsgaWkqNjQgKyBqaiArIGliKkJMT0NLKSAqIG0gKyBsZGdfbV0gOiAwOw0KICAgICAgICAgICAgICAgICooZmxvYXQgKilsZGdfYltpaV1bampdID0gbGRnX24gPCBuID8gKihmbG9hdCAqKSZiWyhsZGdfayArIGlpKjY0ICsgamogKyBpYipCTE9DSykgKiBuICsgbGRnX25dIDogMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZsb2F0IHRoaXNfYXNbMl1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKXRoaXNfYXNbaWldID0gYXNfbSArIGlpKjE2IDwgbSA/ICooZmxvYXQ0ICopJmFzW2liKm0gKyBhc19tICsgaWkqMTZdIDogMDsNCiAgICAgICAgfQ0KICAgICAgICBmbG9hdCB0aGlzX2JzID0gYnNbaWIgKiAoKG4rQkxPQ0stMSkvQkxPQ0spICsgYnNfbl07DQoNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2FfdFtpaV1bampdW2trXSA9IGxkZ19hW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgICAgICBsZGdfYl90W2lpXVtqal1ba2tdID0gbGRnX2JbaWldW2trXVtqal07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19hW3N0c19tbiArIGpqXVtTV1pfMTI4ZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19hX3RbaWldW2pqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19iW3N0c19tbiArIGpqXVtTV1pfMTI4ZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19iX3RbaWldW2pqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBmbG9hdDQgYmxvY2tfdGlsZV9kWzJdWzRdID0gezB9Ow0KICAgICAgICBsb25nIHRpbGVfYVsyXVs0XSwgdGlsZV9iWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2FbaWldW2trXSA9ICoobG9uZyAqKSZsZHNfYVtsZHNfbSArIGlpKjE2XVtTV1pfMTI4ZnQyKGxkc19tICsgaWkqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2JbampdW2trXSA9ICoobG9uZyAqKSZsZHNfYltsZHNfbiArIGpqKjE2XVtTV1pfMTI4ZnQyKGxkc19uICsgamoqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSoxNiA8IG0gJiYgY19uICsgamoqMTYgPCBuKSB7DQogICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpIHsNCiAgICBpbnQgbSA9IGEuc2l6ZSgwKTsNCiAgICBpbnQgbiA9IGIuc2l6ZSgwKTsNCiAgICBpbnQgayA9IGEuc2l6ZSgxKTsNCiAgICBpZiAobSAqIG4gPCA2NCAqIDEyOCAqIDEyOCkgeyAvLyBncm91cCAzMngzMiB3YXZlIDE2eDE2IHRpbGluZw0KICAgICAgICBmcDhfbW1fMzJ4MzJfMTZ4MTZfZnQyPDw8ZGltMygobSszMSkvMzIsIChuKzMxKS8zMiksIGRpbTMoNjQsIDQpLCAwLCAwPj4+ICgNCiAgICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksDQogICAgICAgICAgICBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChfX2hpcF9iZmxvYXQxNiopYy5kYXRhX3B0cigpLCBtLCBuLCBrKTsNCiAgICB9DQogICAgZWxzZSBpZiAobSAqIG4gPCAxMjggKiAxMjggKiAxMjgpIHsgLy8gZ3JvdXAgNjR4NjQgd2F2ZSAzMngzMiB0aWxpbmcNCiAgICAgICAgZnA4X21tXzY0eDY0XzMyeDMyX2Z0Mjw8PGRpbTMoKG0rNjMpLzY0LCAobis2MykvNjQpLCBkaW0zKDY0LCA0KSwgMCwgMD4+PiAoDQogICAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLA0KICAgICAgICAgICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAoX19oaXBfYmZsb2F0MTYqKWMuZGF0YV9wdHIoKSwgbSwgbiwgayk7DQogICAgfQ0KICAgIGVsc2UgeyAvLyBncm91cCAxMjh4MTI4IHdhdmUgMzJ4NjQgdGlsaW5nDQogICAgICAgIGlmIChtICogbiA+PSAxMDI0ICogKG0gKyBuKSAmJiBtICUgMTI4ID09IDAgJiYgbiAlIDEyOCA9PSAwKSB7DQogICAgICAgICAgICBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobSsxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgaywgbSk7DQogICAgICAgICAgICBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgaywgbik7DQogICAgICAgICAgICBmcDhfbW1fMTI4eDEyOF9wdDw8PGRpbTMoKG0rMTI3KS8xMjgsIChuKzEyNykvMTI4KSwgZGltMyg2NCwgOCksIDAsIDA+Pj4gKA0KICAgICAgICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksDQogICAgICAgICAgICAgICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAoX19oaXBfYmZsb2F0MTYqKWMuZGF0YV9wdHIoKSwgbSwgbiwgayk7DQogICAgICAgICAgICAvLyBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobSsxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgaywgbSk7DQogICAgICAgICAgICAvLyBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgaywgbik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBmcDhfbW1fMTI4eDEyOF9mdDI8PDxkaW0zKChtKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoNjQsIDgpLCAwLCAwPj4+ICgNCiAgICAgICAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLA0KICAgICAgICAgICAgICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKF9faGlwX2JmbG9hdDE2KiljLmRhdGFfcHRyKCksIG0sIG4sIGspOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vQzEwX0NVREFfQ0hFQ0soY3VkYUdldExhc3RFcnJvcigpKTsNCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQoNCm1vZHVsZSA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCIsICItTzMiXSwNCikNCg0KZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6DQogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGENCiAgICBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpDQogICAgcmV0dXJuIGM=

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

Changes from previous submission

Against this author's previous submission submission 21230.

- IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCg0KY29uc3RleHByIGNvbnN0IGludCBCTE9DSyA9IDEyODsNCg0KLy8gc3dpenpsZSBmdW5jdGlvbiBmb3IgOC1mcDggLyAxMjgtZnA4DQojZGVmaW5lIFNXWihtLCBuKSAoKChtKSAqIDggKyAobikpICUgMTI4KQ0KDQpfX2dsb2JhbF9fIHZvaWQgZnA4X21tXzMyeDMyKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIGEsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIGIsIGNvbnN0IGZsb2F0KiBhcywgY29uc3QgZmxvYXQqIGJzLA0KICAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2KiBjLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGhlcmUNCiAgICAvLyBpbnQgY3ggPSB0aHJlYWRJZHgueCArIGJsb2NrRGltLnggKiBibG9ja0lkeC54Ow0KICAgIC8vIGludCBjeSA9IHRocmVhZElkeC55ICsgYmxvY2tEaW0ueSAqIGJsb2NrSWR4Lnk7DQogICAgLy8gaWYoY3ggPj0gbSB8fCBjeSA+PSBuKSByZXR1cm47DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gbG9uZyBsZHNfYVszMl1bMTddOw0KICAgIF9fc2hhcmVkX18gbG9uZyBsZHNfYlszMl1bMTddOw0KICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogKmxkc19hX2ZwOCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19oaXBfZnA4X2U0bTNfZm51eiAqPihsZHNfYSk7DQogICAgX19oaXBfZnA4X2U0bTNfZm51eiAqbGRzX2JfZnA4ID0gcmVpbnRlcnByZXRfY2FzdDxfX2hpcF9mcDhfZTRtM19mbnV6ICo+KGxkc19iKTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAzMjsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMzI7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAxNjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiAxNjsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2OyAvLyBieSBmbG9hdA0KDQogICAgLy8gaW50IGNwX3NoYXJlZF9tbiA9IHRocmVhZElkeC55ICogOCArIHRocmVhZElkeC54IC8gODsNCiAgICAvLyBpbnQgY3Bfc2hhcmVkX2sgID0gKHRocmVhZElkeC54ICUgOCkgKiAyOyAvLyBieSBsb25nDQoNCiAgICAvLyBpbnQgY3BfZ2xvYmFsX20gPSB0aHJlYWRfYmxvY2tfbSArIGNwX3NoYXJlZF9tbjsNCiAgICAvLyBpbnQgY3BfZ2xvYmFsX24gPSB0aHJlYWRfYmxvY2tfbiArIGNwX3NoYXJlZF9tbjsNCiAgICAvLyBpbnQgY3BfZ2xvYmFsX2sgPSBjcF9zaGFyZWRfazsNCg0KICAgIGludCBjcF9yb3cgPSB0aHJlYWRJZHgueSAqIDMyICsgdGhyZWFkSWR4LnggLyAyOyAvLyBieSBmcDgNCiAgICBpbnQgY3BfY29sID0gKHRocmVhZElkeC54ICUgMikgKiAxNjsgICAgICAgICAgICAvLyBieSBmcDgNCiAgICBpbnQgY3BfZ2xvYmFsX2sgPSBjcF9yb3c7DQogICAgaW50IGNwX2dsb2JhbF9tID0gY3BfY29sICsgdGhyZWFkX2Jsb2NrX207ICAgICAgLy8gYnkgZnA4DQogICAgaW50IGNwX2dsb2JhbF9uID0gY3BfY29sICsgdGhyZWFkX2Jsb2NrX247ICAgICAgLy8gYnkgZnA4DQoNCiAgICBpbnQgbGRzX3NoYXJlZF9tID0gd2F2ZV9tICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX3NoYXJlZF9uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX3NoYXJlZF9rID0gdGhyZWFkSWR4LnggLyAxNjsgLy8gYnkgbG9uZw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2F2ZV9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXZlX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQ0ICphX3B0ciA9IChmbG9hdDQgKilhOw0KICAgIGZsb2F0NCAqYl9wdHIgPSAoZmxvYXQ0ICopYjsNCg0KICAgIGZsb2F0NCB0aWxlX2QgPSB7MH07DQoNCiAgICBpbnQgYXNfbSA9ICB0aHJlYWRfYmxvY2tfbSArIHdhdmVfbSArIHRocmVhZF9jX207DQogICAgaW50IGJzX24gPSAodGhyZWFkX2Jsb2NrX24gKyB3YXZlX24gKyB0aHJlYWRfY19uKSAvIEJMT0NLOw0KICAgIC8vIGZsb2F0ICphc19wdHIgPSAoZmxvYXQqKSZhc1thc19tICogay9CTE9DS107DQogICAgLy8gZmxvYXQgKmJzX3B0ciA9IChmbG9hdCopJmJzW2JzX24gKiBrL0JMT0NLXTsNCiAgICBmbG9hdCAqYXNfcHRyID0gKGZsb2F0KikmYXNbYXNfbV07DQogICAgZmxvYXQgKmJzX3B0ciA9IChmbG9hdCopJmJzW2JzX25dOw0KDQogICAgZm9yIChpbnQgaWIgPSAwOyBpYiA8IGs7IGliICs9IEJMT0NLKSB7DQogICAgICAgIC8vIGZsb2F0NCBsZGdfYSA9IGFfcHRyW2NwX2dsb2JhbF9tICogay8xNiArIGNwX2dsb2JhbF9rLzIgKyBpYi8xNl07DQogICAgICAgIC8vIGZsb2F0NCBsZGdfYiA9IGJfcHRyW2NwX2dsb2JhbF9uICogay8xNiArIGNwX2dsb2JhbF9rLzIgKyBpYi8xNl07DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2FbMTZdLCBsZGdfYlsxNl07DQogICAgICAgICooZmxvYXQ0ICopbGRnX2EgPSBhX3B0clsoY3BfZ2xvYmFsX2sgKyBpYikgKiBtLzE2ICsgY3BfZ2xvYmFsX20vMTZdOw0KICAgICAgICAqKGZsb2F0NCAqKWxkZ19iID0gYl9wdHJbKGNwX2dsb2JhbF9rICsgaWIpICogbi8xNiArIGNwX2dsb2JhbF9uLzE2XTsNCiAgICAgICAgZmxvYXQ0IHRoaXNfYXMgPSAqKGZsb2F0NCAqKSgmYXNfcHRyWzBdKTsNCiAgICAgICAgZmxvYXQgIHRoaXNfYnMgPSBic19wdHJbMF07DQogICAgICAgIC8vICooZmxvYXQ0ICopKCZsZHNfYVtjcF9zaGFyZWRfbW5dW2NwX3NoYXJlZF9rXSkgPSBsZGdfYTsNCiAgICAgICAgLy8gKihmbG9hdDQgKikoJmxkc19iW2NwX3NoYXJlZF9tbl1bY3Bfc2hhcmVkX2tdKSA9IGxkZ19iOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTY7IGlpKyspIHsNCiAgICAgICAgICAgIGxkc19hX2ZwOFsoY3BfY29sICsgaWkpICogMTM2ICsgY3Bfcm93XSA9IGxkZ19hW2lpXTsNCiAgICAgICAgICAgIGxkc19iX2ZwOFsoY3BfY29sICsgaWkpICogMTM2ICsgY3Bfcm93XSA9IGxkZ19iW2lpXTsNCiAgICAgICAgfQ0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2QgPSB7MH07DQogICAgICAgIGJsb2NrX3RpbGVfZCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOChsZHNfYVtsZHNfc2hhcmVkX21dW2xkc19zaGFyZWRfayArICAwXSwgbGRzX2JbbGRzX3NoYXJlZF9uXVtsZHNfc2hhcmVkX2sgKyAgMF0sIGJsb2NrX3RpbGVfZCwgMCwgMCwgMCk7DQogICAgICAgIGJsb2NrX3RpbGVfZCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOChsZHNfYVtsZHNfc2hhcmVkX21dW2xkc19zaGFyZWRfayArICA0XSwgbGRzX2JbbGRzX3NoYXJlZF9uXVtsZHNfc2hhcmVkX2sgKyAgNF0sIGJsb2NrX3RpbGVfZCwgMCwgMCwgMCk7DQogICAgICAgIGJsb2NrX3RpbGVfZCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOChsZHNfYVtsZHNfc2hhcmVkX21dW2xkc19zaGFyZWRfayArICA4XSwgbGRzX2JbbGRzX3NoYXJlZF9uXVtsZHNfc2hhcmVkX2sgKyAgOF0sIGJsb2NrX3RpbGVfZCwgMCwgMCwgMCk7DQogICAgICAgIGJsb2NrX3RpbGVfZCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOChsZHNfYVtsZHNfc2hhcmVkX21dW2xkc19zaGFyZWRfayArIDEyXSwgbGRzX2JbbGRzX3NoYXJlZF9uXVtsZHNfc2hhcmVkX2sgKyAxMl0sIGJsb2NrX3RpbGVfZCwgMCwgMCwgMCk7DQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICAgICAgdGlsZV9kWzBdICs9IGJsb2NrX3RpbGVfZFswXSAqIHRoaXNfYXNbMF0gKiB0aGlzX2JzOw0KICAgICAgICB0aWxlX2RbMV0gKz0gYmxvY2tfdGlsZV9kWzFdICogdGhpc19hc1sxXSAqIHRoaXNfYnM7DQogICAgICAgIHRpbGVfZFsyXSArPSBibG9ja190aWxlX2RbMl0gKiB0aGlzX2FzWzJdICogdGhpc19iczsNCiAgICAgICAgdGlsZV9kWzNdICs9IGJsb2NrX3RpbGVfZFszXSAqIHRoaXNfYXNbM10gKiB0aGlzX2JzOw0KICAgICAgICBhc19wdHIgKz0gbTsNCiAgICAgICAgYnNfcHRyICs9IChuK0JMT0NLLTEpL0JMT0NLOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGNbKGNfbSArIDApICogbiArIGNfbl0gPSAoX19oaXBfYmZsb2F0MTYpKHRpbGVfZFswXSk7DQogICAgY1soY19tICsgMSkgKiBuICsgY19uXSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kWzFdKTsNCiAgICBjWyhjX20gKyAyKSAqIG4gKyBjX25dID0gKF9faGlwX2JmbG9hdDE2KSh0aWxlX2RbMl0pOw0KICAgIGNbKGNfbSArIDMpICogbiArIGNfbl0gPSAoX19oaXBfYmZsb2F0MTYpKHRpbGVfZFszXSk7DQp9DQoNCi8qDQpfX2dsb2JhbF9fIHZvaWQgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4KGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLCBpbnQgbSwgaW50IG4pIHsNCiAgICAvLyB0cmFuc3Bvc2UgaW4gZXZlcnkgMTI4eDEyOCBibG9jaw0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgdGhyZWFkX20gPSAodGhyZWFkSWR4LnggLyA4KSAqIDE2Ow0KICAgIGludCB0aHJlYWRfbiA9ICh0aHJlYWRJZHgueCAlIDgpICogMTY7DQoNCiAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGRhdGFbMTZdWzE2XTsNCiAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGRhdGFfdFsxNl1bMTZdOw0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQogICAgICAgICooZmxvYXQ0ICopJmRhdGFbaV1bMF0gPSAqKGZsb2F0NCAqKSZhWyh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tICsgaSkgKiBuICsgdGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbl07DQogICAgfQ0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTY7IGorKykgew0KICAgICAgICAgICAgZGF0YV90W2pdW2ldID0gZGF0YVtpXVtqXTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgew0KICAgICAgICAqKGZsb2F0NCAqKSZhWyh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9uICsgaSkgKiBuICsgdGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbV0gPSAqKGZsb2F0NCAqKSZkYXRhX3RbaV1bMF07DQogICAgfQ0KfQ0KKi8NCg0KX19nbG9iYWxfXyB2b2lkIGluc2l0dV90cmFuc3Bvc2VfMTI4eDEyOChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwgaW50IG0sIGludCBuKSB7DQogICAgLy8gdHJhbnNwb3NlIGluIGV2ZXJ5IDEyOHgxMjggYmxvY2sNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHRocmVhZF9tID0gdGhyZWFkSWR4LnggLyA4Ow0KICAgIGludCB0aHJlYWRfbiA9ICh0aHJlYWRJZHgueCAlIDgpICogMTY7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogc21lbVsxMjhdWzEyOV07DQoNCiAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGRhdGFbMTZdOw0KDQogICAgKihmbG9hdDQgKikmZGF0YVswXSA9ICooZmxvYXQ0ICopJmFbKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20pICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dOw0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQogICAgICAgIHNtZW1bdGhyZWFkX24gKyBpXVt0aHJlYWRfbV0gPSBkYXRhW2ldOw0KICAgIH0NCg0KICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICooZmxvYXQ0ICopJmFbKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20pICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dID0gKihmbG9hdDQgKikmc21lbVt0aHJlYWRfbV1bdGhyZWFkX25dOw0KfQ0KDQpfX2xhdW5jaF9ib3VuZHNfXyg1MTIsIDIpDQpfX2dsb2JhbF9fIHZvaWQgZnA4X21tXzEyOHgxMjgoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVsxMjhdWzEyOF07DQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19iWzEyOF1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXZlX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDMyOw0KICAgIGludCB3YXZlX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gIHRocmVhZElkeC54ICUgMTY7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX21uID0gdGhyZWFkSWR4LnkgKiA4ICsgdGhyZWFkSWR4LnggLyA4Ow0KICAgIGludCBzdHNfayAgPSAodGhyZWFkSWR4LnggJSA4KSAqIDE2Ow0KICAgIGludCBsZGdfbSA9IHRocmVhZF9ibG9ja19tICsgc3RzX2s7DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfazsNCiAgICBpbnQgbGRnX2sgPSBzdHNfbW47DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXZlX20gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfbiA9IHdhdmVfbiArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMTYpICogODsNCg0KICAgIC8vIEMmRCBQYXJhbWV0ZXJzDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2F2ZV9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXZlX24gKyB0aHJlYWRfY19uOw0KDQogICAgaW50IGFzX20gPSBjX207DQogICAgaW50IGJzX24gPSBjX24gLyBCTE9DSzsNCg0KICAgIGZsb2F0NCB0aWxlX2RbMl1bNF0gPSB7MH07DQoNCiAgICBmb3IgKGludCBpYiA9IDA7IGliIDwgay9CTE9DSzsgaWIrKykgew0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hWzJdWzE2XSwgbGRnX2JbMl1bMTZdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKilsZGdfYVtpaV0gPSAqKGZsb2F0NCAqKSZhWyhsZGdfayArIGliKkJMT0NLICsgaWkqNjQpICogbSArIGxkZ19tXTsNCiAgICAgICAgICAgICooZmxvYXQ0ICopbGRnX2JbaWldID0gKihmbG9hdDQgKikmYlsobGRnX2sgKyBpYipCTE9DSyArIGlpKjY0KSAqIG4gKyBsZGdfbl07DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9ICooZmxvYXQ0ICopJmFzW2liKm0gKyBhc19tICsgaWkqMTZdOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHRoaXNfYnMgPSBic1tpYiAqICgobitCTE9DSy0xKS9CTE9DSykgKyBic19uXTsNCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihsb25nICopJmxkc19hW3N0c19tbiArIGlpKjY0XVtTV1ooc3RzX21uLCBzdHNfayAgICApXSA9ICoobG9uZyAqKSZsZGdfYVtpaV1bMF07DQogICAgICAgICAgICAqKGxvbmcgKikmbGRzX2Fbc3RzX21uICsgaWkqNjRdW1NXWihzdHNfbW4sIHN0c19rICsgOCldID0gKihsb25nICopJmxkZ19hW2lpXVs4XTsNCiAgICAgICAgICAgICoobG9uZyAqKSZsZHNfYltzdHNfbW4gKyBpaSo2NF1bU1daKHN0c19tbiwgc3RzX2sgICAgKV0gPSAqKGxvbmcgKikmbGRnX2JbaWldWzBdOw0KICAgICAgICAgICAgKihsb25nICopJmxkc19iW3N0c19tbiArIGlpKjY0XVtTV1ooc3RzX21uLCBzdHNfayArIDgpXSA9ICoobG9uZyAqKSZsZGdfYltpaV1bOF07DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgZmxvYXQ0IGJsb2NrX3RpbGVfZFsyXVs0XSA9IHswfTsNCiAgICAgICAgbG9uZyB0aWxlX2FbMl1bNF0sIHRpbGVfYls0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGxvbmcgKikmbGRzX2FbbGRzX20gKyBpaSoxNl1bU1daKGxkc19tLCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daKGxkc19uLCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCBibG9ja190aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdW2trXSArPSBibG9ja190aWxlX2RbaWldW2pqXVtra10gKiB0aGlzX2FzW2lpXVtra10gKiB0aGlzX2JzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgcmVzdWx0IGFzIGJmMTYNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSoxNiArIGtrKSAqIG4gKyBjX24gKyBqaioxNl0gPSAoX19oaXBfYmZsb2F0MTYpKHRpbGVfZFtpaV1bampdW2trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpIHsNCiAgICBpbnQgbSA9IGEuc2l6ZSgwKTsNCiAgICBpbnQgbiA9IGIuc2l6ZSgwKTsNCiAgICBpbnQgayA9IGEuc2l6ZSgxKTsNCi8vIGhpcEV2ZW50X3Qgc3RhcnQsIGVuZDsNCi8vIGhpcEV2ZW50Q3JlYXRlKCZzdGFydCk7DQovLyBoaXBFdmVudENyZWF0ZSgmZW5kKTsNCi8vIGhpcEV2ZW50UmVjb3JkKHN0YXJ0KTsNCiAgICBpZiAobSAlIDEyOCAhPSAwIHx8IG4gJSAxMjggIT0gMCkgew0KICAgICAgICBmcDhfbW1fMzJ4MzI8PDxkaW0zKChtKzMxKS8zMiwgKG4rMzEpLzMyKSwgZGltMyg2NCwgNCksIDAsIDA+Pj4gKA0KICAgICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwNCiAgICAgICAgICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKF9faGlwX2JmbG9hdDE2KiljLmRhdGFfcHRyKCksIG0sIG4sIGspOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG0rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIGssIG0pOw0KICAgICAgICBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgaywgbik7DQogICAgICAgIGZwOF9tbV8xMjh4MTI4PDw8ZGltMygobSsxMjcpLzEyOCwgKG4rMTI3KS8xMjgpLCBkaW0zKDY0LCA4KSwgMCwgMD4+PiAoDQogICAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLA0KICAgICAgICAgICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAoX19oaXBfYmZsb2F0MTYqKWMuZGF0YV9wdHIoKSwgbSwgbiwgayk7DQogICAgICAgIC8vIGluc2l0dV90cmFuc3Bvc2VfMTI4eDEyODw8PGRpbTMoKGsrMTI3KS8xMjgsIChtKzEyNykvMTI4KSwgZGltMyg2NCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgaywgbSk7DQogICAgICAgIC8vIGluc2l0dV90cmFuc3Bvc2VfMTI4eDEyODw8PGRpbTMoKGsrMTI3KS8xMjgsIChuKzEyNykvMTI4KSwgZGltMyg2NCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgaywgbik7DQogICAgfQ0KLy8gaGlwRXZlbnRSZWNvcmQoZW5kKTsNCi8vIGhpcEV2ZW50U3luY2hyb25pemUoZW5kKTsNCi8vIGZsb2F0IG1zZWM7DQovLyBoaXBFdmVudEVsYXBzZWRUaW1lKCZtc2VjLCBzdGFydCwgZW5kKTsNCi8vIGZsb2F0IHVzZWMgPSBtc2VjICogMTAwMDsNCi8vIGFzLmRhdGFfcHRyPGZsb2F0PigpWzBdID0gdXNlYzsNCi8vIGhpcEV2ZW50RGVzdHJveShzdGFydCk7DQovLyBoaXBFdmVudERlc3Ryb3koZW5kKTsNCiAgICAvL0MxMF9DVURBX0NIRUNLKGN1ZGFHZXRMYXN0RXJyb3IoKSk7DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdmcDhfbW0nLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8zIl0sDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhDQogICAgIyB0bXAgPSBhX3NjYWxlWzBdWzBdDQogICAgIyBpbXBvcnQgbnVtcHkgYXMgbnANCiAgICAjIHJhbmRpbnQgPSBucC5yYW5kb20ucmFuZGludCgwLCAyMCkNCiAgICBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpDQogICAgIyBpZiByYW5kaW50ICUgMjAgPT0gMDoNCiAgICAjICAgICBwcmludChmIk0gTiBLID0ge2Euc2hhcGVbMF06NH0ge2Iuc2hhcGVbMF06NH0ge2Euc2hhcGVbMV06NH0sIFRpbWUgPSB7YV9zY2FsZVswXVswXTouMmZ9IHVzIikNCiAgICAjIGFfc2NhbGVbMF1bMF0gPSB0bXANCiAgICByZXR1cm4gYw==
No newline at end of file
+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCg0KY29uc3RleHByIGNvbnN0IGludCBCTE9DSyA9IDEyODsNCg0KI2RlZmluZSBTV1pfMzJmdDIobSwgbikgKCgobSkgKiA4ICsgKChtKSAvIDE2KSAqIDggKyAobikpICUgMTI4KQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV8zMngzMl8xNngxNl9mdDIoDQogICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwNCiAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYnMsDQogICAgICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzMyXVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYlszMl1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAzMjsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMzI7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAxNjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiAxNjsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19rICA9IHRocmVhZElkeC55ICogMzIgKyAodGhyZWFkSWR4LnggLyA4KSAqIDQ7DQogICAgaW50IHN0c19tbiA9ICh0aHJlYWRJZHgueCAlIDgpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsxXVsxXSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2EgIFsxXVs0XVs0XSwgbGRnX2IgIFsxXVs0XVs0XTsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYV90WzFdWzRdWzRdLCBsZGdfYl90WzFdWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2FbaWldW2pqXSA9ICooZmxvYXQgKikmYVsobGRnX2sgKyBpaSozMiArIGpqICsgaWIqQkxPQ0spICogbSArIGxkZ19tXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSozMiArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZsb2F0IHRoaXNfYXNbMV1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKXRoaXNfYXNbaWldID0gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl07DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzMyZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19hX3RbaWldW2pqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19iW3N0c19tbiArIGpqXVtTV1pfMzJmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2JfdFtpaV1bampdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMV1bMV0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzFdWzRdLCB0aWxlX2JbMV1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl8zMmZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDE7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzMyZnQyKGxkc19uICsgamoqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDE7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAxOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQojZGVmaW5lIFNXWl82NGZ0MihtLCBuKSAoKChtKSAqIDggKyAoKG0pIC8gMTYpICogOCArIChuKSkgJSAxMjgpDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDQpDQpfX2dsb2JhbF9fIHZvaWQgZnA4X21tXzY0eDY0XzMyeDMyX2Z0MigNCiAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGFzLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGJzLA0KICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzY0XVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYls2NF1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiA2NDsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogNjQ7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAzMjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiAzMjsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19rICA9IHRocmVhZElkeC55ICogMTYgKyAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCBzdHNfbW4gPSAodGhyZWFkSWR4LnggJSAxNikgKiA0Ow0KICAgIGludCBsZGdfbSA9IHRocmVhZF9ibG9ja19tICsgc3RzX21uOw0KICAgIGludCBsZGdfbiA9IHRocmVhZF9ibG9ja19uICsgc3RzX21uOw0KICAgIGludCBsZGdfayA9IHN0c19rOw0KDQogICAgLy8gTERTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IGxkc19tID0gd2F2ZV9tICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX24gPSB3YXZlX24gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfayA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDg7DQoNCiAgICAvLyBDJkQgUGFyYW1ldGVycw0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhdmVfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2F2ZV9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGludCBhc19tID0gY19tOw0KICAgIGludCBic19uID0gY19uIC8gQkxPQ0s7DQoNCiAgICBmbG9hdDQgdGlsZV9kWzJdWzJdID0gezB9Ow0KDQogICAgZm9yIChpbnQgaWIgPSAwOyBpYiA8IGsvQkxPQ0s7IGliKyspIHsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYSAgWzJdWzRdWzRdLCBsZGdfYiAgWzJdWzRdWzRdOw0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hX3RbMl1bNF1bNF0sIGxkZ19iX3RbMl1bNF1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKilsZGdfYVtpaV1bampdID0gbGRnX20gPCBtID8gKihmbG9hdCAqKSZhWyhsZGdfayArIGlpKjY0ICsgamogKyBpYipCTE9DSykgKiBtICsgbGRnX21dIDogMDsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9IGxkZ19uIDwgbiA/ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSo2NCArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXSA6IDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9IGFzX20gKyBpaSoxNiA8IG0gPyAqKGZsb2F0NCAqKSZhc1tpYiptICsgYXNfbSArIGlpKjE2XSA6IDA7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzY0ZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19hX3RbaWldW2pqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19iW3N0c19tbiArIGpqXVtTV1pfNjRmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2JfdFtpaV1bampdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMl1bMl0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzJdWzRdLCB0aWxlX2JbMl1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl82NGZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzY0ZnQyKGxkc19uICsgamoqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSoxNiA8IG0gJiYgY19uICsgamoqMTYgPCBuKSB7DQogICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjgoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsIGludCBtLCBpbnQgbikgew0KICAgIC8vIHRyYW5zcG9zZSBpbiBldmVyeSAxMjh4MTI4IGJsb2NrDQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB0aHJlYWRfbSA9IHRocmVhZElkeC54IC8gODsNCiAgICBpbnQgdGhyZWFkX24gPSAodGhyZWFkSWR4LnggJSA4KSAqIDE2Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHNtZW1bMTI4XVsxMjldOw0KDQogICAgX19oaXBfZnA4X2U0bTNfZm51eiBkYXRhWzE2XTsNCg0KICAgICooZmxvYXQ0ICopJmRhdGFbMF0gPSAqKGZsb2F0NCAqKSZhWyh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tKSAqIG4gKyB0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9uXTsNCg0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgew0KICAgICAgICBzbWVtW3RocmVhZF9uICsgaV1bdGhyZWFkX21dID0gZGF0YVtpXTsNCiAgICAgICAgLy8gc21lbVt0aHJlYWRfbiArIGldWygodGhyZWFkX24gLyAxNikgKiAxNiArIHRocmVhZF9tKSAlIDEyOF0gPSBkYXRhW2ldOyAvLyBzd2l6emxlDQogICAgfQ0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgKihmbG9hdDQgKikmYVsodGhyZWFkX2Jsb2NrX20gKyB0aHJlYWRfbSkgKiBuICsgdGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbl0gPSAqKGZsb2F0NCAqKSZzbWVtW3RocmVhZF9tXVt0aHJlYWRfbl07DQogICAgLy8gKihmbG9hdDQgKikmYVsodGhyZWFkX2Jsb2NrX20gKyB0aHJlYWRfbSkgKiBuICsgdGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbl0gPSAqKGZsb2F0NCAqKSZzbWVtW3RocmVhZF9tXVsoKHRocmVhZF9tIC8gMTYpICogMTYgKyB0aHJlYWRfbikgJSAxMjhdOyAvLyBzd2l6emxlDQp9DQoNCiNkZWZpbmUgU1daXzEyOHB0KG0sIG4pICgoKG0pICogOCArIChuKSkgJSAxMjgpDQpfX2xhdW5jaF9ib3VuZHNfXyg1MTIsIDIpDQpfX2dsb2JhbF9fIHZvaWQgZnA4X21tXzEyOHgxMjhfcHQoDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBicywNCiAgICAgICAgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVsxMjhdWzEyOF07DQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19iWzEyOF1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXZlX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDMyOw0KICAgIGludCB3YXZlX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gIHRocmVhZElkeC54ICUgMTY7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX21uID0gdGhyZWFkSWR4LnkgKiA4ICsgdGhyZWFkSWR4LnggLyA4Ow0KICAgIGludCBzdHNfayAgPSAodGhyZWFkSWR4LnggJSA4KSAqIDE2Ow0KICAgIGludCBsZGdfbSA9IHRocmVhZF9ibG9ja19tICsgc3RzX2s7DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfazsNCiAgICBpbnQgbGRnX2sgPSBzdHNfbW47DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXZlX20gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfbiA9IHdhdmVfbiArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMTYpICogODsNCg0KICAgIC8vIEMmRCBQYXJhbWV0ZXJzDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2F2ZV9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXZlX24gKyB0aHJlYWRfY19uOw0KDQogICAgaW50IGFzX20gPSBjX207DQogICAgaW50IGJzX24gPSBjX24gLyBCTE9DSzsNCg0KICAgIGZsb2F0NCB0aWxlX2RbMl1bNF0gPSB7MH07DQoNCiAgICBmb3IgKGludCBpYiA9IDA7IGliIDwgay9CTE9DSzsgaWIrKykgew0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hWzJdWzE2XSwgbGRnX2JbMl1bMTZdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKilsZGdfYVtpaV0gPSAqKGZsb2F0NCAqKSZhWyhsZGdfayArIGliKkJMT0NLICsgaWkqNjQpICogbSArIGxkZ19tXTsNCiAgICAgICAgICAgICooZmxvYXQ0ICopbGRnX2JbaWldID0gKihmbG9hdDQgKikmYlsobGRnX2sgKyBpYipCTE9DSyArIGlpKjY0KSAqIG4gKyBsZGdfbl07DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9ICooZmxvYXQ0ICopJmFzW2liKm0gKyBhc19tICsgaWkqMTZdOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHRoaXNfYnMgPSBic1tpYiAqICgobitCTE9DSy0xKS9CTE9DSykgKyBic19uXTsNCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihsb25nICopJmxkc19hW3N0c19tbiArIGlpKjY0XVtTV1pfMTI4cHQoc3RzX21uLCBzdHNfayAgICApXSA9ICoobG9uZyAqKSZsZGdfYVtpaV1bMF07DQogICAgICAgICAgICAqKGxvbmcgKikmbGRzX2Fbc3RzX21uICsgaWkqNjRdW1NXWl8xMjhwdChzdHNfbW4sIHN0c19rICsgOCldID0gKihsb25nICopJmxkZ19hW2lpXVs4XTsNCiAgICAgICAgICAgICoobG9uZyAqKSZsZHNfYltzdHNfbW4gKyBpaSo2NF1bU1daXzEyOHB0KHN0c19tbiwgc3RzX2sgICAgKV0gPSAqKGxvbmcgKikmbGRnX2JbaWldWzBdOw0KICAgICAgICAgICAgKihsb25nICopJmxkc19iW3N0c19tbiArIGlpKjY0XVtTV1pfMTI4cHQoc3RzX21uLCBzdHNfayArIDgpXSA9ICoobG9uZyAqKSZsZGdfYltpaV1bOF07DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgZmxvYXQ0IGJsb2NrX3RpbGVfZFsyXVs0XSA9IHswfTsNCiAgICAgICAgbG9uZyB0aWxlX2FbMl1bNF0sIHRpbGVfYls0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGxvbmcgKikmbGRzX2FbbGRzX20gKyBpaSoxNl1bU1daXzEyOHB0KGxkc19tLCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzEyOHB0KGxkc19uLCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCBibG9ja190aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdW2trXSArPSBibG9ja190aWxlX2RbaWldW2pqXVtra10gKiB0aGlzX2FzW2lpXVtra10gKiB0aGlzX2JzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgcmVzdWx0IGFzIGJmMTYNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSoxNiArIGtrKSAqIG4gKyBjX24gKyBqaioxNl0gPSAoX19oaXBfYmZsb2F0MTYpKHRpbGVfZFtpaV1bampdW2trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCiNkZWZpbmUgU1daXzEyOGZ0MihtLCBuKSAoKChtKSAqIDggKyAoKG0pIC8gMTYpICogOCArIChuKSkgJSAxMjgpDQpfX2xhdW5jaF9ib3VuZHNfXyg1MTIsIDIpDQpfX2dsb2JhbF9fIHZvaWQgZnA4X21tXzEyOHgxMjhfZnQyKA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwNCiAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGIsDQogICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYXMsDQogICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYnMsDQogICAgICAgIF9faGlwX2JmbG9hdDE2KiBfX3Jlc3RyaWN0X18gYywgaW50IG0sIGludCBuLCBpbnQgaykgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRzX2FbMTI4XVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYlsxMjhdWzEyOF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAzMjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19rICA9IHRocmVhZElkeC55ICogOCArICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHN0c19tbiA9ICh0aHJlYWRJZHgueCAlIDMyKSAqIDQ7DQogICAgaW50IGxkZ19tID0gdGhyZWFkX2Jsb2NrX20gKyBzdHNfbW47DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfbW47DQogICAgaW50IGxkZ19rID0gc3RzX2s7DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXZlX20gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfbiA9IHdhdmVfbiArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMTYpICogODsNCg0KICAgIC8vIEMmRCBQYXJhbWV0ZXJzDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2F2ZV9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXZlX24gKyB0aHJlYWRfY19uOw0KDQogICAgaW50IGFzX20gPSBjX207DQogICAgaW50IGJzX24gPSBjX24gLyBCTE9DSzsNCg0KICAgIGZsb2F0NCB0aWxlX2RbMl1bNF0gPSB7MH07DQoNCiAgICBmb3IgKGludCBpYiA9IDA7IGliIDwgay9CTE9DSzsgaWIrKykgew0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hICBbMl1bNF1bNF0sIGxkZ19iICBbMl1bNF1bNF07DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2FfdFsyXVs0XVs0XSwgbGRnX2JfdFsyXVs0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKWxkZ19hW2lpXVtqal0gPSBsZGdfbSA8IG0gPyAqKGZsb2F0ICopJmFbKGxkZ19rICsgaWkqNjQgKyBqaiArIGliKkJMT0NLKSAqIG0gKyBsZGdfbV0gOiAwOw0KICAgICAgICAgICAgICAgICooZmxvYXQgKilsZGdfYltpaV1bampdID0gbGRnX24gPCBuID8gKihmbG9hdCAqKSZiWyhsZGdfayArIGlpKjY0ICsgamogKyBpYipCTE9DSykgKiBuICsgbGRnX25dIDogMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZsb2F0IHRoaXNfYXNbMl1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKXRoaXNfYXNbaWldID0gYXNfbSArIGlpKjE2IDwgbSA/ICooZmxvYXQ0ICopJmFzW2liKm0gKyBhc19tICsgaWkqMTZdIDogMDsNCiAgICAgICAgfQ0KICAgICAgICBmbG9hdCB0aGlzX2JzID0gYnNbaWIgKiAoKG4rQkxPQ0stMSkvQkxPQ0spICsgYnNfbl07DQoNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2FfdFtpaV1bampdW2trXSA9IGxkZ19hW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgICAgICBsZGdfYl90W2lpXVtqal1ba2tdID0gbGRnX2JbaWldW2trXVtqal07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19hW3N0c19tbiArIGpqXVtTV1pfMTI4ZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19hX3RbaWldW2pqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19iW3N0c19tbiArIGpqXVtTV1pfMTI4ZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19iX3RbaWldW2pqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBmbG9hdDQgYmxvY2tfdGlsZV9kWzJdWzRdID0gezB9Ow0KICAgICAgICBsb25nIHRpbGVfYVsyXVs0XSwgdGlsZV9iWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2FbaWldW2trXSA9ICoobG9uZyAqKSZsZHNfYVtsZHNfbSArIGlpKjE2XVtTV1pfMTI4ZnQyKGxkc19tICsgaWkqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2JbampdW2trXSA9ICoobG9uZyAqKSZsZHNfYltsZHNfbiArIGpqKjE2XVtTV1pfMTI4ZnQyKGxkc19uICsgamoqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSoxNiA8IG0gJiYgY19uICsgamoqMTYgPCBuKSB7DQogICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpIHsNCiAgICBpbnQgbSA9IGEuc2l6ZSgwKTsNCiAgICBpbnQgbiA9IGIuc2l6ZSgwKTsNCiAgICBpbnQgayA9IGEuc2l6ZSgxKTsNCiAgICBpZiAobSAqIG4gPCA2NCAqIDEyOCAqIDEyOCkgeyAvLyBncm91cCAzMngzMiB3YXZlIDE2eDE2IHRpbGluZw0KICAgICAgICBmcDhfbW1fMzJ4MzJfMTZ4MTZfZnQyPDw8ZGltMygobSszMSkvMzIsIChuKzMxKS8zMiksIGRpbTMoNjQsIDQpLCAwLCAwPj4+ICgNCiAgICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksDQogICAgICAgICAgICBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChfX2hpcF9iZmxvYXQxNiopYy5kYXRhX3B0cigpLCBtLCBuLCBrKTsNCiAgICB9DQogICAgZWxzZSBpZiAobSAqIG4gPCAxMjggKiAxMjggKiAxMjgpIHsgLy8gZ3JvdXAgNjR4NjQgd2F2ZSAzMngzMiB0aWxpbmcNCiAgICAgICAgZnA4X21tXzY0eDY0XzMyeDMyX2Z0Mjw8PGRpbTMoKG0rNjMpLzY0LCAobis2MykvNjQpLCBkaW0zKDY0LCA0KSwgMCwgMD4+PiAoDQogICAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLA0KICAgICAgICAgICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAoX19oaXBfYmZsb2F0MTYqKWMuZGF0YV9wdHIoKSwgbSwgbiwgayk7DQogICAgfQ0KICAgIGVsc2UgeyAvLyBncm91cCAxMjh4MTI4IHdhdmUgMzJ4NjQgdGlsaW5nDQogICAgICAgIGlmIChtICogbiA+PSAxMDI0ICogKG0gKyBuKSAmJiBtICUgMTI4ID09IDAgJiYgbiAlIDEyOCA9PSAwKSB7DQogICAgICAgICAgICBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobSsxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgaywgbSk7DQogICAgICAgICAgICBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgaywgbik7DQogICAgICAgICAgICBmcDhfbW1fMTI4eDEyOF9wdDw8PGRpbTMoKG0rMTI3KS8xMjgsIChuKzEyNykvMTI4KSwgZGltMyg2NCwgOCksIDAsIDA+Pj4gKA0KICAgICAgICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksDQogICAgICAgICAgICAgICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAoX19oaXBfYmZsb2F0MTYqKWMuZGF0YV9wdHIoKSwgbSwgbiwgayk7DQogICAgICAgICAgICAvLyBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobSsxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgaywgbSk7DQogICAgICAgICAgICAvLyBpbnNpdHVfdHJhbnNwb3NlXzEyOHgxMjg8PDxkaW0zKChrKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoMTAyNCksIDAsIDA+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgaywgbik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBmcDhfbW1fMTI4eDEyOF9mdDI8PDxkaW0zKChtKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoNjQsIDgpLCAwLCAwPj4+ICgNCiAgICAgICAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLA0KICAgICAgICAgICAgICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKF9faGlwX2JmbG9hdDE2KiljLmRhdGFfcHRyKCksIG0sIG4sIGspOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vQzEwX0NVREFfQ0hFQ0soY3VkYUdldExhc3RFcnJvcigpKTsNCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQoNCm1vZHVsZSA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCIsICItTzMiXSwNCikNCg0KZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6DQogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGENCiAgICBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpDQogICAgcmV0dXJuIGM=
No newline at end of file

Best evidence level for this revision: reported

JSON