LyoKICogY29tY3RsIChVa3JhaW5pYW4gcmVzb3VyY2VzKQogKgogKiBDb3B5cmlnaHQgMjAwNCBJbHlhIEtvcm5peWtvCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfVUtSQUlOSUFOLCBTVUJMQU5HX0RFRkFVTFQKCklERF9QUk9QU0hFRVQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIyMCwgMTQwClNUWUxFIERTX0NPTlRFWFRIRUxQIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19WSVNJQkxFCkNBUFRJT04gIsLr4PHy6OLu8fKzIOTr/yAlcyIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogIERFRlBVU0hCVVRUT04gIk9LIiwgICAgIElET0ssNCwxMjIsNTAsMTQsIFdTX1RBQlNUT1AgfCBXU19HUk9VUAogIFBVU0hCVVRUT04gICAgIibCs+Tss+3gIiwgSURDQU5DRUwsNTgsMTIyLDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiJsfg8fLu8fPi4PLoIiwgSURDX0FQUExZX0JVVFRPTiwxMTIsMTIyLDUwLDE0LFdTX0RJU0FCTEVECiAgUFVTSEJVVFRPTiAgICAiJsTu4rPk6uAiLCAgIElESEVMUCwxNjYsMTIyLDUwLDE0LFdTX1RBQlNUT1B8V1NfR1JPVVAKICBDT05UUk9MICAgICAgICJUYWIiLCAgICBJRENfVEFCQ09OVFJPTCwiU3lzVGFiQ29udHJvbDMyIixXU19DTElQU0lCTElOR1N8V1NfR1JPVVB8V1NfVEFCU1RPUHxUQ1NfTVVMVElMSU5FLDQsNCwyMTIsMTE0CkVORAoKCklERF9XSVpBUkQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDI5MCwgMTU5ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgV1NfVklTSUJMRQpDQVBUSU9OICLM4PHy5fAiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICBQVVNIQlVUVE9OICAgICI8ICbN4Ofg5CIsIElEQ19CQUNLX0JVVFRPTiw3MSwxMzgsNTAsMTQKICBERUZQVVNIQlVUVE9OICImxODrsyA+IiwgSURDX05FWFRfQlVUVE9OLDEyMSwxMzgsNTAsMTQKICBERUZQVVNIQlVUVE9OICImx+Di5fD46PLoIiwgIElEQ19GSU5JU0hfQlVUVE9OLDEyMSwxMzgsNTAsMTQKICBQVVNIQlVUVE9OICAgICImwrPk7LPt4CIsICBJRENBTkNFTCwxNzgsMTM4LDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiJsTu4rPk6uAiLCAgICBJREhFTFAsMjM1LDEzOCw1MCwxNCxXU19HUk9VUAogIExURVhUICAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkUsNywxMjksMjc4LDEsU1NfU1VOS0VOCiAgQ09OVFJPTCAgICAgICAiVGFiIiwgICAgIElEQ19UQUJDT05UUk9MLCJTeXNUYWJDb250cm9sMzIiLFdTX0NMSVBTSUJMSU5HUyB8IFdTX0RJU0FCTEVELDcsNywyNTgsNQogIExURVhUCSAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkVIRUFERVIsMCwzNSwyOTAsMSxTU19MRUZUIHwgU1NfU1VOS0VOIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFCkVORAoKCklERF9UQkNVU1RPTUlaRSBESUFMT0cgRElTQ0FSREFCTEUgMTAsIDIwLCAzNTcsIDEyNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAizeDx8vDu6ergIO/g7eXrsyCz7fHy8PPs5e3ys+IiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICBERUZQVVNIQlVUVE9OICImx+Dq8Ojy6CIsICAgICBJRENBTkNFTCwzMDgsNiw0NCwxNAogIFBVU0hCVVRUT04gICAgIibR6ujt8/LoIiwgICAgIElEQ19SRVNFVF9CVE4sMzA4LDIzLDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiJsTu4rPk6uAiLCAgICAgIElEQ19IRUxQX0JUTiwzMDgsNDAsNDQsMTQKICBQVVNIQlVUVE9OICAgICLP5fDl8fPt8/LoIOIm4+7w8yIsICAgSURDX01PVkVVUF9CVE4sMzA4LDc0LDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiz+Xw5fHz7fPy6CDk7ibt6OfzIiwgSURDX01PVkVETl9CVE4sMzA4LDkxLDQ0LDE0CiAgTFRFWFQgICAgICAgICAizeAm/+LtsyDq7e7v6ug6IiwgLTEsNCw1LDg0LDEwCiAgTElTVEJPWCAgICAgICBJRENfQVZBSUxCVE5fTEJPWCw0LDE3LDEyMCwxMDAsIExCU19OT1RJRlkgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19OT0lOVEVHUkFMSEVJR0hUIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIHwgV1NfVEFCU1RPUAogIFBVU0hCVVRUT04gICAgIibE7uTg8uggLT4iLCAgICBJRE9LLCAxMzEsIDQyLCA0NCwgMTQKICBQVVNIQlVUVE9OICAgICI8LSAmz/Do4fDg8ugiLCBJRENfUkVNT1ZFX0JUTiwxMzEsNjIsNDQsMTQKICBMVEVYVCAgICAgICAgICImyu3u7+roIO/g7eXrsyCz7fHy8PPs5e3ys+I6IiwgLTEsMTgyLDUsNzgsMTAKICBMSVNUQk9YICAgICAgIElEQ19UT09MQkFSQlROX0xCT1gsIDE4MiwxNywxMjAsMTAwLExCU19OT1RJRlkgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19OT0lOVEVHUkFMSEVJR0hUIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIHwgV1NfVEFCU1RPUApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19DTE9TRSAgICAix+Dq8Ojy6CIKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURNX1RPREFZICAgICLR/O7j7uTtszoiCiAgICBJRE1fR09UT0RBWSAgIs/u8u737eAg5ODy4CIKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURTX1NFUEFSQVRPUiAi0O7n5LPr/O3o6iIKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSEtZX05PTkUgIs3l7OAiCn0K