LyoKICogIE5vdGVwYWQgKEphcGFuZXNlIHJlc291cmNlcykKICoKICogIENvcHlyaWdodCAxOTk3LDk4IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KICogIFByb29mcmVhZCAxOTk4IGJ5IERhdmlkIExlZSBMYW1iZXJ0IDxsYW1iZXI0NUBlZ3IubXN1LmVkdT4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0pBUEFORVNFLCBTVUJMQU5HX0RFRkFVTFQKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICKDdINAg0ODiygmRikiIHsKICBNRU5VSVRFTSAikFaLS43skKwoJk4pLi4uIiwgICAgICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAiikqCrSgmTylcdEN0cmwrTyIsICAgICBDTURfT1BFTgogIE1FTlVJVEVNICKV25G2KCZTKVx0Q3RybCtTIiwgICAgIENNRF9TQVZFCiAgTUVOVUlURU0gIpa8kU+C8JV0gq+CxJXbkbYoJmEpLi4uIiwgICAgICAgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiiPON/CgmUCkiLCAgICAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICKDeYFbg1eQ3ZLoKCZ0KS4uLiIsICAgIENNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIoN2g4qDk4NegsyQ3ZLoKCZyKS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIo9Jl7koJngpIiwgICAgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIpXSj1coJkUpIiB7CiAgTUVOVUlURU0gIoNBg5ODaINEKCZVKVx0Q3RybCtaIiwgICAgIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIpDYguiO5oLoKCZ0KVx0Q3RybCtYIiwgICAgICBDTURfQ1VUCiAgTUVOVUlURU0gIoNSg3OBWygmQylcdEN0cmwrQyIsICAgICBDTURfQ09QWQogIE1FTlVJVEVNICKDeYFbg1iDZygmUClcdEN0cmwrViIsICAgIENNRF9QQVNURQogIE1FTlVJVEVNICKN7Y+cKCZEKVx0RGVsIiwgICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIpFTgsSRSZHwKCZhKVx0Q3RybCtBIiwgICAgICAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAik/qVdILGjp6NjygmVClcdEY1IiwgICAgQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICKSt4KijXOC8JDcguiV1IK3KCZXKSIsICBDTURfV1JBUAogIE1FTlVJVEVNICKDdINIg5ODZygmRikuLi4iLCAgICAgICAgICBDTURfRk9OVAogfQpQT1BVUCAijJ+N9SgmUykiIHsKICBNRU5VSVRFTSAijJ+N9SgmUylcdEN0cmwrRiIsICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICKOn4LMjPOV4oLwjJ+N9SgmUylcdEYzIiwgIENNRF9TRUFSQ0hfTkVYVAogfQpQT1BVUCAig3eDi4N2KCZIKSIgewogIE1FTlVJVEVNICKW2o6fKCZDKSIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAijJ+N9SgmUykuLi4iLCAgICAgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIoN3g4uDdoLMjmeCopX7KCZIKSIsICAgICBDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgUE9QVVAgIo/ulfEoJm8pLi4uIiB7CiAgIE1FTlVJVEVNICKDiYNDg1qDk4NYKCZMKSIsICAgICAgICAgQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gIpailduP2CgmTikiLCAgICAgQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICJXaW5lgsmCwoKigsQoJkEpIiwgICAgICBDTURfQUJPVVRfV0lORQogIH0KIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA5LCAiTVMgVUkgR290aGljIgpDQVBUSU9OICKDeYFbg1eQ3ZLoIgp7CkxURVhUICAgICKDd4Nig18oJkgpOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MSwgICAgICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIoN0g2KDXigmRik6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQzLCAgICAgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIoN9gVuDV4OTKCZNKToiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIo22KCZMKToiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsKi8gICAweDE0NywgICAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAij+MoJlQpOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICKJRSgmUik6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsKi8gIDB4MTRELCAgICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIom6KCZCKToiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCovIDB4MTUwLCAgICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgIElET0ssICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICKDTIODg5ODWoOLIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICKDd4OLg3YoJkgpIiwgICAgICAgSURIRUxQLCAgICAgICAgICAgICAgICAxODAsIDM5LCA0MCwgMTUsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgICImbiIgICAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIiZzIIN5gVuDVyIgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwgICAgICAgICAgICAgIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCAgICAiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLCAgICAgICAgICAgICAgIjI1IG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwgICAiMjUgbW0iICAgICAvKiBGSVhNRSAqLwoKU1RSSU5HX05PVEVQQUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIoOBg4KSoCIKU1RSSU5HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIoNHg4mBWyIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIox4jZAiClNUUklOR19JTkZPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICKP7pXxIgoKU1RSSU5HX1VOVElUTEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiiWs5HoKSIKClNUUklOR19BTExfRklMRVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICKRU4LEgsyDdINAg0ODiyAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICAgICAgICAgICKDZYNMg1iDZ4N0g0CDQ4OLICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAig3SDQINDg4sgJyVzJyCCzINUg0ODWYLNkeWCq4K3gqyC6YK9gt+BQYOBg4KSoILFgs2V0o9XgsWCq4LcgrmC8YFCXG4gXAqVyoLMg0eDZoNCg16C8I5nl3CCtYLEibqCs4KigUIiClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICKJvYLgk/yXzYKzguqCxIKigtyCuYLxgUJcClxuib2CqZP8l82CtYLEgqmC547AjXOCtYLEibqCs4KigUIiClNUUklOR19ET0VTTk9URVhJU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICKDdINAg0ODiyAnJXMnXG6CzZG2jd2CtYLcgrmC8VxuXG4gXAqQVoK1gqKDdINAg0ODi4LwjeyQrIK1gtyCt4KpID8iClNUUklOR19OT1RTQVZFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICKDdINAg0ODiyAnJXMnXG6CzZXPjViCs4LqgsSCooLcgrdcblxuIFwKlc+NWILwlduRtoK1gtyCt4KpID8iClNUUklOR19OT1RGT1VORCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycggs2MqYLCgqmC6ILcgrmC8YLFgrWCvSIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgICAgICAgICKCsYLMkYCN7ILwjsCNc4K3gumCvYLfgsyDgYOCg4qCqlwKkauC6ILcgrmC8YFCIFxug4GDgoOKgsyL84KrgvCRnYLigreCvYLfgsmCooKtgsKCqYLMg0GDdoOKg1CBW4NWg4eDk4LwXG6PSZe5grWCxFwKibqCs4KigUIiCgp9Cg==