LyoKICogIE5vdGVwYWQgKEdlcm1hbiByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMTk5Nyw5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAqICBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICoKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKTUFJTl9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19HRVJNQU4sIFNVQkxBTkdfTkVVVFJBTAp7CiBQT1BVUCAiJkRhdGVpIiB7CiAgTUVOVUlURU0gIiZOZXUuLi4iLCAweDEwMAogIE1FTlVJVEVNICLWJmZmbmVuLi4uIiwgMHgxMDEKICBNRU5VSVRFTSAiJlNwZWljaGVybiIsIDB4MTAyCiAgTUVOVUlURU0gIlNwZWljaGVybiAmdW50ZXIuLi4iLCAweDEwMwogIE1FTlVJVEVNICImRHJ1Y2tlbiIsIDB4MTA0CiAgTUVOVUlURU0gIlNlaXRlIGVpbiZyaWNodGVuLi4uIiwgMHgxMDUKICBNRU5VSVRFTSAiRHJ1Y2tlciZlaW5yaWNodHVuZy4uLiIsIDB4MTA2CiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZCZWVuZGVuIiwgMHgxMDgKIH0KUE9QVVAgIiZCZWFyYmVpdGVuIiB7CiAgTUVOVUlURU0gIiZS/GNrZ+RuZ2lnXHRTdHJnK1oiLCAweDExMAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQXVzc2NobmVpZGVuXHRTdHJnK1giLCAweDExMQogIE1FTlVJVEVNICImS29waWVyZW5cdFN0cmcrQyIsIDB4MTEyCiAgTUVOVUlURU0gIiZFaW5m/Gdlblx0U3RyZytWIiwgMHgxMTMKICBNRU5VSVRFTSAiJkz2c2NoZW5cdEVudGYiLCAweDExNAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJBbGxlcyAmbWFya2llcmVuIiwgMHgxMTYKICBNRU5VSVRFTSAiJlVocnplaXQvRGF0dW1cdEY1IiwgMHgxMTcKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlplaWxlbnVtYnJ1Y2giLCAweDExOQogfQpQT1BVUCAiJlN1Y2hlbiIgewogIE1FTlVJVEVNICJTdWNoZW4uLi4iLCAweDEyMAogIE1FTlVJVEVNICImV2VpdGVyc3VjaGVuXHRGMyIsIDB4MTIxCiB9ClBPUFVQICImSGlsZmUiIHsKICBNRU5VSVRFTSAiJkluaGFsdCIsIDB4MTMwCiAgTUVOVUlURU0gIiZTdWNoZW4uLi4iLCAweDEzMQogIE1FTlVJVEVNICImSGlsZmUgYmVudXR6ZW4iLCAweDEzMgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICJJbmYmby4uLiIgewogICBNRU5VSVRFTSAiJkxpemVueiIsIDB4MTM1CiAgIE1FTlVJVEVNICImS0VJTkUgR0FSQU5USUUiLCAweDEzNgogICBNRU5VSVRFTSAiJtxiZXIgV2luZSIsIDB4MTM3CiAgfQogfQp9CgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQXyBESUFMT0cgMCwgMCwgMjI1LCA5NQpMQU5HVUFHRSBMQU5HX0dFUk1BTiwgU1VCTEFOR19ORVVUUkFMClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJIZWx2IgpDQVBUSU9OICJTZWl0ZSBlaW5yaWNodGVuIgp7CkxURVhUICAgICImS29wZnplaWxlOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MSwgICAgICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZGdd96ZWlsZToiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDMsICAgICAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiUuRuZGVyIiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImTGlua3M6IiwgICAgICAgIDB4MTQ1LCAgIDIwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLCovICAgMHgxNDcsICAgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZPYmVuOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUmVjaHRzOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCovICAweDE0RCwgICAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImVW50ZW46IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwqLyAweDE1MCwgICAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICAweDE1MSwgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkFiYnJlY2hlbiIsICAgICAweDE1MiwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkhpbGZlIiwgICAgICAgMHgxNTMsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX0dFUk1BTiwgU1VCTEFOR19ORVVUUkFMCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwJIiZuIiAgICAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwJIlBhZ2UgJnMiICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsCQkiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsCSIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsCQkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLAkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwoKU1RSSU5HX05PVEVQQUQsCQkJCQkiRWRpdG9yIgpTVFJJTkdfRVJST1IsCQkJCQkiRkVITEVSIgpTVFJJTkdfV0FSTklORywJCQkJCSJBQ0hUVU5HIgpTVFJJTkdfSU5GTywJCQkJCSJJbmZvcm1hdGlvbiIKClNUUklOR19VTlRJVExFRCwJCQkJIih1bmJlbmFubnQpIgoKU1RSSU5HX0FMTF9GSUxFUywJCQkJIkFsbGUgRGF0ZWllbiAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULAkJCSJUZXh0ZGF0ZWllbiAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLAkJCQkiJyVzJyBpc3QgenUgZ3Jvc3MgZvxyIGRlbiBFZGl0b3JcbiBcCkJlbnV0emVuIFNpZSBiaXR0ZSBlaW5lbiBhbmRlcmVuIEVkaXRvciwgdW0gZGllc2UgRGF0ZWkgenUgYmVhcmJlaXRlbi4iClNUUklOR19OT1RFWFQsCQkJCQkiU2llIGhhYmVuIGtlaW5lbiBUZXh0IGVpbmdlZ2ViZW4sIGRlciBcCmdlc3BlaWNoZXJ0XG4gd2VyZGVuIGv2bm50ZS4gR2ViZW4gU2llIFRleHQgZWluLCB1bmQgdmVyc3VjaGVuIFNpZSBlcyBcClxuZXJuZXV0LiIKU1RSSU5HX0RPRVNOT1RFWElTVCwJCQkJIkZpbGUgJyVzJ1xuZG9lcyBub3QgZXhpc3RcblxuIFwKRG8geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGZpbGUgPyIKU1RSSU5HX05PVFNBVkVELAkJCQkiRGF0ZWkgJXNcbiB3dXJkZSBnZWFlbmRlcnQuXG5cbiBcCk1vZWNodGVuIFNpZSBkaWUgQWVuZGVydW5nZW4gc3BlaWNoZXJuID8iClNUUklOR19OT1RGT1VORCwJCQkJCSInJXMnIGthbm4gbmljaHQgZ2VmdW5kZW4gd2VyZGVuLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksCQkJIk5pY2h0IGdlbvxnZW5kIEFyYmVpdHNzcGVpY2hlciwgXAp1bSBkaWVzZSBGdW5rdGlvbiBcbmFienVzY2hsaWXfZW4uIEJlZW5kZW4gU2llIGVpbmUgb2RlciBtZWhyZXJlIFwKXG5BbndlbmR1bmdlbiwgdW0gZGVuIHZlcmb8Z2JhcmVuIEFyYmVpdHNzcGVpY2hlciB6dSBcbmVyaPZoZW4uIgoKCn0K