LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiB1Y29udigxKTogYW4gaWNvbnYoMSktbGlrZSBjb252ZXJ0ZXIgdXNpbmcgSUNVLgogKgogKiBPcmlnaW5hbCBjb2RlIGJ5IEpvbmFzIFV0dGVyc3Ry9m0gPGpvbmFzLnV0dGVyc3Ryb21Adml0dHJhbi5ub3Jybm9kLnNlPgogKiBjb250cmlidXRlZCBpbiAxOTk5LgogKgogKiBDb252ZXJzaW9uIHRvIHRoZSBDIGNvbnZlcnNpb24gQVBJIGFuZCBtYW55IGltcHJvdmVtZW50cyBieQogKiBZdmVzIEFycm91eWUgPHl2ZXNAcmVhbG5hbWVzLmNvbT4sIGN1cnJlbnQgbWFpbnRhaW5lci4KICoKICovCgojaW5jbHVkZSA8dW5pY29kZS91dHlwZXMuaD4KI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPgojaW5jbHVkZSA8dW5pY29kZS91bmlzdHIuaD4KI2luY2x1ZGUgPHVuaWNvZGUvdHJhbnNsaXQuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAiY21lbW9yeS5oIgojaW5jbHVkZSAiY3N0cmluZy5oIgojaW5jbHVkZSAidXN0cmZtdC5oIgoKI2luY2x1ZGUgInVuaWNvZGUvdXdtc2cuaCIKCiNpZmRlZiBXSU4zMgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxpby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCgojaWZkZWYgVUNPTlZNU0dfTElOSwovKiBiZWxvdyBmcm9tIHRoZSBSRUFETUUgKi8KI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VkYXRhLmgiClVfQ0ZVTkMgY2hhciB1Y29udm1zZ19kYXRbXTsKI2VuZGlmCgojZGVmaW5lIERFRkFVTFRfQlVGU1ogICA0MDk2CiNkZWZpbmUgVUNPTlZNU0cgInVjb252bXNnIgoKc3RhdGljIFVSZXNvdXJjZUJ1bmRsZSAqZ0J1bmRsZSA9IDA7ICAgIC8qIEJ1bmRsZSBjb250YWluaW5nIG1lc3NhZ2VzLiAqLwoKLyoKICogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBidW5kbGUgc28gdGhhdCBtZXNzYWdlIHN0cmluZ3MgY2FuIGJlIGZldGNoZWQKICogYnkgdV93bXNnKCkuCiAqCiAqLwoKc3RhdGljIHZvaWQgaW5pdE1zZyhjb25zdCBjaGFyICpwbmFtZSkgewogICAgc3RhdGljIGludCBwcyA9IDA7CgogICAgaWYgKCFwcykgewogICAgICAgIGNoYXIgZGF0YVBhdGhbMjA0OF07ICAgICAgICAvKiBYWFggU2xvcHB5OiBzaG91bGQgYmUgUEFUSF9NQVguICovCiAgICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CgogICAgICAgIHBzID0gMTsKCiAgICAgICAgLyogU2V0IHVwIG91ciBzdGF0aWMgZGF0YSAtIGlmIGFueSAqLwojaWZkZWYgVUNPTlZNU0dfTElOSwogICAgICAgIHVkYXRhX3NldEFwcERhdGEoVUNPTlZNU0csIChjb25zdCB2b2lkKikgdWNvbnZtc2dfZGF0LCAmZXJyKTsKICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmcsIHByb2JsZW0gaW5zdGFsbGluZyBvdXIgc3RhdGljIHJlc291cmNlIGJ1bmRsZSBkYXRhIHVjb252bXNnOiAlcyAtIHRyeWluZyBhbnl3YXlzLlxuIiwKICAgICAgICAgICAgICAgICAgcG5hbWUsIHVfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOyAvKiBJdCBtYXkgc3RpbGwgZmFpbCAqLwogICAgICAgIH0KI2VuZGlmCgogICAgICAgIC8qIEdldCBtZXNzYWdlcy4gKi8KICAgICAgICBnQnVuZGxlID0gdV93bXNnX3NldFBhdGgoVUNPTlZNU0csICZlcnIpOwogICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAiJXM6IHdhcm5pbmc6IGNvdWxkbid0IG9wZW4gYnVuZGxlICVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBwbmFtZSwgVUNPTlZNU0csIHVfZXJyb3JOYW1lKGVycikpOwojaWZkZWYgVUNPTlZNU0dfTElOSwogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAiJXM6IHNldEFwcERhdGEgd2FzIGNhbGxlZCwgaW50ZXJuYWwgZGF0YSAlcyBmYWlsZWQgdG8gbG9hZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcG5hbWUsIFVDT05WTVNHKTsKI2VuZGlmCiAKICAgICAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgICAgICAgICAvKiB0aGF0IHdhcyB0cnkgIzEsIHRyeSBhZ2FpbiB3aXRoIGEgcGF0aCAqLwogICAgICAgICAgICB1cHJ2X3N0cmNweShkYXRhUGF0aCwgdV9nZXREYXRhRGlyZWN0b3J5KCkpOwogICAgICAgICAgICB1cHJ2X3N0cmNhdChkYXRhUGF0aCwgVV9GSUxFX1NFUF9TVFJJTkcpOwogICAgICAgICAgICB1cHJ2X3N0cmNhdChkYXRhUGF0aCwgVUNPTlZNU0cpOwoKICAgICAgICAgICAgZ0J1bmRsZSA9IHVfd21zZ19zZXRQYXRoKGRhdGFQYXRoLCAmZXJyKTsKICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAiJXM6IHdhcm5pbmc6IHN0aWxsIGNvdWxkbid0IG9wZW4gYnVuZGxlICVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBwbmFtZSwgZGF0YVBhdGgsIHVfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogd2FybmluZzogbWVzc2FnZXMgd2lsbCBub3QgYmUgZGlzcGxheWVkXG4iLCBwbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8qIE1hcHBpbmcgb2YgY2FsbGJhY2sgbmFtZXMgdG8gdGhlIGNhbGxiYWNrcyBwYXNzZWQgdG8gdGhlIGNvbnZlcnRlcgogICBBUEkuICovCgpzdGF0aWMgc3RydWN0IGNhbGxiYWNrX2VudCB7CiAgICBjb25zdCBjaGFyICpuYW1lOwogICAgVUNvbnZlcnRlckZyb21VQ2FsbGJhY2sgZnJvbXU7CiAgICBjb25zdCB2b2lkICpmcm9tdWN0eHQ7CiAgICBVQ29udmVydGVyVG9VQ2FsbGJhY2sgdG91OwogICAgY29uc3Qgdm9pZCAqdG91Y3R4dDsKfSB0cmFuc2NvZGVfY2FsbGJhY2tzW10gPSB7CiAgICB7ICJzdWJzdGl0dXRlIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfU1VCU1RJVFVURSwgMCwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX1NVQlNUSVRVVEUsIDAgfSwKICAgIHsgInNraXAiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19TS0lQLCAwLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfU0tJUCwgMCB9LAogICAgeyAic3RvcCIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX1NUT1AsIDAsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19TVE9QLCAwIH0sCiAgICB7ICJlc2NhcGUiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIDAsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIDB9LAogICAgeyAiZXNjYXBlLWljdSIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfSUNVLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9JQ1UgfSwKICAgIHsgImVzY2FwZS1qYXZhIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9KQVZBLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9KQVZBIH0sCiAgICB7ICJlc2NhcGUtYyIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfQywKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfQyB9LAogICAgeyAiZXNjYXBlLXhtbCIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfWE1MX0hFWCwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfWE1MX0hFWCB9LAogICAgeyAiZXNjYXBlLXhtbC1oZXgiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1hNTF9IRVgsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1hNTF9IRVggfSwKICAgIHsgImVzY2FwZS14bWwtZGVjIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9YTUxfREVDLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9YTUxfREVDIH0sCiAgICB7ICJlc2NhcGUtdW5pY29kZSIsIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfVU5JQ09ERSwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfVU5JQ09ERSB9Cn07CgovKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgY2FsbGJhY2sgcmVjb3JkIGdpdmVuIGl0cyBuYW1lLiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjYWxsYmFja19lbnQgKmZpbmRDYWxsYmFjayhjb25zdCBjaGFyICpuYW1lKSB7CiAgICBpbnQgaSwgY291bnQgPQogICAgICAgIHNpemVvZih0cmFuc2NvZGVfY2FsbGJhY2tzKSAvIHNpemVvZigqdHJhbnNjb2RlX2NhbGxiYWNrcyk7CgogICAgLyogV2UnbGwgZG8gYSBsaW5lYXIgc2VhcmNoLCB0aGVyZSBhcmVuJ3QgbWFueSBvZiB0aGVtIGFuZCBic2VhcmNoKCkKICAgICAgIG1heSBub3QgYmUgdGhhdCBwb3J0YWJsZS4gKi8KCiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgIGlmICghdXBydl9zdHJpY21wKG5hbWUsIHRyYW5zY29kZV9jYWxsYmFja3NbaV0ubmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuICZ0cmFuc2NvZGVfY2FsbGJhY2tzW2ldOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyogUHJpbnQgY29udmVydGVyIGluZm9ybWF0aW9uLiBJZiBsb29rZm9yIGlzIHNldCwgb25seSB0aGF0IGNvbnZlcnRlciB3aWxsCiAgIGJlIHByaW50ZWQsIG90aGVyd2lzZSBhbGwgY29udmVydGVycyB3aWxsIGJlIHByaW50ZWQuIElmIGNhbm9uIGlzIG5vbgogICB6ZXJvLCB0YWdzIGFuZCBhbGlhc2VzIGZvciBlYWNoIGNvbnZlcnRlciBhcmUgcHJpbnRlZCB0b28sIGluIHRoZSBmb3JtYXQKICAgZXhwZWN0ZWQgZm9yIGNvbnZydGVycy50eHQoNSkuICovCgpzdGF0aWMgaW50IHByaW50Q29udmVydGVycyhjb25zdCBjaGFyICpwbmFtZSwgY29uc3QgY2hhciAqbG9va2ZvciwKICAgIGludCBjYW5vbikKewogICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICBpbnQzMl90IG51bTsKICAgIHVpbnQxNl90IG51bV9zdGRzOwogICAgY29uc3QgY2hhciAqKnN0ZHM7CgogICAgLyogSWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgbmFtZSwganVzdCBoYW5kbGUgdGhhdCBub3cuICovCgogICAgaWYgKGxvb2tmb3IpIHsKICAgICAgICBpZiAoIWNhbm9uKSB7CiAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIGxvb2tmb3IpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgIC8qICBCZWNhdXNlIHdlIGFyZSBwcmludGluZyBhIGNhbm9uaWNhbCBuYW1lLCB3ZSBuZWVkIHRoZQogICAgICAgICAgICB0cnVlIGNvbnZlcnRlciBuYW1lLiBXZSd2ZSBkb25lIHRoYXQgYWxyZWFkeSBleGNlcHQgZm9yCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IG5hbWUgKGJlY2F1c2Ugd2Ugd2FudCB0byBwcmludCB0aGUgZXhhY3QKICAgICAgICAgICAgbmFtZSBvbmUgd291bGQgZ2V0IHdoZW4gY2FsbGluZyB1Y252X2dldERlZmF1bHROYW1lKCkKICAgICAgICAgICAgaW4gbm9uLWNhbm9uIG1vZGUpLiBCdXQgc2luY2Ugd2UgZG8gbm90IGtub3cgYXQgdGhpcwogICAgICAgICAgICBwb2ludCBpZiB3ZSBoYXZlIHRoZSBkZWZhdWx0IG5hbWUgb3Igc29tZXRoaW5nIGVsc2UsIHdlCiAgICAgICAgICAgIG5lZWQgdG8gbm9ybWFsaXplIGFnYWluIHRvIHRoZSBjYW5vbmljYWwgY29udmVydGVyCiAgICAgICAgICAgIG5hbWUuICovCgogICAgICAgICAgICBjb25zdCBjaGFyICp0cnVlbmFtZSA9IHVjbnZfZ2V0QWxpYXMobG9va2ZvciwgMCwgJmVycik7CiAgICAgICAgICAgIGlmIChVX1NVQ0NFU1MoZXJyKSkgewogICAgICAgICAgICAgICAgbG9va2ZvciA9IHRydWVuYW1lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIFByaW50IGNvbnZlcnRlciBuYW1lcy4gV2UgY29tZSBoZXJlIGZvciBvbmUgb2YgdHdvIHJlYXNvbnM6IHdlCiAgICAgICBhcmUgcHJpbnRpbmcgYWxsIHRoZSBuYW1lcyAobG9va2ZvciB3YXMgbnVsbCksIG9yIHdlIGhhdmUgYQogICAgICAgc2luZ2xlIGNvbnZlcnRlciB0byBwcmludCBidXQgaW4gY2Fub24gbW9kZSwgaGVuY2Ugd2UgbmVlZCB0bwogICAgICAgZ2V0IHRvIGl0IGluIG9yZGVyIHRvIHByaW50IGV2ZXJ5dGhpbmcuICovCgogICAgbnVtID0gdWNudl9jb3VudEF2YWlsYWJsZSgpOwogICAgaWYgKG51bSA8PSAwKSB7CiAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRHZXROYW1lcyIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGlmIChsb29rZm9yKSB7CiAgICAgICAgbnVtID0gMTsgICAgICAgICAgICAgICAgLyogV2Uga25vdyB3aGVyZSB3ZSB3YW50IHRvIGJlLiAqLwogICAgfQoKICAgIG51bV9zdGRzID0gdWNudl9jb3VudFN0YW5kYXJkcygpOwogICAgc3RkcyA9IChjb25zdCBjaGFyICoqKSB1cHJ2X21hbGxvYyhudW1fc3RkcyAqIHNpemVvZigqc3RkcykpOwogICAgaWYgKCFzdGRzKSB7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRHZXRUYWciLCB1X3dtc2dfZXJyb3JOYW1lKFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgewogICAgICAgIHVpbnQxNl90IHM7CgogICAgICAgIGZvciAocyA9IDA7IHMgPCBudW1fc3RkczsgKytzKSB7CiAgICAgICAgICAgIHN0ZHNbc10gPSB1Y252X2dldFN0YW5kYXJkKHMsICZlcnIpOwogICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50R2V0VGFnIiwgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgICAgdWludDE2X3QgbnVtX2FsaWFzZXM7CgogICAgICAgIC8qIFNldCB0aGUgbmFtZSBlaXRoZXIgdG8gd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IsIG9yCiAgICAgICAgdG8gdGhlIGN1cnJlbnQgY29udmVydGVyIG5hbWUuICovCgogICAgICAgIGlmIChsb29rZm9yKSB7CiAgICAgICAgICAgIG5hbWUgPSBsb29rZm9yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5hbWUgPSB1Y252X2dldEF2YWlsYWJsZU5hbWUoaSk7CiAgICAgICAgfQoKICAgICAgICAvKiBHZXQgYWxsIHRoZSBhbGlhc2VzIGFzc29jaWF0ZWQgdG8gdGhlIG5hbWUuICovCgogICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgICAgICBudW1fYWxpYXNlcyA9IHVjbnZfY291bnRBbGlhc2VzKG5hbWUsICZlcnIpOwogICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICBwcmludGYoIiVzIiwgbmFtZSk7CgogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihuYW1lLCAoaW50MzJfdCkodXBydl9zdHJsZW4obmFtZSkgKyAxKSk7CiAgICAgICAgICAgIHB1dGNoYXIoJ1x0Jyk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50R2V0QWxpYXNlcyIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1aW50MTZfdCBhLCBzLCB0OwoKICAgICAgICAgICAgLyogV3JpdGUgYWxsIHRoZSBhbGlhc2VzIGFuZCB0aGVpciB0YWdzLiAqLwoKICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IG51bV9hbGlhc2VzOyArK2EpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFsaWFzID0gdWNudl9nZXRBbGlhcyhuYW1lLCBhLCAmZXJyKTsKCiAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihuYW1lLCAoaW50MzJfdCkodXBydl9zdHJsZW4obmFtZSkgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgcHV0Y2hhcignXHQnKTsKICAgICAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudEdldEFsaWFzZXMiLCBzdHIuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCBhbGlhcyk7CgogICAgICAgICAgICAgICAgLyogTG9vayAoc2xvd2x5LCBsaW5lYXIgc2VhcmNoaW5nKSBmb3IgYSB0YWcuICovCgogICAgICAgICAgICAgICAgaWYgKGNhbm9uKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gdCA9IDA7IHMgPCBudW1fc3RkczsgKytzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YW5kYXJkID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbnZfZ2V0U3RhbmRhcmROYW1lKG5hbWUsIHN0ZHNbc10sICZlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKGVycikgJiYgc3RhbmRhcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHN0YW5kYXJkLCBhbGlhcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgeyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBzdGRzW3NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiB9Iik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIE1vdmUgb24uICovCgogICAgICAgICAgICAgICAgaWYgKGEgPCBudW1fYWxpYXNlcyAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBwdXRjaGFyKGEgfHwgIWNhbm9uID8gJyAnIDogJ1x0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFRlcm1pbmF0ZSB0aGlzIGVudHJ5LiAqLwoKICAgICAgICBpZiAoY2Fub24pIHsKICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKICAgICAgICB9IGVsc2UgaWYgKGkgPCBudW0gLSAxKSB7CiAgICAgICAgICAgIHB1dGNoYXIoJyAnKTsKICAgICAgICB9CiAgICB9CgogICAgLyogRnJlZSB0ZW1wb3JhcnkgZGF0YS4gKi8KCiAgICB1cHJ2X2ZyZWUoc3Rkcyk7CgogICAgLyogU3VjY2Vzcy4gKi8KCiAgICByZXR1cm4gMDsKfQoKLyogUHJpbnQgYWxsIGF2YWlsYWJsZSB0cmFuc2xpdGVyYXRvcnMuIElmIGNhbm9uIGlzIG5vbiB6ZXJvLCBwcmludAogICBvbmUgdHJhbnNsaXRlcmF0b3IgcGVyIGxpbmUuICovCgpzdGF0aWMgaW50IHByaW50VHJhbnNsaXRlcmF0b3JzKGludCBjYW5vbikKewojaWYgVUNPTkZJR19OT19UUkFOU0xJVEVSQVRJT04KICAgIHByaW50Zigibm8gdHJhbnNsaXRlcmF0b3JzIGF2YWlsYWJsZSBiZWNhdXNlIG9mIFVDT05GSUdfTk9fVFJBTlNMSVRFUkFUSU9OLCBzZWUgdWNvbmZpZy5oXG4iKTsKICAgIHJldHVybiAxOwojZWxzZQogICAgaW50MzJfdCBudW10cmFucyA9IHV0cmFuc19jb3VudEF2YWlsYWJsZUlEcygpLCBpOwogICAgaW50IGJ1ZmxlbiA9IDUxMjsKICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopIHVwcnZfbWFsbG9jKGJ1Zmxlbik7CiAgICBjaGFyIHN0YXRpY2J1Zls1MTJdOwoKICAgIGNoYXIgc2VwY2hhciA9IGNhbm9uID8gJ1xuJyA6ICcgJzsKCiAgICBpZiAoIWJ1ZikgewogICAgICAgIGJ1ZiA9IHN0YXRpY2J1ZjsKICAgICAgICBidWZsZW4gPSBzaXplb2Yoc3RhdGljYnVmKTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtdHJhbnM7ICsraSkgewogICAgICAgIGludDMyX3QgbGVuID0gdXRyYW5zX2dldEF2YWlsYWJsZUlEKGksIGJ1ZiwgYnVmbGVuKTsKICAgICAgICBpZiAobGVuID49IGJ1ZmxlbiAtIDEpIHsKICAgICAgICAgICAgaWYgKGJ1ZiAhPSBzdGF0aWNidWYpIHsKICAgICAgICAgICAgICAgIGJ1ZmxlbiA8PD0gMTsKICAgICAgICAgICAgICAgIGlmIChidWZsZW4gPCBsZW4pIHsKICAgICAgICAgICAgICAgICAgICBidWZsZW4gPSBsZW4gKyA2NDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJ1ZiA9IChjaGFyICopIHVwcnZfcmVhbGxvYyhidWYsIGJ1Zmxlbik7CiAgICAgICAgICAgICAgICBpZiAoIWJ1ZikgewogICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHN0YXRpY2J1ZjsKICAgICAgICAgICAgICAgICAgICBidWZsZW4gPSBzaXplb2Yoc3RhdGljYnVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB1dHJhbnNfZ2V0QXZhaWxhYmxlSUQoaSwgYnVmLCBidWZsZW4pOwogICAgICAgICAgICBpZiAobGVuID49IGJ1ZmxlbikgewogICAgICAgICAgICAgICAgdXBydl9zdHJjcHkoYnVmICsgYnVmbGVuIC0gNCwgIi4uLiIpOyAvKiBUcnVuY2F0ZSB0aGUgbmFtZS4gKi8KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJpbnRmKCIlcyIsIGJ1Zik7CiAgICAgICAgaWYgKGkgPCBudW10cmFucyAtIDEpIHsKICAgICAgICAgICAgcHV0Y2hhcihzZXBjaGFyKTsKICAgICAgICB9CiAgICB9CgogICAgLyogQWRkIGEgdGVybWluYXRpbmcgbmV3bGluZSBpZiBuZWVkZWQuICovCgogICAgaWYgKHNlcGNoYXIgIT0gJ1xuJykgewogICAgICAgIHB1dGNoYXIoJ1xuJyk7CiAgICB9CgogICAgLyogRnJlZSB0ZW1wb3JhcnkgZGF0YS4gKi8KCiAgICBpZiAoYnVmICE9IHN0YXRpY2J1ZikgewogICAgICAgIHVwcnZfZnJlZShidWYpOwogICAgfQoKICAgIC8qIFN1Y2Nlc3MuICovCgogICAgcmV0dXJuIDA7CiNlbmRpZgp9CgovKiBSZXR1cm4gdGhlIG9mZnNldCBvZiBhIGJ5dGUgaW4gaXRzIHNvdXJjZSwgZ2l2ZW4gdGhlIGZyb20gYW5kIHRvIG9mZnNldHMKICAgdmVjdG9ycyBhbmQgdGhlIGJ5dGUgb2Zmc2V0IGl0c2VsZi4gKi8KCnN0YXRpYyBpbmxpbmUgaW50MzJfdCBkYXRhT2Zmc2V0KGludDMyX3Qgd2hlcmV0bywKICAgIGNvbnN0IGludDMyX3QgKmZyb21vZmZzZXRzLCBpbnQzMl90IGZyb21zeiwKICAgIGNvbnN0IGludDMyX3QgKnRvb2Zmc2V0cywgaW50MzJfdCB0b3N6KSB7CiAgICBpZiAod2hlcmV0byA+PSAwICYmIHdoZXJldG8gPCB0b3N6KSB7CiAgICAgICAgd2hlcmV0byA9IHRvb2Zmc2V0c1t3aGVyZXRvXTsKICAgICAgICBpZiAod2hlcmV0byA+PSAwICYmIHdoZXJldG8gPCBmcm9tc3opIHsKICAgICAgICAgICAgcmV0dXJuIGZyb21vZmZzZXRzW3doZXJldG9dOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLy8gQ29udmVydCBhIGZpbGUgZnJvbSBvbmUgZW5jb2RpbmcgdG8gYW5vdGhlcgpzdGF0aWMgVUJvb2wgY29udmVydEZpbGUoY29uc3QgY2hhciAqcG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tY3BhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBVQ29udmVydGVyVG9VQ2FsbGJhY2sgdG91Y2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0b3VjdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9jcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNrIGZyb211Y2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpmcm9tdWN0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmc3osCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFuc2xpdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluZmlsZXN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKiBvdXRmaWxlLCBpbnQgdmVyYm9zZSkKewogICAgRklMRSAqaW5maWxlOwogICAgVUJvb2wgcmV0ID0gVFJVRTsKICAgIFVDb252ZXJ0ZXIgKmNvbnZmcm9tID0gMDsKICAgIFVDb252ZXJ0ZXIgKmNvbnZ0byA9IDA7CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgIFVCb29sIGZsdXNoOwogICAgY29uc3QgY2hhciAqY2J1ZnA7CiAgICBjaGFyICpidWZwOwogICAgY2hhciAqYnVmID0gMDsKCiAgICB1aW50MzJfdCBpbmZvZmZzZXQgPSAwLCBvdXRmb2Zmc2V0ID0gMDsgICAvKiBXaGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUsIGZvciBlcnJvciByZXBvcnRpbmcuICovCgogICAgY29uc3QgVUNoYXIgKnVuaWJ1ZmJwOwogICAgVUNoYXIgKnVuaWJ1ZnA7CiAgICBVQ2hhciAqdW5pYnVmID0gMDsKICAgIGludDMyX3QgKmZyb21vZmZzZXRzID0gMCwgKnRvb2Zmc2V0cyA9IDA7CgogICAgc2l6ZV90IHJkLCB3ciwgdG9idWZzejsKCiNpZiAhVUNPTkZJR19OT19UUkFOU0xJVEVSQVRJT04KICAgIFRyYW5zbGl0ZXJhdG9yICp0ID0gMDsgICAgICAvLyBUcmFuc2xpdGVyYXRvciBhY3Rpbmcgb24gVW5pY29kZSBkYXRhLgojZW5kaWYKICAgIFVuaWNvZGVTdHJpbmcgdTsgICAgICAgICAgICAvLyBTdHJpbmcgdG8gZG8gdGhlIHRyYW5zbGl0ZXJhdGlvbi4KCiAgICAvLyBPcGVuIHRoZSBjb3JyZWN0IGlucHV0IGZpbGUgb3IgY29ubmVjdCB0byBzdGRpbiBmb3IgcmVhZGluZyBpbnB1dAoKICAgIGlmIChpbmZpbGVzdHIgIT0gMCAmJiBzdHJjbXAoaW5maWxlc3RyLCAiLSIpKSB7CiAgICAgICAgaW5maWxlID0gZm9wZW4oaW5maWxlc3RyLCAicmIiKTsKICAgICAgICBpZiAoaW5maWxlID09IDApIHsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIxKGluZmlsZXN0ciwgIiIpOwogICAgICAgICAgICBzdHIxLmFwcGVuZCgoVUNoYXIzMikgMCk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyMihzdHJlcnJvcihlcnJubyksICIiKTsKICAgICAgICAgICAgc3RyMi5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRPcGVuSW5wdXRGIiwgc3RyMS5nZXRCdWZmZXIoKSwgc3RyMi5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGluZmlsZXN0ciA9ICItIjsKICAgICAgICBpbmZpbGUgPSBzdGRpbjsKI2lmZGVmIFdJTjMyCiAgICAgICAgaWYgKHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpID09IC0xKSB7CiAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFNldEluQmluTW9kZSIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQojZW5kaWYKICAgIH0KCiAgICBpZiAodmVyYm9zZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCBpbmZpbGVzdHIpOwogICAgfQoKI2lmICFVQ09ORklHX05PX1RSQU5TTElURVJBVElPTgogICAgLy8gQ3JlYXRlIHRyYW5zbGl0ZXJhdG9yIGFzIG5lZWRlZC4KCiAgICBpZiAodHJhbnNsaXQgIT0gTlVMTCAmJiAqdHJhbnNsaXQpIHsKICAgICAgICBVUGFyc2VFcnJvciBwYXJzZTsKICAgICAgICBVbmljb2RlU3RyaW5nIHN0cih0cmFuc2xpdCksIHBlc3RyOwoKICAgICAgICAvKiBDcmVhdGUgZnJvbSBydWxlcyBvciBieSBJRCBhcyBuZWVkZWQuICovCgogICAgICAgIHBhcnNlLmxpbmUgPSAtMTsKCiAgICAgICAgaWYgKHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnOicpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPicpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPCcpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPicpKSB7CiAgICAgICAgICAgIHQgPSBUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlRnJvbVJ1bGVzKCJVY29udiIsIHN0ciwgVVRSQU5TX0ZPUldBUkQsIHBhcnNlLCBlcnIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHQgPSBUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlSW5zdGFuY2UodHJhbnNsaXQsIFVUUkFOU19GT1JXQVJELCBlcnIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgIHN0ci5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKCiAgICAgICAgICAgIGlmIChwYXJzZS5saW5lID49IDApIHsKICAgICAgICAgICAgICAgIFVDaGFyIGxpbmVidWZbMjBdLCBvZmZzZXRidWZbMjBdOwogICAgICAgICAgICAgICAgdXBydl9pdG91KGxpbmVidWYsIHBhcnNlLmxpbmUsIDEwLCAwKTsKICAgICAgICAgICAgICAgIHVwcnZfaXRvdShvZmZzZXRidWYsIHBhcnNlLm9mZnNldCwgMTAsIDApOwogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRDcmVhdGVUcmFuc2xpdFBhcnNlRXJyIiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSwgbGluZWJ1Ziwgb2Zmc2V0YnVmKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50Q3JlYXRlVHJhbnNsaXQiLCBzdHIuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0OwogICAgICAgICAgICAgICAgdCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgIH0KICAgIH0KI2VuZGlmCgogICAgLy8gQ3JlYXRlIGNvZGVwYWdlIGNvbnZlcnRlci4gSWYgdGhlIGNvZGVwYWdlIG9yIGl0cyBhbGlhc2VzIHdlcmVuJ3QKICAgIC8vIGF2YWlsYWJsZSwgaXQgcmV0dXJucyBOVUxMIGFuZCBhIGZhaWx1cmUgY29kZS4gV2UgYWxzbyBzZXQgdGhlCiAgICAvLyBjYWxsYmFja3MsIGFuZCByZXR1cm4gZXJyb3JzIGluIHRoZSBzYW1lIHdheS4KCiAgICBjb252ZnJvbSA9IHVjbnZfb3Blbihmcm9tY3BhZ2UsICZlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoZnJvbWNwYWdlLCAoaW50MzJfdCkodXBydl9zdHJsZW4oZnJvbWNwYWdlKSArIDEpKTsKICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudE9wZW5Gcm9tQ29kZXNldCIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICB9CiAgICB1Y252X3NldFRvVUNhbGxCYWNrKGNvbnZmcm9tLCB0b3VjYWxsYmFjaywgdG91Y3R4dCwgMCwgMCwgJmVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFNldENhbGxiYWNrIiwgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICB9CgogICAgY29udnRvID0gdWNudl9vcGVuKHRvY3BhZ2UsICZlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBzdHIodG9jcGFnZSwgKGludDMyX3QpKHVwcnZfc3RybGVuKHRvY3BhZ2UpICsgMSkpOwogICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50T3BlblRvQ29kZXNldCIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICB9CiAgICB1Y252X3NldEZyb21VQ2FsbEJhY2soY29udnRvLCBmcm9tdWNhbGxiYWNrLCBmcm9tdWN0eHQsIDAsIDAsICZlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRTZXRDYWxsYmFjayIsIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgfQogICAgdWNudl9zZXRGYWxsYmFjayhjb252dG8sIGZhbGxiYWNrKTsKCiAgICAvLyBUbyBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGFsd2F5cyBpcyBvZiBlbm91Z2ggc2l6ZSwgd2UKICAgIC8vIG11c3QgdGFrZSB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbywgdGhhdCBpcyB0aGUgY2hhcmFjdGVyIGluCiAgICAvLyB0aGUgY29kZXBhZ2UgdGhhdCB1c2VzIHRoZSBtb3N0IGJ5dGVzIGFuZCBtdWx0aXBseSBpdCBhZ2FpbnN0CiAgICAvLyB0aGUgYnVmZmVyIHNpemUuCgogICAgLy8gdXNlIGJ1ZnN6KzEgdG8gYWxsb3cgZm9yIGFkZGl0aW9uYWwgQk9NL3NpZ25hdHVyZSBjaGFyYWN0ZXIgKFUrRkVGRikKICAgIHRvYnVmc3ogPSAoYnVmc3orMSkgKiB1Y252X2dldE1heENoYXJTaXplKGNvbnZ0byk7CgogICAgYnVmID0gbmV3IGNoYXJbdG9idWZzel07CiAgICB1bmlidWYgPSBuZXcgVUNoYXJbYnVmc3pdOwoKICAgIGZyb21vZmZzZXRzID0gbmV3IGludDMyX3RbYnVmc3pdOwogICAgdG9vZmZzZXRzID0gbmV3IGludDMyX3RbdG9idWZzel07CgogICAgLy8gT0ssIHdlIGNhbiBjb252ZXJ0IG5vdy4KCiAgICBkbyB7CiAgICAgICAgY2hhciB3aWxsZXhpdCA9IDA7CgogICAgICAgIHJkID0gZnJlYWQoYnVmLCAxLCBidWZzeiwgaW5maWxlKTsKICAgICAgICBpZiAoZmVycm9yKGluZmlsZSkgIT0gMCkgewogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICBzdHIuYXBwZW5kKChVQ2hhcjMyKSAwKTsKICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50UmVhZCIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICB9CgogICAgICAgIC8vIENvbnZlcnQgdGhlIHJlYWQgYnVmZmVyIGludG8gdGhlIG5ldyBjb2RpbmcKICAgICAgICAvLyBBZnRlciB0aGUgY2FsbCAndW5pYnVmcCcgd2lsbCBiZSBwbGFjZWQgb24gdGhlIGxhc3QKICAgICAgICAvLyBjaGFyYWN0ZXIgdGhhdCB3YXMgY29udmVydGVkIGluIHRoZSAndW5pYnVmJy4KICAgICAgICAvLyBBbHNvIHRoZSAnY2J1ZnAnIGlzIHBvc2l0aW9uZWQgb24gdGhlIGxhc3QgY29udmVydGVkCiAgICAgICAgLy8gY2hhcmFjdGVyLgogICAgICAgIC8vIEF0IHRoZSBsYXN0IGNvbnZlcnNpb24gaW4gdGhlIGZpbGUsIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8KICAgICAgICAvLyB0cnVlIHNvIHRoYXQgd2UgZ2V0IGFsbCBjaGFyYWN0ZXJzIGNvbnZlcnRlZAogICAgICAgIC8vCiAgICAgICAgLy8gVGhlIGNvbnZlcnRlciBtdXN0IGJlIGZsdXNoZWQgYXQgdGhlIGVuZCBvZiBjb252ZXJzaW9uIHNvCiAgICAgICAgLy8gdGhhdCBjaGFyYWN0ZXJzIG9uIGhvbGQgYWxzbyB3aWxsIGJlIHdyaXR0ZW4uCgogICAgICAgIHVuaWJ1ZnAgPSB1bmlidWY7CiAgICAgICAgY2J1ZnAgPSBidWY7CiAgICAgICAgZmx1c2ggPSByZCAhPSBidWZzejsKICAgICAgICB1Y252X3RvVW5pY29kZShjb252ZnJvbSwgJnVuaWJ1ZnAsIHVuaWJ1ZnAgKyBidWZzeiwgJmNidWZwLAogICAgICAgICAgICBjYnVmcCArIHJkLCBmcm9tb2Zmc2V0cywgZmx1c2gsICZlcnIpOwoKICAgICAgICBpbmZvZmZzZXQgKz0gKHVpbnQzMl90KShjYnVmcCAtIGJ1Zik7CgogICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICBjaGFyIHBvc1szMl07CiAgICAgICAgICAgIHNwcmludGYocG9zLCAiJXUiLCBpbmZvZmZzZXQgLSAxKTsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIocG9zLCAoaW50MzJfdCkodXBydl9zdHJsZW4ocG9zKSArIDEpKTsKICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJwcm9ibGVtQ3Z0VG9VIiwgc3RyLmdldEJ1ZmZlcigpLCB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICB3aWxsZXhpdCA9IDE7CiAgICAgICAgfQoKICAgICAgICAvLyBBdCB0aGUgbGFzdCBjb252ZXJzaW9uLCB0aGUgY29udmVydGVkIGNoYXJhY3RlcnMgc2hvdWxkIGJlCiAgICAgICAgLy8gZXF1YWwgdG8gbnVtYmVyIG9mIGNoYXJzIHJlYWQuCgogICAgICAgIGlmIChmbHVzaCAmJiAhd2lsbGV4aXQgJiYgY2J1ZnAgIT0gKGJ1ZiArIHJkKSkgewogICAgICAgICAgICBjaGFyIHBvc1szMl07CiAgICAgICAgICAgIHNwcmludGYocG9zLCAiJXUiLCBpbmZvZmZzZXQpOwogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihwb3MsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihwb3MpICsgMSkpOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInByZW1FbmRJbnB1dCIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgIHdpbGxleGl0ID0gMTsKICAgICAgICB9CgogICAgICAgIC8vIFByZXBhcmUgdG8gdHJhbnNsaXRlcmF0ZSBhbmQgY29udmVydC4gVHJhbnNsaXRlcmF0ZSBpZiBuZWVkZWQuCgojaWYgIVVDT05GSUdfTk9fVFJBTlNMSVRFUkFUSU9OCiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgdS5zZXRUbyh1bmlidWYsIChpbnQzMl90KSh1bmlidWZwIC0gdW5pYnVmKSk7IC8vIENvcHkgaW50byBzdHJpbmcuCiAgICAgICAgICAgIHQtPnRyYW5zbGl0ZXJhdGUodSk7CiAgICAgICAgfSBlbHNlCiNlbmRpZgogICAgICAgIHsKICAgICAgICAgICAgdS5zZXRUbyh1bmlidWYsIChpbnQzMl90KSh1bmlidWZwIC0gdW5pYnVmKSwgKGludDMyX3QpKGJ1ZnN6KSk7IC8vIFNoYXJlIHRoZSBidWZmZXIuCiAgICAgICAgfQoKICAgICAgICBpbnQzMl90IHVsZW4gPSB1Lmxlbmd0aCgpOwoKICAgICAgICAvLyBDb252ZXJ0IHRoZSBVbmljb2RlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBjb2RlcGFnZQogICAgICAgIC8vIEFnYWluICdidWZwJyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbGFzdCBjb252ZXJ0ZWQgY2hhcmFjdGVyCiAgICAgICAgLy8gQW5kICd1bmlidWZicCcgd2lsbCBiZSBwbGFjZWQgb24gdGhlIGxhc3QgY29udmVydGVkIHVuaWNvZGUgY2hhcmFjdGVyCiAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiBmbHVzaCBzaG91bGQgYmUgc2V0IHRvIHRydWUgdG8gZW5zdXJlIHRoYXQKICAgICAgICAvLyBhbGwgY2hhcmFjdGVycyBsZWZ0IGdldCBjb252ZXJ0ZWQKCiAgICAgICAgY29uc3QgVUNoYXIgKnVuaWJ1ZnUgPSB1bmlidWZicCA9IHUuZ2V0QnVmZmVyKCk7CgogICAgICAgIGRvIHsKICAgICAgICAgICAgaW50MzJfdCBsZW4gPSB1bGVuID4gKGludDMyX3QpYnVmc3ogPyAoaW50MzJfdClidWZzeiA6IHVsZW47CgogICAgICAgICAgICBidWZwID0gYnVmOwogICAgICAgICAgICB1bmlidWZwID0gKFVDaGFyICopICh1bmlidWZicCArIGxlbik7CgogICAgICAgICAgICB1Y252X2Zyb21Vbmljb2RlKGNvbnZ0bywgJmJ1ZnAsIGJ1ZnAgKyB0b2J1ZnN6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bmlidWZicCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlidWZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2Zmc2V0cywgZmx1c2gsICZlcnIpOwoKICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJ0YWc7CiAgICAgICAgICAgICAgICBjaGFyIHBvc1szMl07CgogICAgICAgICAgICAgICAgdWludDMyX3QgZXJyb2Zmc2V0ID0KICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0KChpbnQzMl90KShidWZwIC0gYnVmIC0gMSksIGZyb21vZmZzZXRzLCAoaW50MzJfdCkoYnVmc3opLCB0b29mZnNldHMsIChpbnQzMl90KSh0b2J1ZnN6KSk7CiAgICAgICAgICAgICAgICBpbnQzMl90IGZlcnJvZmZzZXQgPSAoaW50MzJfdCkoaW5mb2Zmc2V0IC0gKHVuaWJ1ZnAgLSB1bmlidWZ1KSArIGVycm9mZnNldCk7CgogICAgICAgICAgICAgICAgaWYgKChpbnQzMl90KSBmZXJyb2Zmc2V0IDwgMCkgewogICAgICAgICAgICAgICAgICAgIGZlcnJvZmZzZXQgPSAoaW50MzJfdCkob3V0Zm9mZnNldCArIChidWZwIC0gYnVmKSk7CiAgICAgICAgICAgICAgICAgICAgZXJydGFnID0gInByb2JsZW1DdnRGcm9tVU91dCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVycnRhZyA9ICJwcm9ibGVtQ3Z0RnJvbVUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3ByaW50Zihwb3MsICIldSIsIGZlcnJvZmZzZXQpOwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIocG9zLCAoaW50MzJfdCkodXBydl9zdHJsZW4ocG9zKSArIDEpKTsKICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgZXJydGFnLCBzdHIuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgICAgIHdpbGxleGl0ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiwgdGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBlcXVhbCB0byBudW1iZXIKICAgICAgICAgICAgLy8gb2YgY29uc3VtZWQgY2hhcmFjdGVycy4KICAgICAgICAgICAgaWYgKGZsdXNoICYmICF3aWxsZXhpdCAmJiB1bmlidWZicCAhPSAodW5pYnVmdSArIChzaXplX3QpICh1bmlidWZwIC0gdW5pYnVmdSkpKSB7CiAgICAgICAgICAgICAgICBjaGFyIHBvc1szMl07CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBvcywgIiV1IiwgaW5mb2Zmc2V0KTsKICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHBvcywgKGludDMyX3QpKHVwcnZfc3RybGVuKHBvcykgKyAxKSk7CiAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJwcmVtRW5kIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgICAgIHdpbGxleGl0ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRmluYWxseSwgd3JpdGUgdGhlIGNvbnZlcnRlZCBidWZmZXIgdG8gdGhlIG91dHB1dCBmaWxlCgoKICAgICAgICAgICAgcmQgPSAoc2l6ZV90KSAoYnVmcCAtIGJ1Zik7CiAgICAgICAgICAgIG91dGZvZmZzZXQgKz0gKGludDMyX3QpKHdyID0gZndyaXRlKGJ1ZiwgMSwgcmQsIG91dGZpbGUpKTsKICAgICAgICAgICAgaWYgKHdyICE9IHJkKSB7CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihzdHJlcnJvcihlcnJubyksICIiKTsKICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRXcml0ZSIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICB3aWxsZXhpdCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh3aWxsZXhpdCkgewogICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoKHVsZW4gLT0gKGludDMyX3QpKGJ1ZnN6KSkgPiAwKTsKICAgIH0gd2hpbGUgKCFmbHVzaCk7ICAgICAgICAgICAvLyBTdG9wIHdoZW4gd2UgaGF2ZSBmbHVzaGVkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnRlcnMgKHRoaXMgbWVhbnMgdGhhdCBpdCdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVuZCBvZiBvdXRwdXQpCgogICAgZ290byBub3JtYWxfZXhpdDsKCmVycm9yX2V4aXQ6CiAgICByZXQgPSBGQUxTRTsKCm5vcm1hbF9leGl0OgogICAgLy8gQ2xlYW51cC4KCiAgICBpZiAoY29udmZyb20pIHVjbnZfY2xvc2UoY29udmZyb20pOwogICAgaWYgKGNvbnZ0bykgdWNudl9jbG9zZShjb252dG8pOwoKI2lmICFVQ09ORklHX05PX1RSQU5TTElURVJBVElPTgogICAgaWYgKHQpIGRlbGV0ZSB0OwojZW5kaWYKCiAgICBpZiAoYnVmKSBkZWxldGVbXSBidWY7CiAgICBpZiAodW5pYnVmKSBkZWxldGVbXSB1bmlidWY7CgogICAgaWYgKGZyb21vZmZzZXRzKSBkZWxldGVbXSBmcm9tb2Zmc2V0czsKICAgIGlmICh0b29mZnNldHMpIGRlbGV0ZVtdIHRvb2Zmc2V0czsKCiAgICBpZiAoaW5maWxlICE9IHN0ZGluKSB7CiAgICAgICAgZmNsb3NlKGluZmlsZSk7CiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqcG5hbWUsIGludCBlY29kZSkgewogICAgY29uc3QgVUNoYXIgKm1zZzsKICAgIGludDMyX3QgbXNnTGVuOwogICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICBGSUxFICpmcCA9IGVjb2RlID8gc3RkZXJyIDogc3Rkb3V0OwogICAgaW50IHJlczsKCiAgICBpbml0TXNnKHBuYW1lKTsKICAgIG1zZyA9CiAgICAgICAgdXJlc19nZXRTdHJpbmdCeUtleShnQnVuZGxlLCBlY29kZSA/ICJsY1VzYWdlV29yZCIgOiAidWNVc2FnZVdvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZ0xlbiwgJmVycik7CiAgICBVbmljb2RlU3RyaW5nIHVwbmFtZShwbmFtZSwgKGludDMyX3QpKHVwcnZfc3RybGVuKHBuYW1lKSArIDEpKTsKICAgIFVuaWNvZGVTdHJpbmcgbW5hbWUobXNnLCBtc2dMZW4gKyAxKTsKCiAgICByZXMgPSB1X3dtc2coZnAsICJ1c2FnZSIsIG1uYW1lLmdldEJ1ZmZlcigpLCB1cG5hbWUuZ2V0QnVmZmVyKCkpOwogICAgaWYgKCFlY29kZSkgewogICAgICAgIGlmICghcmVzKSB7CiAgICAgICAgICAgIGZwdXRjKCdcbicsIGZwKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF1X3dtc2coZnAsICJoZWxwIikpIHsKICAgICAgICAgICAgLyogTm93IGR1bXAgY2FsbGJhY2tzIGFuZCBmaW5pc2guICovCgogICAgICAgICAgICBpbnQgaSwgY291bnQgPQogICAgICAgICAgICAgICAgc2l6ZW9mKHRyYW5zY29kZV9jYWxsYmFja3MpIC8gc2l6ZW9mKCp0cmFuc2NvZGVfY2FsbGJhY2tzKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgJXMiLCB0cmFuc2NvZGVfY2FsbGJhY2tzW2ldLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRjKCdcbicsIGZwKTsKICAgICAgICB9CiAgICB9CgogICAgZXhpdChlY29kZSk7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgRklMRSAqb3V0ZmlsZTsKICAgIGludCByZXQgPSAwOwogICAgaW50IHNlZW5mID0gMDsKCiAgICBzaXplX3QgYnVmc3ogPSBERUZBVUxUX0JVRlNaOwoKICAgIGNvbnN0IGNoYXIgKmZyb21jcGFnZSA9IDA7CiAgICBjb25zdCBjaGFyICp0b2NwYWdlID0gMDsKICAgIGNvbnN0IGNoYXIgKnRyYW5zbGl0ID0gMDsKICAgIGNvbnN0IGNoYXIgKm91dGZpbGVzdHIgPSAwOwogICAgaW50IGZhbGxiYWNrID0gMDsKCiAgICBVQ29udmVydGVyRnJvbVVDYWxsYmFjayBmcm9tdWNhbGxiYWNrID0gVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfU1RPUDsKICAgIGNvbnN0IHZvaWQgKmZyb211Y3R4dCA9IDA7CiAgICBVQ29udmVydGVyVG9VQ2FsbGJhY2sgdG91Y2FsbGJhY2sgPSBVQ05WX1RPX1VfQ0FMTEJBQ0tfU1RPUDsKICAgIGNvbnN0IHZvaWQgKnRvdWN0eHQgPSAwOwoKICAgIGNoYXIgKippdGVyOwogICAgY2hhciAqKmVuZCA9IGFyZ3YgKyBhcmdjOwoKICAgIGNvbnN0IGNoYXIgKnBuYW1lOwoKICAgIGludCBwcmludENvbnZzID0gMCwgcHJpbnRDYW5vbiA9IDA7CiAgICBjb25zdCBjaGFyICpwcmludE5hbWUgPSAwOwogICAgaW50IHByaW50VHJhbnNsaXRzID0gMDsKCiAgICBpbnQgdmVyYm9zZSA9IDA7CgogICAgLy8gR2V0IGFuZCBwcmV0dGlmeSBwbmFtZS4KICAgIHBuYW1lID0gdXBydl9zdHJyY2hyKCphcmd2LCBVX0ZJTEVfU0VQX0NIQVIpOwojaWZkZWYgV0lOMzIKICAgIGlmICghcG5hbWUpIHsKICAgICAgICBwbmFtZSA9IHVwcnZfc3RycmNocigqYXJndiwgJy8nKTsKICAgIH0KI2VuZGlmCiAgICBpZiAoIXBuYW1lKSB7CiAgICAgICAgcG5hbWUgPSAqYXJndjsKICAgIH0gZWxzZSB7CiAgICAgICAgKytwbmFtZTsKICAgIH0KCiAgICAvLyBGaXJzdCwgZ2V0IHRoZSBhcmd1bWVudHMgZnJvbSBjb21tYW5kLWxpbmUKICAgIC8vIHRvIGtub3cgdGhlIGNvZGVwYWdlcyB0byBjb252ZXJ0IGJldHdlZW4KCiAgICAvLyBYWFggV2hlbiB5b3UgYWRkIHRvIHRoaXMgbG9vcCwgeW91IG5lZWQgdG8gYWRkIHRvIHRoZSBzaW1pbGFyIGxvb3AKICAgIC8vIGJlbG93LgoKICAgIGZvciAoaXRlciA9IGFyZ3YgKyAxOyBpdGVyICE9IGVuZDsgaXRlcisrKSB7CiAgICAgICAgLy8gQ2hlY2sgZm9yIGZyb20gY2hhcnNldAogICAgICAgIGlmIChzdHJjbXAoIi1mIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1mcm9tLWNvZGUiLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpCiAgICAgICAgICAgICAgICBmcm9tY3BhZ2UgPSAqaXRlcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItdCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tdG8tY29kZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkKICAgICAgICAgICAgICAgIHRvY3BhZ2UgPSAqaXRlcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCIteCIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKQogICAgICAgICAgICAgICAgdHJhbnNsaXQgPSAqaXRlcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS1mYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBmYWxsYmFjayA9IDE7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLW5vLWZhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGZhbGxiYWNrID0gMDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLWIiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWJsb2NrLXNpemUiLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpIHsKICAgICAgICAgICAgICAgIGJ1ZnN6ID0gYXRvaSgqaXRlcik7CiAgICAgICAgICAgICAgICBpZiAoKGludCkgYnVmc3ogPD0gMCkgewogICAgICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKCppdGVyKTsKICAgICAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiYmFkQmxvY2tTaXplIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItbCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tbGlzdCIsICppdGVyKSkgewogICAgICAgICAgICBpZiAocHJpbnRUcmFuc2xpdHMpIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludENvbnZzID0gMTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1kZWZhdWx0LWNvZGUiLCAqaXRlcikgPT0gMCkgewogICAgICAgICAgICBpZiAocHJpbnRUcmFuc2xpdHMpIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludE5hbWUgPSB1Y252X2dldERlZmF1bHROYW1lKCk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi0tbGlzdC1jb2RlIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgaWYgKHByaW50VHJhbnNsaXRzKSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKSB7CiAgICAgICAgICAgICAgICBVRXJyb3JDb2RlIGUgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgICAgICAgICBwcmludE5hbWUgPSB1Y252X2dldEFsaWFzKCppdGVyLCAwLCAmZSk7CiAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGUpIHx8ICFwcmludE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cigqaXRlcik7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgIm5vU3VjaENvZGVzZXQiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1jYW5vbiIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIHByaW50Q2Fub24gPSAxOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItTCIsICppdGVyKSA9PSAwCiAgICAgICAgICAgIHx8ICFzdHJjbXAoIi0tbGlzdC10cmFuc2xpdGVyYXRvcnMiLCAqaXRlcikpIHsKICAgICAgICAgICAgaWYgKHByaW50Q29udnMpIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludFRyYW5zbGl0cyA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi1oIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLT8iLCAqaXRlcikKICAgICAgICAgICAgfHwgIXN0cmNtcCgiLS1oZWxwIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAwKTsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1jIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGZyb211Y2FsbGJhY2sgPSBVQ05WX0ZST01fVV9DQUxMQkFDS19TS0lQOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS10by1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNhbGxiYWNrX2VudCAqY2JlID0gZmluZENhbGxiYWNrKCppdGVyKTsKICAgICAgICAgICAgICAgIGlmIChjYmUpIHsKICAgICAgICAgICAgICAgICAgICBmcm9tdWNhbGxiYWNrID0gY2JlLT5mcm9tdTsKICAgICAgICAgICAgICAgICAgICBmcm9tdWN0eHQgPSBjYmUtPmZyb211Y3R4dDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoKml0ZXIpOwogICAgICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJ1bmtub3duQ2FsbGJhY2siLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWZyb20tY2FsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBjYWxsYmFja19lbnQgKmNiZSA9IGZpbmRDYWxsYmFjaygqaXRlcik7CiAgICAgICAgICAgICAgICBpZiAoY2JlKSB7CiAgICAgICAgICAgICAgICAgICAgdG91Y2FsbGJhY2sgPSBjYmUtPnRvdTsKICAgICAgICAgICAgICAgICAgICB0b3VjdHh0ID0gY2JlLT50b3VjdHh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cigqaXRlcik7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInVua25vd25DYWxsYmFjayIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1pIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHRvdWNhbGxiYWNrID0gVUNOVl9UT19VX0NBTExCQUNLX1NLSVA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWNhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY2FsbGJhY2tfZW50ICpjYmUgPSBmaW5kQ2FsbGJhY2soKml0ZXIpOwogICAgICAgICAgICAgICAgaWYgKGNiZSkgewogICAgICAgICAgICAgICAgICAgIGZyb211Y2FsbGJhY2sgPSBjYmUtPmZyb211OwogICAgICAgICAgICAgICAgICAgIGZyb211Y3R4dCA9IGNiZS0+ZnJvbXVjdHh0OwogICAgICAgICAgICAgICAgICAgIHRvdWNhbGxiYWNrID0gY2JlLT50b3U7CiAgICAgICAgICAgICAgICAgICAgdG91Y3R4dCA9IGNiZS0+dG91Y3R4dDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoKml0ZXIpOwogICAgICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJ1bmtub3duQ2FsbGJhY2siLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItcyIsICppdGVyKSB8fCAhc3RyY21wKCItLXNpbGVudCIsICppdGVyKSkgewogICAgICAgICAgICB2ZXJib3NlID0gMDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi12IiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tdmVyYm9zZSIsICppdGVyKSkgewogICAgICAgICAgICB2ZXJib3NlID0gMTsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1WIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tdmVyc2lvbiIsICppdGVyKSkgewogICAgICAgICAgICBwcmludGYoIiVzIHYyLjBcbiIsIHBuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItbyIsICppdGVyKSB8fCAhc3RyY21wKCItLW91dHB1dCIsICppdGVyKSkgewogICAgICAgICAgICArK2l0ZXI7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCAmJiAhb3V0ZmlsZXN0cikgewogICAgICAgICAgICAgICAgb3V0ZmlsZXN0ciA9ICppdGVyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgqKml0ZXIgPT0gJy0nICYmICgqaXRlcilbMV0pIHsKICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAocHJpbnRDb252cyB8fCBwcmludE5hbWUpIHsKICAgICAgICByZXR1cm4gcHJpbnRDb252ZXJ0ZXJzKHBuYW1lLCBwcmludE5hbWUsIHByaW50Q2Fub24pID8gMiA6IDA7CiAgICB9IGVsc2UgaWYgKHByaW50VHJhbnNsaXRzKSB7CiAgICAgICAgcmV0dXJuIHByaW50VHJhbnNsaXRlcmF0b3JzKHByaW50Q2Fub24pID8gMyA6IDA7CiAgICB9CgogICAgaWYgKCFmcm9tY3BhZ2UgfHwgIXVwcnZfc3RyY21wKGZyb21jcGFnZSwgIi0iKSkgewogICAgICAgIGZyb21jcGFnZSA9IHVjbnZfZ2V0RGVmYXVsdE5hbWUoKTsKICAgIH0KICAgIGlmICghdG9jcGFnZSB8fCAhdXBydl9zdHJjbXAodG9jcGFnZSwgIi0iKSkgewogICAgICAgIHRvY3BhZ2UgPSB1Y252X2dldERlZmF1bHROYW1lKCk7CiAgICB9CgogICAgLy8gT3BlbiB0aGUgY29ycmVjdCBvdXRwdXQgZmlsZSBvciBjb25uZWN0IHRvIHN0ZG91dCBmb3IgcmVhZGluZyBpbnB1dAogICAgaWYgKG91dGZpbGVzdHIgIT0gMCAmJiBzdHJjbXAob3V0ZmlsZXN0ciwgIi0iKSkgewogICAgICAgIG91dGZpbGUgPSBmb3BlbihvdXRmaWxlc3RyLCAid2IiKTsKICAgICAgICBpZiAob3V0ZmlsZSA9PSAwKSB7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyMShvdXRmaWxlc3RyLCAiIik7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyMihzdHJlcnJvcihlcnJubyksICIiKTsKICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50Q3JlYXRlT3V0cHV0RiIsCiAgICAgICAgICAgICAgICBzdHIxLmdldEJ1ZmZlcigpLCBzdHIyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBvdXRmaWxlc3RyID0gIi0iOwogICAgICAgIG91dGZpbGUgPSBzdGRvdXQ7CiNpZmRlZiBXSU4zMgogICAgICAgIGlmIChzZXRtb2RlKGZpbGVubyhvdXRmaWxlKSwgT19CSU5BUlkpID09IC0xKSB7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50U2V0T3V0QmluTW9kZSIpOwogICAgICAgICAgICBleGl0KC0xKTsKICAgICAgICB9CiNlbmRpZgogICAgfQoKICAgIC8qIExvb3AgYWdhaW4gb24gdGhlIGFyZ3VtZW50cyB0byBmaW5kIGFsbCB0aGUgaW5wdXQgZmlsZXMsIGFuZAogICAgY29udmVydCB0aGVtLiBYWFggQ2hlYXAgYW5kIHNsb3BweS4gKi8KCiAgICBmb3IgKGl0ZXIgPSBhcmd2ICsgMTsgaXRlciAhPSBlbmQ7IGl0ZXIrKykgewogICAgICAgIGlmIChzdHJjbXAoIi1mIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1mcm9tLWNvZGUiLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItdCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tdG8tY29kZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi14IiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS1mYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLW5vLWZhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLWIiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWJsb2NrLXNpemUiLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItbCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tbGlzdCIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi0tZGVmYXVsdC1jb2RlIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItLWxpc3QtY29kZSIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1jYW5vbiIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLUwiLCAqaXRlcikgPT0gMAogICAgICAgICAgICB8fCAhc3RyY21wKCItLWxpc3QtdHJhbnNsaXRlcmF0b3JzIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLWgiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItPyIsICppdGVyKQogICAgICAgICAgICB8fCAhc3RyY21wKCItLWhlbHAiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLWMiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS10by1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWZyb20tY2FsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLWkiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItcyIsICppdGVyKSB8fCAhc3RyY21wKCItLXNpbGVudCIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItdiIsICppdGVyKSB8fCAhc3RyY21wKCItLXZlcmJvc2UiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLVYiLCAqaXRlcikgfHwgIXN0cmNtcCgiLS12ZXJzaW9uIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1vIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tb3V0cHV0IiwgKml0ZXIpKSB7CiAgICAgICAgICAgICsraXRlcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWVuZiA9IDE7CiAgICAgICAgICAgIGlmICghY29udmVydEZpbGUKICAgICAgICAgICAgICAgIChwbmFtZSwgZnJvbWNwYWdlLCB0b3VjYWxsYmFjaywgdG91Y3R4dCwgdG9jcGFnZSwKICAgICAgICAgICAgICAgIGZyb211Y2FsbGJhY2ssIGZyb211Y3R4dCwgZmFsbGJhY2ssIGJ1ZnN6LCB0cmFuc2xpdCwgKml0ZXIsCiAgICAgICAgICAgICAgICBvdXRmaWxlLCB2ZXJib3NlKSkgewogICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICghc2VlbmYpIHsKICAgICAgICBpZiAoIWNvbnZlcnRGaWxlCiAgICAgICAgICAgIChwbmFtZSwgZnJvbWNwYWdlLCB0b3VjYWxsYmFjaywgdG91Y3R4dCwgdG9jcGFnZSwKICAgICAgICAgICAgZnJvbXVjYWxsYmFjaywgZnJvbXVjdHh0LCBmYWxsYmFjaywgYnVmc3osIHRyYW5zbGl0LCAwLCBvdXRmaWxlLAogICAgICAgICAgICB2ZXJib3NlKSkgewogICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgfQogICAgfQoKICAgIGdvdG8gbm9ybWFsX2V4aXQ7CmVycm9yX2V4aXQ6CiAgICByZXQgPSAxOwpub3JtYWxfZXhpdDoKCiAgICBpZiAob3V0ZmlsZSAhPSBzdGRvdXQpCiAgICAgICAgZmNsb3NlKG91dGZpbGUpOwoKICAgIHJldHVybiByZXQ7Cn0KCgovKgogKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CiAqCiAqIExvY2FsIFZhcmlhYmxlczoKICogaW5kZW50LXRhYnMtbW9kZTogbmlsCiAqIEVuZDoKICoKICovCg==