LyoKICogQ29weXJpZ2h0IDIwMDQgSGVubmluZyBHZXJoYXJkdAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAicmVzb3VyY2UuaCIKCkxBTkdVQUdFIExBTkdfR0VSTUFOLCBTVUJMQU5HX05FVVRSQUwKClVJSU5TRVJUT0JKRUNUIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjk0LCAxNTEKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiT2JqZWt0IGVpbmb8Z2VuIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBMSVNUQk9YICAgICAgICAgSURDX09CSlRZUEVMSVNULDgyLDE5LDEzMSw2NixMQlNfU09SVCB8CiAgICAgICAgICAgICAgICAgICAgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WSVNJQkxFIHwgV1NfVlNDUk9MTCB8CiAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUAogICAgTFRFWFQgICAgICAgICAgICJPYmpla3R0eXA6IixJRENfT0JKVFlQRUxCTCw4Miw3LDUzLDgsV1NfVklTSUJMRQogICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywyMjEsNyw2NiwxNAogICAgUFVTSEJVVFRPTiAgICAgICJBYmJyZWNoZW4iLElEQ0FOQ0VMLDIyMSwyNCw2NiwxNAogICAgR1JPVVBCT1ggICAgICAgICJFcmdlYm5pcyIsSURDX1JFU1VMVCw3LDEwMywyMDgsNDEKICAgIENPTlRST0wgICAgICAgICAiJk5ldSBlcnN0ZWxsZW4iLElEQ19DUkVBVEVORVcsIkJ1dHRvbiIsQlNfQVVUT1JBRElPQlVUVE9OIHwgCiAgICAgICAgICAgICAgICAgICAgV1NfR1JPVVAsNywyMCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJTJnRldWVydW5nIGVyc3RlbGxlbiIsSURDX0NSRUFURUNPTlRST0wsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgTk9UIFdTX1ZJU0lCTEUsNyw1NCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJBJnVzIERhdGVpIGVyc3RlbGxlbiIsSURDX0NSRUFURUZST01GSUxFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiw3LDM3LDY3LDEwCiAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX1JFU1VMVERFU0MsNDksMTEyLDE1OSwyMwogICAgUFVTSEJVVFRPTiAgICAgICJTdGV1ZXJ1bmcgaGluJnp1ZvxnZW4iLElEQ19BRERDT05UUk9MLDgxLDg4LDYzLDE0LE5PVCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICAgIkFscyAmU3ltYm9sIGFuemVpZ2VuIixJRENfQVNJQ09OLCJCdXR0b24iLEJTX0FVVE9DSEVDS0JPWCB8IAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AgfCBOT1QgV1NfVklTSUJMRSwyMjMsNTgsNjQsMTAKICAgIFBVU0hCVVRUT04gICAgICAiRCZ1cmNoc3VjaGVuLi4uIixJRENfQlJPV1NFLDgzLDUzLDUwLDE0LE5PVCBXU19WSVNJQkxFCiAgICBMVEVYVCAgICAgICAgICAgIkRhdGVpOiIsSURDX0ZJTEVMQkwsODMsMjcsMjAsOCwgTk9UIFdTX1ZJU0lCTEUKICAgIEVESVRURVhUICAgICAgICBJRENfRklMRSw4MywzNywxMzIsMTMsRVNfQVVUT0hTQ1JPTEwgfCBOT1QgV1NfVklTSUJMRQpFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICBJRFNfUkVTVUxUT0JKREVTQwkiRvxndCBlaW4gbmV1ZXMgJXMgLSBPYmpla3QgaW4gSWhyIERva3VtZW50IGVpbi4iCiAgSURTX1JFU1VMVEZJTEVPQkpERVNDCSJG/Gd0IGRlbiBJbmhhbHQgZGVyIERhdGVpIGFscyBPYmpla3Qgc28gaW4gSWhyIERva3VtZW50IGVpbiwgZGFzcyBTaWUgZXMgbWl0IGRlbSBQcm9ncmFtbSBha3RpdmllcmVuIGv2bm5lbiwgbWl0IGRlbSBlcyBlcnN0ZWxsdCB3dXJkZS4iCiAgSURTX0JST1dTRSAgICAgICAgICAgICJEdXJjaHN1Y2hlbiIKICBJRFNfTk9UT0xFTU9EICAgICAgICAgIkRpZSBEYXRlaSBpc3Qgb2ZmZW5iYXIga2VpbiBn/Gx0aWdlcyBPTEUgLSBTdGV1ZXJtb2R1bC4gRGllIE9MRSAtIFN0ZXVlcnVuZyBrb25udGUgbmljaHQgcmVnaXN0aWVydCB3ZXJkZW4uIgogIElEU19OT1RPTEVNT0RDQVBUSU9OICAiU3RldWVydW5nIGhpbnp1ZvxnZW4iCn0KCklERF9QQVNURVNQRUNJQUw0IERJQUxPRyBESVNDQVJEQUJMRSAzLCAxNSwgMjkzLCAxNDAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkluaGFsdGUgZWluZvxnZW4iCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExURVhUICAgICAgICAgIlF1ZWxsZToiLCAtMSwgNiwgOSwgMzAsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgQ09OVFJPTCAgICAgICAiJkVpbmb8Z2VuIiwgSURDX1BTX1BBU1RFLCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgNiwgMzgsIDU1LCAxMAogICAgQ09OVFJPTCAgICAgICAiJlZlcmtu/HBmdW5nIGVpbmb8Z2VuIiwgSURDX1BTX1BBU1RFTElOSywgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDYsIDYzLCA1NSwgMTAKICAgIExURVhUICAgICAgICAgIiZBbHM6IiwgLTEsIDY1LCAyNSwgMTYsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSVNULCAgICAgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19QQVNURUxJTktMSVNULCA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgTk9UIFdTX1ZJU0lCTEUKICAgIExJU1RCT1ggICAgICAgSURDX1BTX0RJU1BMQVlMSVNULCAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICJPSyIsIElET0ssICJCdXR0b24iLCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwgMjI0LCA2LCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIkFiYnJlY2hlbiIsIElEQ0FOQ0VMLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDIzLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiZIaWxmZSIsIElEQ19PTEVVSUhFTFAsICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNDIsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiQWxzIFN5bWJvbCAmZGFyc3RlbGxlbiIsIElEQ19QU19ESVNQTEFZQVNJQ09OLCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNTksIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX0lDT05ESVNQTEFZLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDIyNCwgNzUsIDY2LCA0NAogICAgQ09OVFJPTCAgICAgICAiJlN5bWJvbCDkbmRlcm4uLi4iLCBJRENfUFNfQ0hBTkdFSUNPTiwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAxMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1JFU1VMVElNQUdFLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDgsIDEwMSwgNDIsIDM0CiAgICBDT05UUk9MICAgICAgICI8PCByZXN1bHQgdGV4dCBnb2VzIGhlcmUgPj4iLCBJRENfUFNfUkVTVUxUVEVYVCwgIlN0YXRpYyIsIFNTX05PUFJFRklYIHwgV1NfVklTSUJMRSwgNTQsIDEwMCwgMTU5LCAzNQogICAgQ09OVFJPTCAgICAgICAiRXJnZWJuaXMiLCAtMSwgIkJ1dHRvbiIsIEJTX0dST1VQQk9YIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCA2LCA5MCwgMjEyLCA0OAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1NPVVJDRVRFWFQsICJFZGl0IiwgRVNfUkVBRE9OTFkgfCBFU19BVVRPSFNDUk9MTCB8IFdTX1ZJU0lCTEUsIDM3LCA5LCAxODAsIDgKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfUFNfUEFTVEVfREFUQSAgICAgICAgICAgICAgICAgICAgICJG/Gd0IGRlbiBJbmhhbHQgZGVyIFp3aXNjaGVuYWJsYWdlIGluIElociBEb2t1bWVudCBhbHMgJXMgZWluLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIkb8Z3QgZGVuIEluaGFsdCBkZXIgWndpc2NoZW5hYmxhZ2Ugc28gaW4gSWhyIERva3VtZW50IGVpbiBkYXNzIFNpZSBlcyBtaXQgJXMgYWt0aXZpZXJlbiBr9m5uZW4uIgogICAgSURTX1BTX1BBU1RFX09CSkVDVF9BU19JQ09OICAgICAgICAgICAiRvxndCBkZW4gSW5oYWx0IGRlciBad2lzY2hlbmFibGFnZSBzbyBpbiBJaHIgRG9rdW1lbnQgZWluIGRhc3MgU2llIGVzIG1pdCAlcyBha3RpdmllcmVuIGv2bm5lbi4gIFdpcmQgYWxzIFN5bWJvbCBkYXJnZXN0ZWxsdC4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19EQVRBICAgICAgICAgICAgICAgICJG/Gd0IGRlbiBJbmhhbHQgZGVyIFp3aXNjaGVuYWJsYWdlIGluIElociBEb2t1bWVudCBhbHMgJXMgZWluLiAgRGllIERhdGVuIHNpbmQgbWl0IGRlciBVcnNwcnVuZ3NkYXRlaSB2ZXJrbvxwZnQgc28gZGFzcyDEbmRlcnVuZ2VuIGFuIGRpZXNlciBpbiBJaHJlbSBEb2t1bWVudCBlcnNjaGVpbmVuLiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVCAgICAgICAgICAgICAgIkb8Z3QgZWluIEJpbGQgZGVzIFp3aXNjaGVuYWJsYWdlbi1JbmhhbHRzIGluIElociBEb2t1bWVudCBlaW4uICBEYXMgQmlsZCBpc3QgbWl0IGRlciBVcnNwcnVuZ3NkYXRlaSB2ZXJrbvxwZnQgc28gZGFzcyDEbmRlcnVuZ2VuIGFuIGRpZXNlciBpbiBJaHJlbSBEb2t1bWVudCBlcnNjaGVpbmVuLiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVF9BU19JQ09OICAgICAgIkb8Z3QgZWluZSBWZXJrbvxwZnVuZyBlaW4gZGllIGF1ZiBkZW4gT3J0IGRlcyBad2lzY2hlbmFibGFnZW4tSW5oYWx0cyB6ZWlndC4gIERpZSBWZXJrbvxwZnVuZyBpc3QgbWl0IGRlciBVcnNwcnVuZ3NkYXRlaSB2ZXJrbvxwZnQgc28gZGFzcyDEbmRlcnVuZ2VuIGFuIGRpZXNlciBpbiBJaHJlbSBEb2t1bWVudCBlcnNjaGVpbmVuLiIKICAgIElEU19QU19OT05fT0xFICAgICAgICAgICAgICAgICAgICAgICAgIkb8Z3QgZGVuIEluaGFsdCBkZXIgWndpc2NoZW5hYmxhZ2UgaW4gSWhyIERva3VtZW50IGFscyBlaW4uIgogICAgSURTX1BTX1VOS05PV05fVFlQRSAgICAgICAgICAgICAgICAgICAiVW5iZWthbm50ZXIgVHlwIgogICAgSURTX1BTX1VOS05PV05fU1JDICAgICAgICAgICAgICAgICAgICAiVW5iZWthbm50ZSBRdWVsbGUiCiAgICBJRFNfUFNfVU5LTk9XTl9BUFAgICAgICAgICAgICAgICAgICAgICJkZW0gRXJ6ZXVnZXJwcm9ncmFtbSIKfQo=