LyoKICogIE5vdGVwYWQgKEdlcm1hbiByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMTk5Nyw5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAqICBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICoKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19HRVJNQU4sIFNVQkxBTkdfTkVVVFJBTAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZEYXRlaSIgewogIE1FTlVJVEVNICImTmV1XHRTdHJnK04iLCAgICAgICAgICAgQ01EX05FVwogIE1FTlVJVEVNICLWJmZmbmVuLi4uXHRTdHJnK08iLCAgICAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAiJlNwZWljaGVyblx0U3RyZytTIiwgICAgICAgIENNRF9TQVZFCiAgTUVOVUlURU0gIlNwZWljaGVybiAmdW50ZXIuLi4iLCAgICAgICBDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImRHJ1Y2tlbi4uLlx0U3RyZytQIiwgICAgICAgICAgQ01EX1BSSU5UCiAgTUVOVUlURU0gIlNlaXRlIGVpbiZyaWNodGVuLi4uIiwgICAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJEcnVja2VyJmVpbnJpY2h0dW5nLi4uIiwgICAgQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkJlZW5kZW4iLCAgICAgICAgICBDTURfRVhJVAogfQpQT1BVUCAiJkJlYXJiZWl0ZW4iIHsKICBNRU5VSVRFTSAiJlL8Y2tn5G5naWdcdFN0cmcrWiIsICAgICAgIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBdXNzY2huZWlkZW5cdFN0cmcrWCIsICAgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZLb3BpZXJlblx0U3RyZytDIiwgICAgICAgICBDTURfQ09QWQogIE1FTlVJVEVNICImRWluZvxnZW5cdFN0cmcrViIsICAgICAgICAgQ01EX1BBU1RFCiAgTUVOVUlURU0gIiZM9nNjaGVuXHRFbnRmIiwgICAgQ01EX0RFTEVURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJBbGxlcyAmbWFya2llcmVuXHRTdHJnK0EiLCAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiJlVocnplaXQvRGF0dW1cdEY1IiwgICAgICAgIENNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlplaWxlbnVtYnJ1Y2giLCAgICBDTURfV1JBUAogIE1FTlVJVEVNICImU2NocmlmdGFydGVuLi4uIiwJQ01EX0ZPTlQKIH0KUE9QVVAgIiZTdWNoZW4iIHsKICBNRU5VSVRFTSAiU3VjaGVuLi4uXHRTdHJnK0YiLCBDTURfU0VBUkNICiAgTUVOVUlURU0gIiZXZWl0ZXJzdWNoZW5cdEYzIiwgQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImSGlsZmUiIHsKICBNRU5VSVRFTSAiJkluaGFsdCIsICAgICAgICAgICBDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImU3VjaGVuLi4uIiwgICAgICAgIENNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICImSGlsZmUgYmVudXR6ZW4iLCAgIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBQT1BVUCAiSW5mJm8iIHsKICAgTUVOVUlURU0gIiZMaXplbnouLi4iLCAgICAgICAgICBDTURfTElDRU5TRQogICBNRU5VSVRFTSAiJktFSU5FIEdBUkFOVElFLi4uIiwgIENNRF9OT19XQVJSQU5UWQogICBNRU5VSVRFTSAiJtxiZXIgV2luZS4uLiIsICAgICAgIENNRF9BQk9VVF9XSU5FCiAgfQogfQp9CgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQIERJQUxPRyAwLCAwLCAyMjUsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIlNlaXRlIGVpbnJpY2h0ZW4iCnsKTFRFWFQgICAgIiZLb3BmemVpbGU6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZGdd96ZWlsZToiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIlLkbmRlciAoTWlsbGltZXRlcikiLCAgMHgxNDQsICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAiJkxpbmtzOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImT2JlbjoiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUmVjaHRzOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlVudGVuOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiQWJicmVjaGVuIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImSGlsZmUiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgIiZmIgpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgICJTZWl0ZSAmcCIKClNUUklOR19OT1RFUEFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0b3IiClNUUklOR19FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGZWhsZXIiClNUUklOR19XQVJOSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2h0dW5nIgpTVFJJTkdfSU5GTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5mb3JtYXRpb24iCgpTVFJJTkdfVU5USVRMRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHVuYmVuYW5udCkiCgpTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSBEYXRlaWVuICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsICAgICAgICAgICAgICAgICAgIlRleHRkYXRlaWVuICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGllIERhdGVpICclcycgaXN0IHp1IGdyb98gZvxyIGRlbiBFZGl0b3JcbiBcCkJlbnV0emVuIFNpZSBiaXR0ZSBlaW5lbiBhbmRlcmVuIEVkaXRvciwgdW0gZGllc2UgRGF0ZWkgenUgYmVhcmJlaXRlbi4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaWUgaGFiZW4ga2VpbmVuIFRleHQgZWluZ2VnZWJlbiwgZGVyIFwKZ2VzcGVpY2hlcnRcbiB3ZXJkZW4ga/ZubnRlLiBHZWJlbiBTaWUgVGV4dCBlaW4sIHVuZCB2ZXJzdWNoZW4gU2llIGVzIFwKXG5lcm5ldXQuIgpTVFJJTkdfRE9FU05PVEVYSVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGllIERhdGVpICclcydcbmV4aXN0aWVydCBuaWNodC5cblxuIFwKTfZjaHRlbiBTaWUgZWluZSBuZXVlIERhdGVpIGVyc3RlbGxlbiA/IgpTVFJJTkdfTk9UU0FWRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0ZWkgJXNcbiB3dXJkZSBnZeRuZGVydC5cblxuIFwKTfZjaHRlbiBTaWUgZGllIMRuZGVydW5nZW4gc3BlaWNoZXJuID8iClNUUklOR19OT1RGT1VORCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycga2FubiBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4uIgpTVFJJTkdfT1VUX09GX01FTU9SWSwgICAgICAgICAgICAgICAgICAgIk5pY2h0IGdlbvxnZW5kIEFyYmVpdHNzcGVpY2hlciwgXAp1bSBkaWVzZSBGdW5rdGlvbiBcbmFienVzY2hsaWXfZW4uIEJlZW5kZW4gU2llIGVpbmUgb2RlciBtZWhyZXJlIFwKXG5BbndlbmR1bmdlbiwgdW0gZGVuIHZlcmb8Z2JhcmVuIEFyYmVpdHNzcGVpY2hlciB6dSBcbmVyaPZoZW4uIgoKCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKSURTX0xJQ0VOU0VfQ0FQVElPTiwgICAgICAgICAgICAiTElaRU5aIgpJRFNfTElDRU5TRSwKIkRpZXNlIEJpYmxpb3RoZWsgaXN0IGZyZWllIFNvZnR3YXJlOyBTaWUgZPxyZmVuIHNpZSB1bnRlciBkZW4gXApCZWRpbmd1bmdlbiBkZXIgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aWUgdm9uIGRlciBcCkZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXL2ZmZlbnRsaWNodCwgd2VpdGVydmVydGVpbGVuIHVuZC9vZGVyIFwKbW9kaWZpemllcmVuOyBlbnR3ZWRlciBnZW3k3yBWZXJzaW9uIDIuMSBkZXIgTGl6ZW56IG9kZXIgKG5hY2ggXApJaHJlciBPcHRpb24pIGplZGVyIHNw5HRlcmVuIFZlcnNpb24uXG5cCkRpZXNlIEJpYmxpb3RoZWsgd2lyZCBpbiBkZXIgSG9mZm51bmcgd2VpdGVydmVyYnJlaXRldCwgZGHfIHNpZSBcCm78dHpsaWNoIHNlaW4gd2lyZCwgamVkb2NoIE9ITkUgSVJHRU5ERUlORSBHQVJBTlRJRSwgYXVjaCBvaG5lIFwKZGllIGltcGxpemllcnRlIEdhcmFudGllIGRlciBNQVJLVFJFSUZFIG9kZXIgZGVyIFZFUldFTkRCQVJLRUlUIFwKRtxSIEVJTkVOIEJFU1RJTU1URU4gWldFQ0suIE1laHIgRGV0YWlscyBmaW5kZW4gU2llIGluIGRlciBcCkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS5cblwKU2llIHNvbGx0ZW4gZWluZSBLb3BpZSBkZXIgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHp1c2FtbWVuIFwKbWl0IGRpZXNlciBCaWJsaW90aGVrIGVyaGFsdGVuIGhhYmVuOyBmYWxscyBuaWNodCwgc2NocmVpYmVuIFNpZSBhbiBcCmRpZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgXApCb3N0b24sIE1BIDAyMTEwLCBVU0EuIgoKSURTX1dBUlJBTlRZX0NBUFRJT04sICJLRUlORSBHQVJBTlRJRSIKSURTX1dBUlJBTlRZLAoiRGllc2UgQmlibGlvdGhlayB3aXJkIGluIGRlciBIb2ZmbnVuZyB3ZWl0ZXJ2ZXJicmVpdGV0LCBkYd8gc2llIG78dHpsaWNoIFwKc2VpbiB3aXJkLCBqZWRvY2ggT0hORSBJUkdFTkRFSU5FIEdBUkFOVElFLCBhdWNoIG9obmUgZGllIGltcGxpemllcnRlIEdhcmFudGllIFwKZGVyIE1BUktUUkVJRkUgb2RlciBkZXIgVkVSV0VOREJBUktFSVQgRtxSIEVJTkVOIEJFU1RJTU1URU4gWldFQ0suIE1laHIgRGV0YWlscyBcCmZpbmRlbiBTaWUgaW4gZGVyIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4iCn0K