LyoKICogIE5vdGVwYWQgKEZyZW5jaCByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMTk5Nyw5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAqICBUcmFuc2xhdGlvbiBieSBMYXVyZW50IEJ1ZmZsZXIgPGxhdXJlbnRAYmx1ZXdpbi5jaD4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpNQUlOX01FTlUgTUVOVSBMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCnsKIFBPUFVQICImRmljaGllciIgewogIE1FTlVJVEVNICImTm91dmVhdS4uLiIsICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAiJk91dnJpciIsICAgICAgICAgICBDTURfT1BFTgogIE1FTlVJVEVNICImRW5yZWdpc3RyZXIiLCAgICAgIENNRF9TQVZFCiAgTUVOVUlURU0gIkVucmVnaXN0cmVyICZzb3VzLi4uIiwgICAgICBDTURfU0FWRV9BUwogIE1FTlVJVEVNICJJbSZwcmltZXIiLCAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICImTWlzZSBlbiBwYWdlLi4uIiwgIENNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIiZDb25maWd1cmF0aW9uIGRlIGwnaW1wcmltYW50ZS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZRdWl0dGVyIiwgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIiZFZGl0aW9uIiB7CiAgTUVOVUlURU0gIiZBbm51bGVyXHRDdHJsK1oiLCAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQ28mdXBlclx0Q3RybCtYIiwgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpZXJcdEN0cmwrQyIsICAgQ01EX0NPUFkKICBNRU5VSVRFTSAiJkNvbGxlclx0Q3RybCtWIiwgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiJkVmZmFjZXJcdERlbCIsICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlRvdXQgJnPpbGVjdGlvbm5lciIsICAgICAgICBDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImSGV1cmUvRGF0ZVx0RjUiLCAgIENNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlJldG91ciDgIGxhIGxpZ25lIiwgICAgICAgIENNRF9XUkFQCiB9ClBPUFVQICImUmVjaGVyY2hlciIgewogIE1FTlVJVEVNICImUmVjaGVyY2hlciIsICAgICAgIENNRF9TRUFSQ0gKICBNRU5VSVRFTSAiJlN1aXZhbnRcdEYzIiwgICAgICBDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIiZBaWRlIiB7CiAgTUVOVUlURU0gIiZTb21tYWlyZSIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJlJlY2hlcmNoZXIuLi4iLCAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiJkFpZGUgc3VyIGwnYWlkZSIsICBDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgUE9QVVAgIkluZiZvLi4uIiB7CiAgIE1FTlVJVEVNICImTGljZW5jZSIsICAgICAgICAgQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gIiZBVUNVTkUgR0FSQU5USUUiLCBDTURfTk9fV0FSUkFOVFkKICAgTUVOVUlURU0gIiZBIHByb3BvcyBkZSBXaW5lIiwgICAgICAgIENNRF9BQk9VVF9XSU5FCiAgfQogfQp9CgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQIERJQUxPRyAwLCAwLCAyMjUsIDk1CkxBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIkhlbHYiCkNBUFRJT04gIlBhZ2UgU2V0dXAiCnsKTFRFWFQgICAgIiZFbi106nRlOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MSwgICAgICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZQaWVkIGRlIHBhZ2U6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQzLCAgICAgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIiZNYXJnZXM6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImR2F1Y2hlOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwqLyAgIDB4MTQ3LCAgICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImSGF1dDoiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLCovICAgIDB4MTRBLCAgICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkRyb2l0ZToiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwqLyAgMHgxNEQsICAgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkJhczoiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCovIDB4MTUwLCAgICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgIDB4MTUxLCAgICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiQW5udWxlciIsICAgICAweDE1MiwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkFpZGUiLCAgICAgICAweDE1MywgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgICImbiIgICAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIlBhZ2UgJnMiICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICAgICAgICAgICIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAgIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICAgICAgICAgICIyNSBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsICAgIjI1IG1tIiAgICAgLyogRklYTUUgKi8KClNUUklOR19OT1RFUEFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3RlcGFkIgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJSRVVSIgpTVFJJTkdfV0FSTklORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRURU5USU9OIgpTVFJJTkdfSU5GTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5mb3JtYXRpb24iCgpTVFJJTkdfVU5USVRMRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNhbnMtdGl0cmUpIgoKU1RSSU5HX0FMTF9GSUxFUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvdXMgZmljaGllcnMgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwgICAgICAgICAgICAgICAgICAiRmljaGllcnMgdGV4dGUgKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZSBmaWNoaWVyICclcycgZXN0IHRyb3AgZ3JhbmQgcG91ciBsZSBibG9jLW5vdGVzLlxuIFwKVmV1aWxsZXogdXRpbGlzZXIgdW4gYXV0cmUg6WRpdGV1ci4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWb3VzIG4nYXZleiBwYXMgZW50cukgZGUgdGV4dGUuIFZldWlsbGV6IHRhcGVyIHF1ZWxxdWUgY2hvc2UgZXQgcmVjb21tZW5jZXJcClxuIgpTVFJJTkdfRE9FU05PVEVYSVNULCAgICAgICAgICAgICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJ1xuXCdleGlzdGUgcGFzLlxuXG4gXApWb3VsZXogdm91cyBjcullciB1biBub3V2ZWF1IGZpY2hpZXIgPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJ1xuYSDpdOkgbW9kaWZp6VxuXG4gXApWb3VsZXogdm91cyBlbnJlZ2lzdHJlciB2b3MgbW9kaWZpY2F0aW9ucyA/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBub24gdHJvdXbpLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgICAgICAgICJQYXMgYXNzZXogZGUgbeltb2lyZSBwb3VyIGZpbmlyIGNldHRlIHTiY2hlLiAgXAp0YXNrLiBcbiBGZXJtZXogdW5lIG91IHBsdXNpZXIgYXBwbGljYXRpb25zIHBvdXIgbGli6XJlclxuXApkZSBsYSBt6W1vaXJlLiIKCn0K