LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL2ZjLWxhbmcvZmMtbGFuZy5jLHYgMS4xIDIwMDIvMDcvMDYgMjM6MjE6MzYga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJmY2ludC5oIgoKLyoKICogZmMtbGFuZwogKgogKiBSZWFkIGEgc2V0IG9mIGxhbmd1YWdlIG9ydGhvZ3JhcGhpZXMgYW5kIGJ1aWxkIEMgZGVjbGFyYXRpb25zIGZvcgogKiBjaGFyc2V0cyB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIGxhbmd1YWdlcyBhcmUKICogc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSBuaWNlIGlmCiAqIHRoaXMgY291bGQgYmUgZG9uZSB3aGlsZSBjb21waWxpbmcgdGhlIGxpYnJhcnksIGJ1dCB0aGlzCiAqIGNvZGUgdXNlcyBhIG51bWJlciBvZiByb3V0aW5lcyBmcm9tIHRoZSBsaWJyYXJ5LiAgSXQncwogKiBleHBlZGlhbnQgdG8ganVzdCBzaGlwIHRoZSBwcmUtYnVpbHQgdmVyc2lvbiBhbG9uZyB3aXRoIHRoZQogKiBzb3VyY2Ugb3J0aG9ncmFwaGllcy4KICovCgpzdGF0aWMgdm9pZCAKZmF0YWwgKGNoYXIgKmZpbGUsIGludCBsaW5lbm8sIGNoYXIgKm1zZykKewogICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6ICVzXG4iLCBmaWxlLCBsaW5lbm8sIG1zZyk7CiAgICBleGl0ICgxKTsKfQoKc3RhdGljIGNoYXIgKgpnZXRfbGluZSAoRklMRSAqZiwgY2hhciAqbGluZSwgaW50ICpsaW5lbm8pCnsKICAgIGNoYXIgICAgKmhhc2g7CiAgICBpZiAoIWZnZXRzIChsaW5lLCAxMDI0LCBmKSkKCXJldHVybiAwOwogICAgKysoKmxpbmVubyk7CiAgICBoYXNoID0gc3RyY2hyIChsaW5lLCAnIycpOwogICAgaWYgKGhhc2gpCgkqaGFzaCA9ICdcMCc7CiAgICBpZiAobGluZVswXSA9PSAnXDAnIHx8IGxpbmVbMF0gPT0gJ1xuJyB8fCBsaW5lWzBdID09ICdcMDMyJyB8fCBsaW5lWzBdID09ICdccicpCglyZXR1cm4gZ2V0X2xpbmUgKGYsIGxpbmUsIGxpbmVubyk7CiAgICByZXR1cm4gbGluZTsKfQoKLyoKICogYnVpbGQgYSBzaW5nbGUgY2hhcnNldCBmcm9tIGEgc291cmNlIGZpbGUKICoKICogVGhlIGZpbGUgZm9ybWF0IGlzIHF1aXRlIHNpbXBsZSwgZWl0aGVyCiAqIGEgc2luZ2xlIGhleCB2YWx1ZSBvciBhIHBhaXIgc2VwYXJhdGVkIHdpdGggYSBkYXNoCiAqCiAqIENvbW1lbnRzIGJlZ2luIHdpdGggJyMnCiAqLwoKc3RhdGljIEZjQ2hhclNldCAqCnNjYW4gKEZJTEUgKmYsIGNoYXIgKmZpbGUpCnsKICAgIEZjQ2hhclNldAkqYyA9IDA7CiAgICBGY0NoYXJTZXQJKm47CiAgICBpbnQJCXN0YXJ0LCBlbmQsIHVjczQ7CiAgICBjaGFyCWxpbmVbMTAyNF07CiAgICBpbnQJCWxpbmVubyA9IDA7CgogICAgd2hpbGUgKGdldF9saW5lIChmLCBsaW5lLCAmbGluZW5vKSkKICAgIHsKCWlmICghc3RybmNtcCAobGluZSwgImluY2x1ZGUiLCA3KSkKCXsKCSAgICBmaWxlID0gc3RyY2hyIChsaW5lLCAnICcpOwoJICAgIHdoaWxlICgqZmlsZSA9PSAnICcpCgkJZmlsZSsrOwoJICAgIGVuZCA9IHN0cmxlbiAoZmlsZSk7CgkgICAgaWYgKGZpbGVbZW5kLTFdID09ICdcbicpCgkJZmlsZVtlbmQtMV0gPSAnXDAnOwoJICAgIGYgPSBmb3BlbiAoZmlsZSwgInIiKTsKCSAgICBpZiAoIWYpCgkJZmF0YWwgKGZpbGUsIDAsICJjYW4ndCBvcGVuIik7CgkgICAgYyA9IHNjYW4gKGYsIGZpbGUpOwoJICAgIGZjbG9zZSAoZik7CgkgICAgcmV0dXJuIGM7Cgl9CglpZiAoc3RyY2hyIChsaW5lLCAnLScpKQoJewoJICAgIGlmIChzc2NhbmYgKGxpbmUsICIleC0leCIsICZzdGFydCwgJmVuZCkgIT0gMikKCQlmYXRhbCAoZmlsZSwgbGluZW5vLCAicGFyc2UgZXJyb3IiKTsKCX0KCWVsc2UKCXsKCSAgICBpZiAoc3NjYW5mIChsaW5lLCAiJXgiLCAmc3RhcnQpICE9IDEpCgkJZmF0YWwgKGZpbGUsIGxpbmVubywgInBhcnNlIGVycm9yIik7CgkgICAgZW5kID0gc3RhcnQ7Cgl9CglpZiAoIWMpCgkgICAgYyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKCWZvciAodWNzNCA9IHN0YXJ0OyB1Y3M0IDw9IGVuZDsgdWNzNCsrKQoJewoJICAgIGlmICghRmNDaGFyU2V0QWRkQ2hhciAoYywgdWNzNCkpCgkJZmF0YWwgKGZpbGUsIGxpbmVubywgIm91dCBvZiBtZW1vcnkiKTsKCX0KICAgIH0KICAgIG4gPSBGY0NoYXJTZXRGcmVlemUgKGMpOwogICAgRmNDaGFyU2V0RGVzdHJveSAoYyk7CiAgICByZXR1cm4gbjsKfQoKLyoKICogQ29udmVydCBhIGZpbGUgbmFtZSBpbnRvIGEgbmFtZSBzdWl0YWJsZSBmb3IgQyBkZWNsYXJhdGlvbnMKICovCnN0YXRpYyBjaGFyICoKZ2V0X25hbWUgKGNoYXIgKmZpbGUpCnsKICAgIGNoYXIgICAgKm5hbWU7CiAgICBjaGFyICAgICpkb3Q7CgogICAgZG90ID0gc3RyY2hyIChmaWxlLCAnLicpOwogICAgaWYgKCFkb3QpCglkb3QgPSBmaWxlICsgc3RybGVuKGZpbGUpOwogICAgbmFtZSA9IG1hbGxvYyAoZG90IC0gZmlsZSArIDEpOwogICAgc3RybmNweSAobmFtZSwgZmlsZSwgZG90IC0gZmlsZSk7CiAgICBuYW1lW2RvdC1maWxlXSA9ICdcMCc7CiAgICByZXR1cm4gbmFtZTsKfQoKLyoKICogQ29udmVydCBhIEMgbmFtZSBpbnRvIGEgbGFuZ3VhZ2UgbmFtZQogKi8Kc3RhdGljIGNoYXIgKgpnZXRfbGFuZyAoY2hhciAqbmFtZSkKewogICAgY2hhciAgICAqbGFuZyA9IG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwogICAgY2hhciAgICAqbCA9IGxhbmc7CiAgICBjaGFyICAgIGM7CgogICAgd2hpbGUgKChjID0gKm5hbWUrKykpCiAgICB7CglpZiAoaXN1cHBlciAoYykpCgkgICAgYyA9IHRvbG93ZXIgKGMpOwoJaWYgKGMgPT0gJ18nKQoJICAgIGMgPSAnLSc7CglpZiAoYyA9PSAnICcpCgkgICAgY29udGludWU7CgkqbCsrID0gYzsKICAgIH0KICAgICpsKysgPSAnXDAnOwogICAgcmV0dXJuIGxhbmc7Cn0KCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIEZjQ2hhclNldAkqc2V0c1sxMDI0XTsKICAgIGludAkJZHVwbGljYXRlWzEwMjRdOwogICAgY2hhcgkqbmFtZXNbMTAyNF07CiAgICBGSUxFCSpmOwogICAgaW50CQlpID0gMDsKICAgIEZjQ2hhckxlYWYJKipsZWF2ZXMsICoqc2xlYXZlczsKICAgIGludAkJdG90YWxfbGVhdmVzID0gMDsKICAgIGludAkJbCwgc2wsIHRsOwogICAgY2hhcglsaW5lWzEwMjRdOwogICAgCiAgICB3aGlsZSAoKisrYXJndikKICAgIHsKCWYgPSBmb3BlbiAoKmFyZ3YsICJyIik7CglpZiAoIWYpCgkgICAgZmF0YWwgKCphcmd2LCAwLCBzdHJlcnJvciAoZXJybm8pKTsKCXNldHNbaV0gPSBzY2FuIChmLCAqYXJndik7CgluYW1lc1tpXSA9IGdldF9uYW1lICgqYXJndik7Cgl0b3RhbF9sZWF2ZXMgKz0gc2V0c1tpXS0+bnVtOwoJaSsrOwoJZmNsb3NlIChmKTsKICAgIH0KICAgIHNldHNbaV0gPSAwOwogICAgbGVhdmVzID0gbWFsbG9jICh0b3RhbF9sZWF2ZXMgKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwogICAgdGwgPSAwOwogICAgLyoKICAgICAqIEZpbmQgdW5pcXVlIGxlYXZlcwogICAgICovCiAgICBmb3IgKGkgPSAwOyBzZXRzW2ldOyBpKyspCiAgICB7CglzbGVhdmVzID0gc2V0c1tpXS0+bGVhdmVzOwoJZm9yIChzbCA9IDA7IHNsIDwgc2V0c1tpXS0+bnVtOyBzbCsrKQoJewoJICAgIGZvciAobCA9IDA7IGwgPCB0bDsgbCsrKQoJCWlmIChsZWF2ZXNbbF0gPT0gc2xlYXZlc1tzbF0pCgkJICAgIGJyZWFrOwoJICAgIGlmIChsID09IHRsKQoJCWxlYXZlc1t0bCsrXSA9IHNsZWF2ZXNbc2xdOwoJfQogICAgfQoKICAgIC8qCiAgICAgKiBTY2FuIHRoZSBpbnB1dCB1bnRpbCB0aGUgbWFya2VyIGlzIGZvdW5kCiAgICAgKi8KICAgIAogICAgd2hpbGUgKGZnZXRzIChsaW5lLCBzaXplb2YgKGxpbmUpLCBzdGRpbikpCiAgICB7CglpZiAoIXN0cm5jbXAgKGxpbmUsICJAQEAiLCAzKSkKCSAgICBicmVhazsKCWZwdXRzIChsaW5lLCBzdGRvdXQpOwogICAgfQogICAgCiAgICBwcmludGYgKCIvKiB0b3RhbCBzaXplOiAlZCB1bmlxdWUgbGVhdmVzOiAlZCAqL1xuXG4iLAoJICAgIHRvdGFsX2xlYXZlcywgdGwpOwogICAgLyoKICAgICAqIER1bXAgbGVhdmVzCiAgICAgKi8KICAgIHByaW50ZiAoInN0YXRpYyBjb25zdCBGY0NoYXJMZWFmCWxlYXZlc1slZF0gPSB7XG4iLCB0bCk7CiAgICBmb3IgKGwgPSAwOyBsIDwgdGw7IGwrKykKICAgIHsKCXByaW50ZiAoIiAgICB7IHsgLyogJWQgKi8iLCBsKTsKCWZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCXsKCSAgICBpZiAoaSAlIDQgPT0gMCkKCQlwcmludGYgKCJcbiAgICIpOwoJICAgIHByaW50ZiAoIiAweCUwOHgsIiwgbGVhdmVzW2xdLT5tYXBbaV0pOwoJfQoJcHJpbnRmICgiXG4gICAgfSB9LFxuIik7CiAgICB9CiAgICBwcmludGYgKCJ9O1xuXG4iKTsKICAgIHByaW50ZiAoIiNkZWZpbmUgTChuKSAoKEZjQ2hhckxlYWYgKikgJmxlYXZlc1tuXSlcblxuIik7CgogICAgLyoKICAgICAqIEZpbmQgZHVwbGljYXRlIGNoYXJzZXRzCiAgICAgKi8KICAgIGR1cGxpY2F0ZVswXSA9IC0xOwogICAgZm9yIChpID0gMTsgc2V0c1tpXTsgaSsrKQogICAgewoJaW50IGo7CgoJZHVwbGljYXRlW2ldID0gLTE7Cglmb3IgKGogPSAwOyBqIDwgaTsgaisrKQoJICAgIGlmIChzZXRzW2pdID09IHNldHNbaV0pCgkgICAgewoJCWR1cGxpY2F0ZVtpXSA9IGo7CgkJYnJlYWs7CgkgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBEdW1wIGFycmF5cwogICAgICovCiAgICBmb3IgKGkgPSAwOyBzZXRzW2ldOyBpKyspCiAgICB7CglpbnQgbjsKCQoJaWYgKGR1cGxpY2F0ZVtpXSA+PSAwKQoJICAgIGNvbnRpbnVlOwoJcHJpbnRmICgic3RhdGljIGNvbnN0IEZjQ2hhckxlYWYgKmxlYXZlc18lc1slZF0gPSB7XG4iLAoJCW5hbWVzW2ldLCBzZXRzW2ldLT5udW0pOwoJZm9yIChuID0gMDsgbiA8IHNldHNbaV0tPm51bTsgbisrKQoJewoJICAgIGlmIChuICUgOCA9PSAwKQoJCXByaW50ZiAoIiAgICIpOwoJICAgIGZvciAobCA9IDA7IGwgPCB0bDsgbCsrKQoJCWlmIChsZWF2ZXNbbF0gPT0gc2V0c1tpXS0+bGVhdmVzW25dKQoJCSAgICBicmVhazsKCSAgICBpZiAobCA9PSB0bCkKCQlmYXRhbCAobmFtZXNbaV0sIDAsICJjYW4ndCBmaW5kIGxlYWYiKTsKCSAgICBwcmludGYgKCIgTCglM2QpLCIsIGwpOwoJICAgIGlmIChuICUgOCA9PSA3KQoJCXByaW50ZiAoIlxuIik7Cgl9CglpZiAobiAlIDggIT0gMCkKCSAgICBwcmludGYgKCJcbiIpOwoJcHJpbnRmICgifTtcblxuIik7CgkKCglwcmludGYgKCJzdGF0aWMgY29uc3QgRmNDaGFyMTYgbnVtYmVyc18lc1slZF0gPSB7XG4iLAoJCW5hbWVzW2ldLCBzZXRzW2ldLT5udW0pOwoJZm9yIChuID0gMDsgbiA8IHNldHNbaV0tPm51bTsgbisrKQoJewoJICAgIGlmIChuICUgOCA9PSAwKQoJCXByaW50ZiAoIiAgICIpOwoJICAgIHByaW50ZiAoIiAweCUwNHgsIiwgc2V0c1tpXS0+bnVtYmVyc1tuXSk7CgkgICAgaWYgKG4gJSA4ID09IDcpCgkJcHJpbnRmICgiXG4iKTsKCX0KCWlmIChuICUgOCAhPSAwKQoJICAgIHByaW50ZiAoIlxuIik7CglwcmludGYgKCJ9O1xuXG4iKTsKICAgIH0KICAgIHByaW50ZiAoIiN1bmRlZiBMXG5cbiIpOwogICAgLyoKICAgICAqIER1bXAgc2V0cwogICAgICovCiAgICBwcmludGYgKCJzdGF0aWMgY29uc3QgRmNMYW5nQ2hhclNldCAgZmNMYW5nQ2hhclNldHNbXSA9IHtcbiIpOwogICAgZm9yIChpID0gMDsgc2V0c1tpXTsgaSsrKQogICAgewoJaW50CWogPSBkdXBsaWNhdGVbaV07CglpZiAoaiA8IDApCgkgICAgaiA9IGk7CglwcmludGYgKCIgICAgeyAoRmNDaGFyOCAqKSBcIiVzXCIsXG4iCgkJIiAgICAgIHsgMSwgRmNUcnVlLCAlZCwgIgoJCSIoRmNDaGFyTGVhZiAqKikgbGVhdmVzXyVzLCAiCgkJIihGY0NoYXIxNiAqKSBudW1iZXJzXyVzIH0gfSxcbiIsCgkJZ2V0X2xhbmcobmFtZXNbaV0pLAoJCXNldHNbal0tPm51bSwgbmFtZXNbal0sIG5hbWVzW2pdKTsKICAgIH0KICAgIHByaW50ZiAoIn07XG5cbiIpOwogICAgd2hpbGUgKGZnZXRzIChsaW5lLCBzaXplb2YgKGxpbmUpLCBzdGRpbikpCglmcHV0cyAobGluZSwgc3Rkb3V0KTsKICAgIAogICAgZmZsdXNoIChzdGRvdXQpOwogICAgZXhpdCAoZmVycm9yIChzdGRvdXQpKTsKfQo=