LyoKICogIE5vdGVwYWQgKFN3ZWRpc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTcsOTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogKiAgUHJvb2ZyZWFkIDE5OTggYnkgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgogKiAgQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqICBDb3B5cmlnaHQgMjAwNywgMjAwOCBEYW5pZWwgTnlsYW5kZXIgPHBvQGRhbmllbG55bGFuZGVyLnNlPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAibm90ZXBhZF9yZXMuaCIKCkxBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkFya2l2IiB7CiAgTUVOVUlURU0gIiZOeVx0Q3RybCtOIiwgICAgICAgICAgICBDTURfTkVXCiAgTUVOVUlURU0gItYmcHBuYS4uLlx0Q3RybCtPIiwgICAgICAgICAgICBDTURfT1BFTgogIE1FTlVJVEVNICImU3BhcmFcdEN0cmwrUyIsICAgICAgICAgICAgQ01EX1NBVkUKICBNRU5VSVRFTSAiU3BhcmEgcyZvbS4uLiIsICAgICBDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImU2tyaXYgdXQuLi5cdEN0cmwrUCIsICAgICAgICAgQ01EX1BSSU5UCiAgTUVOVUlURU0gIlNpZGxhJnlvdXQuLi4iLCAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJTa3JpdmFyJmtvbmZpZ3VyYXRpb24uLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQXZzbHV0YSIsICAgICAgICAgIENNRF9FWElUCiB9ClBPUFVQICImUmVkaWdlcmEiIHsKICBNRU5VSVRFTSAiJsVuZ3JhXHRDdHJsK1oiLCAgICAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiS2xpcHAgJnV0XHRDdHJsK1giLCAgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZLb3BpZXJhXHRDdHJsK0MiLCAgQ01EX0NPUFkKICBNRU5VSVRFTSAiS2xpc3RyYSAmaW5cdEN0cmwrViIsICAgICAgIENNRF9QQVNURQogIE1FTlVJVEVNICImVGEgYm9ydFx0RGVsIiwgICAgIENNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiTWFya2VyYSAmYWxsdCIsICAgICBDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImVGlkL0RhdHVtXHRGNSIsICAgIENNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkRlbGEgbOVuZ2EgbWVuaW5nYXIiLCAgICAgIENNRF9XUkFQCiAgTUVOVUlURU0gIiZGb250Li4uIiwgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZT9msiIHsKICBNRU5VSVRFTSAiU/ZrLi4uIiwgICAgICAgICAgICBDTURfU0VBUkNICiAgTUVOVUlURU0gIiZT9msgbuRzdGFcdEYzIiwgICAgQ01EX1NFQVJDSF9ORVhUCiAgTUVOVUlURU0gIiZFcnPkdHQuLi5cdEN0cmwrSCIsIENNRF9SRVBMQUNFCiB9ClBPUFVQICImSGrkbHAiIHsKICBNRU5VSVRFTSAiJklubmVo5WxsIiwgICAgICAgICBDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImU/ZrLi4uIiwgICAgICAgICAgIENNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICJBbnbkbmRuaW5nICZhdiBoauRscCIsICAgIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJk9tIEFudGVja25pbmdhciIsIENNRF9IRUxQX0FCT1VUX05PVEVQQUQKIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJTaWRsYXlvdXQiCnsKTFRFWFQgICAgIiZTaWRodXZ1ZDoiLCAgMHgxNDAsICAgMTAsIDA3LCA0MCwgMTUKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwgICA2MCwgMDUsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlNpZGZvdDoiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIkthbnRlcjoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZW5G5zdGVyOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICIm1nZlcjoiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImSPZnZXI6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImVW5kZXI6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgIElET0ssICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJBdmJyeXQiLCAgICAgSURDQU5DRUwsICAgICAgICAgICAgICAgMTgwLCAyMSwgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIiZIauRscCIsICAgICAgIElESEVMUCwgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KCklERF9PRk5fVEVNUExBVEUgIERJQUxPRyA1MCw1MCwzMDAsMTUKU1RZTEUgRFNfM0RMT09LIHwgRFNfQ09OVFJPTCB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX0JPUkRFUgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgTFRFWFQgIktvZG5pbmc6IiwgLTEsIDUsMCwgNTAsMTIKICBDT01CT0JPWCBJRENfT0ZOX0VOQ0NPTUJPLCA1MywwLCAxNTYsNDgsIFdTX0NISUxEIHwgV1NfVlNDUk9MTCB8IENCU19EUk9QRE9XTkxJU1QKRU5ECgpTVFJJTkdUQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgIiZmIgpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgICJTaWRhICZwIgoKU1RSSU5HX05PVEVQQUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFudGVja25pbmdhciIKU1RSSU5HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZFTCIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZBUk5JTkciClNUUklOR19JTkZPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvcm1hdGlvbiIKClNUUklOR19VTlRJVExFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIobmFtbmz2cykiCgpTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsYSBmaWxlciAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICAgICAgICAgIAkiVGV4dGZpbGVyICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW4gJyVzJyDkciBm9nIgc3RvciBm9nIgQW50ZWNrbmluZ2FyLlxuIFwKQW525G5kIGVuIGFubmFuIHJlZGlnZXJhcmUuIgpTVFJJTkdfTk9URVhULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHUgc2tyZXYgaW50ZSBpbiBu5WdvbiB0ZXh0LiBcClxuU2tyaXYgbuVnb3Qgb2NoIGb2cnP2ayBzZWRhbiBpZ2VuIgpTVFJJTkdfRE9FU05PVEVYSVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW4gJyVzJ1xuZmlubnMgaW50ZVxuXG4gXApWaWxsIGR1IHNrYXBhIGVuIG55IGZpbD8iClNUUklOR19OT1RTQVZFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlbiAnJXMnXG5oYXIg5G5kcmF0c1xuXG4gXApWaWxsIGR1IHNwYXJhIORuZHJpbmdhcm5hPyIKU1RSSU5HX05PVEZPVU5ELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgaGl0dGFkZXMgaW50ZS4iClNUUklOR19PVVRfT0ZfTUVNT1JZLCAgICAgICAgICAgICAgICAgICAiRGV0IGZpbm5zIGludGUgdGlsbHLkY2tsaWd0IG1lZCBtaW5uZSBm9nIgYXR0IHNsdXRm9nJhIFwKZGVuIGjkciB1cHBnaWZ0ZW4uXG5BdnNsdXRhIGV0dCBlbGxlciBmbGVyYSBwcm9ncmFtIGb2ciBhdHQg9mthIG3kbmdkZW5cbmxlZGlndCBcCm1pbm5lLiIKClNUUklOR19VTklDT0RFX0xFLCAgICAgIlVuaWNvZGUgKFVURi0xNikiClNUUklOR19VTklDT0RFX0JFLCAgICAgIlVuaWNvZGUgKFVURi0xNiBiaWctZW5kaWFuKSIKClNUUklOR19MT1NTX09GX1VOSUNPREVfQ0hBUkFDVEVSUywgICAgICAgICAiJXNcblwKRGVubmEgZmlsIGlubmVo5WxsZXIgVW5pY29kZS10ZWNrZW4gdmlsa2Ega29tbWVyIGF0dCBn5VxuXApm9nJsb3JhZGUgb20gZHUgc3BhcmFyIGZpbGVuIHVuZGVyIGtvZG5pbmdlbiAlcy5cblwKS2xpY2thIEF2YnJ5dCBvY2ggduRsaiBzZWRhbiBldHQgYXYgVW5pY29kZS1hbHRlcm5hdGl2ZW5cblwKaSB0ZWNrZW5rb2RuaW5nc2xpc3RhbiBm9nIgYXR0IGJlaOVsbGEgZGVzc2EgdGVja2VuLlxuXApWaWxsIGR1IGZvcnRz5HR0YT8iCn0K