LyoKICogQ29weXJpZ2h0IDIwMDUgTWlsa28gS3JhY2hvdW5vdgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0JVTEdBUklBTiwgU1VCTEFOR19ERUZBVUxUCgpNRU5VXzAwMSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglNRU5VSVRFTSAiJsPu6+Xs6CDo6u7t6CIsCUZDSURNX1NIVklFV19CSUdJQ09OCglNRU5VSVRFTSAiJszg6+roIOjq7u3oIiwJRkNJRE1fU0hWSUVXX1NNQUxMSUNPTgoJTUVOVUlURU0gIibR7+jx+uoiLAkJRkNJRE1fU0hWSUVXX0xJU1RWSUVXCglNRU5VSVRFTSAiJs/u5PDu4e3u8fLoIiwJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKRU5ECgovKgogc2hlbGx2aWV3IGJhY2tncm91bmQgbWVudQoqLwpNRU5VXzAwMiBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgUE9QVVAgIibI5+Pr5eQiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIibD7uvl7Ogg6Oru7egiLAlGQ0lETV9TSFZJRVdfQklHSUNPTgoJICAgIE1FTlVJVEVNICImzODr6ugg6Oru7egiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCgkgICAgTUVOVUlURU0gIibR7+jx+uoiLAkJRkNJRE1fU0hWSUVXX0xJU1RWSUVXCgkgICAgTUVOVUlURU0gIibP7uTw7uHt7vHy6CIsCUZDSURNX1NIVklFV19SRVBPUlRWSUVXCgkgIEVORAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgUE9QVVAgIs/u5PDl5OggJujq7u3o8uUiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIs/uICbo7OUiLAkJMHgzMAkvKiBjb2x1bW4gMCAqLwoJICAgIE1FTlVJVEVNICLP7iAm8ujvIiwJCTB4MzIJLyogY29sdW1uIDIgKi8KCSAgICBNRU5VSVRFTSAiz+4gJvDg5+zl8CIsCTB4MzEJLyogLi4uICovCgkgICAgTUVOVUlURU0gIs/uICbk4PLgIiwJMHgzMwoJICAgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICAgIE1FTlVJVEVNICImwOLy7uzg8uj37e4g7+7k8OXm5ODt5SIsCUZDSURNX1NIVklFV19BVVRPQVJSQU5HRQoJICBFTkQKCSAgTUVOVUlURU0gIs/u5PDg4u3oIOjq7u3o8uUiLAkJRkNJRE1fU0hWSUVXX1NOQVBUT0dSSUQKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICLO7/Dl8e3oIiwJCQlGQ0lETV9TSFZJRVdfUkVGUkVTSAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIsLs+urt6CIsCQkJRkNJRE1fU0hWSUVXX0lOU0VSVAoJICBNRU5VSVRFTSAiwuz66u3oIOrg8u4g4vD65+rgIiwJRkNJRE1fU0hWSUVXX0lOU0VSVExJTksKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIFBPUFVQICLR+ufk4OkiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIs3u4uAgJu/g7+rgIiwJCUZDSURNX1NIVklFV19ORVdGT0xERVIKCSAgICBNRU5VSVRFTSAize7i4CAm4vD65+rgIiwJCUZDSURNX1NIVklFV19ORVdMSU5LCgkgICAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIEVORAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gItHi7unx8uLgIiwJCQlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKLyoKIHNoZWxsdmlldyBpdGVtIG1lbnUKKi8KTUVOVV9TSFZfRklMRSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgTUVOVUlURU0gIibQ4Ofj6+Xk4OkiLAlGQ0lETV9TSFZJRVdfRVhQTE9SRQoJICBNRU5VSVRFTSAiJs7y4u7w6CIsCQlGQ0lETV9TSFZJRVdfT1BFTgoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIibI5/Dl5ugiLAkJRkNJRE1fU0hWSUVXX0NVVAoJICBNRU5VSVRFTSAiJsru7+jw4OkiLAkJRkNJRE1fU0hWSUVXX0NPUFkKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICLR+ufk4OkgJuLw+ufq4CIsCUZDSURNX1NIVklFV19DUkVBVEVMSU5LCgkgIE1FTlVJVEVNICLI5yby8OjpIiwJCUZDSURNX1NIVklFV19ERUxFVEUKCSAgTUVOVUlURU0gIibP8OXo7OXt8+Lg6SIsCUZDSURNX1NIVklFV19SRU5BTUUKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICIm0eLu6fHy4uAiLAkJRkNJRE1fU0hWSUVXX1BST1BFUlRJRVMKCUVORApFTkQKClNIQlJTRk9SRk9MREVSX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDE4OCwgMTkyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVSB8IERTX01PREFMRlJBTUUgfCBEU19TRVRGT05UIHwgRFNfM0RMT09LCkNBUFRJT04gIsjn4e7wIO3gIO/g7+rgIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgODAsIDE3NiwgNTAsIDEyLCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICLO8uzl7egiLCAyLCAxMzQsIDE3NiwgNTAsIDEyLCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIExURVhUICIiLCBJRERfVElUTEUsIDQsIDQsIDE4MCwgMTIKIExURVhUICIiLCBJRERfU1RBVFVTLCA0LCAyNSwgMTgwLCAxMgogQ09OVFJPTCAiIiwgSUREX1RSRUVWSUVXLCAiU3lzVHJlZVZpZXczMiIsCiAJVFZTX0hBU0JVVFRPTlMgfCBUVlNfSEFTTElORVMgfCBUVlNfTElORVNBVFJPT1QgfAoJV1NfQk9SREVSIHwgV1NfVEFCU1RPUCwKCTQsIDQwLCAxODAsIDEyMAp9CgpTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAyMTAsIDE1MgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAizvLt7vHt7iAlcyIKRk9OVCAxMCwgIk1TIFNoZWxsIERsZyIKewogREVGUFVTSEJVVFRPTiAiT0siLCBJRE9LLCAxNTMsIDEzMywgNTAsIDEyLCBXU19UQUJTVE9QCiBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKIElDT04gIiIsIDEwODgsIDEwLCAxMCwgMTQsIDE2CiBMVEVYVCAiIiwgMTAwLCAzMCwgMTAsIDEzNywgMTAKIExURVhUICIiLCAxMDEsIDMwLCAyMiwgMTM3LCAxMAogTFRFWFQgIldpbmUg4eX45SDx+ufk4OTl7SDn4CDi4PEg7vI6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCn0KClNIRUxMX1JVTl9ETEcgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMCwgMCwgMjI3LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKIElDT04gIiIsIDEyMjk3LCA3LCAxMSwgMTgsIDIwLCBXU19WSVNJQkxFCiBMVEVYVCAiwvri5eTl8uUg6OzlIO3gIO/w7uPw4OzgLCDv4O/q4Cwg5O7q8+zl7fIg6OvoIMjt8uXw7eXyIPDl8fPw8SDoIFdpbmUg+eUg4+4g7vLi7vDoIOfgIOLg8S4iLCAxMjI4OSwgMzYsIDExLCAxODIsIDE4CiBMVEVYVCAiJk9wZW46IiwgMTIzMDUsIDcsIDM5LCAyNCwgMTAKIENPTlRST0wgIiIsIDEyMjk4LCAiQ09NQk9CT1giLCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WU0NST0xMIHwgV1NfVklTSUJMRSB8IENCU19ESVNBQkxFTk9TQ1JPTEwgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfRFJPUERPV04sIDM2LCAzNywgMTgzLCAxMDAKIERFRlBVU0hCVVRUT04gIk9LIiwgSURPSywgNjIsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIs7y7OXt6CIsIElEQ0FOQ0VMLCAxMTYsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIibI5+Hl8OguLi4iLCAxMjI4OCwgMTcwLCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgICAgICAvKiBjb2x1bW5zIGluIHRoZSBzaGVsbHZpZXcgKi8KCUlEU19TSFZfQ09MVU1OMQkJItTg6esiCglJRFNfU0hWX0NPTFVNTjIJCSLQ4Ofs5fAiCglJRFNfU0hWX0NPTFVNTjMJCSLS6O8iCglJRFNfU0hWX0NPTFVNTjQJCSLP8O7s5e3l7SIKCUlEU19TSFZfQ09MVU1ONQkJIsDy8Ojh8/LoIgoJSURTX1NIVl9DT0xVTU42CQki0ODn7OXwIgoJSURTX1NIVl9DT0xVTU43CQkizvHy4OLg+SDw4Ofs5fAiIC8qIFNpemUgYXZhaWxhYmxlLCDK4u7u7u7u7u7u7u7u7u4hPyAqLwoJSURTX1NIVl9DT0xVTU44CQkiyOzlIgoJSURTX1NIVl9DT0xVTU45CQkiyu7s5e3y4PAiCglJRFNfU0hWX0NPTFVNTjEwCSLR7uHx8uLl7ejqIgoJSURTX1NIVl9DT0xVTU4xMQkiw/Dz7+AiCgogICAgICAgIC8qIHNwZWNpYWwgZm9sZGVycyAqLwoJSURTX0RFU0tUT1AJCSLQ4OHu8uXtIO/r7vIiCglJRFNfTVlDT01QVVRFUgkJIszu//Ig6u7s7/7y+vAiCgogICAgICAgIC8qIGNvbnRleHQgbWVudXMgKi8KCUlEU19WSUVXX0xBUkdFCQkiJsPu6+Xs6CDo6u7t6CIKCUlEU19WSUVXX1NNQUxMCQkiJszg6+roIOjq7u3oIgoJSURTX1ZJRVdfTElTVAkJIibR7+jx+uoiCglJRFNfVklFV19ERVRBSUxTCSImz+7k8O7h7e7x8ugiCglJRFNfU0VMRUNUCQkiyOfh5fDoIgoJSURTX09QRU4JCSLO8uLu8OgiCgoJSURTX0NSRUFURUZPTERFUl9ERU5JRUQgIs/g7+rg8uAg7eUg7O7m5SDk4CDh+uTlIPH65+Tg5OXt4DogxO7x8vrv+vIg7vLq4Ofg7S4iCglJRFNfQ1JFQVRFRk9MREVSX0NBUFRJT04gIsPw5fjq4CDv8Ogg8frn5ODi4O3l8u4g7eAg7e7i4CDv4O/q4C4iCglJRFNfREVMRVRFSVRFTV9DQVBUSU9OICLP7vLi+vDk5fLlIOjn8vDo4uDt5fLuIO3gIPTg6evgIgoJSURTX0RFTEVURUZPTERFUl9DQVBUSU9OICLP7vLi+vDk5fLlIOjn8vDo4uDt5fLuIO3gIO/g7+rg8uAiCglJRFNfREVMRVRFSVRFTV9URVhUICLN4Ojx8ujt4CDr6CDo8erg8uUg5OAg6Ofy8Ojl8uUgJyUxJz8iCglJRFNfREVMRVRFTVVMVElQTEVfVEVYVCAizeDo8fLo7eAg6+gg6PHq4PLlIOTgIOjn8vDo5fLlIPLl5+ggJTEg5evl7OXt8uA/IgoJSURTX0RFTEVURVNFTEVDVEVEX1RFWFQgIs3g6PHy6O3gIOvoIOjx6uDy5SDk4CDo5/Lw6OXy5SDo5+Hw4O3o8uUg5evl7OXt8ug/IgoJSURTX09WRVJXUklURUZJTEVfVEVYVCAiVGhpcyBmb2xkZXIgYWxyZWFkeSBjb250YWlucyBhIGZpbGUgY2FsbGVkICclMScuXG5cbkRvIHlvdSB3YW50IHRvIHJlcGxhY2UgaXQ/IgoJSURTX09WRVJXUklURUZJTEVfQ0FQVElPTiAiz+7y4vrw5OXy5SDv8OXn4O/o8eAg7eAg9ODp6+AiCglJRFNfT1ZFUldSSVRFRk9MREVSX1RFWFQgIlRoaXMgZm9sZGVyIGFscmVhZHkgY29udGFpbnMgYSBmb2xkZXIgbmFtZWQgJyUxJy5cblxuIlwKCSAgICAiSWYgdGhlIGZpbGVzIGluIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyBmaWxlcyBpbiB0aGVcbiJcCgkgICAgInNlbGVjdGVkIGZvbGRlciB0aGV5IHdpbGwgYmUgcmVwbGFjZWQuIERvIHlvdSBzdGlsbCB3YW50IHRvIG1vdmUgb3IgY29weVxuIlwKCSAgICAidGhlIGZvbGRlcj8iCgogICAgICAgIC8qIG1lc3NhZ2UgYm94IHN0cmluZ3MgKi8KICAgICAgICBJRFNfUkVTVEFSVF9USVRMRSAgICAgICAi0OXx8uDw8ujw4O3lIgogICAgICAgIElEU19SRVNUQVJUX1BST01QVCAgICAgICLI8erg8uUg6+gg5OAg8ejs8+vo8ODy5SDw5fHy4PDy6PDg7eUg7eAgV2luZG93cz8iCiAgICAgICAgSURTX1NIVVRET1dOX1RJVExFICAgICAgIsjn6uv+9+Lg7eUiCiAgICAgICAgSURTX1NIVVRET1dOX1BST01QVCAgICAgIsjx6uDy5SDr6CDk4CDv8OXq8ODy6PLlIOLg+ODy4CBXaW5lIPHl8ej/PyIKCiAgICAgICAgLyogc2hlbGwgZm9sZGVyIHBhdGggZGVmYXVsdCB2YWx1ZXMgKi8KICAgICAgICAvKiDS5efoIOzu5uUg4egg5SDk7uHw4CDo5OX/IOTgIO7x8uDt4PIg7eXv8OXi5eTl7eggPyAqLwoJSURTX1BST0dSQU1TICAgICAgICAgICAgICAgICJTdGFydCBNZW51XFxQcm9ncmFtcyIKCUlEU19QRVJTT05BTCAgICAgICAgICAgICAgICAiTXkgRG9jdW1lbnRzIgoJSURTX0ZBVk9SSVRFUyAgICAgICAgICAgICAgICJGYXZvcml0ZXMiCglJRFNfU1RBUlRVUCAgICAgICAgICAgICAgICAgIlN0YXJ0IE1lbnVcXFByb2dyYW1zXFxTdGFydFVwIgoJSURTX1JFQ0VOVCAgICAgICAgICAgICAgICAgICJSZWNlbnQiCglJRFNfU0VORFRPICAgICAgICAgICAgICAgICAgIlNlbmRUbyIKCUlEU19TVEFSVE1FTlUgICAgICAgICAgICAgICAiU3RhcnQgTWVudSIKCUlEU19NWU1VU0lDICAgICAgICAgICAgICAgICAiTXkgTXVzaWMiCglJRFNfTVlWSURFTyAgICAgICAgICAgICAgICAgIk15IFZpZGVvIgoJSURTX0RFU0tUT1BESVJFQ1RPUlkgICAgICAgICJEZXNrdG9wIgoJSURTX05FVEhPT0QgICAgICAgICAgICAgICAgICJOZXRIb29kIgoJSURTX1RFTVBMQVRFUyAgICAgICAgICAgICAgICJUZW1wbGF0ZXMiCglJRFNfQVBQREFUQSAgICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIERhdGEiCglJRFNfUFJJTlRIT09EICAgICAgICAgICAgICAgIlByaW50SG9vZCIKCUlEU19MT0NBTF9BUFBEQVRBICAgICAgICAgICAiTG9jYWwgU2V0dGluZ3NcXEFwcGxpY2F0aW9uIERhdGEiCglJRFNfSU5URVJORVRfQ0FDSEUgICAgICAgICAgIkxvY2FsIFNldHRpbmdzXFxUZW1wb3JhcnkgSW50ZXJuZXQgRmlsZXMiCglJRFNfQ09PS0lFUyAgICAgICAgICAgICAgICAgIkNvb2tpZXMiCglJRFNfSElTVE9SWSAgICAgICAgICAgICAgICAgIkxvY2FsIFNldHRpbmdzXFxIaXN0b3J5IgoJSURTX1BST0dSQU1fRklMRVMgICAgICAgICAgICJQcm9ncmFtIEZpbGVzIgoJSURTX01ZUElDVFVSRVMgICAgICAgICAgICAgICJNeSBQaWN0dXJlcyIKCUlEU19QUk9HUkFNX0ZJTEVTX0NPTU1PTiAgICAiUHJvZ3JhbSBGaWxlc1xcQ29tbW9uIEZpbGVzIgoJSURTX0NPTU1PTl9ET0NVTUVOVFMgICAgICAgICJEb2N1bWVudHMiCglJRFNfQURNSU5UT09MUyAgICAgICAgICAgICAgIlN0YXJ0IE1lbnVcXFByb2dyYW1zXFxBZG1pbmlzdHJhdGl2ZSBUb29scyIKCUlEU19DT01NT05fTVVTSUMgICAgICAgICAgICAiRG9jdW1lbnRzXFxNeSBNdXNpYyIKCUlEU19DT01NT05fUElDVFVSRVMgICAgICAgICAiRG9jdW1lbnRzXFxNeSBQaWN0dXJlcyIKCUlEU19DT01NT05fVklERU8gICAgICAgICAgICAiRG9jdW1lbnRzXFxNeSBWaWRlbyIKCUlEU19DREJVUk5fQVJFQSAgICAgICAgICAgICAiTG9jYWwgU2V0dGluZ3NcXEFwcGxpY2F0aW9uIERhdGFcXE1pY3Jvc29mdFxcQ0QgQnVybmluZyIKfQo=