Ly8gVGhpcyBzbWFsbCBwcm9ncmFtIGNvbXB1dGVzIGEgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybS4gIEl0IHRlc3RzCi8vIFZhbGdyaW5kJ3MgaGFuZGxpbmcgb2YgRlAgb3BlcmF0aW9ucy4gIEl0IGlzIHJlcHJlc2VudGF0aXZlIG9mIGFsbAovLyBwcm9ncmFtcyB0aGF0IGRvIGEgbG90IG9mIEZQIG9wZXJhdGlvbnMuCgovLyBMaWNlbnNpbmc6IFRoaXMgcHJvZ3JhbSBpcyBjbG9zZWx5IGJhc2VkIG9uIHRoZSBvbmUgb2YgdGhlIHNhbWUgbmFtZSBmcm9tCi8vIGh0dHA6Ly93d3cuZm91cm1pbGFiLmNoLy4gIFRoZSBmcm9udCBwYWdlIG9mIHRoYXQgc2l0ZSBzYXlzOgovLwovLyAgICJFeGNlcHQgZm9yIGEgZmV3IGNsZWFybHktbWFya2VkIGV4Y2VwdGlvbnMsIGFsbCB0aGUgbWF0ZXJpYWwgb24gdGhpcwovLyAgIHNpdGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4gYW5kIG1heSBiZSB1c2VkIGluIGFueSBtYW5uZXIgd2l0aG91dAovLyAgIHBlcm1pc3Npb24sIHJlc3RyaWN0aW9uLCBhdHRyaWJ1dGlvbiwgb3IgY29tcGVuc2F0aW9uLiIKCi8qCgoJVHdvLWRpbWVuc2lvbmFsIEZGVCBiZW5jaG1hcmsKCglEZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgYnkgSm9obiBXYWxrZXIgaW4gQXByaWwgb2YgMTk4OS4KCglUaGlzICBiZW5jaG1hcmsgZXhlY3V0ZXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBhc3NlcyAoZGVmYXVsdAoJMjApIHRocm91Z2ggYSBsb29wIGluIHdoaWNoIGVhY2ggIGl0ZXJhdGlvbiAgcGVyZm9ybXMgIGEgIGZhc3QKCUZvdXJpZXIgdHJhbnNmb3JtIG9mIGEgc3F1YXJlIG1hdHJpeCAoZGVmYXVsdCBzaXplIDI1NngyNTYpIG9mCgljb21wbGV4IG51bWJlcnMgKGRlZmF1bHQgcHJlY2lzaW9uIGRvdWJsZSksICBmb2xsb3dlZCAgYnkgIHRoZQoJaW52ZXJzZSAgdHJhbnNmb3JtLiAgIEFmdGVyICBhbGwgbG9vcCBpdGVyYXRpb25zIGFyZSBwZXJmb3JtZWQKCXRoZSByZXN1bHRzIGFyZSBjaGVja2VkIGFnYWluc3Qga25vd24gY29ycmVjdCB2YWx1ZXMuCgoJVGhpcyBiZW5jaG1hcmsgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbiBDIGltcGxlbWVudGF0aW9ucyAgd2hpY2gKICAgICAgICBkZWZpbmUgICJpbnQiICBhcyAgMzIgYml0cyBvciBsb25nZXIgYW5kIHBlcm1pdCBhbGxvY2F0aW9uIGFuZAoJZGlyZWN0IGFkZHJlc3Npbmcgb2YgYXJyYXlzIGxhcmdlciB0aGFuIG9uZSBtZWdhYnl0ZS4KCglJZiBDQVBPVVQgaXMgZGVmaW5lZCwgIHRoZSAgcmVzdWx0ICBhZnRlciAgYWxsCWl0ZXJhdGlvbnMgIGlzCgl3cml0dGVuICBhcyAgYQlDQSAgTGFiICBwYXR0ZXJuICBmaWxlLiAgIFRoaXMgaXMgaW50ZW5kZWQgZm9yCglkZWJ1Z2dpbmcgaW4gY2FzZSBob3JyaWJseSB3cm9uZyByZXN1bHRzICBhcmUgIG9idGFpbmVkICBvbiAgYQoJZ2l2ZW4gbWFjaGluZS4KCglBcmNoaXZhbCAgdGltaW5ncyAgYXJlCXJ1biAgd2l0aCB0aGUgZGVmaW5pdGlvbnMgYmVsb3cgc2V0IGFzCglmb2xsb3dzOiBGbG9hdCA9IGRvdWJsZSwgQXNpemUgPSAyNTYsIFBhc3NlcyA9IDIwLCBDQVBPVVQgIG5vdAoJZGVmaW5lZC4KCglUaW1lIChzZWNvbmRzKQkJICAgIFN5c3RlbQoKICAgICAgICAgICAgMjM5My45MyAgICAgICBTdW4gMy8yNjAsIFN1bk9TIDMuNCwgQywgIi1mNjg4ODEgLU8iLgoJCQkgIChKb2huIFdhbGtlcikuCgogICAgICAgICAgICAxOTI4ICAgICAgICAgIE1hY2ludG9zaCBJSXgsIE1QVyBDIDMuMCwgIi1tYzY4MDIwCiAgICAgICAgICAgICAgICAgICAgICAgICAgLW1jNjg4ODEgLWVsZW1zODgxIC1tIi4gIChIdWdoIEhvb3ZlcikuCgogICAgICAgICAgICAxNjM2LjEgICAgICAgIFN1biA0LzExMCwgImNjIC1PMyAtbG0iLiAgKE1pY2hhZWwgTWNDbGFyeSkuCgkJCSAgVGhlIHN1c3BpY2lvbiBpcyB0aGF0IHRoaXMgaXMgc29mdHdhcmUKCQkJICBmbG9hdGluZyBwb2ludC4KCiAgICAgICAgICAgIDE1NTYuNyAgICAgICAgTWFjaW50b3NoIElJLCBBL1VYLCAiY2MgLU8gLWxtIgoJCQkgIChNaWNoYWVsIE1jQ2xhcnkpLgoKCSAgICAxMzg4LjgJICBTdW4gMzg2aS8yNTAsIFN1bk9TIDQuMC4xIEMKICAgICAgICAgICAgICAgICAgICAgICAgICAiLU8gL3Vzci9saWIvdHJpZy5pbCIuICAoSmFtZXMgQ2FycmluZ3RvbikuCgoJICAgIDEzMzEuOTMJICBTdW4gMy82MCwgU3VuT1MgNC4wLjEsIEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIi1PNCAtZjY4ODgxIC91c3IvbGliL2xpYm0uaWwiCgkJCSAgKEJvYiBFbG1hbikuCgogICAgICAgICAgICAxMjA0LjAgICAgICAgIEFwb2xsbyBEb21haW4gRE40MDAwLCBDLCAiLWNwdSAzMDAwIC1vcHQgNCIuCgkJCSAgKFNhbSBDcnVwaSkuCgoJICAgIDExNzQuNjYJICBDb21wYXEgMzg2LzI1LCBTQ08gWGVuaXggMzg2IEMuCgkJCSAgKFBldGVyIFNoaWVoKS4KCgkgICAgMTA2OAkgIENvbXBhcSAzODYvMjUsIFNDTyBYZW5peCAzODYsCgkJCSAgTWV0YXdhcmUgSGlnaCBDLiAgKFJvYmVydCBXZW5pZykuCgoJICAgIDEwNjQuMAkgIFN1biAzLzgwLCBTdW5PUyA0LjAuMyBCZXRhIEMKICAgICAgICAgICAgICAgICAgICAgICAgICAiLU8zIC1mNjg4ODEgL3Vzci9saWIvbGlibS5pbCIuICAoSmFtZXMgQ2FycmluZ3RvbikuCgoJICAgIDEwNjEuNAkgIENvbXBhcSAzODYvMjUsIFNDTyBYZW5peCwgSGlnaCBDIDEuNC4KCQkJICAoSmFtZXMgQ2FycmluZ3RvbikuCgoJICAgIDEwNTkuNzkJICBDb21wYXEgMzg2LzI1LCAzODcvMjUsIEhpZ2ggQyAxLjQsCgkJCSAgRE9TfEV4dGVuZGVyIDIuMiwgMzg3IGlubGluZSBjb2RlCgkJCSAgZ2VuZXJhdGlvbi4gIChOYXRoYW4gQmVuZGVyKS4KCgkgICAgIDc3Ny4xNAkgIENvbXBhcSAzODYvMjUsIElJVCAzQzg3LTI1ICgzODcgQ29tcGF0aWJsZSksCgkJCSAgSGlnaCBDIDEuNSwgRE9TfEV4dGVuZGVyIDIuMiwgMzg3IGlubGluZQoJCQkgIGNvZGUgZ2VuZXJhdGlvbi4gIChOYXRoYW4gQmVuZGVyKS4KCgkgICAgIDc1MQkgIENvbXBhcSBEZXNrUHJvIDM4Ni8zMywgSGlnaCBDIDEuNSArIERPU3xFeHRlbmRlciwKCQkJICAzODcgY29kZSBnZW5lcmF0aW9uLgkoSmFtZXMgQ2FycmluZ3RvbikuCgoJICAgICA0MzEuNDQJICBDb21wYXEgMzg2LzI1LCBXZWl0ZWsgMzE2Ny0yNSwgRE9TIDMuMzEsCgkJCSAgSGlnaCBDIDEuNCwgRE9TfEV4dGVuZGVyLCBXZWl0ZWsgY29kZSBnZW5lcmF0aW9uLgoJCQkgIChOYXRoYW4gQmVuZGVyKS4KCgkgICAgIDM0NC45CSAgQ29tcGFxIDQ4Ni8yNSwgTWV0YXdhcmUgSGlnaCBDIDEuNiwgUGhhciBMYXAKCQkJICBET1N8RXh0ZW5kZXIsIGluLWxpbmUgZmxvYXRpbmcgcG9pbnQuICAoTmF0aGFuCgkJCSAgQmVuZGVyKS4KCgkgICAgIDMyNC4yCSAgRGF0YSBHZW5lcmFsIE1vdG9yb2xhIDg4MDAwLCAxNiBNaHosIEdudSBDLgoKICAgICAgICAgICAgIDMyMy4xICAgICAgICBTdW4gNC8yODAsIEMsICItTzQiLiAgKEVyaWMgSGlsbCkuCgoJICAgICAyNTQJICBDb21wYXEgU3lzdGVtUHJvIDQ4Ni8zMywgSGlnaCBDIDEuNSArIERPU3xFeHRlbmRlciwKCQkJICAzODcgY29kZSBnZW5lcmF0aW9uLgkoSmFtZXMgQ2FycmluZ3RvbikuCgoJICAgICAyNDIuOAkgIFNpbGljb24gR3JhcGhpY3MgUGVyc29uYWwgSVJJUywgTUlQUyBSMjAwMEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuNSBNaHosICItTzMiIChoaWdoZXN0IGxldmVsIG9wdGltaXNhdGlvbikuCgkJCSAgKE1pa2UgWmVudG5lcikuCgogICAgICAgICAgICAgMjMzLjAgICAgICAgIFN1biBTUEFSQ1N0YXRpb24gMSwgQywgIi1PNCIsIFN1bk9TIDQuMC4zLgoJCQkgIChOYXRoYW4gQmVuZGVyKS4KCgkgICAgIDE4Ny4zMAkgIERFQyBQTUFYIDMxMDAsIE1JUFMgMjAwMCBjaGlwLgoJCQkgIChSb2JlcnQgV2VuaWcpLgoKICAgICAgICAgICAgIDEyMC40NiAgICAgICBTdW4gU3BhcmNTdGF0aW9uIDIsIEMsICItTzQiLCBTdW5PUyA0LjEuMS4KCQkJICAoSm9obiBXYWxrZXIpLgoKICAgICAgICAgICAgIDEyMC4yMSAgICAgICBERUMgM01BWCwgTUlQUyAzMDAwLCAiLU80Ii4KCgkgICAgICA5OC4wCSAgSW50ZWwgaTg2MCBleHBlcmltZW50YWwgZW52aXJvbm1lbnQsCgkJCSAgT1MvMiwgZGF0YSBjYWNoaW5nIGRpc2FibGVkLgkoS2VybgoJCQkgIFNpYmJhbGQpLgoKCSAgICAgIDM0LjkJICBTaWxpY29uIEdyYXBoaWNzIEluZGlnb7IsIE1JUFMgUjQ0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMTc1IE1oeiwgSVJJWCA1LjIsICItTyIuCgoJICAgICAgMzIuNAkgIFBlbnRpdW0gMTMzLCBXaW5kb3dzIE5ULCBNaWNyb3NvZnQgVmlzdWFsCgkJCSAgQysrIDQuMC4KCgkgICAgICAxNy4yNQkgIFNpbGljb24gR3JhcGhpY3MgSW5kaWdvsiwgTUlQUyBSNDQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAxNzUgTWh6LCBJUklYIDYuNSwgIi1PMyIuCgoJICAgICAgMTQuMTAJICBEZWxsIERpbWVuc2lvbiBYUFMgUjEwMCwgUGVudGl1bSBJSSA0MDAgTUh6LAoJCQkgIFdpbmRvd3MgOTgsIE1pY3Jvc29mdCBWaXN1YWwgQyA1LjAuCgoJICAgICAgMTAuNwkgIEhld2xldHQtUGFja2FyZCBLYXlhayBYVSA0NTBNaHogUGVudGl1bSBJSSwKCQkJICBNaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAsIFdpbmRvd3MgTlQgNC4wc3AzLgkoTmF0aGFuIEJlbmRlcikuCgoJICAgICAgIDUuMDkJICBTdW4gVWx0cmEgMiwgVWx0cmFTUEFSQyBWOSwgMzAwIE1IeiwgZ2NjIC1PMy4KCSAgICAgICAKCSAgICAgICAwLjg0NgkgIERlbGwgSW5zcGlyb24gOTEwMCwgUGVudGl1bSA0LCAzLjQgR0h6LCBnY2MgLU8zLgoKKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCi8qICBUaGUgIHByb2dyYW0gIG1heSAgYmUgIHJ1bgl3aXRoICBGbG9hdCBkZWZpbmVkIGFzIGVpdGhlciBmbG9hdCBvcgogICAgZG91YmxlLiAgV2l0aCBJRUVFIGFyaXRobWV0aWMsIHRoZSBzYW1lIGFuc3dlcnMgYXJlIGdlbmVyYXRlZCAgZm9yCiAgICBlaXRoZXIgZmxvYXRpbmcgcG9pbnQgbW9kZS4gICovCgojZGVmaW5lIEZsb2F0CSBkb3VibGUgCSAgIC8qIEZsb2F0aW5nIHBvaW50IHR5cGUgdXNlZCBpbiBGRlQgKi8KCiNkZWZpbmUgQXNpemUJIDI1NgkJICAgLyogQXJyYXkgZWRnZSBzaXplICovCiNkZWZpbmUgUGFzc2VzCSAyMAkJICAgLyogTnVtYmVyIG9mIEZGVC9JbnZlcnNlIHBhc3NlcyAqLwoKI2RlZmluZSBtYXgoYSxiKSAoKGEpPihiKT8oYSk6KGIpKQojZGVmaW5lIG1pbihhLGIpICgoYSk8PShiKT8oYSk6KGIpKQoKLyoKCglNdWx0aS1kaW1lbnNpb25hbCBmYXN0IEZvdXJpZXIgdHJhbnNmb3JtCgogICAgICAgIEFkYXB0ZWQgZnJvbSBQcmVzcyBldCBhbC4sICJOdW1lcmljYWwgUmVjaXBlcyBpbiBDIi4KCiovCgojZGVmaW5lIFNXQVAoYSxiKSB0ZW1wcj0oYSk7IChhKT0oYik7IChiKT10ZW1wcgoKc3RhdGljIHZvaWQgZm91cm4oZGF0YSwgbm4sIG5kaW0sIGlzaWduKQogIEZsb2F0IGRhdGFbXTsKICBpbnQgbm5bXSwgbmRpbSwgaXNpZ247CnsKCXJlZ2lzdGVyIGludCBpMSwgaTIsIGkzOwoJaW50IGkycmV2LCBpM3JldiwgaXAxLCBpcDIsIGlwMywgaWZwMSwgaWZwMjsKCWludCBpYml0LCBpZGltLCBrMSwgazIsIG4sIG5wcmV2LCBucmVtLCBudG90OwoJRmxvYXQgdGVtcGksIHRlbXByOwoJZG91YmxlIHRoZXRhLCB3aSwgd3BpLCB3cHIsIHdyLCB3dGVtcDsKCgludG90ID0gMTsKCWZvciAoaWRpbSA9IDE7IGlkaW0gPD0gbmRpbTsgaWRpbSsrKQoJICAgbnRvdCAqPSBubltpZGltXTsKCW5wcmV2ID0gMTsKCWZvciAoaWRpbSA9IG5kaW07IGlkaW0gPj0gMTsgaWRpbS0tKSB7CgkgICBuID0gbm5baWRpbV07CgkgICBucmVtID0gbnRvdCAvIChuICogbnByZXYpOwoJICAgaXAxID0gbnByZXYgPDwgMTsKCSAgIGlwMiA9IGlwMSAqIG47CgkgICBpcDMgPSBpcDIgKiBucmVtOwoJICAgaTJyZXYgPSAxOwoJICAgZm9yIChpMiA9IDE7IGkyIDw9IGlwMjsgaTIgKz0gaXAxKSB7CgkgICAgICBpZiAoaTIgPCBpMnJldikgewoJCSBmb3IgKGkxID0gaTI7IGkxIDw9IGkyICsgaXAxIC0gMjsgaTEgKz0gMikgewoJCSAgICBmb3IgKGkzID0gaTE7IGkzIDw9IGlwMzsgaTMgKz0gaXAyKSB7CgkJICAgICAgIGkzcmV2ID0gaTJyZXYgKyBpMyAtIGkyOwoJCSAgICAgICBTV0FQKGRhdGFbaTNdLCBkYXRhW2kzcmV2XSk7CgkJICAgICAgIFNXQVAoZGF0YVtpMyArIDFdLCBkYXRhW2kzcmV2ICsgMV0pOwoJCSAgICB9CgkJIH0KCSAgICAgIH0KCSAgICAgIGliaXQgPSBpcDIgPj4gMTsKCSAgICAgIHdoaWxlIChpYml0ID49IGlwMSAmJiBpMnJldiA+IGliaXQpIHsKCQkgaTJyZXYgLT0gaWJpdDsKCQkgaWJpdCA+Pj0gMTsKCSAgICAgIH0KCSAgICAgIGkycmV2ICs9IGliaXQ7CgkgICB9CgkgICBpZnAxID0gaXAxOwoJICAgd2hpbGUgKGlmcDEgPCBpcDIpIHsKCSAgICAgIGlmcDIgPSBpZnAxIDw8IDE7CgkgICAgICB0aGV0YSA9IGlzaWduICogNi4yODMxODUzMDcxNzk1OSAvIChpZnAyIC8gaXAxKTsKCSAgICAgIHd0ZW1wID0gc2luKDAuNSAqIHRoZXRhKTsKCSAgICAgIHdwciA9IC0yLjAgKiB3dGVtcCAqIHd0ZW1wOwoJICAgICAgd3BpID0gc2luKHRoZXRhKTsKCSAgICAgIHdyID0gMS4wOwoJICAgICAgd2kgPSAwLjA7CgkgICAgICBmb3IgKGkzID0gMTsgaTMgPD0gaWZwMTsgaTMgKz0gaXAxKSB7CgkJIGZvciAoaTEgPSBpMzsgaTEgPD0gaTMgKyBpcDEgLSAyOyBpMSArPSAyKSB7CgkJICAgIGZvciAoaTIgPSBpMTsgaTIgPD0gaXAzOyBpMiArPSBpZnAyKSB7CgkJICAgICAgIGsxID0gaTI7CgkJICAgICAgIGsyID0gazEgKyBpZnAxOwoJCSAgICAgICB0ZW1wciA9IHdyICogZGF0YVtrMl0gLSB3aSAqIGRhdGFbazIgKyAxXTsKCQkgICAgICAgdGVtcGkgPSB3ciAqIGRhdGFbazIgKyAxXSArIHdpICogZGF0YVtrMl07CgkJICAgICAgIGRhdGFbazJdID0gZGF0YVtrMV0gLSB0ZW1wcjsKCQkgICAgICAgZGF0YVtrMiArIDFdID0gZGF0YVtrMSArIDFdIC0gdGVtcGk7CgkJICAgICAgIGRhdGFbazFdICs9IHRlbXByOwoJCSAgICAgICBkYXRhW2sxICsgMV0gKz0gdGVtcGk7CgkJICAgIH0KCQkgfQoJCSB3ciA9ICh3dGVtcCA9IHdyKSAqIHdwciAtIHdpICogd3BpICsgd3I7CgkJIHdpID0gd2kgKiB3cHIgKyB3dGVtcCAqIHdwaSArIHdpOwoJICAgICAgfQoJICAgICAgaWZwMSA9IGlmcDI7CgkgICB9CgkgICBucHJldiAqPSBuOwoJfQp9CiN1bmRlZiBTV0FQCgppbnQgbWFpbigpCnsKCWludCBpLCBqLCBrLCBsLCBtLCBucGFzc2VzID0gUGFzc2VzLCBmYWVkZ2U7CglGbG9hdCAqZmRhdGEgLyogLCAqZmQgKi8gOwoJc3RhdGljIGludCBuc2l6ZVtdID0gezAsIDAsIDB9OwoJbG9uZyBmYW51bSwgZmFzaXplOwoJZG91YmxlIG1hcGJhc2UsIG1hcHNjYWxlLCAvKiB4LCAqLyBybWluLCBybWF4LCBpbWluLCBpbWF4OwoKCWZhZWRnZSA9IEFzaXplOyAJICAgLyogRkZUIGFycmF5IGVkZ2Ugc2l6ZSAqLwoJZmFudW0gPSBmYWVkZ2UgKiBmYWVkZ2U7ICAgLyogRWxlbWVudHMgaW4gRkZUIGFycmF5ICovCglmYXNpemUgPSAoKGZhbnVtICsgMSkgKiAyICogc2l6ZW9mKEZsb2F0KSk7IC8qIEZGVCBhcnJheSBzaXplICovCgluc2l6ZVsxXSA9IG5zaXplWzJdID0gZmFlZGdlOwoKCWZkYXRhID0gKEZsb2F0ICopIG1hbGxvYyhmYXNpemUpOwoJaWYgKGZkYXRhID09IE5VTEwpIHsKICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkNhbid0IGFsbG9jYXRlIGRhdGEgYXJyYXkuXG4iKTsKCSAgIGV4aXQoMSk7Cgl9CgoJLyogIEdlbmVyYXRlIGRhdGEgYXJyYXkgdG8gcHJvY2Vzcy4gICovCgojZGVmaW5lIFJlKHgseSkgZmRhdGFbMSArIChmYWVkZ2UgKiAoeCkgKyAoeSkpICogMl0KI2RlZmluZSBJbSh4LHkpIGZkYXRhWzIgKyAoZmFlZGdlICogKHgpICsgKHkpKSAqIDJdCgoJbWVtc2V0KGZkYXRhLCAwLCBmYXNpemUpOwoJZm9yIChpID0gMDsgaSA8IGZhZWRnZTsgaSsrKSB7CgkgICBmb3IgKGogPSAwOyBqIDwgZmFlZGdlOyBqKyspIHsKCSAgICAgIGlmICgoKGkgJiAxNSkgPT0gOCkgfHwgKChqICYgMTUpID09IDgpKQoJCSBSZShpLCBqKSA9IDEyOC4wOwoJICAgfQoJfQoKCWZvciAoaSA9IDA7IGkgPCBucGFzc2VzOyBpKyspIHsKLypwcmludGYoIlBhc3MgJWRcbiIsIGkpOyovCgkgICAvKiBUcmFuc2Zvcm0gaW1hZ2UgdG8gZnJlcXVlbmN5IGRvbWFpbi4gKi8KCSAgIGZvdXJuKGZkYXRhLCBuc2l6ZSwgMiwgMSk7CgoJICAgLyogIEJhY2stdHJhbnNmb3JtIHRvIGltYWdlLiAqLwoJICAgZm91cm4oZmRhdGEsIG5zaXplLCAyLCAtMSk7Cgl9CgoJewoJICAgZG91YmxlIHIsIGlqLCBhciwgYWk7CgkgICBybWluID0gMWUxMDsgcm1heCA9IC0xZTEwOwoJICAgaW1pbiA9IDFlMTA7IGltYXggPSAtMWUxMDsKCSAgIGFyID0gMDsKCSAgIGFpID0gMDsKCgkgICBmb3IgKGkgPSAxOyBpIDw9IGZhbnVtOyBpICs9IDIpIHsKCSAgICAgIHIgPSBmZGF0YVtpXTsKCSAgICAgIGlqID0gZmRhdGFbaSArIDFdOwoJICAgICAgYXIgKz0gcjsKCSAgICAgIGFpICs9IGlqOwoJICAgICAgcm1pbiA9IG1pbihyLCBybWluKTsKCSAgICAgIHJtYXggPSBtYXgociwgcm1heCk7CgkgICAgICBpbWluID0gbWluKGlqLCBpbWluKTsKCSAgICAgIGltYXggPSBtYXgoaWosIGltYXgpOwoJICAgfQojaWZkZWYgREVCVUcKICAgICAgICAgICBwcmludGYoIlJlYWwgbWluICUuNGcsIG1heCAlLjRnLiAgSW1hZ2luYXJ5IG1pbiAlLjRnLCBtYXggJS40Zy5cbiIsCgkgICAgICBybWluLCBybWF4LCBpbWluLCBpbWF4KTsKICAgICAgICAgICBwcmludGYoIkF2ZXJhZ2UgcmVhbCAlLjRnLCBpbWFnaW5hcnkgJS40Zy5cbiIsIAoJICAgICAgYXIgLyBmYW51bSwgYWkgLyBmYW51bSk7CiNlbmRpZgoJICAgbWFwYmFzZSA9IHJtaW47CgkgICBtYXBzY2FsZSA9IDI1NSAvIChybWF4IC0gcm1pbik7Cgl9CgoJLyogU2VlIGlmIHdlIGdvdCB0aGUgcmlnaHQgYW5zd2Vycy4gKi8KCgltID0gMDsKCWZvciAoaSA9IDA7IGkgPCBmYWVkZ2U7IGkrKykgewoJICAgZm9yIChqID0gMDsgaiA8IGZhZWRnZTsgaisrKSB7CgkgICAgICBrID0gKFJlKGksIGopIC0gbWFwYmFzZSkgKiBtYXBzY2FsZTsKCSAgICAgIGwgPSAoKChpICYgMTUpID09IDgpIHx8ICgoaiAmIDE1KSA9PSA4KSkgPyAyNTUgOiAwOwoJICAgICAgaWYgKGsgIT0gbCkgewoJCSBtKys7CgkJIGZwcmludGYoc3Rkb3V0LAogICAgICAgICAgICAgICAgICAgICJXcm9uZyBhbnN3ZXIgYXQgKCVkLCVkKSEgIEV4cGVjdGVkICVkLCBnb3QgJWQuXG4iLAoJCSAgICBpLCBqLCBsLCBrKTsKCSAgICAgIH0KCSAgIH0KCX0KCWlmIChtID09IDApIHsKICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVkIHBhc3Nlcy4gIE5vIGVycm9ycyBpbiByZXN1bHRzLlxuIiwgbnBhc3Nlcyk7Cgl9IGVsc2UgewogICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJWQgcGFzc2VzLiAgJWQgZXJyb3JzIGluIHJlc3VsdHMuXG4iLAoJICAgICAgbnBhc3NlcywgbSk7Cgl9CgojaWZkZWYgQ0FQT1VUCgoJLyogT3V0cHV0IHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybSBhcyBhIENBIExhYiBwYXR0ZXJuCgkgICBmaWxlIGZvciBkZWJ1Z2dpbmcuICovCgoJewojZGVmaW5lIFNDUlggIDMyMgojZGVmaW5lIFNDUlkgIDIwMAojZGVmaW5lIFNDUk4gIChTQ1JYICogU0NSWSkKCSAgIHVuc2lnbmVkIGNoYXIgcGF0YXJyW1NDUlldW1NDUlhdOwoJICAgRklMRSAqZnA7CgovKiAgTWFwIHVzZXIgZXh0ZXJuYWwgc3RhdGUgbnVtYmVycyB0byBpbnRlcm5hbCBzdGF0ZSBpbmRleCAgKi8KCiNkZWZpbmUgVXRvSSh4KSAgICAgKCgoKCh4KSA+PiAxKSAmIDB4N0YpIHwgKCh4KSA8PCA3KSkgJiAweEZGKQoKCSAgIC8qIENvcHkgZGF0YSBmcm9tIEZGVCBidWZmZXIgdG8gbWFwLiAqLwoKCSAgIG1lbXNldChwYXRhcnIsIDAsIHNpemVvZiBwYXRhcnIpOwoJICAgbCA9IChTQ1JYIC0gZmFlZGdlKSAvIDI7CgkgICBtID0gKGZhZWRnZSA+IFNDUlkpID8gMCA6ICgoU0NSWSAtIGZhZWRnZSkgLyAyKTsKCSAgIGZvciAoaSA9IDE7IGkgPCBmYWVkZ2U7IGkrKykgewoJICAgICAgZm9yIChqID0gMDsgaiA8IG1pbihTQ1JZLCBmYWVkZ2UpOyBqKyspIHsKCQkgayA9IChSZShpLCBqKSAtIG1hcGJhc2UpICogbWFwc2NhbGU7CgkJIHBhdGFycltqICsgbV1baSArIGxdID0gVXRvSShrKTsKCSAgICAgIH0KCSAgIH0KCgkgICAvKiBEdW1wIHBhdHRlcm4gbWFwIHRvIGZpbGUuICovCgogICAgICAgICAgIGZwID0gZm9wZW4oImZmdC5jYXAiLCAidyIpOwoJICAgaWYgKGZwID09IE5VTEwpIHsKICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlLlxuIik7CgkgICAgICBleGl0KDApOwoJICAgfQogICAgICAgICAgIHB1dGMoJzonLCBmcCk7CgkgICBwdXRjKDEsIGZwKTsKCSAgIGZ3cml0ZShwYXRhcnIsIFNDUk4sIDEsIGZwKTsKCSAgIHB1dGMoNiwgZnApOwoJICAgZmNsb3NlKGZwKTsKCX0KI2VuZGlmCgoJcmV0dXJuIDA7Cn0K