LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL2ZjLWxhbmcvZmMtbGFuZy5jLHYgMS4yIDIwMDIvMDcvMDcgMTk6MTg6NTEga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJmY2ludC5oIgoKLyoKICogZmMtbGFuZwogKgogKiBSZWFkIGEgc2V0IG9mIGxhbmd1YWdlIG9ydGhvZ3JhcGhpZXMgYW5kIGJ1aWxkIEMgZGVjbGFyYXRpb25zIGZvcgogKiBjaGFyc2V0cyB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIGxhbmd1YWdlcyBhcmUKICogc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSBuaWNlIGlmCiAqIHRoaXMgY291bGQgYmUgZG9uZSB3aGlsZSBjb21waWxpbmcgdGhlIGxpYnJhcnksIGJ1dCB0aGlzCiAqIGNvZGUgdXNlcyBhIG51bWJlciBvZiByb3V0aW5lcyBmcm9tIHRoZSBsaWJyYXJ5LiAgSXQncwogKiBleHBlZGlhbnQgdG8ganVzdCBzaGlwIHRoZSBwcmUtYnVpbHQgdmVyc2lvbiBhbG9uZyB3aXRoIHRoZQogKiBzb3VyY2Ugb3J0aG9ncmFwaGllcy4KICovCgpzdGF0aWMgdm9pZCAKZmF0YWwgKGNoYXIgKmZpbGUsIGludCBsaW5lbm8sIGNoYXIgKm1zZykKewogICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6ICVzXG4iLCBmaWxlLCBsaW5lbm8sIG1zZyk7CiAgICBleGl0ICgxKTsKfQoKc3RhdGljIGNoYXIgKgpnZXRfbGluZSAoRklMRSAqZiwgY2hhciAqbGluZSwgaW50ICpsaW5lbm8pCnsKICAgIGNoYXIgICAgKmhhc2g7CiAgICBpZiAoIWZnZXRzIChsaW5lLCAxMDI0LCBmKSkKCXJldHVybiAwOwogICAgKysoKmxpbmVubyk7CiAgICBoYXNoID0gc3RyY2hyIChsaW5lLCAnIycpOwogICAgaWYgKGhhc2gpCgkqaGFzaCA9ICdcMCc7CiAgICBpZiAobGluZVswXSA9PSAnXDAnIHx8IGxpbmVbMF0gPT0gJ1xuJyB8fCBsaW5lWzBdID09ICdcMDMyJyB8fCBsaW5lWzBdID09ICdccicpCglyZXR1cm4gZ2V0X2xpbmUgKGYsIGxpbmUsIGxpbmVubyk7CiAgICByZXR1cm4gbGluZTsKfQoKLyoKICogYnVpbGQgYSBzaW5nbGUgY2hhcnNldCBmcm9tIGEgc291cmNlIGZpbGUKICoKICogVGhlIGZpbGUgZm9ybWF0IGlzIHF1aXRlIHNpbXBsZSwgZWl0aGVyCiAqIGEgc2luZ2xlIGhleCB2YWx1ZSBvciBhIHBhaXIgc2VwYXJhdGVkIHdpdGggYSBkYXNoCiAqCiAqIENvbW1lbnRzIGJlZ2luIHdpdGggJyMnCiAqLwoKc3RhdGljIEZjQ2hhclNldCAqCnNjYW4gKEZJTEUgKmYsIGNoYXIgKmZpbGUpCnsKICAgIEZjQ2hhclNldAkqYyA9IDA7CiAgICBGY0NoYXJTZXQJKm47CiAgICBpbnQJCXN0YXJ0LCBlbmQsIHVjczQ7CiAgICBjaGFyCWxpbmVbMTAyNF07CiAgICBpbnQJCWxpbmVubyA9IDA7CgogICAgd2hpbGUgKGdldF9saW5lIChmLCBsaW5lLCAmbGluZW5vKSkKICAgIHsKCWlmICghc3RybmNtcCAobGluZSwgImluY2x1ZGUiLCA3KSkKCXsKCSAgICBmaWxlID0gc3RyY2hyIChsaW5lLCAnICcpOwoJICAgIHdoaWxlICgqZmlsZSA9PSAnICcpCgkJZmlsZSsrOwoJICAgIGVuZCA9IHN0cmxlbiAoZmlsZSk7CgkgICAgaWYgKGZpbGVbZW5kLTFdID09ICdcbicpCgkJZmlsZVtlbmQtMV0gPSAnXDAnOwoJICAgIGYgPSBmb3BlbiAoZmlsZSwgInIiKTsKCSAgICBpZiAoIWYpCgkJZmF0YWwgKGZpbGUsIDAsICJjYW4ndCBvcGVuIik7CgkgICAgYyA9IHNjYW4gKGYsIGZpbGUpOwoJICAgIGZjbG9zZSAoZik7CgkgICAgcmV0dXJuIGM7Cgl9CglpZiAoc3RyY2hyIChsaW5lLCAnLScpKQoJewoJICAgIGlmIChzc2NhbmYgKGxpbmUsICIleC0leCIsICZzdGFydCwgJmVuZCkgIT0gMikKCQlmYXRhbCAoZmlsZSwgbGluZW5vLCAicGFyc2UgZXJyb3IiKTsKCX0KCWVsc2UKCXsKCSAgICBpZiAoc3NjYW5mIChsaW5lLCAiJXgiLCAmc3RhcnQpICE9IDEpCgkJZmF0YWwgKGZpbGUsIGxpbmVubywgInBhcnNlIGVycm9yIik7CgkgICAgZW5kID0gc3RhcnQ7Cgl9CglpZiAoIWMpCgkgICAgYyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKCWZvciAodWNzNCA9IHN0YXJ0OyB1Y3M0IDw9IGVuZDsgdWNzNCsrKQoJewoJICAgIGlmICghRmNDaGFyU2V0QWRkQ2hhciAoYywgdWNzNCkpCgkJZmF0YWwgKGZpbGUsIGxpbmVubywgIm91dCBvZiBtZW1vcnkiKTsKCX0KICAgIH0KICAgIG4gPSBGY0NoYXJTZXRGcmVlemUgKGMpOwogICAgRmNDaGFyU2V0RGVzdHJveSAoYyk7CiAgICByZXR1cm4gbjsKfQoKLyoKICogQ29udmVydCBhIGZpbGUgbmFtZSBpbnRvIGEgbmFtZSBzdWl0YWJsZSBmb3IgQyBkZWNsYXJhdGlvbnMKICovCnN0YXRpYyBjaGFyICoKZ2V0X25hbWUgKGNoYXIgKmZpbGUpCnsKICAgIGNoYXIgICAgKm5hbWU7CiAgICBjaGFyICAgICpkb3Q7CgogICAgZG90ID0gc3RyY2hyIChmaWxlLCAnLicpOwogICAgaWYgKCFkb3QpCglkb3QgPSBmaWxlICsgc3RybGVuKGZpbGUpOwogICAgbmFtZSA9IG1hbGxvYyAoZG90IC0gZmlsZSArIDEpOwogICAgc3RybmNweSAobmFtZSwgZmlsZSwgZG90IC0gZmlsZSk7CiAgICBuYW1lW2RvdC1maWxlXSA9ICdcMCc7CiAgICByZXR1cm4gbmFtZTsKfQoKLyoKICogQ29udmVydCBhIEMgbmFtZSBpbnRvIGEgbGFuZ3VhZ2UgbmFtZQogKi8Kc3RhdGljIGNoYXIgKgpnZXRfbGFuZyAoY2hhciAqbmFtZSkKewogICAgY2hhciAgICAqbGFuZyA9IG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwogICAgY2hhciAgICAqbCA9IGxhbmc7CiAgICBjaGFyICAgIGM7CgogICAgd2hpbGUgKChjID0gKm5hbWUrKykpCiAgICB7CglpZiAoaXN1cHBlciAoYykpCgkgICAgYyA9IHRvbG93ZXIgKGMpOwoJaWYgKGMgPT0gJ18nKQoJICAgIGMgPSAnLSc7CglpZiAoYyA9PSAnICcpCgkgICAgY29udGludWU7CgkqbCsrID0gYzsKICAgIH0KICAgICpsKysgPSAnXDAnOwogICAgcmV0dXJuIGxhbmc7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZSAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKewogICAgY29uc3QgRmNDaGFyOCAgICAqY29uc3QgKmFzID0gYSwgKmNvbnN0ICpicyA9IGI7CiAgICByZXR1cm4gRmNTdHJDbXBJZ25vcmVDYXNlICgqYXMsICpicyk7Cn0KCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGNoYXIJKmZpbGVzWzEwMjRdOwogICAgRmNDaGFyU2V0CSpzZXRzWzEwMjRdOwogICAgaW50CQlkdXBsaWNhdGVbMTAyNF07CiAgICBjaGFyCSpuYW1lc1sxMDI0XTsKICAgIEZJTEUJKmY7CiAgICBpbnQJCWkgPSAwOwogICAgRmNDaGFyTGVhZgkqKmxlYXZlcywgKipzbGVhdmVzOwogICAgaW50CQl0b3RhbF9sZWF2ZXMgPSAwOwogICAgaW50CQlsLCBzbCwgdGw7CiAgICBjaGFyCWxpbmVbMTAyNF07CiAgICAKICAgIHdoaWxlICgqKythcmd2KQoJZmlsZXNbaSsrXSA9ICphcmd2OwogICAgZmlsZXNbaV0gPSAwOwogICAgcXNvcnQgKGZpbGVzLCBpLCBzaXplb2YgKGNoYXIgKiksIGNvbXBhcmUpOwogICAgaSA9IDA7CiAgICB3aGlsZSAoZmlsZXNbaV0pCiAgICB7CglmID0gZm9wZW4gKGZpbGVzW2ldLCAiciIpOwoJaWYgKCFmKQoJICAgIGZhdGFsIChmaWxlc1tpXSwgMCwgc3RyZXJyb3IgKGVycm5vKSk7CglzZXRzW2ldID0gc2NhbiAoZiwgZmlsZXNbaV0pOwoJbmFtZXNbaV0gPSBnZXRfbmFtZSAoZmlsZXNbaV0pOwoJdG90YWxfbGVhdmVzICs9IHNldHNbaV0tPm51bTsKCWkrKzsKCWZjbG9zZSAoZik7CiAgICB9CiAgICBzZXRzW2ldID0gMDsKICAgIGxlYXZlcyA9IG1hbGxvYyAodG90YWxfbGVhdmVzICogc2l6ZW9mIChGY0NoYXJMZWFmICopKTsKICAgIHRsID0gMDsKICAgIC8qCiAgICAgKiBGaW5kIHVuaXF1ZSBsZWF2ZXMKICAgICAqLwogICAgZm9yIChpID0gMDsgc2V0c1tpXTsgaSsrKQogICAgewoJc2xlYXZlcyA9IHNldHNbaV0tPmxlYXZlczsKCWZvciAoc2wgPSAwOyBzbCA8IHNldHNbaV0tPm51bTsgc2wrKykKCXsKCSAgICBmb3IgKGwgPSAwOyBsIDwgdGw7IGwrKykKCQlpZiAobGVhdmVzW2xdID09IHNsZWF2ZXNbc2xdKQoJCSAgICBicmVhazsKCSAgICBpZiAobCA9PSB0bCkKCQlsZWF2ZXNbdGwrK10gPSBzbGVhdmVzW3NsXTsKCX0KICAgIH0KCiAgICAvKgogICAgICogU2NhbiB0aGUgaW5wdXQgdW50aWwgdGhlIG1hcmtlciBpcyBmb3VuZAogICAgICovCiAgICAKICAgIHdoaWxlIChmZ2V0cyAobGluZSwgc2l6ZW9mIChsaW5lKSwgc3RkaW4pKQogICAgewoJaWYgKCFzdHJuY21wIChsaW5lLCAiQEBAIiwgMykpCgkgICAgYnJlYWs7CglmcHV0cyAobGluZSwgc3Rkb3V0KTsKICAgIH0KICAgIAogICAgcHJpbnRmICgiLyogdG90YWwgc2l6ZTogJWQgdW5pcXVlIGxlYXZlczogJWQgKi9cblxuIiwKCSAgICB0b3RhbF9sZWF2ZXMsIHRsKTsKICAgIC8qCiAgICAgKiBEdW1wIGxlYXZlcwogICAgICovCiAgICBwcmludGYgKCJzdGF0aWMgY29uc3QgRmNDaGFyTGVhZglsZWF2ZXNbJWRdID0ge1xuIiwgdGwpOwogICAgZm9yIChsID0gMDsgbCA8IHRsOyBsKyspCiAgICB7CglwcmludGYgKCIgICAgeyB7IC8qICVkICovIiwgbCk7Cglmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCgl7CgkgICAgaWYgKGkgJSA0ID09IDApCgkJcHJpbnRmICgiXG4gICAiKTsKCSAgICBwcmludGYgKCIgMHglMDh4LCIsIGxlYXZlc1tsXS0+bWFwW2ldKTsKCX0KCXByaW50ZiAoIlxuICAgIH0gfSxcbiIpOwogICAgfQogICAgcHJpbnRmICgifTtcblxuIik7CiAgICBwcmludGYgKCIjZGVmaW5lIEwobikgKChGY0NoYXJMZWFmICopICZsZWF2ZXNbbl0pXG5cbiIpOwoKICAgIC8qCiAgICAgKiBGaW5kIGR1cGxpY2F0ZSBjaGFyc2V0cwogICAgICovCiAgICBkdXBsaWNhdGVbMF0gPSAtMTsKICAgIGZvciAoaSA9IDE7IHNldHNbaV07IGkrKykKICAgIHsKCWludCBqOwoKCWR1cGxpY2F0ZVtpXSA9IC0xOwoJZm9yIChqID0gMDsgaiA8IGk7IGorKykKCSAgICBpZiAoc2V0c1tqXSA9PSBzZXRzW2ldKQoJICAgIHsKCQlkdXBsaWNhdGVbaV0gPSBqOwoJCWJyZWFrOwoJICAgIH0KICAgIH0KCiAgICAvKgogICAgICogRHVtcCBhcnJheXMKICAgICAqLwogICAgZm9yIChpID0gMDsgc2V0c1tpXTsgaSsrKQogICAgewoJaW50IG47CgkKCWlmIChkdXBsaWNhdGVbaV0gPj0gMCkKCSAgICBjb250aW51ZTsKCXByaW50ZiAoInN0YXRpYyBjb25zdCBGY0NoYXJMZWFmICpsZWF2ZXNfJXNbJWRdID0ge1xuIiwKCQluYW1lc1tpXSwgc2V0c1tpXS0+bnVtKTsKCWZvciAobiA9IDA7IG4gPCBzZXRzW2ldLT5udW07IG4rKykKCXsKCSAgICBpZiAobiAlIDggPT0gMCkKCQlwcmludGYgKCIgICAiKTsKCSAgICBmb3IgKGwgPSAwOyBsIDwgdGw7IGwrKykKCQlpZiAobGVhdmVzW2xdID09IHNldHNbaV0tPmxlYXZlc1tuXSkKCQkgICAgYnJlYWs7CgkgICAgaWYgKGwgPT0gdGwpCgkJZmF0YWwgKG5hbWVzW2ldLCAwLCAiY2FuJ3QgZmluZCBsZWFmIik7CgkgICAgcHJpbnRmICgiIEwoJTNkKSwiLCBsKTsKCSAgICBpZiAobiAlIDggPT0gNykKCQlwcmludGYgKCJcbiIpOwoJfQoJaWYgKG4gJSA4ICE9IDApCgkgICAgcHJpbnRmICgiXG4iKTsKCXByaW50ZiAoIn07XG5cbiIpOwoJCgoJcHJpbnRmICgic3RhdGljIGNvbnN0IEZjQ2hhcjE2IG51bWJlcnNfJXNbJWRdID0ge1xuIiwKCQluYW1lc1tpXSwgc2V0c1tpXS0+bnVtKTsKCWZvciAobiA9IDA7IG4gPCBzZXRzW2ldLT5udW07IG4rKykKCXsKCSAgICBpZiAobiAlIDggPT0gMCkKCQlwcmludGYgKCIgICAiKTsKCSAgICBwcmludGYgKCIgMHglMDR4LCIsIHNldHNbaV0tPm51bWJlcnNbbl0pOwoJICAgIGlmIChuICUgOCA9PSA3KQoJCXByaW50ZiAoIlxuIik7Cgl9CglpZiAobiAlIDggIT0gMCkKCSAgICBwcmludGYgKCJcbiIpOwoJcHJpbnRmICgifTtcblxuIik7CiAgICB9CiAgICBwcmludGYgKCIjdW5kZWYgTFxuXG4iKTsKICAgIC8qCiAgICAgKiBEdW1wIHNldHMKICAgICAqLwogICAgcHJpbnRmICgic3RhdGljIGNvbnN0IEZjTGFuZ0NoYXJTZXQgIGZjTGFuZ0NoYXJTZXRzW10gPSB7XG4iKTsKICAgIGZvciAoaSA9IDA7IHNldHNbaV07IGkrKykKICAgIHsKCWludAlqID0gZHVwbGljYXRlW2ldOwoJaWYgKGogPCAwKQoJICAgIGogPSBpOwoJcHJpbnRmICgiICAgIHsgKEZjQ2hhcjggKikgXCIlc1wiLFxuIgoJCSIgICAgICB7IEZDX1JFRl9DT05TVEFOVCwgJWQsICIKCQkiKEZjQ2hhckxlYWYgKiopIGxlYXZlc18lcywgIgoJCSIoRmNDaGFyMTYgKikgbnVtYmVyc18lcyB9IH0sXG4iLAoJCWdldF9sYW5nKG5hbWVzW2ldKSwKCQlzZXRzW2pdLT5udW0sIG5hbWVzW2pdLCBuYW1lc1tqXSk7CiAgICB9CiAgICBwcmludGYgKCJ9O1xuXG4iKTsKICAgIHdoaWxlIChmZ2V0cyAobGluZSwgc2l6ZW9mIChsaW5lKSwgc3RkaW4pKQoJZnB1dHMgKGxpbmUsIHN0ZG91dCk7CiAgICAKICAgIGZmbHVzaCAoc3Rkb3V0KTsKICAgIGV4aXQgKGZlcnJvciAoc3Rkb3V0KSk7Cn0K