LyoKICogIENsb2NrIChGcmVuY2ggcmVzb3VyY2VzKQogKgogKiBDb3B5cmlnaHQgMTk5OCBSb2JlcnQgUG91bGlvdCA8a3J5bm9zQGNsaWMubmV0PgogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDYgSm9uYXRoYW4gRXJuc3QgPGpvbmF0aGFuQGVybnN0ZmFtaWx5LmNoPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJlByb3Byael06XMiIHsKICBNRU5VSVRFTSAiQW5hJmxvZ2lxdWUiLCBJRE1fQU5BTE9HCiAgTUVOVUlURU0gIiZOdW3pcmlxdWUiLCBJRE1fRElHSVRBTAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUG9saWNlLi4uIiwgSURNX0ZPTlQKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2FucyAmYmFycmUgZGUgdGl0cmUiLCBJRE1fTk9USVRMRQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImU2Vjb25kZXMiLCBJRE1fU0VDT05EUwogIE1FTlVJVEVNICImRGF0ZSIsIElETV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZUb3Vqb3VycyB2aXNpYmxlIiwgSURNX09OVE9QCiB9CiBQT1BVUCAiSW5mJm8iIHsKICBNRU5VSVRFTSAiJkxpY2VuY2UuLi4iLCBJRE1fTElDRU5TRQogIE1FTlVJVEVNICJBVUNVTkUgJkdBUkFOVElFLi4uIiwgSURNX05PV0FSUkFOVFkKICBNRU5VSVRFTSAiwCAmcHJvcG9zIGRlIGwnaG9ybG9nZSIsIElETV9BQk9VVAogfQp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CklEU19DTE9DSywgIkhvcmxvZ2UiCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKewpJRFNfTElDRU5TRV9DQVBUSU9OLCAgICAgICAgICAgICJMSUNFTkNFIgpJRFNfTElDRU5TRSwKIkNldHRlIGJpYmxpb3Ro6HF1ZSBlc3QgbGlicmUsIHZvdXMgcG91dmV6IGxhIHJlZGlzdHJpYnVlciBldC9vdSBcCmxhIG1vZGlmaWVyIHNlbG9uIGxlcyB0ZXJtZXMgZGUgbGEgTGljZW5jZSBQdWJsaXF1ZSBH6W7pcmFsZSBHTlUgXApMaW1pdOllIHB1Ymxp6WUgcGFyIGxhIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAodmVyc2lvbiAyLjEgb3UgXApiaWVuIHRvdXRlIGF1dHJlIHZlcnNpb24gdWx06XJpZXVyZSBjaG9pc2llIHBhciB2b3VzKS5cblwKQ2V0dGUgYmlibGlvdGjocXVlIGVzdCBkaXN0cmlidellIGNhciBwb3RlbnRpZWxsZW1lbnQgdXRpbGUsIFwKbWFpcyBTQU5TIEFVQ1VORSBHQVJBTlRJRSwgbmkgZXhwbGljaXRlIG5pIGltcGxpY2l0ZSwgeSBjb21wcmlzIFwKbGVzIGdhcmFudGllcyBkZSBjb21tZXJjaWFsaXNhdGlvbiBvdSBkJ2FkYXB0YXRpb24gZGFucyB1biBidXQgXApzcOljaWZpcXVlLiBSZXBvcnRlei12b3VzIOAgbGEgTGljZW5jZSBQdWJsaXF1ZSBH6W7pcmFsZSBHTlUgXApMaW1pdOllIHBvdXIgcGx1cyBkZSBk6XRhaWxzLlxuXApWb3VzIGRldmV6IGF2b2lyIHJl53UgdW5lIGNvcGllIGRlIGxhIExpY2VuY2UgUHVibGlxdWUgR+lu6XJhbGUgXApHTlUgTGltaXTpZSBlbiBt6m1lIHRlbXBzIHF1ZSBjZXR0ZSBiaWJsaW90aOhxdWWgOyBzaSBjZSBuJ2VzdCBwYXMgXApsZSBjYXMsIOljcml2ZXog4CBsYSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBcCkZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTExLTEzMDEsIMl0YXRzLVVuaXMuIgoKSURTX1dBUlJBTlRZX0NBUFRJT04sICJBVUNVTkUgR0FSQU5USUUiCklEU19XQVJSQU5UWSwKIkNldHRlIGJpYmxpb3Ro6HF1ZSBlc3QgZGlzdHJpYnXpZSBjYXIgcG90ZW50aWVsbGVtZW50IHV0aWxlLCBcCm1haXMgU0FOUyBBVUNVTkUgR0FSQU5USUUsIG5pIGV4cGxpY2l0ZSBuaSBpbXBsaWNpdGUsIHkgY29tcHJpcyBcCmxlcyBnYXJhbnRpZXMgZGUgY29tbWVyY2lhbGlzYXRpb24gb3UgZCdhZGFwdGF0aW9uIGRhbnMgdW4gYnV0IFwKc3DpY2lmaXF1ZS4gUmVwb3J0ZXotdm91cyDgIGxhIExpY2VuY2UgUHVibGlxdWUgR+lu6XJhbGUgR05VIFwKTGltaXTpZSBwb3VyIHBsdXMgZGUgZOl0YWlscy4iCn0K