Skip to content
KernelIndex
Search⌘K

submission 25056

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

fp8_gemm.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-25056?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
34.9µs
#5 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
35.2µs
#10 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
49.0µs
#8 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
90.4µs
#37 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
96.7µs
#27 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
97.2µs
#26 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
100.4µs
#21 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
101.2µs
#42 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
108.8µs
#23 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
109.8µs
#21 of 98
2025-05-19
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
142.8µs
#11 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
146.9µs
#10 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
154.4µs
#26 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
169.3µs
#12 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
302.0µs
#28 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
393.2µs
#28 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
432.8µs
#28 of 98
2025-05-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
851.2µs
#28 of 98
2025-05-19

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:407dd25f5c40a0c2e07c22567efcc93ac058b0bbf01cd2debabedfb1cdc7d8e7
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

fp8_gemm.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgojZGVmaW5lIEhJUF9DSEVDSyhjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQApkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmlmKGVycm9yICE9IGhpcFN1Y2Nlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKc3RkOjpjZXJyIDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKPDwgaGlwR2V0RXJyb3JTdHJpbmcoZXJyb3IpIDw8ICIgaW4gIiA8PCBfX2Z1bmNfXyA8PCAiIGF0ICIgPDwgX19GSUxFX18gQAo8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACndoaWxlKGZhbHNlKQp1c2luZyBmcDggPSBfX2hpcF9mcDhfZTRtM19mbnV6Owp1c2luZyBiZjE2ID0gX19oaXBfYmZsb2F0MTY7CnVzaW5nIGZwMzIgPSBmbG9hdDsKdXNpbmcgZnAzMng0ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKdXNpbmcgaTMyeDQgPSBpbnQzMl90IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CnN0cnVjdCBjdWJlIHsKaW50IG0sIG4sIGs7Cn07CmNvbnN0ZXhwciBpbnQgd2FycF9zaXplID0gNjQ7CmNvbnN0ZXhwciBpbnQgY2FjaGVfbGluZV9zaXplID0gMTI4Owpjb25zdGV4cHIgaW50IG1fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IG5fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IGtfYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDEyODsKdXNpbmcgcmVnaXN0ZXJfdHlwZSA9IHVpbnQzMl90Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIGF1dG8gY2VpbF9kaXYoVCBhLCBVIGIpIHsKcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIGF1dG8gZGl2aWRlX2V4YWN0KCkgewpzdGF0aWNfYXNzZXJ0KGEgJSBiID09IDAsICJkb2VzIG5vdCBkaXZpZGUgZXhhY3QhIik7CnJldHVybiBhIC8gYjsKfQp0ZW1wbGF0ZTxpbnQgaW5jLCBpbnQgYWRkLCB0eXBlbmFtZSBzZXE+CnN0cnVjdCBtdWx0aXBseV9ieV9pbmM7CnRlbXBsYXRlPGludCBpbmMsIGludCBhZGQsIGludC4uLiBJcz4Kc3RydWN0IG11bHRpcGx5X2J5X2luYzxpbmMsIGFkZCwgc3RkOjppbnRlZ2VyX3NlcXVlbmNlPGludCwgSXMuLi4+PiB7CnVzaW5nIHR5cGUgPSBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCAoaW5jICogSXMgKyBhZGQpLi4uPjsKfTsKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jLCBpbnQuLi4gSXM+CnN0cnVjdCBtYWtlX2luZGV4X3NlcXVlbmNlX3dpdGhfaW5jX2hlbHBlciB7CnVzaW5nIHR5cGUgPSB0eXBlbmFtZSBtdWx0aXBseV9ieV9pbmM8aW5jLCBJLCBzdGQ6Om1ha2VfaW50ZWdlcl9zZXF1ZW5jZTxpbnQsIChOIC0gSSkgLyBpbmM+Pjo6dHlwZTsKfTsKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jPgp1c2luZyBtYWtlX2luZGV4X3NlcXVlbmNlX3dpdGhfaW5jID0gdHlwZW5hbWUgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luY19oZWxwZXI8SSwgTiwgaW5jPjo6dHlwZTsKdGVtcGxhdGU8dHlwZW5hbWUgRiwgaW50Li4uIElzPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbF9hcHBseShGIGYsIHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxpbnQsIElzLi4uPikgewooZi50ZW1wbGF0ZSBvcGVyYXRvcigpPElzPigpLCAuLi4pOwp9CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYyA9IDEsIHR5cGVuYW1lIEY+Cl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsKEYgZikgewp1bnJvbGxfYXBwbHkoZiwgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luYzxJLCBOLCBpbmM+e30pOwp9CnRlbXBsYXRlPGludCBJLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDFkKEYgZikgewp1bnJvbGw8MCwgST4oZik7Cn0KdGVtcGxhdGU8aW50IEksIGludCBKLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDJkKEYgZikgewp1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CnVucm9sbDwwLCBKPihbJl08aW50IGo+IHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGksIGo+KCk7Cn0pOwp9KTsKfQp0ZW1wbGF0ZTxpbnQgSSwgaW50IEosIGludCBLLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDNkKEYgZikgewp1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CnVucm9sbDwwLCBKPihbJl08aW50IGo+IHsKdW5yb2xsPDAsIEs+KFsmXTxpbnQgaz4gewpmLnRlbXBsYXRlIG9wZXJhdG9yKCk8aSwgaiwgaz4oKTsKfSk7Cn0pOwp9KTsKfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgY2xlYXIoVCAoJmFycmF5KVtOXSkgewp1bnJvbGw8MCwgTj4oWyZdPGludCBpPiB7CmFycmF5W2ldID0gVHswfTsKfSk7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KYmYxNiBiZjE2X2Zyb21fZnAzMihmbG9hdCB4KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PGJmMTY+KApzdGF0aWNfY2FzdDx1aW50MTZfdD4oCnN0ZDo6Yml0X2Nhc3Q8dWludDMyX3Q+KHgpID4+IDE2CikKKTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpmcDMyIGZwMzJfZnJvbV9mcDgoZnA4IHgpIHsKcmV0dXJuIGZsb2F0KHgpOwp9CnRlbXBsYXRlIDx0eXBlbmFtZSBGPgpfX2RldmljZV9fIF9faG9zdF9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHNlbGVjdChib29sIGNvbmQsIEYgZikgewppZiAoY29uZCkgewpmLnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oKTsKfSBlbHNlIHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGZhbHNlPigpOwp9Cn0KdGVtcGxhdGU8aW50IGRwcF9jdHJsLCBpbnQgcm93X21hc2sgPSAweGYsIGludCBiYW5rX21hc2sgPSAweGYsIGJvb2wgYm91bmRfY3RybCA9IGZhbHNlPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp1aW50MzJfdCBzaGZsX2RwcCh1aW50MzJfdCB4KSB7CnJldHVybiBfX2J1aWx0aW5fYW1kZ2NuX3VwZGF0ZV9kcHAoeCwgeCwgZHBwX2N0cmwsIHJvd19tYXNrLCBiYW5rX21hc2ssIGJvdW5kX2N0cmwpOwp9CnRlbXBsYXRlPGludCBsYW5lX3N0cmlkZT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KdWludDMyX3QgdHJhbnNwb3NlXzR4NF9mOF92Mih1aW50MzJfdCBpbnB1dCkgewpzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlIDwgd2FycF9zaXplIC8gNCwgImxhbmUgc3RyaWRlIGlzIHRvbyBsYXJnZSIpOwpzdGF0aWNfYXNzZXJ0KChsYW5lX3N0cmlkZSAmIChsYW5lX3N0cmlkZSAtIDEpKSA9PSAwLCAibGluZSBzdHJpZGUgaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiIpOwpzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlID09IDEsICJEUFAgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgbGFuZV9zdHJpZGUgPT0gMSIpOwpjb25zdCBhdXRvIGxhbmUgPSBfX2xhbmVfaWQoKTsKY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gbGFuZSAvIGxhbmVfc3RyaWRlICUgNDsKY29uc3QgYXV0byB0MngyID0gX19idWlsdGluX2FtZGdjbl9wZXJtKAoKc2hmbF9kcHA8MGIxMCcxMScwMCcwMT4oaW5wdXQpLAppbnB1dCwKZ3JvdXBfbGFuZV9pbmRleCAlIDIgPT0gMAo/IDB4MDYnMDInMDQnMDAKOiAweDAzJzA3JzAxJzA1Cik7CgoKCgoKCmNvbnN0IGF1dG8gdDR4NCA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKCnNoZmxfZHBwPDBiMDEnMDAnMTEnMTA+KHQyeDIpLAp0MngyLApncm91cF9sYW5lX2luZGV4IDwgMgo/IDB4MDUnMDQnMDEnMDAKOiAweDAzJzAyJzA3JzA2Cik7CgpyZXR1cm4gdDR4NDsKfQpfX2RldmljZV9fIHVpbnQ4X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2I4KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTgiKTsKX19kZXZpY2VfXyB1aW50MTZfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjE2KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTE2Iik7Cl9fZGV2aWNlX18gdWludDMyX3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMihpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkzMiIpOwpfX2RldmljZV9fIHVpbnQ2NF90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iNjQoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pNjQiKTsKX19kZXZpY2VfXyBfX3VpbnQxMjhfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjEyOChpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkxMjgiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjgodWludDhfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTgiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjE2KHVpbnQxNl90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pMTYiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjMyKHVpbnQzMl90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pMzIiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjY0KHVpbnQ2NF90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pNjQiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjEyOChfX3VpbnQxMjhfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTEyOCIpOwplbnVtIGNsYXNzIGNvaGVyZW5jeSB7CmNhY2hlX2FsbCA9IDAsCmNhY2hlX2dsb2JhbCA9IDEsCmNhY2hlX3N0cmVhbSA9IDIsCm5vbl90ZW1wb3JhbCA9IDMKfTsKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBidWZmZXIgewpzdHJ1Y3QgYnVmZmVyX3Jlc291cmNlIHsKY29uc3Qgdm9pZCogcHRyOwp1aW50MzJfdCByYW5nZTsKdWludDMyX3QgY29uZmlnOwp9Owp1c2luZyBlbGVtX3R5cGUgPSBzdGQ6OnJlbW92ZV9jdl90PFQ+OwpidWZmZXJfcmVzb3VyY2UgcnNyYzsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KYnVmZmVyKFQqIHBvaW50ZXIsIHVpbnQzMl90IHNpemUpIHsKdGhpcy0+cnNyYyA9IGJ1ZmZlcl9yZXNvdXJjZXsKcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocG9pbnRlciksCnN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplICogc2l6ZW9mKGVsZW1fdHlwZSkpLAoKCjB4MDAwMjAwMDBVCn07Cn0KdGVtcGxhdGU8c2l6ZV90IE4sIGNvaGVyZW5jeSBjID0gY29oZXJlbmN5OjpjYWNoZV9hbGw+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPiBsb2FkKAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3Qgewp1c2luZyByZXN1bHRfdHlwZSA9IHN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPjsKY29uc3RleHByIGNvbnN0IGludCBsb2FkX3NpemUgPSBzaXplb2YoZWxlbV90eXBlKSAqIE47CndhdmVfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ID0gaW5fYm91bmRzID8gdGhyZWFkX29mZnNldCA6IDB4RkZGRidGRkZGOwpjb25zdCBpbnQgY2MgPSBzdGF0aWNfY2FzdDxpbnQ+KGMpOwppZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAxKSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjgoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAyKSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjE2KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgY29uc3RleHByIChsb2FkX3NpemUgPT0gNCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMigKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIGlmIGNvbnN0ZXhwciAobG9hZF9zaXplID09IDgpIHsKcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8cmVzdWx0X3R5cGU+KGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iNjQoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAxNikgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxMjgoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSB7CnN0YXRpY19hc3NlcnQobG9hZF9zaXplID09IC0xLCAibG9hZCBzaXplIG5vdCBpbXBsZW1lbnRlZCIpOwp9Cn0KdGVtcGxhdGU8Y29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbCwgc2l6ZV90IE4+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgc3RvcmUoCmNvbnN0IHN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPiYgZGF0YSwKdWludDMyX3Qgd2F2ZV9vZmZzZXQsCnVpbnQzMl90IHRocmVhZF9vZmZzZXQsCmJvb2wgaW5fYm91bmRzID0gdHJ1ZQopIGNvbnN0IHsKY29uc3RleHByIGNvbnN0IGludCBzdG9yZV9zaXplID0gc2l6ZW9mKGVsZW1fdHlwZSkgKiBOOwp3YXZlX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCA9IGluX2JvdW5kcyA/IHRocmVhZF9vZmZzZXQgOiAweEZGRkYnRkZGRjsKY29uc3QgaW50IGNjID0gc3RhdGljX2Nhc3Q8aW50PihjKTsKaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDEpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iOCgKc3RkOjpiaXRfY2FzdDx1aW50OF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDIpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iMTYoCnN0ZDo6Yml0X2Nhc3Q8dWludDE2X3Q+KGRhdGEpLApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCik7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKHN0b3JlX3NpemUgPT0gNCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMigKc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIGNvbnN0ZXhwciAoc3RvcmVfc2l6ZSA9PSA4KSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjY0KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDE2KSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjEyOCgKc3RkOjpiaXRfY2FzdDxfX3VpbnQxMjhfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIHsKc3RhdGljX2Fzc2VydChzdG9yZV9zaXplID09IC0xLCAic3RvcmUgc2l6ZSBub3QgaW1wbGVtZW50ZWQiKTsKfQp9CnRlbXBsYXRlPGNvaGVyZW5jeSBjID0gY29oZXJlbmN5OjpjYWNoZV9hbGw+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgc3RvcmUoCmNvbnN0IGVsZW1fdHlwZSYgZGF0YSwKdWludDMyX3Qgd2F2ZV9vZmZzZXQsCnVpbnQzMl90IHRocmVhZF9vZmZzZXQsCmJvb2wgaW5fYm91bmRzID0gdHJ1ZQopIGNvbnN0IHsKc3RvcmU8Yz4oCnN0ZDo6YXJyYXk8ZWxlbV90eXBlLCAxPih7ZGF0YX0pLAp3YXZlX29mZnNldCwKdGhyZWFkX29mZnNldCwKaW5fYm91bmRzCik7Cn0KfTsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLAppbnQgYmxvY2tfdGlsZV9tLAppbnQgYmxvY2tfdGlsZV9uLAp0eXBlbmFtZSBsb2FkX3R5cGUsCmJvb2wgZnVzZWRfdHJhbnNwb3NlCj4Kc3RydWN0IGJsb2NrX2xvYWRlcjsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLAppbnQgYmxvY2tfdGlsZV9tLAppbnQgYmxvY2tfdGlsZV9uLAp0eXBlbmFtZSBsb2FkX3R5cGUKPgpzdHJ1Y3QgYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbSwgYmxvY2tfdGlsZV9uLCBsb2FkX3R5cGUsIHRydWU+IHsKc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSBzaXplb2YobG9hZF90eXBlKSA9PSAwLCAidGlsZSBpbm5lciBkaW1lbnNpb24gaGFzIHRvIGJlIGRpdmlzaWJsZSBieSBsb2FkIHR5cGUgc2l6ZSIpOwpjb25zdGV4cHIgc3RhdGljIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwpzdGF0aWNfYXNzZXJ0KHRvdGFsX2xvYWRzICUgYmxvY2tfc2l6ZSA9PSAwLCAidG90YWwgYW1vdW50IG9mIGxvYWRzIG5lZWRzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpjb25zdGV4cHIgc3RhdGljIGludCBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tID0gYmxvY2tfdGlsZV9tIC8gc2l6ZW9mKGxvYWRfdHlwZSk7CmNvbnN0ZXhwciBzdGF0aWMgaW50IGxvYWRzX3Blcl90aHJlYWQgPSB0b3RhbF9sb2FkcyAvIGJsb2NrX3NpemU7CmNvbnN0ZXhwciBzdGF0aWMgaW50IGdyb3VwX3NpemUgPSA0Owp1c2luZyBmcmdfdHlwZSA9IHN0ZDo6YXJyYXk8bG9hZF90eXBlLCBsb2Fkc19wZXJfdGhyZWFkPjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGZyZ190eXBlIGxvYWRfZnJvbV9nbG9iYWwoCmNvbnN0IGZwOCogYmxvY2tfdGlsZV9zcmMsCmludCBtLAppbnQgbiwKaW50IGJsb2NrX29mZl9tLAppbnQgYmxvY2tfb2ZmX24KKSB7CmNvbnN0IGF1dG8gb2Zmc2V0ID0gYmxvY2tfb2ZmX24gKiBtICsgYmxvY2tfb2ZmX207CmNvbnN0IGF1dG8gYnVmID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJsb2NrX3RpbGVfc3JjKSwgbSAqIG4pOwpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CmZyZ190eXBlIHJlc3VsdDsKdW5yb2xsPDAsIGxvYWRzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaj4gewpjb25zdCBpbnQgaSA9IGogKiBibG9ja19zaXplICsgdGlkOwoKY29uc3QgaW50IGdyb3VwX2luZGV4ID0gaSAlIGdyb3VwX3NpemU7CmNvbnN0IGludCBncm91cF9iYW5rID0gaSAvIGdyb3VwX3NpemU7CmNvbnN0IGludCByb3cgPSBncm91cF9iYW5rICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKY29uc3QgaW50IGNvbCA9IGdyb3VwX2luZGV4ICsgZ3JvdXBfYmFuayAvIGxvYWRzX3Blcl9ibG9ja190aWxlX20gKiBncm91cF9zaXplOwpjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKY29uc3QgaW50IHNyY19yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGJsb2NrX29mZl9tOwpjb25zdCBpbnQgc3JjX2NvbCA9IGNvbCArIGJsb2NrX29mZl9uOwpjb25zdCBib29sIGluX2JvdW5kcyA9IHNyY19yb3cgPCBtICYmIHNyY19jb2wgPCBuOwoKY29uc3QgYXV0byB3b3JkID0gYnVmLnRlbXBsYXRlIGxvYWQ8c2l6ZW9mKGxvYWRfdHlwZSk+KG9mZnNldCwgc3JjX29mZiwgaW5fYm91bmRzKTsKcmVzdWx0W2pdID0gc3RkOjpiaXRfY2FzdDxsb2FkX3R5cGU+KHdvcmQpOwp9KTsKcmV0dXJuIHJlc3VsdDsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBzdG9yZV90b19zbWVtKApmcDgqIGJsb2NrX3RpbGVfZHN0LApmcmdfdHlwZSB0aHJlYWRfc3JjLAppbnQgbSwKaW50IG4sCmludCBibG9ja19vZmZfbSwKaW50IGJsb2NrX29mZl9uCikgewpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgoKCgp1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CmNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7Cgpjb25zdCBpbnQgZ3JvdXBfaW5kZXggPSBpICUgZ3JvdXBfc2l6ZTsKY29uc3QgaW50IGdyb3VwX2JhbmsgPSBpIC8gZ3JvdXBfc2l6ZTsKY29uc3QgaW50IHJvdyA9IGdyb3VwX2JhbmsgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwpjb25zdCBpbnQgY29sID0gZ3JvdXBfaW5kZXggKyBncm91cF9iYW5rIC8gbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSAqIGdyb3VwX3NpemU7CmF1dG8qIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJsb2NrX3RpbGVfZHN0KTsKCmNvbnN0IGF1dG8gc3JjID0gc3RkOjpiaXRfY2FzdDxzdGQ6OmFycmF5PHVpbnQzMl90LCA0Pj4odGhyZWFkX3NyY1tqXSk7CmNvbnN0ZXhwciBpbnQgbGFuZV9zdHJpZGUgPSAxOwp1bnJvbGw8MCwgc2l6ZW9mKGxvYWRfdHlwZSksIHNpemVvZih1aW50MzJfdCk+KFsmXTxpbnQgaz4gewpjb25zdCBpbnQgZHN0X3JvdyA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgazsKY29uc3QgaW50IGRzdF9jb2wgPSBjb2w7CmF1dG8gdiA9IHNyY1trIC8gc2l6ZW9mKHVpbnQzMl90KV07CnYgPSB0cmFuc3Bvc2VfNHg0X2Y4X3YyPGxhbmVfc3RyaWRlPih2KTsKY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gX19sYW5lX2lkKCkgLyBsYW5lX3N0cmlkZSAlIDQ7CipyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJmRzdFsoZHN0X2NvbCAtIGRzdF9jb2wgJSA0KSArIChkc3Rfcm93ICsgZ3JvdXBfbGFuZV9pbmRleCkgKiAoYmxvY2tfdGlsZV9uICsgNCldKQo9IHY7Cn0pOwp9KTsKfQp9Owp0ZW1wbGF0ZSA8aW50IHdhcnBfdGlsZV9tXywgaW50IHdhcnBfdGlsZV9uXywgdHlwZW5hbWUgVD4Kc3RydWN0IG1mbWFfZnJhZ21lbnQgewp1c2luZyB0eXBlID0gVDsKY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgd2FycF90aWxlX20gPSB3YXJwX3RpbGVfbV87CmNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9uID0gd2FycF90aWxlX25fOwpjb25zdGV4cHIgc3RhdGljIGNvbnN0IGludCB0b3RhbF9pdGVtcyA9IHdhcnBfdGlsZV9tICogd2FycF90aWxlX247CmNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8dG90YWxfaXRlbXMsIHdhcnBfc2l6ZT4oKTsKY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgcmVnaXN0ZXJzX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8aXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKSwgc2l6ZW9mKHJlZ2lzdGVyX3R5cGUpPigpOwpjb25zdGV4cHIgc3RhdGljIGNvbnN0IGludCBieXRlc19wZXJfdGhyZWFkID0gaXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKTsKcmVnaXN0ZXJfdHlwZSByZWdzW3JlZ2lzdGVyc19wZXJfdGhyZWFkXTsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIHN0YXRpYyBtZm1hX2ZyYWdtZW50IHplcm8oKSB7CnJldHVybiBtZm1hX2ZyYWdtZW50e3t9fTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+JiB0aHJlYWRfdmFsdWVzKCkgewpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjphcnJheTxULCBpdGVtc19wZXJfdGhyZWFkPio+KCZ0aGlzLT5yZWdzKTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpjb25zdCBzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+JiB0aHJlYWRfdmFsdWVzKCkgY29uc3QgewpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RkOjphcnJheTxULCBpdGVtc19wZXJfdGhyZWFkPio+KCZ0aGlzLT5yZWdzKTsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBVPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+JiByZWdzX2FzKCkgewpzdGF0aWNfYXNzZXJ0KGJ5dGVzX3Blcl90aHJlYWQgJSBzaXplb2YoVSkgPT0gMCwgInRvdGFsIGJ5dGVzIGluIHRocmVhZCBmcmFnbWVudCBub3QgZGl2aXNpYmxlIGJ5IFUiKTsKcmV0dXJuICpyZWludGVycHJldF9jYXN0PHN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4qPigmdGhpcy0+cmVncyk7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgVT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3Qgc3RkOjphcnJheTxVLCBieXRlc19wZXJfdGhyZWFkIC8gc2l6ZW9mKFUpPiYgcmVnc19hcygpIGNvbnN0IHsKc3RhdGljX2Fzc2VydChieXRlc19wZXJfdGhyZWFkICUgc2l6ZW9mKFUpID09IDAsICJ0b3RhbCBieXRlcyBpbiB0aHJlYWQgZnJhZ21lbnQgbm90IGRpdmlzaWJsZSBieSBVIik7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+Kj4oJnRoaXMtPnJlZ3MpOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgY2xlYXIoKSB7CnVucm9sbDwwLCByZWdpc3RlcnNfcGVyX3RocmVhZD4oWyZdPGludCBpPiB7CnRoaXMtPnJlZ3NbaV0gPSAwOwp9KTsKfQpzdGF0aWMgY29uc3RleHByIGludCBmaXJzdF9pdGVtX29mX3JlZyhpbnQgcmVnKSB7CnJldHVybiByZWcgKiBzaXplb2YocmVnaXN0ZXJfdHlwZSk7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDE2LCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDQ+KGMpLAowLAowLAowCikKKTsKfQp9Owp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODsKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDMyLCBmcDg+Owp1c2luZyBmcmdfYl90eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgMzIsIGZwOD47CnVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBleGVjdXRlKApmcmdfY190eXBlJiBjLApjb25zdCBmcmdfYV90eXBlJiBhLApjb25zdCBmcmdfYl90eXBlJiBiCikgewojaWZkZWYgX19ISVBfREVWSUNFX0NPTVBJTEVfXwojaWZkZWYgX19nZng5NDJfXwpjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYiksCnN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCgp1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+Owpjb25zdCBhdXRvJiBhX3ZhbHVlcyA9IGEudGhyZWFkX3ZhbHVlcygpOwpjb25zdCBhdXRvJiBiX3ZhbHVlcyA9IGIudGhyZWFkX3ZhbHVlcygpOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYSA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2FfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFfdmFsdWVzW2tdKSk7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYiA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2JfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJfdmFsdWVzW2tdKSk7CmZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7Cn0pOwojZW5kaWYKI2VuZGlmCn0KfTsKdGVtcGxhdGU8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4gewp1c2luZyBmcmdfYV90eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMTYsIGZwOD47CnVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAxNiwgZnA4PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCnN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGEpLApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCgp1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+Owpjb25zdCBhdXRvJiBhX3ZhbHVlcyA9IGEudGhyZWFkX3ZhbHVlcygpOwpjb25zdCBhdXRvJiBiX3ZhbHVlcyA9IGIudGhyZWFkX3ZhbHVlcygpOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYSA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2FfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFfdmFsdWVzW2tdKSk7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYiA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2JfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJfdmFsdWVzW2tdKSk7CmZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7Cn0pOwojZW5kaWYKI2VuZGlmCn0KfTsKCgoKCgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+PiB7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9hKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IGxhbmUgJSAxNjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwpyZXR1cm4ge20sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9iKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwpyZXR1cm4ge24sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9jKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIGl0ZW07CmNvbnN0IGludCBuID0gbGFuZSAlIDE2OwpyZXR1cm4ge20sIG59Owp9Cn07CnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4+IHsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CnJldHVybiB7bSwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gbGFuZSAlIDMyOwpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CnJldHVybiB7biwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gOCAqIChpdGVtIC8gNCkgJSAzMiArIDQgKiAobGFuZSAvIDMyKSArIChpdGVtICUgNCk7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpyZXR1cm4ge24sIG19Owp9Cn07CnRlbXBsYXRlIDwKaW50IGJsb2NrX3NpemUsCmN1YmUgYmxvY2tfdGlsZSwKY3ViZSB3YXJwX3RpbGUsCnR5cGVuYW1lIGxvYWRfdHlwZSwKYm9vbCBwaXBlbGluZWRfbWFpbl9sb29wID0gZmFsc2UsCmJvb2wgZnVzZWRfdHJhbnNwb3NlID0gdHJ1ZQo+Cl9fZ2xvYmFsX18gX19sYXVuY2hfYm91bmRzX18oYmxvY2tfc2l6ZSkKdm9pZCBrZXJuZWwoCmNvbnN0IGZwOCogYSwKY29uc3QgZnA4KiBiLApjb25zdCBmcDMyKiBhcywKY29uc3QgZnAzMiogYnMsCmJmMTYqIGMsCmludCBtLAppbnQgbiwKaW50IGsKKSB7CmNvbnN0ZXhwciBpbnQgd2FycHMgPSBibG9ja19zaXplIC8gd2FycF9zaXplOwpjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGUubTsKY29uc3RleHByIGludCBibG9ja190aWxlX24gPSBibG9ja190aWxlLm47CmNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwoKCgpjb25zdGV4cHIgaW50IHdhcnBfdGlsZV9tID0gd2FycF90aWxlLm07CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGUubjsKY29uc3RleHByIGludCB3YXJwX3RpbGVfayA9IHdhcnBfdGlsZS5rOwpjb25zdGV4cHIgaW50IGNfdG90YWwgPSBibG9ja190aWxlX20gKiBibG9ja190aWxlX247CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9rICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2EpIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKc3RhdGljX2Fzc2VydChibG9ja190aWxlX24gKiBibG9ja190aWxlX2sgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYikgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgd2FycF90aWxlX20gPT0gMCwgIndhcnAgdGlsZSBNIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBNIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9rICUgd2FycF90aWxlX2sgPT0gMCwgIndhcnAgdGlsZSBLIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBLIik7CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19uID0gYmxvY2tfdGlsZV9uIC8gd2FycF90aWxlX247CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19rID0gYmxvY2tfdGlsZV9rIC8gd2FycF90aWxlX2s7CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tbiA9IHdhcnBfdGlsZXNfbSAqIHdhcnBfdGlsZXNfbjsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVzX20gPSB3YXJwcyA9PSAxID8gMSA6IDI7CmNvbnN0ZXhwciBpbnQgaW50cmFfd2FycF90aWxlc19uID0gd2FycHMgPT0gMSB8fCB3YXJwcyA9PSAyID8gMSA6IHdhcnBzID09IDQgPyAyIDogNDsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVfbSA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX20sIGludHJhX3dhcnBfdGlsZXNfbT4oKTsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVfbiA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX24sIGludHJhX3dhcnBfdGlsZXNfbj4oKTsKCmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tbl9wZXJfd2FycCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX21uLCB3YXJwcz4oKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVfbSAqIGludHJhX3dhcnBfdGlsZV9uID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsICJzYW5pdHkgY2hlY2siKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVzX20gKiBpbnRyYV93YXJwX3RpbGVzX24gPT0gd2FycHMsICJzYW5pdHkgY2hlY2siKTsKY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwp1c2luZyBtZm1hID0gbWZtYV9mMzJfZjhfZjg8d2FycF90aWxlX20sIHdhcnBfdGlsZV9uLCB3YXJwX3RpbGVfaz47CnVzaW5nIGZyZ19hX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfYV90eXBlOwp1c2luZyBmcmdfYl90eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2JfdHlwZTsKdXNpbmcgZnJnX2NfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19jX3R5cGU7CnVzaW5nIGluZGV4ZXIgPSBtZm1hX2luZGV4ZXI8bWZtYT47CnVzaW5nIGJsb2NrX2xvYWRlcl9hID0gYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbSwgYmxvY2tfdGlsZV9rLCBsb2FkX3R5cGUsIGZ1c2VkX3RyYW5zcG9zZT47CnVzaW5nIGJsb2NrX2xvYWRlcl9iID0gYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbiwgYmxvY2tfdGlsZV9rLCBsb2FkX3R5cGUsIGZ1c2VkX3RyYW5zcG9zZT47CmNvbnN0ZXhwciBpbnQgY19wZXJfdGhyZWFkID0gY190b3RhbCAvIGJsb2NrX3NpemU7CnN0YXRpY19hc3NlcnQoY19wZXJfdGhyZWFkID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiBmcmdfY190eXBlOjppdGVtc19wZXJfdGhyZWFkLCAic2FuaXR5IGNoZWNrIik7CmNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKY29uc3QgaW50IHdhcnAgPSB0aWQgLyB3YXJwX3NpemU7CmNvbnN0IGludCBsYW5lID0gX19sYW5lX2lkKCk7Cgpjb25zdCBpbnQgdGlfbSA9IGdyaWREaW0ueCAtIGJsb2NrSWR4LnggLSAxOwpjb25zdCBpbnQgdGlfbiA9IGdyaWREaW0ueSAtIGJsb2NrSWR4LnkgLSAxOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX2ltID0gd2FycCAlIGludHJhX3dhcnBfdGlsZXNfbTsKY29uc3QgaW50IGludHJhX3dhcnBfdGlsZV9pbiA9IHdhcnAgLyBpbnRyYV93YXJwX3RpbGVzX207CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfb20gPSBpbnRyYV93YXJwX3RpbGVfaW0gKiBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tLCBpbnRyYV93YXJwX3RpbGVzX20+KCk7CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfb24gPSBpbnRyYV93YXJwX3RpbGVfaW4gKiBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19uLCBpbnRyYV93YXJwX3RpbGVzX24+KCk7CmludCBzbiA9IGNlaWxfZGl2KG4sIDEyOCk7CgpmcmdfY190eXBlIGJsb2NrX2NfZnJnW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewpibG9ja19jX2ZyZ1tpXVtqXS5jbGVhcigpOwp9KTsKX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIChibG9ja190aWxlX2sgKyA0KV07Cl9fc2hhcmVkX18gZnA4IGJsb2NrX3RpbGVfYltibG9ja190aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwpfX3NoYXJlZF9fIGZsb2F0IGJsb2NrX3RpbGVfc2NhbGluZ1tibG9ja19zaXplXTsKY29uc3QgYXV0byBsb2FkX2lucHV0ID0gWyZdKGludCBpKSB7CmZsb2F0IGZyZ19hczsKaWYgKHRpZCA8IDEyOCkgewpmcmdfYXMgPSBhc1tpIC8gMTI4ICogbSArIHRpX20gKiBibG9ja190aWxlX20gKyB0aWRdOwp9CmZsb2F0IGZyZ19icyA9IGJzW2kgLyAxMjggKiBzbiArIHRpX24gKiBibG9ja190aWxlX24gLyAxMjhdOwpjb25zdCBhdXRvIGZyZ19hID0gYmxvY2tfbG9hZGVyX2E6OmxvYWRfZnJvbV9nbG9iYWwoCmEsIG0sIGssIHRpX20gKiBibG9ja190aWxlX20sIGkKKTsKY29uc3QgYXV0byBmcmdfYiA9IGJsb2NrX2xvYWRlcl9iOjpsb2FkX2Zyb21fZ2xvYmFsKApiLCBuLCBrLCB0aV9uICogYmxvY2tfdGlsZV9uLCBpCik7CnJldHVybiBzdGQ6Om1ha2VfdHVwbGUoZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cn07CmNvbnN0IGF1dG8gc3RvcmVfaW5wdXQgPSBbJl0oaW50IGksIGNvbnN0IGF1dG8mIGZyZ19hLCBjb25zdCBhdXRvJiBmcmdfYiwgY29uc3QgYXV0byYgZnJnX2FzLCBjb25zdCBhdXRvJiBmcmdfYnMpIHsKYmxvY2tfbG9hZGVyX2E6OnN0b3JlX3RvX3NtZW0oYmxvY2tfdGlsZV9hLCBmcmdfYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaSk7CmJsb2NrX2xvYWRlcl9iOjpzdG9yZV90b19zbWVtKGJsb2NrX3RpbGVfYiwgZnJnX2IsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkpOwpibG9ja190aWxlX3NjYWxpbmdbdGlkXSA9IGZyZ19hcyAqIGZyZ19iczsKfTsKY29uc3QgYXV0byBtbWEgPSBbJl0oaW50IGkpIHsKZnJnX2FfdHlwZSBmcmdfYVtpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CnVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CmNvbnN0ZXhwciBpbnQgd3RrID0gd3RrX2Jhc2UgLyB3YXJwX3RpbGVfazsKdW5yb2xsPDAsIGZyZ19hX3R5cGU6OnJlZ2lzdGVyc19wZXJfdGhyZWFkLCAyPihbJl08aW50IG1rX3JlZz4gewpjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2EobGFuZSwgZnJnX2FfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobWtfcmVnKSk7CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CipyZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4oJmZyZ19hW2l3dG1dW2l3dG5dW3d0a10ucmVnc1tta19yZWddKSA9CipyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oJmJsb2NrX3RpbGVfYVtiaWsgKyBiaW0gKiAoYmxvY2tfdGlsZV9rICsgNCldKTsKfSk7Cn0pOwp9KTsKZnJnX2JfdHlwZSBmcmdfYltpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CnVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CmNvbnN0ZXhwciBpbnQgd3RrID0gd3RrX2Jhc2UgLyB3YXJwX3RpbGVfazsKdW5yb2xsPDAsIGZyZ19iX3R5cGU6OnJlZ2lzdGVyc19wZXJfdGhyZWFkLCAyPihbJl08aW50IG5rX3JlZz4gewpjb25zdCBhdXRvIFttZm1hX2luLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2IobGFuZSwgZnJnX2JfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobmtfcmVnKSk7CmNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CmNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CipyZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4oJmZyZ19iW2l3dG1dW2l3dG5dW3d0a10ucmVnc1tua19yZWddKSA9CipyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oJmJsb2NrX3RpbGVfYltiaWsgKyBiaW4gKiAoYmxvY2tfdGlsZV9rICsgNCldKTsKfSk7Cn0pOwp9KTsKZnJnX2NfdHlwZSB3YXJwX2ZyZ19jW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewp3YXJwX2ZyZ19jW2ldW2pdLmNsZWFyKCk7Cn0pOwoKdW5yb2xsM2Q8aW50cmFfd2FycF90aWxlX20sIGludHJhX3dhcnBfdGlsZV9uLCB3YXJwX3RpbGVzX2s+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCB3dGs+IHsKbWZtYTo6ZXhlY3V0ZSgKd2FycF9mcmdfY1tpd3RtXVtpd3RuXSwKZnJnX2FbaXd0bV1baXd0bl1bd3RrXSwKZnJnX2JbaXd0bV1baXd0bl1bd3RrXQopOwp9KTsKCnVucm9sbDNkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbiwgZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IG1uX2l0ZW0+IHsKY29uc3QgaW50IHd0bSA9IGludHJhX3dhcnBfdGlsZV9vbSArIGl3dG07CmNvbnN0IGludCB3dG4gPSBpbnRyYV93YXJwX3RpbGVfb24gKyBpd3RuOwpjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2luXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2MobGFuZSwgbW5faXRlbSk7CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmJsb2NrX2NfZnJnW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXSArPSB3YXJwX2ZyZ19jW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXQoqIGJsb2NrX3RpbGVfc2NhbGluZ1tiaW1dOwp9KTsKfTsKaWYgY29uc3RleHByICghcGlwZWxpbmVkX21haW5fbG9vcCkgewoKZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpjb25zdCBhdXRvIFtmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzXSA9IGxvYWRfaW5wdXQoaSk7CnN0b3JlX2lucHV0KGksIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwpfX3N5bmN0aHJlYWRzKCk7Cm1tYShpKTsKX19zeW5jdGhyZWFkcygpOwp9Cn0gZWxzZSB7CgppbnQgaSA9IDA7CmF1dG8gW2ZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnNdID0gbG9hZF9pbnB1dChpKTsKc3RvcmVfaW5wdXQoaSwgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cl9fc3luY3RocmVhZHMoKTsKZm9yICg7IGkgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7CgptbWEoaSk7Cl9fc3luY3RocmVhZHMoKTsKc3RvcmVfaW5wdXQoaSArIGJsb2NrX3RpbGVfaywgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cl9fc3luY3RocmVhZHMoKTsKfQptbWEoaSk7Cn0KCgpjb25zdCBpbnQgaW1fYmFzZSA9IHRpX20gKiBibG9ja190aWxlX207CmNvbnN0IGludCBpbl9iYXNlID0gdGlfbiAqIGJsb2NrX3RpbGVfbjsKYXV0byBidWYgPSBidWZmZXI8YmYxNj4oYywgbSAqIG4pOwp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCBtbl9pdGVtPiB7CmNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaW5dID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYyhsYW5lLCBtbl9pdGVtKTsKY29uc3QgaW50IHd0bSA9IGludHJhX3dhcnBfdGlsZV9vbSArIGl3dG07CmNvbnN0IGludCB3dG4gPSBpbnRyYV93YXJwX3RpbGVfb24gKyBpd3RuOwpjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwpjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwpjb25zdCBpbnQgaW0gPSBpbV9iYXNlICsgYmltOwpjb25zdCBpbnQgaW4gPSBpbl9iYXNlICsgYmluOwpjb25zdCBhdXRvIHZhbCA9IGJmMTZfZnJvbV9mcDMyKGJsb2NrX2NfZnJnW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXSk7CmJ1Zi5zdG9yZTxjb2hlcmVuY3k6Om5vbl90ZW1wb3JhbD4odmFsLCAwLCBpbSAqIG4gKyBpbiwgaW0gPCBtICYmIGluIDwgbik7Cn0pOwp9Cl9fZGV2aWNlX18Kdm9pZCB0cmFuc3Bvc2VfbWF0cml4KApmcDgqIG91dHB1dCwKY29uc3QgZnA4KiBpbnB1dCwKaW50IG0sCmludCBuLAppbnQgYmxvY2tfeCwKaW50IGJsb2NrX3kKKSB7CmF1dG8gaW4gPSBidWZmZXI8Y29uc3QgdWludDhfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oaW5wdXQpLCBtICogbik7CmF1dG8gb3V0ID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KG91dHB1dCksIG4gKiBtKTsKY29uc3QgYXV0byB0aWQgPSB0aHJlYWRJZHgueDsKY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSAxNjsKX19zaGFyZWRfXyB1aW50OF90IHRtcFs2OCAqIDY0XTsKY29uc3QgYXV0byBibSA9IGJsb2NrX3ggKiA2NDsKY29uc3QgYXV0byBibiA9IGJsb2NrX3kgKiA2NDsKewpjb25zdCBpbnQgaSA9IHRpZCAqIGl0ZW1zX3Blcl90aHJlYWQ7CmNvbnN0IGludCBvID0gYm0gKyBibiAqIG07CmNvbnN0IGludCB4ID0gaSAvIDY0Owpjb25zdCBpbnQgeSA9IGkgJSA2NDsKY29uc3QgYXV0byBpdGVtcyA9IGluLmxvYWQ8aXRlbXNfcGVyX3RocmVhZCwgY29oZXJlbmN5Ojpub25fdGVtcG9yYWw+KG8sIHggKiBtICsgeSk7CipyZWludGVycHJldF9jYXN0PF9fdWludDEyOF90Kj4oJnRtcFt4ICogNjggKyB5XSkgPSBzdGQ6OmJpdF9jYXN0PF9fdWludDEyOF90PihpdGVtcyk7Cn0KX19zeW5jdGhyZWFkcygpOwp7CmNvbnN0IGludCBpID0gdGlkICogaXRlbXNfcGVyX3RocmVhZDsKY29uc3QgaW50IG8gPSBibSAqIG4gKyBibjsKY29uc3QgaW50IHggPSBpICUgNjQ7CmNvbnN0IGludCB5ID0gaSAvIDY0OwpzdGQ6OmFycmF5PHVpbnQ4X3QsIGl0ZW1zX3Blcl90aHJlYWQ+IGl0ZW1zOwpmb3IgKGludCBqID0gMDsgaiA8IGl0ZW1zX3Blcl90aHJlYWQ7ICsraikgewpjb25zdCBpbnQgYnggPSAoaSArIGopIC8gNjQ7CmNvbnN0IGludCBieSA9IChpICsgaikgJSA2NDsKaXRlbXNbal0gPSB0bXBbYnggKyBieSAqIDY4XTsKfQpvdXQuc3RvcmU8Y29oZXJlbmN5OjpjYWNoZV9hbGw+KAppdGVtcywKbywKeCArIHkgKiBuCik7Cn0KfQpfX2dsb2JhbF9fIF9fbGF1bmNoX2JvdW5kc19fKDI1NikKdm9pZCB0cmFuc3Bvc2VfZmFzdGVyX2Z1c2VkKApmcDgqIG91dHB1dF9hLApmcDgqIG91dHB1dF9iLApjb25zdCBmcDgqIGlucHV0X2EsCmNvbnN0IGZwOCogaW5wdXRfYiwKaW50IG0sCmludCBuLAppbnQgaywKaW50IG1fYmxvY2tzCikgewpjb25zdCBpbnQgeCA9IGJsb2NrSWR4Lng7CmNvbnN0IGludCB5ID0gYmxvY2tJZHgueTsKaWYgKHggPCBtX2Jsb2Nrcykgewp0cmFuc3Bvc2VfbWF0cml4KApvdXRwdXRfYSwKaW5wdXRfYSwKbSwKaywKeCwKeQopOwp9IGVsc2Ugewp0cmFuc3Bvc2VfbWF0cml4KApvdXRwdXRfYiwKaW5wdXRfYiwKbiwKaywKeCAtIG1fYmxvY2tzLAp5Cik7Cn0KfQpmcDgqIHRtcF9hVCA9IG51bGxwdHI7CmZwOCogdG1wX2JUID0gbnVsbHB0cjsKaW50IHByZXZfbSA9IDA7CmludCBwcmV2X24gPSAwOwppbnQgcHJldl9rID0gMDsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLApjdWJlIGJsb2NrX3RpbGUsCmN1YmUgd2FycF90aWxlLApib29sIHBpcGVsaW5lZF9tYWluX2xvb3AgPSBmYWxzZSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlLAp0eXBlbmFtZSBsb2FkX3R5cGUgPSBfX3VpbnQxMjhfdAo+CnZvaWQgcnVuX2tlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgaywKYm9vbCBtZWFzdXJlCikgewpjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKY29uc3QgaW50IGdyaWRfbiA9IGNlaWxfZGl2KG4sIGJsb2NrX3RpbGUubik7Cmtlcm5lbDwKYmxvY2tfc2l6ZSwKYmxvY2tfdGlsZSwKd2FycF90aWxlLApsb2FkX3R5cGUsCnBpcGVsaW5lZF9tYWluX2xvb3AKPjw8PApkaW0zKGdyaWRfbSwgZ3JpZF9uKSwKZGltMyhibG9ja19zaXplKSwKMAo+Pj4oCmZ1c2VkX3RyYW5zcG9zZSA/IGEgOiB0bXBfYVQsCmZ1c2VkX3RyYW5zcG9zZSA/IGIgOiB0bXBfYlQsCmFzLApicywKYywKbSwKbiwKawopOwpISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CnZvaWQgcnVuKAp1aW50cHRyX3QgYV9wdHIsCnVpbnRwdHJfdCBiX3B0ciwKdWludHB0cl90IGFzX3B0ciwKdWludHB0cl90IGJzX3B0ciwKdWludHB0cl90IGNfcHRyLAppbnQgbSwKaW50IG4sCmludCBrLApib29sIG1lYXN1cmUKKSB7Cgphc3NlcnQoYV9wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGJfcHRyICUgMTYgPT0gMCk7CmFzc2VydChhc19wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGJzX3B0ciAlIDE2ID09IDApOwphc3NlcnQoY19wdHIgJSAxNiA9PSAwKTsKY29uc3QgYXV0byogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwpjb25zdCBhdXRvKiBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihiX3B0cik7CmNvbnN0IGF1dG8qIGFzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDMyKj4oYXNfcHRyKTsKY29uc3QgYXV0byogYnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihic19wdHIpOwphdXRvKiBjID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oY19wdHIpOwppZiAobSA9PSAxMDI0ICYmIG4gPT0gMTUzNiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDMwNzIgJiYgayA9PSAxNTM2KSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1NzYgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjU2KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyMDQ4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNDYwOCAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIzMDQpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1MTIgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSAxNTM2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSAzMDcyICYmIGsgPT0gMTUzNikgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDU3NiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDI1NikgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgZmFsc2UsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIwNDgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0NjA4ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDcxNjggJiYgayA9PSAyMzA0KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNTEyICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXsxNiwgMTYsIDMyfSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9Cn0KUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewptLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCIsICItV2Vycm9yIl0sCiAgICBidWlsZF9kaXJlY3Rvcnk9Ii93b3Jrc3BhY2UvYnVpbGQvIiBpZiBURVNUSU5HID09ICJ2c2NvZGUiIGVsc2UgIi9ncHVtb2RlL2FtZC9mcDgvYnVpbGQvIiBpZiBURVNUSU5HIGlzIG5vdCBOb25lIGVsc2UgTm9uZSwKICAgICoqKHsnbm9faW1wbGljaXRfaGVhZGVycyc6IFRydWV9IGlmIFRFU1RJTkcgIT0gInZzY29kZSIgZWxzZSB7fSksCikKCmZpcnN0ID0gVHJ1ZQoKY2FjaGVfbSA9IDAKY2FjaGVfbiA9IDAKY2FjaGVfayA9IDAKY2FjaGVfaSA9IDAKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgZ2xvYmFsIGZpcnN0CiAgICBpZiBmaXJzdDoKICAgICAgICBwcmludCgiZXhlY3V0aW5nIG9uIiwgdG9yY2guY3VkYS5nZXRfZGV2aWNlX25hbWUoKSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIGZpcnN0ID0gRmFsc2UKCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQoKICAgICMgYSA9IGEuY29udGlndW91cygpCiAgICAjIGIgPSBiLmNvbnRpZ3VvdXMoKQoKICAgIG0sIG4gPSBjLnNoYXBlCiAgICBrID0gYS5zaGFwZVsxXQoKICAgIGdsb2JhbCBjYWNoZV9tCiAgICBnbG9iYWwgY2FjaGVfbgogICAgZ2xvYmFsIGNhY2hlX2sKICAgIGdsb2JhbCBjYWNoZV9pCgogICAgaWYgY2FjaGVfbSAhPSBtIG9yIGNhY2hlX24gIT0gbiBvciBjYWNoZV9rICE9IGs6CiAgICAgICAgY2FjaGVfbSA9IG0KICAgICAgICBjYWNoZV9uID0gbgogICAgICAgIGNhY2hlX2sgPSBrCiAgICAgICAgY2FjaGVfaSA9IDAKICAgIGVsc2U6CiAgICAgICAgY2FjaGVfaSArPSAxCgogICAgIyBEb24ndCBjaGVjayB0aGUgcGVyZm9ybWFuY2Ugb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiB0byBhbGxvdyBmb3Igc29tZSB3YXJtdXAKICAgIG1lYXN1cmUgPSBGYWxzZQogICAgaWYgY2FjaGVfaSA9PSAxOgogICAgICAgIG1lYXN1cmUgPSBUcnVlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMK

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

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgoKI2RlZmluZSBISVBfQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBpZihlcnJvciAhPSBoaXBTdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKICAgICAgICAgICAgICAgICAgICAgIDw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKICAgICAgICAgICAgICAgICAgICAgIDw8ICc6JyA8PCBfX0xJTkVfXyA8PCAnQG4nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgZXhpdChlcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHdoaWxlKGZhbHNlKQoKdXNpbmcgZnA4ID0gX19oaXBfZnA4X2U0bTNfZm51ejsKdXNpbmcgYmYxNiA9IF9faGlwX2JmbG9hdDE2Owp1c2luZyBmcDMyID0gZmxvYXQ7CnVzaW5nIGZwMzJ4NCA9IGZwMzIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7CnVzaW5nIGkzMng0ID0gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKdXNpbmcgZnAzMngxNiA9IGZwMzIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwoKc3RydWN0IGN1YmUgewogICAgaW50IG0sIG4sIGs7Cn07Cgpjb25zdGV4cHIgaW50IHdhcnBfc2l6ZSA9IDY0Owpjb25zdGV4cHIgaW50IGNhY2hlX2xpbmVfc2l6ZSA9IDEyODsKCmNvbnN0ZXhwciBpbnQgbV9ibG9ja19zaXplX211bHRpcGxlID0gMzI7CmNvbnN0ZXhwciBpbnQgbl9ibG9ja19zaXplX211bHRpcGxlID0gMzI7CmNvbnN0ZXhwciBpbnQga19ibG9ja19zaXplX211bHRpcGxlID0gMTI4OwoKdXNpbmcgcmVnaXN0ZXJfdHlwZSA9IHVpbnQzMl90OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Cl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmNvbnN0ZXhwciBhdXRvIGNlaWxfZGl2KFQgYSwgVSBiKSB7CiAgICByZXR1cm4gKGEgKyBiIC0gMSkgLyBiOwp9Cgp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIGF1dG8gZGl2aWRlX2V4YWN0KCkgewogICAgc3RhdGljX2Fzc2VydChhICUgYiA9PSAwLCAiZG9lcyBub3QgZGl2aWRlIGV4YWN0ISIpOwogICAgcmV0dXJuIGEgLyBiOwp9Cgp0ZW1wbGF0ZTxpbnQgaW5jLCB0eXBlbmFtZSBzZXE+CnN0cnVjdCBtdWx0aXBseV9ieV9pbmM7Cgp0ZW1wbGF0ZTxpbnQgaW5jLCBpbnQuLi4gSXM+CnN0cnVjdCBtdWx0aXBseV9ieV9pbmM8aW5jLCBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCBJcy4uLj4+IHsKICAgIHVzaW5nIHR5cGUgPSBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCAoaW5jICogSXMpLi4uPjsKfTsKCnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYywgaW50Li4uIElzPgpzdHJ1Y3QgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luY19oZWxwZXIgewogICAgdXNpbmcgdHlwZSA9IHR5cGVuYW1lIG11bHRpcGx5X2J5X2luYzxpbmMsIHN0ZDo6bWFrZV9pbnRlZ2VyX3NlcXVlbmNlPGludCwgKE4gLSBJKSAvIGluYz4+Ojp0eXBlOwp9OwoKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jPgp1c2luZyBtYWtlX2luZGV4X3NlcXVlbmNlX3dpdGhfaW5jID0gdHlwZW5hbWUgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luY19oZWxwZXI8SSwgTiwgaW5jPjo6dHlwZTsKCnRlbXBsYXRlPHR5cGVuYW1lIEYsIGludC4uLiBJcz4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGxfYXBwbHkoRiBmLCBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCBJcy4uLj4pIHsKICAgIChmLnRlbXBsYXRlIG9wZXJhdG9yKCk8SXM+KCksIC4uLik7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYyA9IDEsIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsKEYgZikgewogICAgdW5yb2xsX2FwcGx5KGYsIG1ha2VfaW5kZXhfc2VxdWVuY2Vfd2l0aF9pbmM8SSwgTiwgaW5jPnt9KTsKfQoKdGVtcGxhdGU8aW50IEksIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsMWQoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oZik7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwyZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihbJl08aW50IGk+IHsKICAgICAgICB1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqPigpOwogICAgICAgIH0pOwogICAgfSk7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgaW50IEssIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsM2QoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CiAgICAgICAgdW5yb2xsPDAsIEo+KFsmXTxpbnQgaj4gewogICAgICAgICAgICB1bnJvbGw8MCwgSz4oWyZdPGludCBrPiB7CiAgICAgICAgICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8aSwgaiwgaz4oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIGNsZWFyKFQgKCZhcnJheSlbTl0pIHsKICAgIHVucm9sbDwwLCBOPihbJl08aW50IGk+IHsKICAgICAgICBhcnJheVtpXSA9IFR7MH07CiAgICB9KTsKfQoKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KYmYxNiBiZjE2X2Zyb21fZnAzMihmbG9hdCB4KSB7CiAgICAvLyBISVAncyBjb252ZXJzaW9uIGZ1bmN0aW9uIGRvZXMgYWxsIGtpbmRzIG9mIGNoZWNrcwogICAgLy8gZm9yIG9kZCBjYXNlcyAoTmFOLCBzdWJub3JtYWxzKSB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQuCiAgICAvLyBUaGlzIGdlbmVyYXRlcyBhYnNvbHV0ZWx5IGFieXNtYWwgY29kZSwgc28ganVzdCB0cnVuY2F0ZQogICAgLy8gdGhlIHVwcGVyIGJpdHMgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZSBsaWtlIHRoZQogICAgLy8gT3BwZXJweXRob24gaW50ZW5kZWQuCgogICAgcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8YmYxNj4oCiAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQzMl90Pih4KSA+PiAxNgogICAgICAgICkKICAgICk7Cn0KCl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmZwMzIgZnAzMl9mcm9tX2ZwOChmcDggeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmcm9tIGZwOCB0byBmcDMyIGlzIHNsb3cgb24gYW55dGhpbmcgdGhhdAogICAgLy8gZG9lc24ndCBoYXZlIHRoZSBoYXJkd2FyZSBpbnN0cnVjdGlvbnMgdG8gZG8gaXQuIFRoZSBzb2Z0d2FyZQogICAgLy8gbWV0aG9kIGRlYWxzIHdpdGggc3BlY2lhbCBjYXNlcyAoTmFOLCBzdWJub3JtYWxzKSwgYnV0IHdlCiAgICAvLyBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSBzaW5jZSB3ZSBkb24ndCBleHBlY3QgdGhvc2UgaW4KICAgIC8vIHRoZSBpbnB1dC4gVGhlcmVmb3JlLCB3ZSBjYW4gb3B0aW1pemUgdGhlIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCiAgICAvLyBieSBqdXN0IHNodWZmbGluZyB0aGUgYml0cy4KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIC8vIE1JMzAwIGhhcyBhbiBpbnN0cnVjdGlvbiBmb3IgdGhpcy4KICAgIHJldHVybiBmbG9hdCh4KTsKI2Vsc2UKICAgIC8vIEZhbGxiYWNrIGNhc2UKICAgIC8vIFRPRE86IEZpbmQgYSBmYXN0ZXIgb3B0aW9uCiAgICByZXR1cm4gZmxvYXQoeCk7CiNlbmRpZgp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2hvc3RfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzZWxlY3QoYm9vbCBjb25kLCBGIGYpIHsKICAgIGlmIChjb25kKSB7CiAgICAgICAgZi50ZW1wbGF0ZSBvcGVyYXRvcigpPHRydWU+KCk7CiAgICB9IGVsc2UgewogICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxmYWxzZT4oKTsKICAgIH0KfQoKdGVtcGxhdGU8aW50IGRwcF9jdHJsLCBpbnQgcm93X21hc2sgPSAweGYsIGludCBiYW5rX21hc2sgPSAweGYsIGJvb2wgYm91bmRfY3RybCA9IGZhbHNlPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp1aW50MzJfdCBzaGZsX2RwcCh1aW50MzJfdCB4KSB7CiAgICByZXR1cm4gX19idWlsdGluX2FtZGdjbl91cGRhdGVfZHBwKHgsIHgsIGRwcF9jdHJsLCByb3dfbWFzaywgYmFua19tYXNrLCBib3VuZF9jdHJsKTsKfQoKdGVtcGxhdGU8aW50IGxhbmVfc3RyaWRlPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp1aW50MzJfdCB0cmFuc3Bvc2VfNHg0X2Y4X3YyKHVpbnQzMl90IGlucHV0KSB7CiAgICBzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlIDwgd2FycF9zaXplIC8gNCwgImxhbmUgc3RyaWRlIGlzIHRvbyBsYXJnZSIpOwogICAgc3RhdGljX2Fzc2VydCgobGFuZV9zdHJpZGUgJiAobGFuZV9zdHJpZGUgLSAxKSkgPT0gMCwgImxpbmUgc3RyaWRlIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIiKTsKICAgIHN0YXRpY19hc3NlcnQobGFuZV9zdHJpZGUgPT0gMSwgIkRQUCBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBsYW5lX3N0cmlkZSA9PSAxIik7CiAgICAvLyBpbnB1dDoKICAgIC8vIGJ5dGUgMCAxIDIgMwogICAgLy8gICAgICAwIDEgMiAzIGxhbmUgWAogICAgLy8gICAgICA0IDUgNiA3IGxhbmUgWCtsYW5lX3N0cmlkZQogICAgLy8gICAgICA4IDkgQSBCIGxhbmUgWCtsYW5lX3N0cmlkZQogICAgLy8gICAgICBDIEQgRSBGIGxhbmUgWCtsYW5lX3N0cmlkZQogICAgLy8gc3dhcCBwYWlycyBvZiBsYW5lcyB0byBnZXQKICAgIC8vIDAgMSAyIDMKICAgIC8vIDQgNSA2IDcKICAgIC8vIEMgRCBFIEYKICAgIC8vIDggOSBBIEIKICAgIC8vIHRoZW4gdXNlIGJ5dGVwZXJtIHRvIHN3YXAgcGFpcnMgaG9yaXpvbnRhbGx5ICsgbWVyZ2UgdGhlCiAgICAvLyB0d28gcmVzdWx0cyB0byBnZXQgMngyIHRyYW5zcG9zZWQKICAgIC8vIDAgNCAyIDYKICAgIC8vIDEgNSAzIDcKICAgIC8vIDggQyBBIEUKICAgIC8vIDkgRCBCIEYKICAgIGNvbnN0IGF1dG8gbGFuZSA9IF9fbGFuZV9pZCgpOwogICAgY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gbGFuZSAvIGxhbmVfc3RyaWRlICUgNDsKICAgIGNvbnN0IGF1dG8gdDJ4MiA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKICAgICAgICAvLyBfX3NoZmxfeG9yKGlucHV0LCBsYW5lX3N0cmlkZSksIC8vIFN3YXAgcGFpcnMKICAgICAgICBzaGZsX2RwcDwwYjEwJzExJzAwJzAxPihpbnB1dCksCiAgICAgICAgaW5wdXQsCiAgICAgICAgZ3JvdXBfbGFuZV9pbmRleCAlIDIgPT0gMAogICAgICAgICAgICA/IDB4MDYnMDInMDQnMDAKICAgICAgICAgICAgOiAweDAzJzA3JzAxJzA1CiAgICApOwogICAgLy8gTm93IHN3YXAgZ3JvdXBzIG9mIDIgaG9yaXpvbnRhbGx5LCBhbmQgZG8gdGhlCiAgICAvLyBzYW1lIGJ5dGVwZXJtIG9wZXJhdGlvbiBleGNlcHQgd2l0aCBncm91cHMgb2YgMngyLgogICAgLy8gMCAwIDEgMSAgICAgMCAwIDIgMgogICAgLy8gMCAwIDEgMSAtLT4gMCAwIDIgMgogICAgLy8gMiAyIDMgMyAgICAgMSAxIDMgMwogICAgLy8gMiAyIDMgMyAgICAgMSAxIDMgMwogICAgY29uc3QgYXV0byB0NHg0ID0gX19idWlsdGluX2FtZGdjbl9wZXJtKAogICAgICAgIC8vIF9fc2hmbF94b3IodDJ4MiwgbGFuZV9zdHJpZGUgKiAyKSwgLy8gU3dhcCBncm91cHMKICAgICAgICBzaGZsX2RwcDwwYjAxJzAwJzExJzEwPih0MngyKSwKICAgICAgICB0MngyLAogICAgICAgIGdyb3VwX2xhbmVfaW5kZXggPCAyCiAgICAgICAgICAgID8gMHgwNScwNCcwMScwMAogICAgICAgICAgICA6IDB4MDMnMDInMDcnMDYKICAgICk7CgogICAgLy8gaW5wdXQgPSAobGFuZSA8PCAyNCkgfCAobGFuZSA8PCAxNikgfCAobGFuZSA8PCA4KSB8IGxhbmU7CiAgICByZXR1cm4gdDR4NDsKfQoKX19kZXZpY2VfXyB1aW50OF90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iOChpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQogICAgX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pOCIpOwoKX19kZXZpY2VfXyB1aW50MTZfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjE2KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCiAgICBfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkxNiIpOwoKX19kZXZpY2VfXyB1aW50MzJfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjMyKGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCiAgICBfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkzMiIpOwoKX19kZXZpY2VfXyB1aW50NjRfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjY0KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCiAgICBfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmk2NCIpOwoKX19kZXZpY2VfXyBfX3VpbnQxMjhfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjEyOChpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQogICAgX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pMTI4Iik7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGJ1ZmZlciB7CiAgICBzdHJ1Y3QgYnVmZmVyX3Jlc291cmNlIHsKICAgICAgICBjb25zdCB2b2lkKiBwdHI7CiAgICAgICAgdWludDMyX3QgcmFuZ2U7CiAgICAgICAgdWludDMyX3QgY29uZmlnOwogICAgfTsKCiAgICBidWZmZXJfcmVzb3VyY2UgcnNyYzsKCiAgICBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwogICAgYnVmZmVyKFQqIHBvaW50ZXIsIHVpbnQzMl90IHNpemUpIHsKICAgICAgICB0aGlzLT5yc3JjID0gYnVmZmVyX3Jlc291cmNlewogICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwb2ludGVyKSwKICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemUgKiBzaXplb2YoVCkpLAogICAgICAgICAgICAvLyBUaGlzIGlzIHdoYXQgQ0sgdXNlcywgYnV0IHdoYXQgZG9lcyBpdCBtZWFuPyBJdCBzZWVtcyB0byBtZWFuIERBVEFfRk9STUFUID0gMzIgYml0CiAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGJlIGFibGUgdG8gcGxheSB3aXRoIHRoaXMgbGF0ZXIuLi4KICAgICAgICAgICAgMHgwMDAyMDAwMFUKICAgICAgICB9OwogICAgfQoKICAgIHRlbXBsYXRlPGludCBOPgogICAgX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KICAgIHN0ZDo6YXJyYXk8VCwgTj4gbG9hZCgKICAgICAgICB1aW50MzJfdCB3YXZlX29mZnNldCwKICAgICAgICB1aW50MzJfdCB0aHJlYWRfb2Zmc2V0CiAgICApIGNvbnN0IHsKICAgICAgICBjb25zdGV4cHIgY29uc3QgaW50IGxvYWRfc2l6ZSA9IHNpemVvZihUKSAqIE47CgogICAgICAgIHVzaW5nIHJlc3VsdF90eXBlID0gc3RkOjphcnJheTxULCBOPjsKCiAgICAgICAgaWYgY29uc3RleHByIChsb2FkX3NpemUgPT0gMSkgewogICAgICAgICAgICByZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2I4KAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCiAgICAgICAgICAgICAgICB0aHJlYWRfb2Zmc2V0LAogICAgICAgICAgICAgICAgd2F2ZV9vZmZzZXQsCiAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICkpOwogICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAyKSB7CiAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjE2KAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCiAgICAgICAgICAgICAgICB0aHJlYWRfb2Zmc2V0LAogICAgICAgICAgICAgICAgd2F2ZV9vZmZzZXQsCiAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICkpOwogICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSA0KSB7CiAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjMyKAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCiAgICAgICAgICAgICAgICB0aHJlYWRfb2Zmc2V0LAogICAgICAgICAgICAgICAgd2F2ZV9vZmZzZXQsCiAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICkpOwogICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSA4KSB7CiAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjY0KAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCiAgICAgICAgICAgICAgICB0aHJlYWRfb2Zmc2V0LAogICAgICAgICAgICAgICAgd2F2ZV9vZmZzZXQsCiAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICkpOwogICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAxNikgewogICAgICAgICAgICByZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxMjgoCiAgICAgICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKICAgICAgICAgICAgICAgIHRocmVhZF9vZmZzZXQsCiAgICAgICAgICAgICAgICB3YXZlX29mZnNldCwKICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGljX2Fzc2VydChsb2FkX3NpemUgPT0gLTEsICJsb2FkIHNpemUgbm90IGltcGxlbWVudGVkIik7CiAgICAgICAgfQogICAgfQp9OwoKLy8gQSBnZW5lcmFsIGZhc3QgZ2xvYmFsIG1lbW9yeSBuZWVkcyB0byBiZSBhcyBmb2xsb3dzOgovLyAtIEdyb3VwIG9mIDE2IGJ5dGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBhIDEyOC1iaXQgbG9hZAovLyAtIFRoZSBmYXN0IHBhdGggcmVxdWlyZXMgZW50aXJlIGNhY2hlIGxpbmVzIHRvIGJlIGxvYWRlZCBhdCBvbmNlLiBDRE5BMwovLyAgIGNhY2hlIGxpbmUgc2l6ZSBpcyAxMjggYnl0ZXMsIHNvIHRoZSBpZGVhbCBtYXRyaXggc2l6ZSBoYXMgYW4gaW5uZXIKLy8gICBkaW1lbnNpb24gKGJsb2NrX3RpbGVfbTsgc291cmNlIGlzIGNvbHVtbiBtYWpvcikgb2YgYXQgbGVhc3QgMTI4LgovLyAtIFdlIHdhbnQgZXZlcnkgdGhyZWFkIHRvIHBhcnRpY2lwYXRlLCBzbyB3ZSBuZWVkIGF0IGxlYXN0Ci8vICAgYmxvY2tfc2l6ZSAvICgxMjggLyAxNikgZWxlbWVudHMgaW4gdGhlIE4gZGlyZWN0aW9uLgovLyAgIGJsb2NrX3NpemUgPT0gNjQgPT4gOAovLyAgIGJsb2NrX3NpemUgPT0gMjU2ID0+IDMyCi8vICAgYmxvY2tfc2l6ZSA9PSAxMDI0ID0+IDEyOAovLyAtIFdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBpcyBhbHJlYWR5IGFsaWduZWQgdG8gMTI4IGJpdHMsIGFuZCB0aGF0IHRoZSBtIHN0cmlkZQovLyAgIGlzIGFsc28gYWxpZ25lZCBzdWNoLiBtLCBuLCBrIGFyZSBhbGwgZGl2aXNpYmxlIGJ5IDY0LCBzbyB0aGlzIHNob3VsZCBiZSBmaW5lLgovLwovLyAgIOKUjOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUkCDilIzilIDilIDilIDilJAKLy8gICDilIIwICDilII0ICDilII4ICDilIIxMiDilIIg4pSCICAg4pSCID0gMTYgYnl0ZXMKLy8gICDilJzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilKQg4pSU4pSA4pSA4pSA4pSYCi8vICAg4pSCMSAg4pSCNSAg4pSCOSAg4pSCMTMg4pSCCi8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkCi8vICAg4pSCMiAg4pSCNiAg4pSCMTAg4pSCMTQg4pSCCi8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkCi8vICAg4pSCMyAg4pSCNyAg4pSCMTEg4pSCMTUg4pSCCi8vICAg4pSU4pSA4pSA4pSA4pS04pSA4pSA4pSA4pS04pSA4pSA4pSA4pS04pSA4pSA4pSA4pSYCnRlbXBsYXRlPAogICAgaW50IGJsb2NrX3NpemUsCiAgICBpbnQgYmxvY2tfdGlsZV9tLAogICAgaW50IGJsb2NrX3RpbGVfbiwKICAgIHR5cGVuYW1lIGxvYWRfdHlwZQo+CnN0cnVjdCBibG9ja19sb2FkZXIgewogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSBzaXplb2YobG9hZF90eXBlKSA9PSAwLCAidGlsZSBpbm5lciBkaW1lbnNpb24gaGFzIHRvIGJlIGRpdmlzaWJsZSBieSBsb2FkIHR5cGUgc2l6ZSIpOwoKICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50IHRvdGFsX2xvYWRzID0gYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9uIC8gc2l6ZW9mKGxvYWRfdHlwZSk7CiAgICBzdGF0aWNfYXNzZXJ0KHRvdGFsX2xvYWRzICUgYmxvY2tfc2l6ZSA9PSAwLCAidG90YWwgYW1vdW50IG9mIGxvYWRzIG5lZWRzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwoKICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGxvYWRzX3Blcl9ibG9ja190aWxlX20gPSBibG9ja190aWxlX20gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGxvYWRzX3Blcl90aHJlYWQgPSB0b3RhbF9sb2FkcyAvIGJsb2NrX3NpemU7CgogICAgY29uc3RleHByIHN0YXRpYyBpbnQgZ3JvdXBfc2l6ZSA9IDQ7IC8vIENvaW5jaWRlcyB3aXRoIDR4NCB0cmFuc3Bvc2UuCgogICAgdXNpbmcgZnJnX3R5cGUgPSBzdGQ6OmFycmF5PGxvYWRfdHlwZSwgbG9hZHNfcGVyX3RocmVhZD47CgogICAgX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KICAgIHN0YXRpYyBmcmdfdHlwZSBsb2FkX2Zyb21fZ2xvYmFsKAogICAgICAgIGNvbnN0IGZwOCogYmxvY2tfdGlsZV9zcmMsCiAgICAgICAgaW50IG0sCiAgICAgICAgaW50IG4sCiAgICAgICAgaW50IGJsb2NrX29mZl9tLAogICAgICAgIGludCBibG9ja19vZmZfbgogICAgKSB7CiAgICAgICAgY29uc3QgYXV0byBvZmZzZXQgPSBibG9ja19vZmZfbiAqIG0gKyBibG9ja19vZmZfbTsKICAgICAgICBibG9ja190aWxlX3NyYyArPSBvZmZzZXQ7CiAgICAgICAgY29uc3QgYXV0byBzaXplID0gbSAqIG4gLSBvZmZzZXQ7CiAgICAgICAgY29uc3QgYXV0byBidWYgPSBidWZmZXI8Y29uc3QgbG9hZF90eXBlPihyZWludGVycHJldF9jYXN0PGNvbnN0IGxvYWRfdHlwZSo+KGJsb2NrX3RpbGVfc3JjKSwgc2l6ZSk7CgogICAgICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICAgICAgZnJnX3R5cGUgcmVzdWx0OwoKICAgICAgICB1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7CiAgICAgICAgICAgIC8vIGNvbnN0IGludCByb3cgPSBpICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgLy8gY29uc3QgaW50IGNvbCA9IGkgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgICAgICAvLyBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKCiAgICAgICAgICAgIC8vIHN3aXp6bGUgdGhlIGxhbmVzIHN1Y2ggdGhhdCBncm91cHMgb2YgNCBjb2x1bW5zIGFyZSBuZXh0IHRvIGVhY2hvdGhlci4KICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwX2luZGV4ID0gaSAlIGdyb3VwX3NpemU7CiAgICAgICAgICAgIGNvbnN0IGludCBncm91cF9iYW5rID0gaSAvIGdyb3VwX3NpemU7CiAgICAgICAgICAgIGNvbnN0IGludCByb3cgPSBncm91cF9iYW5rICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgY29uc3QgaW50IGNvbCA9IGdyb3VwX2luZGV4ICsgZ3JvdXBfYmFuayAvIGxvYWRzX3Blcl9ibG9ja190aWxlX20gKiBncm91cF9zaXplOwogICAgICAgICAgICBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKCiAgICAgICAgICAgIHJlc3VsdFtqXSA9IGJ1Zi50ZW1wbGF0ZSBsb2FkPDE+KDAsIHNyY19vZmYpWzBdOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCiAgICBzdGF0aWMgdm9pZCBzdG9yZV90b19zbWVtKAogICAgICAgIGZwOCogYmxvY2tfdGlsZV9kc3QsCiAgICAgICAgZnJnX3R5cGUgdGhyZWFkX3NyYywKICAgICAgICBpbnQgbSwKICAgICAgICBpbnQgbiwKICAgICAgICBpbnQgYmxvY2tfb2ZmX20sCiAgICAgICAgaW50IGJsb2NrX29mZl9uCiAgICApIHsKICAgICAgICBjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgogICAgICAgIC8vIFRoZSBidWZmZXIgbG9hZCBhbGxvd3MgdXMgdG8gb21pdCBib3VuZHMgY2hlY2tpbmcgd2l0aCBsb2FkaW5nLAogICAgICAgIC8vIGJ1dCB0aGF0IHRoZW4gbG9hZHMgaW52YWxpZCBlbGVtZW50cy4gVG8gZml4IHRoYXQsIHdlIGNoZWNrCiAgICAgICAgLy8gZm9yIGVhY2ggZWxlbWVudCB3aGV0aGVyIGl0cyBzdXBwb3NlZCB0byBiZSBpbiByYW5nZSwgYW5kIGlmIG5vdAogICAgICAgIC8vIHplcm8gaXQgb3V0LgoKICAgICAgICB1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7CgogICAgICAgICAgICAvLyBzd2l6emxlIHRoZSBsYW5lcyBzdWNoIHRoYXQgZ3JvdXBzIG9mIDQgY29sdW1ucyBhcmUgbmV4dCB0byBlYWNob3RoZXIuCiAgICAgICAgICAgIGNvbnN0IGludCBncm91cF9pbmRleCA9IGkgJSBncm91cF9zaXplOwogICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXBfYmFuayA9IGkgLyBncm91cF9zaXplOwogICAgICAgICAgICBjb25zdCBpbnQgcm93ID0gZ3JvdXBfYmFuayAlIGxvYWRzX3Blcl9ibG9ja190aWxlX207CiAgICAgICAgICAgIGNvbnN0IGludCBjb2wgPSBncm91cF9pbmRleCArIGdyb3VwX2JhbmsgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tICogZ3JvdXBfc2l6ZTsKCiAgICAgICAgICAgIGNvbnN0IGludCBzcmNfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBibG9ja19vZmZfbTsKICAgICAgICAgICAgY29uc3QgaW50IHNyY19jb2wgPSBjb2wgKyBibG9ja19vZmZfbjsKICAgICAgICAgICAgY29uc3QgYm9vbCBpbl9ib3VuZHMgPSBzcmNfcm93IDwgbSAmJiBzcmNfY29sIDwgbjsKCiAgICAgICAgICAgIGF1dG8qIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJsb2NrX3RpbGVfZHN0KTsKCiAgICAgICAgICAgIC8vIFN0b3JlIHRyYW5zcG9zZWQKICAgICAgICAgICAgLy8gY29uc3QgYXV0byBzcmMgPSBzdGQ6OmJpdF9jYXN0PHN0ZDo6YXJyYXk8dWludDhfdCwgc2l6ZW9mKGxvYWRfdHlwZSk+Pih0aHJlYWRfc3JjW2pdKTsKICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgYm91bmRzPwogICAgICAgICAgICAvLyB1bnJvbGw8MCwgc2l6ZW9mKGxvYWRfdHlwZSk+KFsmXTxpbnQgaz4gewogICAgICAgICAgICAvLyAgICAgY29uc3QgaW50IGRzdF9yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGs7CiAgICAgICAgICAgIC8vICAgICBjb25zdCBpbnQgZHN0X2NvbCA9IGNvbDsKICAgICAgICAgICAgLy8gICAgIGRzdFtkc3RfY29sICsgZHN0X3JvdyAqIChibG9ja190aWxlX24gKyA0KV0gPSBpbl9ib3VuZHMgPyBzcmNba10gOiAwOwogICAgICAgICAgICAvLyB9KTsKCiAgICAgICAgICAgIC8vIFN0b3JlIHRyYW5zcG9zZWQgdXNpbmcgNHg0IGdyb3Vwcy4KICAgICAgICAgICAgY29uc3QgYXV0byBzcmMgPSBzdGQ6OmJpdF9jYXN0PHN0ZDo6YXJyYXk8dWludDMyX3QsIDQ+Pih0aHJlYWRfc3JjW2pdKTsKICAgICAgICAgICAgY29uc3RleHByIGludCBsYW5lX3N0cmlkZSA9IDE7IC8vbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgdW5yb2xsPDAsIHNpemVvZihsb2FkX3R5cGUpLCBzaXplb2YodWludDMyX3QpPihbJl08aW50IGs+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3Rfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBrOwogICAgICAgICAgICAgICAgY29uc3QgaW50IGRzdF9jb2wgPSBjb2w7CiAgICAgICAgICAgICAgICBhdXRvIHYgPSBzcmNbayAvIHNpemVvZih1aW50MzJfdCldOwogICAgICAgICAgICAgICAgdiA9IGluX2JvdW5kcyA/IHYgOiAwOwogICAgICAgICAgICAgICAgdiA9IHRyYW5zcG9zZV80eDRfZjhfdjI8bGFuZV9zdHJpZGU+KHYpOwogICAgICAgICAgICAgICAgY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gX19sYW5lX2lkKCkgLyBsYW5lX3N0cmlkZSAlIDQ7CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZkc3RbKGRzdF9jb2wgLSBkc3RfY29sICUgNCkgKyAoZHN0X3JvdyArIGdyb3VwX2xhbmVfaW5kZXgpICogKGJsb2NrX3RpbGVfbiArIDQpXSkKICAgICAgICAgICAgICAgICAgICA9IHY7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQp9OwoKdGVtcGxhdGUgPGludCB3YXJwX3RpbGVfbV8sIGludCB3YXJwX3RpbGVfbl8sIHR5cGVuYW1lIFQ+CnN0cnVjdCBtZm1hX2ZyYWdtZW50IHsKICAgIHVzaW5nIHR5cGUgPSBUOwoKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9tID0gd2FycF90aWxlX21fOwogICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGVfbl87CgogICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgdG90YWxfaXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8dG90YWxfaXRlbXMsIHdhcnBfc2l6ZT4oKTsKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHJlZ2lzdGVyc19wZXJfdGhyZWFkID0gZGl2aWRlX2V4YWN0PGl0ZW1zX3Blcl90aHJlYWQgKiBzaXplb2YoVCksIHNpemVvZihyZWdpc3Rlcl90eXBlKT4oKTsKCiAgICByZWdpc3Rlcl90eXBlIHJlZ3NbcmVnaXN0ZXJzX3Blcl90aHJlYWRdOwoKICAgIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCiAgICBjb25zdGV4cHIgc3RhdGljIG1mbWFfZnJhZ21lbnQgemVybygpIHsKICAgICAgICByZXR1cm4gbWZtYV9mcmFnbWVudHt7fX07CiAgICB9CgogICAgX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KICAgIHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSB7CiAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4qPigmdGhpcy0+cmVncyk7CiAgICB9CgogICAgX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KICAgIGNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4qPigmdGhpcy0+cmVncyk7CiAgICB9CgogICAgX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KICAgIHZvaWQgY2xlYXIoKSB7CiAgICAgICAgdW5yb2xsPDAsIHJlZ2lzdGVyc19wZXJfdGhyZWFkPihbJl08aW50IGk+IHsKICAgICAgICAgICAgdGhpcy0+cmVnc1tpXSA9IDA7CiAgICAgICAgfSk7CiAgICB9CgogICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgZmlyc3RfaXRlbV9vZl9yZWcoaW50IHJlZykgewogICAgICAgIHJldHVybiByZWcgKiBzaXplb2YocmVnaXN0ZXJfdHlwZSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8aW50IG0sIGludCBuLCBpbnQgaz4Kc3RydWN0IG1mbWFfZjMyX2YzMl9mMzI7Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+IHsKICAgIHVzaW5nIGZyZ19hX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCA0LCBmbG9hdD47CiAgICB1c2luZyBmcmdfYl90eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgNCwgZmxvYXQ+OwogICAgdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDE2LCBmbG9hdD47CgogICAgX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGUoCiAgICAgICAgZnJnX2NfdHlwZSYgYywKICAgICAgICBjb25zdCBmcmdfYV90eXBlJiBhLAogICAgICAgIGNvbnN0IGZyZ19iX3R5cGUmIGIKICAgICkgewogICAgICAgIGMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KAogICAgICAgICAgICBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCiAgICAgICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGZsb2F0PihhKSwKICAgICAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGIpLAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmcDMyeDQ+KGMpLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICkKICAgICAgICApOwogICAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPiB7CiAgICB1c2luZyBmcmdfYV90eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMiwgZmxvYXQ+OwogICAgdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKICAgIHVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAzMiwgZmxvYXQ+OwoKICAgIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZyZ19jX3R5cGUmIGMsCiAgICAgICAgY29uc3QgZnJnX2FfdHlwZSYgYSwKICAgICAgICBjb25zdCBmcmdfYl90eXBlJiBiCiAgICApIHsKICAgICAgICBjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKICAgICAgICAgICAgX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngyZjMyKAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmbG9hdD4oYSksCiAgICAgICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKICAgICAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMngxNj4oYyksCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8aW50IG0sIGludCBuLCBpbnQgaz4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKICAgIHVzaW5nIGZyZ19hX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAzMiwgZnA4PjsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAzMiwgZnA4PjsKICAgIHVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwoKICAgIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZyZ19jX3R5cGUmIGMsCiAgICAgICAgY29uc3QgZnJnX2FfdHlwZSYgYSwKICAgICAgICBjb25zdCBmcmdfYl90eXBlJiBiCiAgICApIHsKI2lmZGVmIF9fSElQX0RFVklDRV9DT01QSUxFX18KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIGMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KAogICAgICAgIF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCgKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYSksCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGIpLAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGZwMzJ4ND4oYyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAKICAgICAgICApCiAgICApOwojZWxzZQogICAgLy8gRmFsbGJhY2sgY29waWVkIGZyb20gQ0ssIHRoaXMgd2F5IHdlIGNhbiB0ZXN0IG9uIE1JMjEwLgogICAgdXNpbmcgZmFsbGJhY2tfbWZtYSA9IG1mbWFfZjMyX2YzMl9mMzI8MTYsIDE2LCA0PjsKICAgIGNvbnN0IGF1dG8mIGFfdmFsdWVzID0gYS50aHJlYWRfdmFsdWVzKCk7CiAgICBjb25zdCBhdXRvJiBiX3ZhbHVlcyA9IGIudGhyZWFkX3ZhbHVlcygpOwogICAgdW5yb2xsPDAsIGZyZ19hX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaz4gewogICAgICAgIGNvbnN0IGF1dG8gZmFsbGJhY2tfYSA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2FfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFfdmFsdWVzW2tdKSk7CiAgICAgICAgY29uc3QgYXV0byBmYWxsYmFja19iID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYl90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYl92YWx1ZXNba10pKTsKICAgICAgICBmYWxsYmFja19tZm1hOjpleGVjdXRlKGMsIGZhbGxiYWNrX2EsIGZhbGxiYWNrX2IpOwogICAgfSk7CiNlbmRpZgojZW5kaWYKICAgIH0KfTsKCnRlbXBsYXRlPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDMyLCAzMiwgMTY+IHsKICAgIHVzaW5nIGZyZ19hX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAxNiwgZnA4PjsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAxNiwgZnA4PjsKICAgIHVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAzMiwgZmxvYXQ+OwoKICAgIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZyZ19jX3R5cGUmIGMsCiAgICAgICAgY29uc3QgZnJnX2FfdHlwZSYgYSwKICAgICAgICBjb25zdCBmcmdfYl90eXBlJiBiCiAgICApIHsKI2lmZGVmIF9fSElQX0RFVklDRV9DT01QSUxFX18KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIGMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KAogICAgICAgIF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYSksCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGIpLAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGZwMzJ4MTY+KGMpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwCiAgICAgICAgKQogICAgKTsKI2Vsc2UKICAgIC8vIEZhbGxiYWNrIGNvcGllZCBmcm9tIENLLCB0aGlzIHdheSB3ZSBjYW4gdGVzdCBvbiBNSTIxMC4KICAgIHVzaW5nIGZhbGxiYWNrX21mbWEgPSBtZm1hX2YzMl9mMzJfZjMyPDMyLCAzMiwgMj47CiAgICBjb25zdCBhdXRvJiBhX3ZhbHVlcyA9IGEudGhyZWFkX3ZhbHVlcygpOwogICAgY29uc3QgYXV0byYgYl92YWx1ZXMgPSBiLnRocmVhZF92YWx1ZXMoKTsKICAgIHVucm9sbDwwLCBmcmdfYV90eXBlOjppdGVtc19wZXJfdGhyZWFkPihbJl08aW50IGs+IHsKICAgICAgICBjb25zdCBhdXRvIGZhbGxiYWNrX2EgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19hX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihhX3ZhbHVlc1trXSkpOwogICAgICAgIGNvbnN0IGF1dG8gZmFsbGJhY2tfYiA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2JfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJfdmFsdWVzW2tdKSk7CiAgICAgICAgZmFsbGJhY2tfbWZtYTo6ZXhlY3V0ZShjLCBmYWxsYmFja19hLCBmYWxsYmFja19iKTsKICAgIH0pOwojZW5kaWYKI2VuZGlmCiAgICB9Cn07CgovLyBTZWUgQ0ROQTMgbWFudWFsLCA3LjEuNC4xLiBJbnB1dCBsYXlvdXQKLy8gVGhlIGNhbGN1bGF0aW9ucyBoZXJlIGFyZSBvYnRhaW5lZCB2aWEgdGhlCi8vIEFNRCBtYXRyaXggaW5zdHJ1Y3Rpb24gY2FsY3VsYXRvcgovLyBodHRwczovL2dpdGh1Yi5jb20vUk9DbS9hbWRfbWF0cml4X2luc3RydWN0aW9uX2NhbGN1bGF0b3IKLy8gVGhlcmUgaXMgYSBjbGVhbmVyIHdheSB0byBjb21wdXRlIHRoZSBtYXBwaW5nLCBidXQKLy8gdGhpcyBpcyB3aGF0IHRoZSB0b29sIHJldHVybnMgYW5kIEknbSBsYXp5LiBXZSBvbmx5Ci8vIHJlYWxseSBuZWVkIHRoZXNlIHR3byBhbnl3YXkgZm9yIG5vdy4KdGVtcGxhdGUgPHR5cGVuYW1lIG1mbWE+CnN0cnVjdCBtZm1hX2luZGV4ZXI7Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+PiB7CiAgICBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCBpdGVtKSB7CiAgICAgICAgY29uc3QgaW50IG0gPSBsYW5lICUgMTY7CiAgICAgICAgY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwogICAgICAgIHJldHVybiB7bSwga307CiAgICB9CgogICAgX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9iKGludCBsYW5lLCBpbnQgaXRlbSkgewogICAgICAgIGNvbnN0IGludCBuID0gbGFuZSAlIDE2OwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMTYpICsgaXRlbTsKICAgICAgICByZXR1cm4ge24sIGt9OwogICAgfQoKICAgIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYyhpbnQgbGFuZSwgaW50IGl0ZW0pIHsKICAgICAgICBjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIGl0ZW07CiAgICAgICAgY29uc3QgaW50IG4gPSBsYW5lICUgMTY7CiAgICAgICAgcmV0dXJuIHttLCBufTsKICAgIH0KfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4+IHsKICAgIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IGl0ZW0pIHsKICAgICAgICBjb25zdCBpbnQgbSA9IGxhbmUgJSAzMjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CiAgICAgICAgcmV0dXJuIHttLCBrfTsKICAgIH0KCiAgICBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CiAgICAgICAgY29uc3QgaW50IG4gPSBsYW5lICUgMzI7CiAgICAgICAgY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAzMikgKyBpdGVtOwogICAgICAgIHJldHVybiB7biwga307CiAgICB9CgogICAgX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9jKGludCBsYW5lLCBpbnQgaXRlbSkgewogICAgICAgIGNvbnN0IGludCBuID0gOCAqIChpdGVtIC8gNCkgJSAzMiArIDQgKiAobGFuZSAvIDMyKSArIChpdGVtICUgNCk7CiAgICAgICAgY29uc3QgaW50IG0gPSBsYW5lICUgMzI7CiAgICAgICAgcmV0dXJuIHtuLCBtfTsKICAgIH0KfTsKCnRlbXBsYXRlIDwKICAgIGludCBibG9ja19zaXplLAogICAgY3ViZSBibG9ja190aWxlLAogICAgY3ViZSB3YXJwX3RpbGUsCiAgICB0eXBlbmFtZSBsb2FkX3R5cGUsCiAgICBib29sIHBpcGVsaW5lZF9tYWluX2xvb3AgPSBmYWxzZQo+Cl9fZ2xvYmFsX18gX19sYXVuY2hfYm91bmRzX18oYmxvY2tfc2l6ZSkKdm9pZCBrZXJuZWwoCiAgICBjb25zdCBmcDgqIGEsCiAgICBjb25zdCBmcDgqIGIsCiAgICBjb25zdCBmcDMyKiBhcywKICAgIGNvbnN0IGZwMzIqIGJzLAogICAgYmYxNiogYywKICAgIGludCBtLAogICAgaW50IG4sCiAgICBpbnQgawopIHsKICAgIGNvbnN0ZXhwciBpbnQgd2FycHMgPSBibG9ja19zaXplIC8gd2FycF9zaXplOwoKICAgIGNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9tID0gYmxvY2tfdGlsZS5tOwogICAgY29uc3RleHByIGludCBibG9ja190aWxlX24gPSBibG9ja190aWxlLm47CiAgICBjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfayA9IGJsb2NrX3RpbGUuazsKCiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSA8PSAxMjgsICJibG9jayB0aWxlIE0gbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmxvY2t3aXNlIGJsb2NrIHNpemUiKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uIDw9IDEyOCwgImJsb2NrIHRpbGUgTiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBibG9ja3dpc2UgYmxvY2sgc2l6ZSIpOwogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX2sgPD0gMTI4LCAiYmxvY2sgdGlsZSBLIG11c3QgYmUgc21hbGxlciB0aGFuIGJsb2Nrd2lzZSBibG9jayBzaXplIik7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbSA9IHdhcnBfdGlsZS5tOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbiA9IHdhcnBfdGlsZS5uOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfayA9IHdhcnBfdGlsZS5rOwoKICAgIGNvbnN0ZXhwciBpbnQgY190b3RhbCA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbjsKCiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9iKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSB3YXJwX3RpbGVfbSA9PSAwLCAid2FycCB0aWxlIE0gaGFzIHRvIGRpdmlkZSBibG9jayB0aWxlIE0iKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbiA9IGJsb2NrX3RpbGVfbiAvIHdhcnBfdGlsZV9uOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVzX2sgPSBibG9ja190aWxlX2sgLyB3YXJwX3RpbGVfazsKCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW4gPSB3YXJwX3RpbGVzX20gKiB3YXJwX3RpbGVzX247CgogICAgLy8gbnVtYmVyIG9mIHdhcnAgdGlsZXMgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHdhcnBzCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tbiwgd2FycHM+KCk7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIHVzaW5nIG1mbWEgPSBtZm1hX2YzMl9mOF9mODx3YXJwX3RpbGVfbSwgd2FycF90aWxlX24sIHdhcnBfdGlsZV9rPjsKICAgIHVzaW5nIGZyZ19hX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfYV90eXBlOwogICAgdXNpbmcgZnJnX2JfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19iX3R5cGU7CiAgICB1c2luZyBmcmdfY190eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2NfdHlwZTsKICAgIHVzaW5nIGluZGV4ZXIgPSBtZm1hX2luZGV4ZXI8bWZtYT47CgogICAgdXNpbmcgYmxvY2tfbG9hZGVyX2EgPSBibG9ja19sb2FkZXI8YmxvY2tfc2l6ZSwgYmxvY2tfdGlsZV9tLCBibG9ja190aWxlX2ssIGxvYWRfdHlwZT47CiAgICB1c2luZyBibG9ja19sb2FkZXJfYiA9IGJsb2NrX2xvYWRlcjxibG9ja19zaXplLCBibG9ja190aWxlX24sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlPjsKCiAgICBjb25zdGV4cHIgaW50IGNfcGVyX3RocmVhZCA9IGNfdG90YWwgLyBibG9ja19zaXplOwogICAgc3RhdGljX2Fzc2VydChjX3Blcl90aHJlYWQgPT0gd2FycF90aWxlc19tbl9wZXJfd2FycCAqIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQsICJzYW5pdHkgY2hlY2siKTsKCiAgICBjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgogICAgY29uc3QgaW50IHdhcnAgPSB0aWQgLyB3YXJwX3NpemU7CiAgICBjb25zdCBpbnQgbGFuZSA9IF9fbGFuZV9pZCgpOwoKICAgIC8vIFN3YXAgZGlyZWN0aW9uIHRvIG1ha2UgYm91bmRzIGNoZWNraW5nIGJlIGZpcnN0CiAgICBjb25zdCBpbnQgdGlfbSA9IGdyaWREaW0ueCAtIGJsb2NrSWR4LnggLSAxOwogICAgY29uc3QgaW50IHRpX24gPSBncmlkRGltLnkgLSBibG9ja0lkeC55IC0gMTsKCiAgICBpbnQgc24gPSBjZWlsX2RpdihuLCAxMjgpOwoKICAgIGZyZ19jX3R5cGUgYmxvY2tfY19mcmdbd2FycF90aWxlc19tbl9wZXJfd2FycF07CiAgICB1bnJvbGw8MCwgd2FycF90aWxlc19tbl9wZXJfd2FycD4oWyZdPGludCBpPiB7CiAgICAgICAgYmxvY2tfY19mcmdbaV0uY2xlYXIoKTsKICAgIH0pOwoKICAgIF9fc2hhcmVkX18gZnA4IGJsb2NrX3RpbGVfYVtibG9ja190aWxlX20gKiAoYmxvY2tfdGlsZV9rICsgNCldOwogICAgX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9iW2Jsb2NrX3RpbGVfbiAqIChibG9ja190aWxlX2sgKyA0KV07CiAgICBfX3NoYXJlZF9fIGZsb2F0IGJsb2NrX3RpbGVfYXNbYmxvY2tfc2l6ZV07CiAgICBmbG9hdCB0aHJlYWRfdGlsZV9iczsKCiAgICBjb25zdCBhdXRvIGxvYWRfaW5wdXQgPSBbJl0oaW50IGkpIHsKICAgICAgICBmbG9hdCBmcmdfYXM7CiAgICAgICAgaWYgKHRpZCA8IDEyOCkgewogICAgICAgICAgICBmcmdfYXMgPSBhc1tpIC8gMTI4ICogbSArIHRpX20gKiBibG9ja190aWxlX20gKyB0aWRdOwogICAgICAgIH0KICAgICAgICBmbG9hdCBmcmdfYnMgPSBic1tpIC8gMTI4ICogc24gKyB0aV9uICogYmxvY2tfdGlsZV9uIC8gMTI4XTsKICAgICAgICBjb25zdCBhdXRvIGZyZ19hID0gYmxvY2tfbG9hZGVyX2E6OmxvYWRfZnJvbV9nbG9iYWwoCiAgICAgICAgICAgIGEsIG0sIGssIHRpX20gKiBibG9ja190aWxlX20sIGkKICAgICAgICApOwogICAgICAgIGNvbnN0IGF1dG8gZnJnX2IgPSBibG9ja19sb2FkZXJfYjo6bG9hZF9mcm9tX2dsb2JhbCgKICAgICAgICAgICAgYiwgbiwgaywgdGlfbiAqIGJsb2NrX3RpbGVfbiwgaQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKTsKICAgIH07CgogICAgY29uc3QgYXV0byBzdG9yZV9pbnB1dCA9IFsmXShpbnQgaSwgY29uc3QgYXV0byYgZnJnX2EsIGNvbnN0IGF1dG8mIGZyZ19iLCBjb25zdCBhdXRvJiBmcmdfYXMsIGNvbnN0IGF1dG8mIGZyZ19icykgewogICAgICAgIGJsb2NrX2xvYWRlcl9hOjpzdG9yZV90b19zbWVtKGJsb2NrX3RpbGVfYSwgZnJnX2EsIG0sIGssIHRpX20gKiBibG9ja190aWxlX20sIGkpOwogICAgICAgIGJsb2NrX2xvYWRlcl9iOjpzdG9yZV90b19zbWVtKGJsb2NrX3RpbGVfYiwgZnJnX2IsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkpOwogICAgICAgIGJsb2NrX3RpbGVfYXNbdGlkXSA9IGZyZ19hczsKICAgICAgICB0aHJlYWRfdGlsZV9icyA9IGZyZ19iczsKICAgIH07CgogICAgY29uc3QgYXV0byBtbWEgPSBbJl0oaW50IGkpIHsKICAgICAgICBmcmdfYV90eXBlIGZyZ19hW3dhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiB3YXJwX3RpbGVzX2tdOwogICAgICAgIHVucm9sbDFkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnA+KFsmXTxpbnQgaXd0aT4gewogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgd3RuID0gd3RpIC8gd2FycF90aWxlc19tOwogICAgICAgICAgICB1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewogICAgICAgICAgICAgICAgY29uc3RleHByIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwoKICAgICAgICAgICAgICAgIHVucm9sbDwwLCBmcmdfYV90eXBlOjpyZWdpc3RlcnNfcGVyX3RocmVhZD4oWyZdPGludCBta19yZWc+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2EobGFuZSwgZnJnX2FfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobWtfcmVnKSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpbSA9IHd0bSAqIHdhcnBfdGlsZV9tICsgbWZtYV9pbTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmlrID0gd3RrX2Jhc2UgKyBtZm1hX2lrOwogICAgICAgICAgICAgICAgICAgIGZyZ19hW3d0ayAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpXS5yZWdzW21rX3JlZ10gPQogICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZibG9ja190aWxlX2FbYmlrICsgYmltICogKGJsb2NrX3RpbGVfayArIDQpXSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIGZyZ19iX3R5cGUgZnJnX2Jbd2FycF90aWxlc19tbl9wZXJfd2FycCAqIHdhcnBfdGlsZXNfa107CiAgICAgICAgdW5yb2xsMWQ8d2FycF90aWxlc19tbl9wZXJfd2FycD4oWyZdPGludCBpd3RpPiB7CiAgICAgICAgICAgIGNvbnN0IGludCB3dGkgPSB3YXJwICogd2FycF90aWxlc19tbl9wZXJfd2FycCArIGl3dGk7CiAgICAgICAgICAgIGNvbnN0IGludCB3dG0gPSB3dGkgJSB3YXJwX3RpbGVzX207CiAgICAgICAgICAgIGNvbnN0IGludCB3dG4gPSB3dGkgLyB3YXJwX3RpbGVzX207CiAgICAgICAgICAgIHVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CiAgICAgICAgICAgICAgICBjb25zdGV4cHIgaW50IHd0ayA9IHd0a19iYXNlIC8gd2FycF90aWxlX2s7CgogICAgICAgICAgICAgICAgdW5yb2xsPDAsIGZyZ19iX3R5cGU6OnJlZ2lzdGVyc19wZXJfdGhyZWFkPihbJl08aW50IG5rX3JlZz4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gW21mbWFfaW4sIG1mbWFfaWtdID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYihsYW5lLCBmcmdfYl90eXBlOjpmaXJzdF9pdGVtX29mX3JlZyhua19yZWcpKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CiAgICAgICAgICAgICAgICAgICAgZnJnX2Jbd3RrICogd2FycF90aWxlc19tbl9wZXJfd2FycCArIGl3dGldLnJlZ3NbbmtfcmVnXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oJmJsb2NrX3RpbGVfYltiaWsgKyBiaW4gKiAoYmxvY2tfdGlsZV9rICsgNCldKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgZnJnX2NfdHlwZSB3YXJwX2ZyZ19jW3dhcnBfdGlsZXNfbW5fcGVyX3dhcnBdOwogICAgICAgIHVucm9sbDwwLCB3YXJwX3RpbGVzX21uX3Blcl93YXJwPihbJl08aW50IGk+IHsKICAgICAgICAgICAgd2FycF9mcmdfY1tpXS5jbGVhcigpOwogICAgICAgIH0pOwoKICAgICAgICB1bnJvbGwyZDx3YXJwX3RpbGVzX21uX3Blcl93YXJwLCB3YXJwX3RpbGVzX2s+KFsmXTxpbnQgaXd0aSwgaW50IHd0az4gewogICAgICAgICAgICBtZm1hOjpleGVjdXRlKAogICAgICAgICAgICAgICAgd2FycF9mcmdfY1tpd3RpXSwKICAgICAgICAgICAgICAgIGZyZ19hW3d0ayAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpXSwKICAgICAgICAgICAgICAgIGZyZ19iW3d0ayAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpXQogICAgICAgICAgICApOwogICAgICAgIH0pOwoKICAgICAgICB1bnJvbGwyZDx3YXJwX3RpbGVzX21uX3Blcl93YXJwLCBmcmdfY190eXBlOjppdGVtc19wZXJfdGhyZWFkPihbJl08aW50IGl3dGksIGludCBtbl9pdGVtPiB7CiAgICAgICAgICAgIGNvbnN0IGludCB3dGkgPSB3YXJwICogd2FycF90aWxlc19tbl9wZXJfd2FycCArIGl3dGk7CiAgICAgICAgICAgIGNvbnN0IGludCB3dG0gPSB3dGkgJSB3YXJwX3RpbGVzX207CgogICAgICAgICAgICBjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2luXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2MobGFuZSwgbW5faXRlbSk7CiAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CgogICAgICAgICAgICBibG9ja19jX2ZyZ1tpd3RpXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0gKz0gd2FycF9mcmdfY1tpd3RpXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0KICAgICAgICAgICAgICAgICogYmxvY2tfdGlsZV9hc1tiaW1dCiAgICAgICAgICAgICAgICAqIHRocmVhZF90aWxlX2JzOwogICAgICAgIH0pOwogICAgfTsKCiAgICBpZiBjb25zdGV4cHIgKCFwaXBlbGluZWRfbWFpbl9sb29wKSB7CiAgICAgICAgLy8gUmVndWxhciBtYWluIGxvb3AKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7IGkgKz0gYmxvY2tfdGlsZV9rKSB7CiAgICAgICAgICAgIGNvbnN0IGF1dG8gW2ZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnNdID0gbG9hZF9pbnB1dChpKTsKICAgICAgICAgICAgc3RvcmVfaW5wdXQoaSwgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7CiAgICAgICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICAgICAgbW1hKGkpOwogICAgICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvLyBQaXBlbGluZWQgbWFpbiBsb29wCiAgICAgICAgaW50IGkgPSAwOwogICAgICAgIGF1dG8gW2ZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnNdID0gbG9hZF9pbnB1dChpKTsKICAgICAgICBzdG9yZV9pbnB1dChpLCBmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKTsKICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICAgIGZvciAoOyBpICsgYmxvY2tfdGlsZV9rIDwgazsgaSArPSBibG9ja190aWxlX2spIHsKICAgICAgICAgICAgc3RkOjp0aWUoZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icykgPSBsb2FkX2lucHV0KGkgKyBibG9ja190aWxlX2spOwogICAgICAgICAgICBfX2J1aWx0aW5fYW1kZ2NuX3NjaGVkX2JhcnJpZXIoMCk7CiAgICAgICAgICAgIG1tYShpKTsKICAgICAgICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgICAgICAgICBzdG9yZV9pbnB1dChpICsgYmxvY2tfdGlsZV9rLCBmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKTsKICAgICAgICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgICAgIH0KICAgICAgICBtbWEoaSk7CiAgICB9CgogICAgLy8gV3JpdGUgb3V0IEMKICAgIC8vIFRoaXMgc2hvdWxkIGFjY2VzcyB0aWxlIEMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4gdGhlIG1hdG11bCBsb29wIQoKICAgIGNvbnN0IGludCBpbV9iYXNlID0gdGlfbSAqIGJsb2NrX3RpbGVfbTsKICAgIGNvbnN0IGludCBpbl9iYXNlID0gdGlfbiAqIGJsb2NrX3RpbGVfbjsKCiAgICBjb25zdCBib29sIGNfaW5fYm91bmRzID0KICAgICAgICAobSAlIGJsb2NrX3RpbGVfbSA9PSAwIHx8IGltX2Jhc2UgKyBibG9ja190aWxlX20gPD0gbSkgJiYKICAgICAgICAobiAlIGJsb2NrX3RpbGVfbiA9PSAwIHx8IGluX2Jhc2UgKyBibG9ja190aWxlX24gPD0gbik7CgogICAgc2VsZWN0KGNfaW5fYm91bmRzLCBbJl08Ym9vbCBjX2luX2JvdW5kcz4gewogICAgICAgIHVucm9sbDJkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0aSwgaW50IG1uX2l0ZW0+IHsKICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwoKICAgICAgICAgICAgY29uc3QgaW50IHd0aSA9IHdhcnAgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aTsKICAgICAgICAgICAgY29uc3QgaW50IHd0bSA9IHd0aSAlIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IHd0biA9IHd0aSAvIHdhcnBfdGlsZXNfbTsKCiAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CiAgICAgICAgICAgIGNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CgogICAgICAgICAgICBjb25zdCBpbnQgaW0gPSBpbV9iYXNlICsgYmltOwogICAgICAgICAgICBjb25zdCBpbnQgaW4gPSBpbl9iYXNlICsgYmluOwoKICAgICAgICAgICAgY29uc3QgYXV0byB2YWwgPSBiZjE2X2Zyb21fZnAzMihibG9ja19jX2ZyZ1tpd3RpXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0pOwoKICAgICAgICAgICAgaWYgKGNfaW5fYm91bmRzIHx8IGltIDwgbSAmJiBpbiA8IG4pIHsKICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZShzdGQ6OmJpdF9jYXN0PHVpbnQxNl90Pih2YWwpLCByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oJmNbaW0gKiBuICsgaW5dKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9Cgp0ZW1wbGF0ZTwKICAgIGludCBibG9ja19zaXplLAogICAgY3ViZSBibG9ja190aWxlLAogICAgY3ViZSB3YXJwX3RpbGUsCiAgICBib29sIHBpcGVsaW5lZF9tYWluX2xvb3AgPSBmYWxzZSwKICAgIHR5cGVuYW1lIGxvYWRfdHlwZSA9IF9fdWludDEyOF90Cj4Kdm9pZCBydW5fa2VybmVsKAogICAgY29uc3QgZnA4KiBhLAogICAgY29uc3QgZnA4KiBiLAogICAgY29uc3QgZnAzMiogYXMsCiAgICBjb25zdCBmcDMyKiBicywKICAgIGJmMTYqIGMsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGssCiAgICBib29sIG1lYXN1cmUKKSB7CiAgICBjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKICAgIGNvbnN0IGludCBncmlkX24gPSBjZWlsX2RpdihuLCBibG9ja190aWxlLm4pOwoKICAgIGhpcEV2ZW50X3Qgc3RhcnQsIHN0b3A7CiAgICBpZiAobWVhc3VyZSkgewogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudENyZWF0ZSgmc3RhcnQpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRDcmVhdGUoJnN0b3ApKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRSZWNvcmQoc3RhcnQsIDApKTsKICAgIH0KCiAgICBrZXJuZWw8CiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICBibG9ja190aWxlLAogICAgICAgIHdhcnBfdGlsZSwKICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgcGlwZWxpbmVkX21haW5fbG9vcAogICAgPjw8PAogICAgICAgIGRpbTMoZ3JpZF9tLCBncmlkX24pLAogICAgICAgIGRpbTMoYmxvY2tfc2l6ZSksCiAgICAgICAgMAogICAgPj4+KAogICAgICAgIGEsCiAgICAgICAgYiwKICAgICAgICBhcywKICAgICAgICBicywKICAgICAgICBjLAogICAgICAgIG0sCiAgICAgICAgbiwKICAgICAgICBrCiAgICApOwoKICAgIEhJUF9DSEVDSyhoaXBHZXRMYXN0RXJyb3IoKSk7CgogICAgaWYgKG1lYXN1cmUpIHsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRSZWNvcmQoc3RvcCwgMCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBEZXZpY2VTeW5jaHJvbml6ZSgpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRTeW5jaHJvbml6ZShzdG9wKSk7CgogICAgICAgIGZsb2F0IG1zID0gMDsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRFbGFwc2VkVGltZSgmbXMsIHN0YXJ0LCBzdG9wKSk7CiAgICAgICAgY29uc3QgZG91YmxlIHRpbWUgPSBtcyAvIDEnMDAwLjA7CgogICAgICAgIGNvbnN0IGRvdWJsZSBtZW1vcnkgPSBtICogayAqIHNpemVvZihmcDgpICsgbiAqIGsgKiBzaXplb2YoZnA4KSArIG0gKiBuICogc2l6ZW9mKGJmMTYpOwogICAgICAgIGNvbnN0IGRvdWJsZSBvcHMgPQogICAgICAgICAgICBkb3VibGUobSkgKiBuICogayAqIDIgLy8gTXVsdGlwbHkgKyBhZGQgZm9yIGVhY2ggcGFpcgogICAgICAgICAgICArIChkb3VibGUobSkgKiBuICogMikgKiBjZWlsX2RpdihrLCB3YXJwX3RpbGUuayk7IC8vIHNjYWxpbmcKCiAgICAgICAgY29uc3QgZG91YmxlIG1lbW9yeV90cHV0ID0gbWVtb3J5IC8gdGltZSAvICgxMDAwLjAgKiAxMDAwICogMTAwMCk7CiAgICAgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfdHB1dCA9IG9wcyAvIHRpbWUgLyAoMTAwMC4wICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKCiAgICAgICAgc3RkOjpjZXJyCiAgICAgICAgICAgIDw8IHN0ZDo6Zml4ZWQKICAgICAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikKICAgICAgICAgICAgPDwgIigiIDw8IG0gPDwgIiAiIDw8IG4gPDwgIiAiIDw8IGsgPDwgIikgIgogICAgICAgICAgICA8PCAiKCIgPDwgYmxvY2tfdGlsZS5tIDw8ICIgIiA8PCBibG9ja190aWxlLm4gPDwgIiAiIDw8IGJsb2NrX3RpbGUuayA8PCAiKSAiCiAgICAgICAgICAgIDw8ICIoIiA8PCB3YXJwX3RpbGUubSA8PCAiICIgPDwgd2FycF90aWxlLm4gPDwgIiAiIDw8IHdhcnBfdGlsZS5rIDw8ICIpICIKICAgICAgICAgICAgPDwgcGlwZWxpbmVkX21haW5fbG9vcCA8PCAiICIKICAgICAgICAgICAgPDwgYmxvY2tfc2l6ZSA8PCAiOiAiCiAgICAgICAgICAgIDw8IG1zIDw8ICIgbXMgIgogICAgICAgICAgICA8PCAodGltZSAqIDEnMDAwJzAwMCkgPDwgIiB1cyAiCiAgICAgICAgICAgIDw8IG1lbW9yeV90cHV0IDw8ICIgR0IvcyAiCiAgICAgICAgICAgIDw8IGNvbXB1dGVfdHB1dCA8PCAiIFRGTE9QUyIKICAgICAgICAgICAgPDwgc3RkOjplbmRsOwoKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnREZXN0cm95KHN0YXJ0KSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50RGVzdHJveShzdG9wKSk7CiAgICB9Cn0KCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGssCiAgICBib29sIG1lYXN1cmUKKSB7CiAgICAvLyBJbiB0aGUga2VybmVscyB3ZSBhc3N1bWUgMTI4LWJpdCBhbGlnbm1lbnQuCiAgICBhc3NlcnQoYV9wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChiX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGFzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGJzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGNfcHRyICUgMTYgPT0gMCk7CgogICAgY29uc3QgYXV0byogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogYXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogYnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihic19wdHIpOwogICAgYXV0byogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGNfcHRyKTsKCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgZmFsc2U+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KClBZQklORDExX01PRFVMRShmcDgsIG0pIHsKICBtLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCJdLAogICAgYnVpbGRfZGlyZWN0b3J5PSIvd29ya3NwYWNlL2J1aWxkLyIgaWYgVEVTVElORyA9PSAidnNjb2RlIiBlbHNlICIvZ3B1bW9kZS9hbWQvZnA4L2J1aWxkLyIgaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIE5vbmUsCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmZpcnN0ID0gVHJ1ZQoKY2FjaGVfbSA9IDAKY2FjaGVfbiA9IDAKY2FjaGVfayA9IDAKY2FjaGVfaSA9IDAKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYmxvY2stc2NhbGUgZnA4IGdlbW0KICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgdGhhdCBleHBhbmRzIHRvOgogICAgICAgICAgICBhOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbSwga10sCiAgICAgICAgICAgIGI6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFtuLCBrXSwKICAgICAgICAgICAgYV9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFttLCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGJfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbiAvLyAxMjgsIGsgLy8gMTI4XSwKICAgICAgICAgICAgYzogdG9yY2guVGVuc29yW2JmbG9hdDE2XSBvZiBzaGFwZSBbbSwgbl0KICAgIFJldHVybnM6CiAgICAgICAgVGVuc29yIGNvbnRhaW5pbmcgb3V0cHV0IGluIGJmMTYKICAgICIiIgoKICAgIGdsb2JhbCBmaXJzdAogICAgaWYgZmlyc3Q6CiAgICAgICAgcHJpbnQoImV4ZWN1dGluZyBvbiIsIHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9uYW1lKCksIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICBmaXJzdCA9IEZhbHNlCgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKCiAgICBtLCBuID0gYy5zaGFwZQogICAgayA9IGEuc2hhcGVbMV0KCiAgICBnbG9iYWwgY2FjaGVfbQogICAgZ2xvYmFsIGNhY2hlX24KICAgIGdsb2JhbCBjYWNoZV9rCiAgICBnbG9iYWwgY2FjaGVfaQoKICAgIGlmIGNhY2hlX20gIT0gbSBvciBjYWNoZV9uICE9IG4gb3IgY2FjaGVfayAhPSBrOgogICAgICAgIGNhY2hlX20gPSBtCiAgICAgICAgY2FjaGVfbiA9IG4KICAgICAgICBjYWNoZV9rID0gawogICAgICAgIGNhY2hlX2kgPSAwCiAgICBlbHNlOgogICAgICAgIGNhY2hlX2kgKz0gMQoKICAgICMgRG9uJ3QgY2hlY2sgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gdG8gYWxsb3cgZm9yIHNvbWUgd2FybXVwCiAgICBtZWFzdXJlID0gRmFsc2UKICAgIGlmIGNhY2hlX2kgPT0gMToKICAgICAgICBtZWFzdXJlID0gRmFsc2UKCiAgICBoaXBfbW9kdWxlLmZwOCgKICAgICAgICBhLmRhdGFfcHRyKCksCiAgICAgICAgYi5kYXRhX3B0cigpLAogICAgICAgIGFfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBiX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYy5kYXRhX3B0cigpLAogICAgICAgIG0sCiAgICAgICAgbiwKICAgICAgICBrLAogICAgICAgIG1lYXN1cmUKICAgICkKCiAgICByZXR1cm4gYwo=
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgojZGVmaW5lIEhJUF9DSEVDSyhjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQApkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmlmKGVycm9yICE9IGhpcFN1Y2Nlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKc3RkOjpjZXJyIDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKPDwgaGlwR2V0RXJyb3JTdHJpbmcoZXJyb3IpIDw8ICIgaW4gIiA8PCBfX2Z1bmNfXyA8PCAiIGF0ICIgPDwgX19GSUxFX18gQAo8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACndoaWxlKGZhbHNlKQp1c2luZyBmcDggPSBfX2hpcF9mcDhfZTRtM19mbnV6Owp1c2luZyBiZjE2ID0gX19oaXBfYmZsb2F0MTY7CnVzaW5nIGZwMzIgPSBmbG9hdDsKdXNpbmcgZnAzMng0ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKdXNpbmcgaTMyeDQgPSBpbnQzMl90IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CnN0cnVjdCBjdWJlIHsKaW50IG0sIG4sIGs7Cn07CmNvbnN0ZXhwciBpbnQgd2FycF9zaXplID0gNjQ7CmNvbnN0ZXhwciBpbnQgY2FjaGVfbGluZV9zaXplID0gMTI4Owpjb25zdGV4cHIgaW50IG1fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IG5fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IGtfYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDEyODsKdXNpbmcgcmVnaXN0ZXJfdHlwZSA9IHVpbnQzMl90Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIGF1dG8gY2VpbF9kaXYoVCBhLCBVIGIpIHsKcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIGF1dG8gZGl2aWRlX2V4YWN0KCkgewpzdGF0aWNfYXNzZXJ0KGEgJSBiID09IDAsICJkb2VzIG5vdCBkaXZpZGUgZXhhY3QhIik7CnJldHVybiBhIC8gYjsKfQp0ZW1wbGF0ZTxpbnQgaW5jLCBpbnQgYWRkLCB0eXBlbmFtZSBzZXE+CnN0cnVjdCBtdWx0aXBseV9ieV9pbmM7CnRlbXBsYXRlPGludCBpbmMsIGludCBhZGQsIGludC4uLiBJcz4Kc3RydWN0IG11bHRpcGx5X2J5X2luYzxpbmMsIGFkZCwgc3RkOjppbnRlZ2VyX3NlcXVlbmNlPGludCwgSXMuLi4+PiB7CnVzaW5nIHR5cGUgPSBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCAoaW5jICogSXMgKyBhZGQpLi4uPjsKfTsKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jLCBpbnQuLi4gSXM+CnN0cnVjdCBtYWtlX2luZGV4X3NlcXVlbmNlX3dpdGhfaW5jX2hlbHBlciB7CnVzaW5nIHR5cGUgPSB0eXBlbmFtZSBtdWx0aXBseV9ieV9pbmM8aW5jLCBJLCBzdGQ6Om1ha2VfaW50ZWdlcl9zZXF1ZW5jZTxpbnQsIChOIC0gSSkgLyBpbmM+Pjo6dHlwZTsKfTsKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jPgp1c2luZyBtYWtlX2luZGV4X3NlcXVlbmNlX3dpdGhfaW5jID0gdHlwZW5hbWUgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luY19oZWxwZXI8SSwgTiwgaW5jPjo6dHlwZTsKdGVtcGxhdGU8dHlwZW5hbWUgRiwgaW50Li4uIElzPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbF9hcHBseShGIGYsIHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxpbnQsIElzLi4uPikgewooZi50ZW1wbGF0ZSBvcGVyYXRvcigpPElzPigpLCAuLi4pOwp9CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYyA9IDEsIHR5cGVuYW1lIEY+Cl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsKEYgZikgewp1bnJvbGxfYXBwbHkoZiwgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luYzxJLCBOLCBpbmM+e30pOwp9CnRlbXBsYXRlPGludCBJLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDFkKEYgZikgewp1bnJvbGw8MCwgST4oZik7Cn0KdGVtcGxhdGU8aW50IEksIGludCBKLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDJkKEYgZikgewp1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CnVucm9sbDwwLCBKPihbJl08aW50IGo+IHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGksIGo+KCk7Cn0pOwp9KTsKfQp0ZW1wbGF0ZTxpbnQgSSwgaW50IEosIGludCBLLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDNkKEYgZikgewp1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CnVucm9sbDwwLCBKPihbJl08aW50IGo+IHsKdW5yb2xsPDAsIEs+KFsmXTxpbnQgaz4gewpmLnRlbXBsYXRlIG9wZXJhdG9yKCk8aSwgaiwgaz4oKTsKfSk7Cn0pOwp9KTsKfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgY2xlYXIoVCAoJmFycmF5KVtOXSkgewp1bnJvbGw8MCwgTj4oWyZdPGludCBpPiB7CmFycmF5W2ldID0gVHswfTsKfSk7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KYmYxNiBiZjE2X2Zyb21fZnAzMihmbG9hdCB4KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PGJmMTY+KApzdGF0aWNfY2FzdDx1aW50MTZfdD4oCnN0ZDo6Yml0X2Nhc3Q8dWludDMyX3Q+KHgpID4+IDE2CikKKTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpmcDMyIGZwMzJfZnJvbV9mcDgoZnA4IHgpIHsKcmV0dXJuIGZsb2F0KHgpOwp9CnRlbXBsYXRlIDx0eXBlbmFtZSBGPgpfX2RldmljZV9fIF9faG9zdF9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHNlbGVjdChib29sIGNvbmQsIEYgZikgewppZiAoY29uZCkgewpmLnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oKTsKfSBlbHNlIHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGZhbHNlPigpOwp9Cn0KdGVtcGxhdGU8aW50IGRwcF9jdHJsLCBpbnQgcm93X21hc2sgPSAweGYsIGludCBiYW5rX21hc2sgPSAweGYsIGJvb2wgYm91bmRfY3RybCA9IGZhbHNlPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp1aW50MzJfdCBzaGZsX2RwcCh1aW50MzJfdCB4KSB7CnJldHVybiBfX2J1aWx0aW5fYW1kZ2NuX3VwZGF0ZV9kcHAoeCwgeCwgZHBwX2N0cmwsIHJvd19tYXNrLCBiYW5rX21hc2ssIGJvdW5kX2N0cmwpOwp9CnRlbXBsYXRlPGludCBsYW5lX3N0cmlkZT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KdWludDMyX3QgdHJhbnNwb3NlXzR4NF9mOF92Mih1aW50MzJfdCBpbnB1dCkgewpzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlIDwgd2FycF9zaXplIC8gNCwgImxhbmUgc3RyaWRlIGlzIHRvbyBsYXJnZSIpOwpzdGF0aWNfYXNzZXJ0KChsYW5lX3N0cmlkZSAmIChsYW5lX3N0cmlkZSAtIDEpKSA9PSAwLCAibGluZSBzdHJpZGUgaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiIpOwpzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlID09IDEsICJEUFAgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgbGFuZV9zdHJpZGUgPT0gMSIpOwpjb25zdCBhdXRvIGxhbmUgPSBfX2xhbmVfaWQoKTsKY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gbGFuZSAvIGxhbmVfc3RyaWRlICUgNDsKY29uc3QgYXV0byB0MngyID0gX19idWlsdGluX2FtZGdjbl9wZXJtKAoKc2hmbF9kcHA8MGIxMCcxMScwMCcwMT4oaW5wdXQpLAppbnB1dCwKZ3JvdXBfbGFuZV9pbmRleCAlIDIgPT0gMAo/IDB4MDYnMDInMDQnMDAKOiAweDAzJzA3JzAxJzA1Cik7CgoKCgoKCmNvbnN0IGF1dG8gdDR4NCA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKCnNoZmxfZHBwPDBiMDEnMDAnMTEnMTA+KHQyeDIpLAp0MngyLApncm91cF9sYW5lX2luZGV4IDwgMgo/IDB4MDUnMDQnMDEnMDAKOiAweDAzJzAyJzA3JzA2Cik7CgpyZXR1cm4gdDR4NDsKfQpfX2RldmljZV9fIHVpbnQ4X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2I4KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTgiKTsKX19kZXZpY2VfXyB1aW50MTZfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjE2KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTE2Iik7Cl9fZGV2aWNlX18gdWludDMyX3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMihpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkzMiIpOwpfX2RldmljZV9fIHVpbnQ2NF90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iNjQoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pNjQiKTsKX19kZXZpY2VfXyBfX3VpbnQxMjhfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjEyOChpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkxMjgiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjgodWludDhfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTgiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjE2KHVpbnQxNl90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pMTYiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjMyKHVpbnQzMl90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pMzIiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjY0KHVpbnQ2NF90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pNjQiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjEyOChfX3VpbnQxMjhfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTEyOCIpOwplbnVtIGNsYXNzIGNvaGVyZW5jeSB7CmNhY2hlX2FsbCA9IDAsCmNhY2hlX2dsb2JhbCA9IDEsCmNhY2hlX3N0cmVhbSA9IDIsCm5vbl90ZW1wb3JhbCA9IDMKfTsKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBidWZmZXIgewpzdHJ1Y3QgYnVmZmVyX3Jlc291cmNlIHsKY29uc3Qgdm9pZCogcHRyOwp1aW50MzJfdCByYW5nZTsKdWludDMyX3QgY29uZmlnOwp9Owp1c2luZyBlbGVtX3R5cGUgPSBzdGQ6OnJlbW92ZV9jdl90PFQ+OwpidWZmZXJfcmVzb3VyY2UgcnNyYzsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KYnVmZmVyKFQqIHBvaW50ZXIsIHVpbnQzMl90IHNpemUpIHsKdGhpcy0+cnNyYyA9IGJ1ZmZlcl9yZXNvdXJjZXsKcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocG9pbnRlciksCnN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplICogc2l6ZW9mKGVsZW1fdHlwZSkpLAoKCjB4MDAwMjAwMDBVCn07Cn0KdGVtcGxhdGU8c2l6ZV90IE4sIGNvaGVyZW5jeSBjID0gY29oZXJlbmN5OjpjYWNoZV9hbGw+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPiBsb2FkKAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3Qgewp1c2luZyByZXN1bHRfdHlwZSA9IHN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPjsKY29uc3RleHByIGNvbnN0IGludCBsb2FkX3NpemUgPSBzaXplb2YoZWxlbV90eXBlKSAqIE47CndhdmVfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ID0gaW5fYm91bmRzID8gdGhyZWFkX29mZnNldCA6IDB4RkZGRidGRkZGOwpjb25zdCBpbnQgY2MgPSBzdGF0aWNfY2FzdDxpbnQ+KGMpOwppZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAxKSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjgoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAyKSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjE2KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgY29uc3RleHByIChsb2FkX3NpemUgPT0gNCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMigKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIGlmIGNvbnN0ZXhwciAobG9hZF9zaXplID09IDgpIHsKcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8cmVzdWx0X3R5cGU+KGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iNjQoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAxNikgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxMjgoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSB7CnN0YXRpY19hc3NlcnQobG9hZF9zaXplID09IC0xLCAibG9hZCBzaXplIG5vdCBpbXBsZW1lbnRlZCIpOwp9Cn0KdGVtcGxhdGU8Y29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbCwgc2l6ZV90IE4+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgc3RvcmUoCmNvbnN0IHN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPiYgZGF0YSwKdWludDMyX3Qgd2F2ZV9vZmZzZXQsCnVpbnQzMl90IHRocmVhZF9vZmZzZXQsCmJvb2wgaW5fYm91bmRzID0gdHJ1ZQopIGNvbnN0IHsKY29uc3RleHByIGNvbnN0IGludCBzdG9yZV9zaXplID0gc2l6ZW9mKGVsZW1fdHlwZSkgKiBOOwp3YXZlX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCA9IGluX2JvdW5kcyA/IHRocmVhZF9vZmZzZXQgOiAweEZGRkYnRkZGRjsKY29uc3QgaW50IGNjID0gc3RhdGljX2Nhc3Q8aW50PihjKTsKaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDEpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iOCgKc3RkOjpiaXRfY2FzdDx1aW50OF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDIpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iMTYoCnN0ZDo6Yml0X2Nhc3Q8dWludDE2X3Q+KGRhdGEpLApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCik7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKHN0b3JlX3NpemUgPT0gNCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMigKc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIGNvbnN0ZXhwciAoc3RvcmVfc2l6ZSA9PSA4KSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjY0KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDE2KSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjEyOCgKc3RkOjpiaXRfY2FzdDxfX3VpbnQxMjhfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIHsKc3RhdGljX2Fzc2VydChzdG9yZV9zaXplID09IC0xLCAic3RvcmUgc2l6ZSBub3QgaW1wbGVtZW50ZWQiKTsKfQp9CnRlbXBsYXRlPGNvaGVyZW5jeSBjID0gY29oZXJlbmN5OjpjYWNoZV9hbGw+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgc3RvcmUoCmNvbnN0IGVsZW1fdHlwZSYgZGF0YSwKdWludDMyX3Qgd2F2ZV9vZmZzZXQsCnVpbnQzMl90IHRocmVhZF9vZmZzZXQsCmJvb2wgaW5fYm91bmRzID0gdHJ1ZQopIGNvbnN0IHsKc3RvcmU8Yz4oCnN0ZDo6YXJyYXk8ZWxlbV90eXBlLCAxPih7ZGF0YX0pLAp3YXZlX29mZnNldCwKdGhyZWFkX29mZnNldCwKaW5fYm91bmRzCik7Cn0KfTsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLAppbnQgYmxvY2tfdGlsZV9tLAppbnQgYmxvY2tfdGlsZV9uLAp0eXBlbmFtZSBsb2FkX3R5cGUsCmJvb2wgZnVzZWRfdHJhbnNwb3NlCj4Kc3RydWN0IGJsb2NrX2xvYWRlcjsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLAppbnQgYmxvY2tfdGlsZV9tLAppbnQgYmxvY2tfdGlsZV9uLAp0eXBlbmFtZSBsb2FkX3R5cGUKPgpzdHJ1Y3QgYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbSwgYmxvY2tfdGlsZV9uLCBsb2FkX3R5cGUsIHRydWU+IHsKc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSBzaXplb2YobG9hZF90eXBlKSA9PSAwLCAidGlsZSBpbm5lciBkaW1lbnNpb24gaGFzIHRvIGJlIGRpdmlzaWJsZSBieSBsb2FkIHR5cGUgc2l6ZSIpOwpjb25zdGV4cHIgc3RhdGljIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwpzdGF0aWNfYXNzZXJ0KHRvdGFsX2xvYWRzICUgYmxvY2tfc2l6ZSA9PSAwLCAidG90YWwgYW1vdW50IG9mIGxvYWRzIG5lZWRzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpjb25zdGV4cHIgc3RhdGljIGludCBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tID0gYmxvY2tfdGlsZV9tIC8gc2l6ZW9mKGxvYWRfdHlwZSk7CmNvbnN0ZXhwciBzdGF0aWMgaW50IGxvYWRzX3Blcl90aHJlYWQgPSB0b3RhbF9sb2FkcyAvIGJsb2NrX3NpemU7CmNvbnN0ZXhwciBzdGF0aWMgaW50IGdyb3VwX3NpemUgPSA0Owp1c2luZyBmcmdfdHlwZSA9IHN0ZDo6YXJyYXk8bG9hZF90eXBlLCBsb2Fkc19wZXJfdGhyZWFkPjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGZyZ190eXBlIGxvYWRfZnJvbV9nbG9iYWwoCmNvbnN0IGZwOCogYmxvY2tfdGlsZV9zcmMsCmludCBtLAppbnQgbiwKaW50IGJsb2NrX29mZl9tLAppbnQgYmxvY2tfb2ZmX24KKSB7CmNvbnN0IGF1dG8gb2Zmc2V0ID0gYmxvY2tfb2ZmX24gKiBtICsgYmxvY2tfb2ZmX207CmNvbnN0IGF1dG8gYnVmID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJsb2NrX3RpbGVfc3JjKSwgbSAqIG4pOwpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CmZyZ190eXBlIHJlc3VsdDsKdW5yb2xsPDAsIGxvYWRzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaj4gewpjb25zdCBpbnQgaSA9IGogKiBibG9ja19zaXplICsgdGlkOwoKY29uc3QgaW50IGdyb3VwX2luZGV4ID0gaSAlIGdyb3VwX3NpemU7CmNvbnN0IGludCBncm91cF9iYW5rID0gaSAvIGdyb3VwX3NpemU7CmNvbnN0IGludCByb3cgPSBncm91cF9iYW5rICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKY29uc3QgaW50IGNvbCA9IGdyb3VwX2luZGV4ICsgZ3JvdXBfYmFuayAvIGxvYWRzX3Blcl9ibG9ja190aWxlX20gKiBncm91cF9zaXplOwpjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKY29uc3QgaW50IHNyY19yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGJsb2NrX29mZl9tOwpjb25zdCBpbnQgc3JjX2NvbCA9IGNvbCArIGJsb2NrX29mZl9uOwpjb25zdCBib29sIGluX2JvdW5kcyA9IHNyY19yb3cgPCBtICYmIHNyY19jb2wgPCBuOwoKY29uc3QgYXV0byB3b3JkID0gYnVmLnRlbXBsYXRlIGxvYWQ8c2l6ZW9mKGxvYWRfdHlwZSk+KG9mZnNldCwgc3JjX29mZiwgaW5fYm91bmRzKTsKcmVzdWx0W2pdID0gc3RkOjpiaXRfY2FzdDxsb2FkX3R5cGU+KHdvcmQpOwp9KTsKcmV0dXJuIHJlc3VsdDsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBzdG9yZV90b19zbWVtKApmcDgqIGJsb2NrX3RpbGVfZHN0LApmcmdfdHlwZSB0aHJlYWRfc3JjLAppbnQgbSwKaW50IG4sCmludCBibG9ja19vZmZfbSwKaW50IGJsb2NrX29mZl9uCikgewpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgoKCgp1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CmNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7Cgpjb25zdCBpbnQgZ3JvdXBfaW5kZXggPSBpICUgZ3JvdXBfc2l6ZTsKY29uc3QgaW50IGdyb3VwX2JhbmsgPSBpIC8gZ3JvdXBfc2l6ZTsKY29uc3QgaW50IHJvdyA9IGdyb3VwX2JhbmsgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwpjb25zdCBpbnQgY29sID0gZ3JvdXBfaW5kZXggKyBncm91cF9iYW5rIC8gbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSAqIGdyb3VwX3NpemU7CmF1dG8qIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJsb2NrX3RpbGVfZHN0KTsKCmNvbnN0IGF1dG8gc3JjID0gc3RkOjpiaXRfY2FzdDxzdGQ6OmFycmF5PHVpbnQzMl90LCA0Pj4odGhyZWFkX3NyY1tqXSk7CmNvbnN0ZXhwciBpbnQgbGFuZV9zdHJpZGUgPSAxOwp1bnJvbGw8MCwgc2l6ZW9mKGxvYWRfdHlwZSksIHNpemVvZih1aW50MzJfdCk+KFsmXTxpbnQgaz4gewpjb25zdCBpbnQgZHN0X3JvdyA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgazsKY29uc3QgaW50IGRzdF9jb2wgPSBjb2w7CmF1dG8gdiA9IHNyY1trIC8gc2l6ZW9mKHVpbnQzMl90KV07CnYgPSB0cmFuc3Bvc2VfNHg0X2Y4X3YyPGxhbmVfc3RyaWRlPih2KTsKY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gX19sYW5lX2lkKCkgLyBsYW5lX3N0cmlkZSAlIDQ7CipyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJmRzdFsoZHN0X2NvbCAtIGRzdF9jb2wgJSA0KSArIChkc3Rfcm93ICsgZ3JvdXBfbGFuZV9pbmRleCkgKiAoYmxvY2tfdGlsZV9uICsgNCldKQo9IHY7Cn0pOwp9KTsKfQp9Owp0ZW1wbGF0ZSA8aW50IHdhcnBfdGlsZV9tXywgaW50IHdhcnBfdGlsZV9uXywgdHlwZW5hbWUgVD4Kc3RydWN0IG1mbWFfZnJhZ21lbnQgewp1c2luZyB0eXBlID0gVDsKY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgd2FycF90aWxlX20gPSB3YXJwX3RpbGVfbV87CmNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9uID0gd2FycF90aWxlX25fOwpjb25zdGV4cHIgc3RhdGljIGNvbnN0IGludCB0b3RhbF9pdGVtcyA9IHdhcnBfdGlsZV9tICogd2FycF90aWxlX247CmNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8dG90YWxfaXRlbXMsIHdhcnBfc2l6ZT4oKTsKY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgcmVnaXN0ZXJzX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8aXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKSwgc2l6ZW9mKHJlZ2lzdGVyX3R5cGUpPigpOwpjb25zdGV4cHIgc3RhdGljIGNvbnN0IGludCBieXRlc19wZXJfdGhyZWFkID0gaXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKTsKcmVnaXN0ZXJfdHlwZSByZWdzW3JlZ2lzdGVyc19wZXJfdGhyZWFkXTsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIHN0YXRpYyBtZm1hX2ZyYWdtZW50IHplcm8oKSB7CnJldHVybiBtZm1hX2ZyYWdtZW50e3t9fTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+JiB0aHJlYWRfdmFsdWVzKCkgewpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjphcnJheTxULCBpdGVtc19wZXJfdGhyZWFkPio+KCZ0aGlzLT5yZWdzKTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpjb25zdCBzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+JiB0aHJlYWRfdmFsdWVzKCkgY29uc3QgewpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RkOjphcnJheTxULCBpdGVtc19wZXJfdGhyZWFkPio+KCZ0aGlzLT5yZWdzKTsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBVPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+JiByZWdzX2FzKCkgewpzdGF0aWNfYXNzZXJ0KGJ5dGVzX3Blcl90aHJlYWQgJSBzaXplb2YoVSkgPT0gMCwgInRvdGFsIGJ5dGVzIGluIHRocmVhZCBmcmFnbWVudCBub3QgZGl2aXNpYmxlIGJ5IFUiKTsKcmV0dXJuICpyZWludGVycHJldF9jYXN0PHN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4qPigmdGhpcy0+cmVncyk7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgVT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3Qgc3RkOjphcnJheTxVLCBieXRlc19wZXJfdGhyZWFkIC8gc2l6ZW9mKFUpPiYgcmVnc19hcygpIGNvbnN0IHsKc3RhdGljX2Fzc2VydChieXRlc19wZXJfdGhyZWFkICUgc2l6ZW9mKFUpID09IDAsICJ0b3RhbCBieXRlcyBpbiB0aHJlYWQgZnJhZ21lbnQgbm90IGRpdmlzaWJsZSBieSBVIik7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+Kj4oJnRoaXMtPnJlZ3MpOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgY2xlYXIoKSB7CnVucm9sbDwwLCByZWdpc3RlcnNfcGVyX3RocmVhZD4oWyZdPGludCBpPiB7CnRoaXMtPnJlZ3NbaV0gPSAwOwp9KTsKfQpzdGF0aWMgY29uc3RleHByIGludCBmaXJzdF9pdGVtX29mX3JlZyhpbnQgcmVnKSB7CnJldHVybiByZWcgKiBzaXplb2YocmVnaXN0ZXJfdHlwZSk7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDE2LCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDQ+KGMpLAowLAowLAowCikKKTsKfQp9Owp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODsKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDMyLCBmcDg+Owp1c2luZyBmcmdfYl90eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgMzIsIGZwOD47CnVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBleGVjdXRlKApmcmdfY190eXBlJiBjLApjb25zdCBmcmdfYV90eXBlJiBhLApjb25zdCBmcmdfYl90eXBlJiBiCikgewojaWZkZWYgX19ISVBfREVWSUNFX0NPTVBJTEVfXwojaWZkZWYgX19nZng5NDJfXwpjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYiksCnN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCgp1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+Owpjb25zdCBhdXRvJiBhX3ZhbHVlcyA9IGEudGhyZWFkX3ZhbHVlcygpOwpjb25zdCBhdXRvJiBiX3ZhbHVlcyA9IGIudGhyZWFkX3ZhbHVlcygpOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYSA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2FfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFfdmFsdWVzW2tdKSk7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYiA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2JfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJfdmFsdWVzW2tdKSk7CmZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7Cn0pOwojZW5kaWYKI2VuZGlmCn0KfTsKdGVtcGxhdGU8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4gewp1c2luZyBmcmdfYV90eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMTYsIGZwOD47CnVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAxNiwgZnA4PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCnN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGEpLApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCgp1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+Owpjb25zdCBhdXRvJiBhX3ZhbHVlcyA9IGEudGhyZWFkX3ZhbHVlcygpOwpjb25zdCBhdXRvJiBiX3ZhbHVlcyA9IGIudGhyZWFkX3ZhbHVlcygpOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYSA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2FfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFfdmFsdWVzW2tdKSk7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYiA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2JfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJfdmFsdWVzW2tdKSk7CmZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7Cn0pOwojZW5kaWYKI2VuZGlmCn0KfTsKCgoKCgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+PiB7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9hKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IGxhbmUgJSAxNjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwpyZXR1cm4ge20sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9iKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwpyZXR1cm4ge24sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9jKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIGl0ZW07CmNvbnN0IGludCBuID0gbGFuZSAlIDE2OwpyZXR1cm4ge20sIG59Owp9Cn07CnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4+IHsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CnJldHVybiB7bSwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gbGFuZSAlIDMyOwpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CnJldHVybiB7biwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gOCAqIChpdGVtIC8gNCkgJSAzMiArIDQgKiAobGFuZSAvIDMyKSArIChpdGVtICUgNCk7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpyZXR1cm4ge24sIG19Owp9Cn07CnRlbXBsYXRlIDwKaW50IGJsb2NrX3NpemUsCmN1YmUgYmxvY2tfdGlsZSwKY3ViZSB3YXJwX3RpbGUsCnR5cGVuYW1lIGxvYWRfdHlwZSwKYm9vbCBwaXBlbGluZWRfbWFpbl9sb29wID0gZmFsc2UsCmJvb2wgZnVzZWRfdHJhbnNwb3NlID0gdHJ1ZQo+Cl9fZ2xvYmFsX18gX19sYXVuY2hfYm91bmRzX18oYmxvY2tfc2l6ZSkKdm9pZCBrZXJuZWwoCmNvbnN0IGZwOCogYSwKY29uc3QgZnA4KiBiLApjb25zdCBmcDMyKiBhcywKY29uc3QgZnAzMiogYnMsCmJmMTYqIGMsCmludCBtLAppbnQgbiwKaW50IGsKKSB7CmNvbnN0ZXhwciBpbnQgd2FycHMgPSBibG9ja19zaXplIC8gd2FycF9zaXplOwpjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGUubTsKY29uc3RleHByIGludCBibG9ja190aWxlX24gPSBibG9ja190aWxlLm47CmNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwoKCgpjb25zdGV4cHIgaW50IHdhcnBfdGlsZV9tID0gd2FycF90aWxlLm07CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGUubjsKY29uc3RleHByIGludCB3YXJwX3RpbGVfayA9IHdhcnBfdGlsZS5rOwpjb25zdGV4cHIgaW50IGNfdG90YWwgPSBibG9ja190aWxlX20gKiBibG9ja190aWxlX247CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9rICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2EpIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKc3RhdGljX2Fzc2VydChibG9ja190aWxlX24gKiBibG9ja190aWxlX2sgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYikgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgd2FycF90aWxlX20gPT0gMCwgIndhcnAgdGlsZSBNIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBNIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9rICUgd2FycF90aWxlX2sgPT0gMCwgIndhcnAgdGlsZSBLIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBLIik7CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19uID0gYmxvY2tfdGlsZV9uIC8gd2FycF90aWxlX247CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19rID0gYmxvY2tfdGlsZV9rIC8gd2FycF90aWxlX2s7CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tbiA9IHdhcnBfdGlsZXNfbSAqIHdhcnBfdGlsZXNfbjsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVzX20gPSB3YXJwcyA9PSAxID8gMSA6IDI7CmNvbnN0ZXhwciBpbnQgaW50cmFfd2FycF90aWxlc19uID0gd2FycHMgPT0gMSB8fCB3YXJwcyA9PSAyID8gMSA6IHdhcnBzID09IDQgPyAyIDogNDsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVfbSA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX20sIGludHJhX3dhcnBfdGlsZXNfbT4oKTsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVfbiA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX24sIGludHJhX3dhcnBfdGlsZXNfbj4oKTsKCmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tbl9wZXJfd2FycCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX21uLCB3YXJwcz4oKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVfbSAqIGludHJhX3dhcnBfdGlsZV9uID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsICJzYW5pdHkgY2hlY2siKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVzX20gKiBpbnRyYV93YXJwX3RpbGVzX24gPT0gd2FycHMsICJzYW5pdHkgY2hlY2siKTsKY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwp1c2luZyBtZm1hID0gbWZtYV9mMzJfZjhfZjg8d2FycF90aWxlX20sIHdhcnBfdGlsZV9uLCB3YXJwX3RpbGVfaz47CnVzaW5nIGZyZ19hX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfYV90eXBlOwp1c2luZyBmcmdfYl90eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2JfdHlwZTsKdXNpbmcgZnJnX2NfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19jX3R5cGU7CnVzaW5nIGluZGV4ZXIgPSBtZm1hX2luZGV4ZXI8bWZtYT47CnVzaW5nIGJsb2NrX2xvYWRlcl9hID0gYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbSwgYmxvY2tfdGlsZV9rLCBsb2FkX3R5cGUsIGZ1c2VkX3RyYW5zcG9zZT47CnVzaW5nIGJsb2NrX2xvYWRlcl9iID0gYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbiwgYmxvY2tfdGlsZV9rLCBsb2FkX3R5cGUsIGZ1c2VkX3RyYW5zcG9zZT47CmNvbnN0ZXhwciBpbnQgY19wZXJfdGhyZWFkID0gY190b3RhbCAvIGJsb2NrX3NpemU7CnN0YXRpY19hc3NlcnQoY19wZXJfdGhyZWFkID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiBmcmdfY190eXBlOjppdGVtc19wZXJfdGhyZWFkLCAic2FuaXR5IGNoZWNrIik7CmNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKY29uc3QgaW50IHdhcnAgPSB0aWQgLyB3YXJwX3NpemU7CmNvbnN0IGludCBsYW5lID0gX19sYW5lX2lkKCk7Cgpjb25zdCBpbnQgdGlfbSA9IGdyaWREaW0ueCAtIGJsb2NrSWR4LnggLSAxOwpjb25zdCBpbnQgdGlfbiA9IGdyaWREaW0ueSAtIGJsb2NrSWR4LnkgLSAxOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX2ltID0gd2FycCAlIGludHJhX3dhcnBfdGlsZXNfbTsKY29uc3QgaW50IGludHJhX3dhcnBfdGlsZV9pbiA9IHdhcnAgLyBpbnRyYV93YXJwX3RpbGVzX207CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfb20gPSBpbnRyYV93YXJwX3RpbGVfaW0gKiBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tLCBpbnRyYV93YXJwX3RpbGVzX20+KCk7CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfb24gPSBpbnRyYV93YXJwX3RpbGVfaW4gKiBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19uLCBpbnRyYV93YXJwX3RpbGVzX24+KCk7CmludCBzbiA9IGNlaWxfZGl2KG4sIDEyOCk7CgpmcmdfY190eXBlIGJsb2NrX2NfZnJnW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewpibG9ja19jX2ZyZ1tpXVtqXS5jbGVhcigpOwp9KTsKX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIChibG9ja190aWxlX2sgKyA0KV07Cl9fc2hhcmVkX18gZnA4IGJsb2NrX3RpbGVfYltibG9ja190aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwpfX3NoYXJlZF9fIGZsb2F0IGJsb2NrX3RpbGVfc2NhbGluZ1tibG9ja19zaXplXTsKY29uc3QgYXV0byBsb2FkX2lucHV0ID0gWyZdKGludCBpKSB7CmZsb2F0IGZyZ19hczsKaWYgKHRpZCA8IDEyOCkgewpmcmdfYXMgPSBhc1tpIC8gMTI4ICogbSArIHRpX20gKiBibG9ja190aWxlX20gKyB0aWRdOwp9CmZsb2F0IGZyZ19icyA9IGJzW2kgLyAxMjggKiBzbiArIHRpX24gKiBibG9ja190aWxlX24gLyAxMjhdOwpjb25zdCBhdXRvIGZyZ19hID0gYmxvY2tfbG9hZGVyX2E6OmxvYWRfZnJvbV9nbG9iYWwoCmEsIG0sIGssIHRpX20gKiBibG9ja190aWxlX20sIGkKKTsKY29uc3QgYXV0byBmcmdfYiA9IGJsb2NrX2xvYWRlcl9iOjpsb2FkX2Zyb21fZ2xvYmFsKApiLCBuLCBrLCB0aV9uICogYmxvY2tfdGlsZV9uLCBpCik7CnJldHVybiBzdGQ6Om1ha2VfdHVwbGUoZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cn07CmNvbnN0IGF1dG8gc3RvcmVfaW5wdXQgPSBbJl0oaW50IGksIGNvbnN0IGF1dG8mIGZyZ19hLCBjb25zdCBhdXRvJiBmcmdfYiwgY29uc3QgYXV0byYgZnJnX2FzLCBjb25zdCBhdXRvJiBmcmdfYnMpIHsKYmxvY2tfbG9hZGVyX2E6OnN0b3JlX3RvX3NtZW0oYmxvY2tfdGlsZV9hLCBmcmdfYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaSk7CmJsb2NrX2xvYWRlcl9iOjpzdG9yZV90b19zbWVtKGJsb2NrX3RpbGVfYiwgZnJnX2IsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkpOwpibG9ja190aWxlX3NjYWxpbmdbdGlkXSA9IGZyZ19hcyAqIGZyZ19iczsKfTsKY29uc3QgYXV0byBtbWEgPSBbJl0oaW50IGkpIHsKZnJnX2FfdHlwZSBmcmdfYVtpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CnVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CmNvbnN0ZXhwciBpbnQgd3RrID0gd3RrX2Jhc2UgLyB3YXJwX3RpbGVfazsKdW5yb2xsPDAsIGZyZ19hX3R5cGU6OnJlZ2lzdGVyc19wZXJfdGhyZWFkLCAyPihbJl08aW50IG1rX3JlZz4gewpjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2EobGFuZSwgZnJnX2FfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobWtfcmVnKSk7CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CipyZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4oJmZyZ19hW2l3dG1dW2l3dG5dW3d0a10ucmVnc1tta19yZWddKSA9CipyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oJmJsb2NrX3RpbGVfYVtiaWsgKyBiaW0gKiAoYmxvY2tfdGlsZV9rICsgNCldKTsKfSk7Cn0pOwp9KTsKZnJnX2JfdHlwZSBmcmdfYltpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CnVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CmNvbnN0ZXhwciBpbnQgd3RrID0gd3RrX2Jhc2UgLyB3YXJwX3RpbGVfazsKdW5yb2xsPDAsIGZyZ19iX3R5cGU6OnJlZ2lzdGVyc19wZXJfdGhyZWFkLCAyPihbJl08aW50IG5rX3JlZz4gewpjb25zdCBhdXRvIFttZm1hX2luLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2IobGFuZSwgZnJnX2JfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobmtfcmVnKSk7CmNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CmNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CipyZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4oJmZyZ19iW2l3dG1dW2l3dG5dW3d0a10ucmVnc1tua19yZWddKSA9CipyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oJmJsb2NrX3RpbGVfYltiaWsgKyBiaW4gKiAoYmxvY2tfdGlsZV9rICsgNCldKTsKfSk7Cn0pOwp9KTsKZnJnX2NfdHlwZSB3YXJwX2ZyZ19jW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewp3YXJwX2ZyZ19jW2ldW2pdLmNsZWFyKCk7Cn0pOwoKdW5yb2xsM2Q8aW50cmFfd2FycF90aWxlX20sIGludHJhX3dhcnBfdGlsZV9uLCB3YXJwX3RpbGVzX2s+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCB3dGs+IHsKbWZtYTo6ZXhlY3V0ZSgKd2FycF9mcmdfY1tpd3RtXVtpd3RuXSwKZnJnX2FbaXd0bV1baXd0bl1bd3RrXSwKZnJnX2JbaXd0bV1baXd0bl1bd3RrXQopOwp9KTsKCnVucm9sbDNkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbiwgZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IG1uX2l0ZW0+IHsKY29uc3QgaW50IHd0bSA9IGludHJhX3dhcnBfdGlsZV9vbSArIGl3dG07CmNvbnN0IGludCB3dG4gPSBpbnRyYV93YXJwX3RpbGVfb24gKyBpd3RuOwpjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2luXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2MobGFuZSwgbW5faXRlbSk7CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmJsb2NrX2NfZnJnW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXSArPSB3YXJwX2ZyZ19jW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXQoqIGJsb2NrX3RpbGVfc2NhbGluZ1tiaW1dOwp9KTsKfTsKaWYgY29uc3RleHByICghcGlwZWxpbmVkX21haW5fbG9vcCkgewoKZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpjb25zdCBhdXRvIFtmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzXSA9IGxvYWRfaW5wdXQoaSk7CnN0b3JlX2lucHV0KGksIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwpfX3N5bmN0aHJlYWRzKCk7Cm1tYShpKTsKX19zeW5jdGhyZWFkcygpOwp9Cn0gZWxzZSB7CgppbnQgaSA9IDA7CmF1dG8gW2ZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnNdID0gbG9hZF9pbnB1dChpKTsKc3RvcmVfaW5wdXQoaSwgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cl9fc3luY3RocmVhZHMoKTsKZm9yICg7IGkgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7CgptbWEoaSk7Cl9fc3luY3RocmVhZHMoKTsKc3RvcmVfaW5wdXQoaSArIGJsb2NrX3RpbGVfaywgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cl9fc3luY3RocmVhZHMoKTsKfQptbWEoaSk7Cn0KCgpjb25zdCBpbnQgaW1fYmFzZSA9IHRpX20gKiBibG9ja190aWxlX207CmNvbnN0IGludCBpbl9iYXNlID0gdGlfbiAqIGJsb2NrX3RpbGVfbjsKYXV0byBidWYgPSBidWZmZXI8YmYxNj4oYywgbSAqIG4pOwp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCBtbl9pdGVtPiB7CmNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaW5dID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYyhsYW5lLCBtbl9pdGVtKTsKY29uc3QgaW50IHd0bSA9IGludHJhX3dhcnBfdGlsZV9vbSArIGl3dG07CmNvbnN0IGludCB3dG4gPSBpbnRyYV93YXJwX3RpbGVfb24gKyBpd3RuOwpjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwpjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwpjb25zdCBpbnQgaW0gPSBpbV9iYXNlICsgYmltOwpjb25zdCBpbnQgaW4gPSBpbl9iYXNlICsgYmluOwpjb25zdCBhdXRvIHZhbCA9IGJmMTZfZnJvbV9mcDMyKGJsb2NrX2NfZnJnW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXSk7CmJ1Zi5zdG9yZTxjb2hlcmVuY3k6Om5vbl90ZW1wb3JhbD4odmFsLCAwLCBpbSAqIG4gKyBpbiwgaW0gPCBtICYmIGluIDwgbik7Cn0pOwp9Cl9fZGV2aWNlX18Kdm9pZCB0cmFuc3Bvc2VfbWF0cml4KApmcDgqIG91dHB1dCwKY29uc3QgZnA4KiBpbnB1dCwKaW50IG0sCmludCBuLAppbnQgYmxvY2tfeCwKaW50IGJsb2NrX3kKKSB7CmF1dG8gaW4gPSBidWZmZXI8Y29uc3QgdWludDhfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oaW5wdXQpLCBtICogbik7CmF1dG8gb3V0ID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KG91dHB1dCksIG4gKiBtKTsKY29uc3QgYXV0byB0aWQgPSB0aHJlYWRJZHgueDsKY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSAxNjsKX19zaGFyZWRfXyB1aW50OF90IHRtcFs2OCAqIDY0XTsKY29uc3QgYXV0byBibSA9IGJsb2NrX3ggKiA2NDsKY29uc3QgYXV0byBibiA9IGJsb2NrX3kgKiA2NDsKewpjb25zdCBpbnQgaSA9IHRpZCAqIGl0ZW1zX3Blcl90aHJlYWQ7CmNvbnN0IGludCBvID0gYm0gKyBibiAqIG07CmNvbnN0IGludCB4ID0gaSAvIDY0Owpjb25zdCBpbnQgeSA9IGkgJSA2NDsKY29uc3QgYXV0byBpdGVtcyA9IGluLmxvYWQ8aXRlbXNfcGVyX3RocmVhZCwgY29oZXJlbmN5Ojpub25fdGVtcG9yYWw+KG8sIHggKiBtICsgeSk7CipyZWludGVycHJldF9jYXN0PF9fdWludDEyOF90Kj4oJnRtcFt4ICogNjggKyB5XSkgPSBzdGQ6OmJpdF9jYXN0PF9fdWludDEyOF90PihpdGVtcyk7Cn0KX19zeW5jdGhyZWFkcygpOwp7CmNvbnN0IGludCBpID0gdGlkICogaXRlbXNfcGVyX3RocmVhZDsKY29uc3QgaW50IG8gPSBibSAqIG4gKyBibjsKY29uc3QgaW50IHggPSBpICUgNjQ7CmNvbnN0IGludCB5ID0gaSAvIDY0OwpzdGQ6OmFycmF5PHVpbnQ4X3QsIGl0ZW1zX3Blcl90aHJlYWQ+IGl0ZW1zOwpmb3IgKGludCBqID0gMDsgaiA8IGl0ZW1zX3Blcl90aHJlYWQ7ICsraikgewpjb25zdCBpbnQgYnggPSAoaSArIGopIC8gNjQ7CmNvbnN0IGludCBieSA9IChpICsgaikgJSA2NDsKaXRlbXNbal0gPSB0bXBbYnggKyBieSAqIDY4XTsKfQpvdXQuc3RvcmU8Y29oZXJlbmN5OjpjYWNoZV9hbGw+KAppdGVtcywKbywKeCArIHkgKiBuCik7Cn0KfQpfX2dsb2JhbF9fIF9fbGF1bmNoX2JvdW5kc19fKDI1NikKdm9pZCB0cmFuc3Bvc2VfZmFzdGVyX2Z1c2VkKApmcDgqIG91dHB1dF9hLApmcDgqIG91dHB1dF9iLApjb25zdCBmcDgqIGlucHV0X2EsCmNvbnN0IGZwOCogaW5wdXRfYiwKaW50IG0sCmludCBuLAppbnQgaywKaW50IG1fYmxvY2tzCikgewpjb25zdCBpbnQgeCA9IGJsb2NrSWR4Lng7CmNvbnN0IGludCB5ID0gYmxvY2tJZHgueTsKaWYgKHggPCBtX2Jsb2Nrcykgewp0cmFuc3Bvc2VfbWF0cml4KApvdXRwdXRfYSwKaW5wdXRfYSwKbSwKaywKeCwKeQopOwp9IGVsc2Ugewp0cmFuc3Bvc2VfbWF0cml4KApvdXRwdXRfYiwKaW5wdXRfYiwKbiwKaywKeCAtIG1fYmxvY2tzLAp5Cik7Cn0KfQpmcDgqIHRtcF9hVCA9IG51bGxwdHI7CmZwOCogdG1wX2JUID0gbnVsbHB0cjsKaW50IHByZXZfbSA9IDA7CmludCBwcmV2X24gPSAwOwppbnQgcHJldl9rID0gMDsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLApjdWJlIGJsb2NrX3RpbGUsCmN1YmUgd2FycF90aWxlLApib29sIHBpcGVsaW5lZF9tYWluX2xvb3AgPSBmYWxzZSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlLAp0eXBlbmFtZSBsb2FkX3R5cGUgPSBfX3VpbnQxMjhfdAo+CnZvaWQgcnVuX2tlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgaywKYm9vbCBtZWFzdXJlCikgewpjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKY29uc3QgaW50IGdyaWRfbiA9IGNlaWxfZGl2KG4sIGJsb2NrX3RpbGUubik7Cmtlcm5lbDwKYmxvY2tfc2l6ZSwKYmxvY2tfdGlsZSwKd2FycF90aWxlLApsb2FkX3R5cGUsCnBpcGVsaW5lZF9tYWluX2xvb3AKPjw8PApkaW0zKGdyaWRfbSwgZ3JpZF9uKSwKZGltMyhibG9ja19zaXplKSwKMAo+Pj4oCmZ1c2VkX3RyYW5zcG9zZSA/IGEgOiB0bXBfYVQsCmZ1c2VkX3RyYW5zcG9zZSA/IGIgOiB0bXBfYlQsCmFzLApicywKYywKbSwKbiwKawopOwpISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CnZvaWQgcnVuKAp1aW50cHRyX3QgYV9wdHIsCnVpbnRwdHJfdCBiX3B0ciwKdWludHB0cl90IGFzX3B0ciwKdWludHB0cl90IGJzX3B0ciwKdWludHB0cl90IGNfcHRyLAppbnQgbSwKaW50IG4sCmludCBrLApib29sIG1lYXN1cmUKKSB7Cgphc3NlcnQoYV9wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGJfcHRyICUgMTYgPT0gMCk7CmFzc2VydChhc19wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGJzX3B0ciAlIDE2ID09IDApOwphc3NlcnQoY19wdHIgJSAxNiA9PSAwKTsKY29uc3QgYXV0byogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwpjb25zdCBhdXRvKiBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihiX3B0cik7CmNvbnN0IGF1dG8qIGFzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDMyKj4oYXNfcHRyKTsKY29uc3QgYXV0byogYnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihic19wdHIpOwphdXRvKiBjID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oY19wdHIpOwppZiAobSA9PSAxMDI0ICYmIG4gPT0gMTUzNiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDMwNzIgJiYgayA9PSAxNTM2KSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1NzYgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjU2KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyMDQ4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNDYwOCAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIzMDQpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1MTIgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSAxNTM2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSAzMDcyICYmIGsgPT0gMTUzNikgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDU3NiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDI1NikgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgZmFsc2UsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIwNDgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0NjA4ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDcxNjggJiYgayA9PSAyMzA0KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNTEyICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXsxNiwgMTYsIDMyfSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9Cn0KUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewptLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCIsICItV2Vycm9yIl0sCiAgICBidWlsZF9kaXJlY3Rvcnk9Ii93b3Jrc3BhY2UvYnVpbGQvIiBpZiBURVNUSU5HID09ICJ2c2NvZGUiIGVsc2UgIi9ncHVtb2RlL2FtZC9mcDgvYnVpbGQvIiBpZiBURVNUSU5HIGlzIG5vdCBOb25lIGVsc2UgTm9uZSwKICAgICoqKHsnbm9faW1wbGljaXRfaGVhZGVycyc6IFRydWV9IGlmIFRFU1RJTkcgIT0gInZzY29kZSIgZWxzZSB7fSksCikKCmZpcnN0ID0gVHJ1ZQoKY2FjaGVfbSA9IDAKY2FjaGVfbiA9IDAKY2FjaGVfayA9IDAKY2FjaGVfaSA9IDAKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgZ2xvYmFsIGZpcnN0CiAgICBpZiBmaXJzdDoKICAgICAgICBwcmludCgiZXhlY3V0aW5nIG9uIiwgdG9yY2guY3VkYS5nZXRfZGV2aWNlX25hbWUoKSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIGZpcnN0ID0gRmFsc2UKCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQoKICAgICMgYSA9IGEuY29udGlndW91cygpCiAgICAjIGIgPSBiLmNvbnRpZ3VvdXMoKQoKICAgIG0sIG4gPSBjLnNoYXBlCiAgICBrID0gYS5zaGFwZVsxXQoKICAgIGdsb2JhbCBjYWNoZV9tCiAgICBnbG9iYWwgY2FjaGVfbgogICAgZ2xvYmFsIGNhY2hlX2sKICAgIGdsb2JhbCBjYWNoZV9pCgogICAgaWYgY2FjaGVfbSAhPSBtIG9yIGNhY2hlX24gIT0gbiBvciBjYWNoZV9rICE9IGs6CiAgICAgICAgY2FjaGVfbSA9IG0KICAgICAgICBjYWNoZV9uID0gbgogICAgICAgIGNhY2hlX2sgPSBrCiAgICAgICAgY2FjaGVfaSA9IDAKICAgIGVsc2U6CiAgICAgICAgY2FjaGVfaSArPSAxCgogICAgIyBEb24ndCBjaGVjayB0aGUgcGVyZm9ybWFuY2Ugb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiB0byBhbGxvdyBmb3Igc29tZSB3YXJtdXAKICAgIG1lYXN1cmUgPSBGYWxzZQogICAgaWYgY2FjaGVfaSA9PSAxOgogICAgICAgIG1lYXN1cmUgPSBUcnVlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMK
No newline at end of file

Best evidence level for this revision: reported

JSON