Ly8gLSotIEMrKyAtKi0KLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZnV0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKI2lmbmRlZiBfTElCQ1BQX0ZVVFVSRQojZGVmaW5lIF9MSUJDUFBfRlVUVVJFCgovKgogICAgZnV0dXJlIHN5bm9wc2lzCgpuYW1lc3BhY2Ugc3RkCnsKCmVudW0gY2xhc3MgZnV0dXJlX2VycmMKewogICAgYnJva2VuX3Byb21pc2UsCiAgICBmdXR1cmVfYWxyZWFkeV9yZXRyaWV2ZWQsCiAgICBwcm9taXNlX2FscmVhZHlfc2F0aXNmaWVkLAogICAgbm9fc3RhdGUKfTsKCmVudW0gY2xhc3MgbGF1bmNoCnsKICAgIGFueSwKICAgIGFzeW5jLAogICAgc3luYwp9OwoKZW51bSBjbGFzcyBmdXR1cmVfc3RhdHVzCnsKICAgIHJlYWR5LAogICAgdGltZW91dCwKICAgIGRlZmVycmVkCn07Cgp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfZXJyb3JfY29kZV9lbnVtPGZ1dHVyZV9lcnJjPiA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OwplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShmdXR1cmVfZXJyYyBlKTsKZXJyb3JfY29uZGl0aW9uIG1ha2VfZXJyb3JfY29uZGl0aW9uKGZ1dHVyZV9lcnJjIGUpOwoKY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGZ1dHVyZV9jYXRlZ29yeSgpOwoKY2xhc3MgZnV0dXJlX2Vycm9yCiAgICA6IHB1YmxpYyBsb2dpY19lcnJvcgp7CnB1YmxpYzoKICAgIGZ1dHVyZV9lcnJvcihlcnJvcl9jb2RlIGVjKTsgIC8vIGV4cG9zaXRpb24gb25seQoKICAgIGNvbnN0IGVycm9yX2NvZGUmIGNvZGUoKSBjb25zdCB0aHJvdygpOwogICAgY29uc3QgY2hhciogICAgICAgd2hhdCgpIGNvbnN0IHRocm93KCk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgUj4KY2xhc3MgcHJvbWlzZQp7CnB1YmxpYzoKICAgIHByb21pc2UoKTsKICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvY2F0b3I+CiAgICAgICAgcHJvbWlzZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IEFsbG9jYXRvciYgYSk7CiAgICBwcm9taXNlKHByb21pc2UmJiByaHMpOwogICAgcHJvbWlzZShjb25zdCBwcm9taXNlJiByaHMpID0gZGVsZXRlOwogICAgfnByb21pc2UoKTsKCiAgICAvLyBhc3NpZ25tZW50CiAgICBwcm9taXNlJiBvcGVyYXRvcj0ocHJvbWlzZSYmIHJocyk7CiAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYgcmhzKSA9IGRlbGV0ZTsKICAgIHZvaWQgc3dhcChwcm9taXNlJiBvdGhlcik7CgogICAgLy8gcmV0cmlldmluZyB0aGUgcmVzdWx0CiAgICBmdXR1cmU8Uj4gZ2V0X2Z1dHVyZSgpOwoKICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdAogICAgdm9pZCBzZXRfdmFsdWUoY29uc3QgUiYgcik7CiAgICB2b2lkIHNldF92YWx1ZShSJiYgcik7CiAgICB2b2lkIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBwKTsKCiAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHQgd2l0aCBkZWZlcnJlZCBub3RpZmljYXRpb24KICAgIHZvaWQgc2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KGNvbnN0IFImIHIpOwogICAgdm9pZCBzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoUiYmIHIpOwogICAgdm9pZCBzZXRfZXhjZXB0aW9uX2F0X3RocmVhZF9leGl0KGV4Y2VwdGlvbl9wdHIgcCk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgUj4KY2xhc3MgcHJvbWlzZTxSJj4KewpwdWJsaWM6CiAgICBwcm9taXNlKCk7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yPgogICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvY2F0b3ImIGEpOwogICAgcHJvbWlzZShwcm9taXNlJiYgcmhzKTsKICAgIHByb21pc2UoY29uc3QgcHJvbWlzZSYgcmhzKSA9IGRlbGV0ZTsKICAgIH5wcm9taXNlKCk7CgogICAgLy8gYXNzaWdubWVudAogICAgcHJvbWlzZSYgb3BlcmF0b3I9KHByb21pc2UmJiByaHMpOwogICAgcHJvbWlzZSYgb3BlcmF0b3I9KGNvbnN0IHByb21pc2UmIHJocykgPSBkZWxldGU7CiAgICB2b2lkIHN3YXAocHJvbWlzZSYgb3RoZXIpOwoKICAgIC8vIHJldHJpZXZpbmcgdGhlIHJlc3VsdAogICAgZnV0dXJlPFI+IGdldF9mdXR1cmUoKTsKCiAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHQKICAgIHZvaWQgc2V0X3ZhbHVlKFImIHIpOwogICAgdm9pZCBzZXRfZXhjZXB0aW9uKGV4Y2VwdGlvbl9wdHIgcCk7CgogICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0IHdpdGggZGVmZXJyZWQgbm90aWZpY2F0aW9uCiAgICB2b2lkIHNldF92YWx1ZV9hdF90aHJlYWRfZXhpdChSJik7CiAgICB2b2lkIHNldF9leGNlcHRpb25fYXRfdGhyZWFkX2V4aXQoZXhjZXB0aW9uX3B0ciBwKTsKfTsKCnRlbXBsYXRlIDw+CmNsYXNzIHByb21pc2U8dm9pZD4KewpwdWJsaWM6CiAgICBwcm9taXNlKCk7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yPgogICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvY2F0b3ImIGEpOwogICAgcHJvbWlzZShwcm9taXNlJiYgcmhzKTsKICAgIHByb21pc2UoY29uc3QgcHJvbWlzZSYgcmhzKSA9IGRlbGV0ZTsKICAgIH5wcm9taXNlKCk7CgogICAgLy8gYXNzaWdubWVudAogICAgcHJvbWlzZSYgb3BlcmF0b3I9KHByb21pc2UmJiByaHMpOwogICAgcHJvbWlzZSYgb3BlcmF0b3I9KGNvbnN0IHByb21pc2UmIHJocykgPSBkZWxldGU7CiAgICB2b2lkIHN3YXAocHJvbWlzZSYgb3RoZXIpOwoKICAgIC8vIHJldHJpZXZpbmcgdGhlIHJlc3VsdAogICAgZnV0dXJlPFI+IGdldF9mdXR1cmUoKTsKCiAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHQKICAgIHZvaWQgc2V0X3ZhbHVlKCk7CiAgICB2b2lkIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBwKTsKCiAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHQgd2l0aCBkZWZlcnJlZCBub3RpZmljYXRpb24KICAgIHZvaWQgc2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KCk7CiAgICB2b2lkIHNldF9leGNlcHRpb25fYXRfdGhyZWFkX2V4aXQoZXhjZXB0aW9uX3B0ciBwKTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBSPiB2b2lkIHN3YXAocHJvbWlzZTxSPiYgeCwgcHJvbWlzZTxSPiYgeSk7Cgp0ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQWxsb2M+CiAgICBzdHJ1Y3QgdXNlc19hbGxvY2F0b3I8cHJvbWlzZTxSPiwgQWxsb2M+IDogcHVibGljIHRydWVfdHlwZSB7fTsKCnRlbXBsYXRlIDxjbGFzcyBSPgpjbGFzcyBmdXR1cmUKewpwdWJsaWM6CiAgICBmdXR1cmUoKTsKICAgIGZ1dHVyZShmdXR1cmUmJik7CiAgICBmdXR1cmUoY29uc3QgZnV0dXJlJiByaHMpID0gZGVsZXRlOwogICAgfmZ1dHVyZSgpOwogICAgZnV0dXJlJiBvcGVyYXRvcj0oY29uc3QgZnV0dXJlJiByaHMpID0gZGVsZXRlOwogICAgZnV0dXJlJiBvcGVyYXRvcj0oZnV0dXJlJiYpOwoKICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCiAgICBSIGdldCgpOwoKICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQogICAgYm9vbCB2YWxpZCgpIGNvbnN0OwoKICAgIHZvaWQgd2FpdCgpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgogICAgICAgIGZ1dHVyZV9zdGF0dXMKICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KICAgICAgICBmdXR1cmVfc3RhdHVzCiAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0Owp9OwoKdGVtcGxhdGUgPGNsYXNzIFI+CmNsYXNzIGZ1dHVyZTxSJj4KewpwdWJsaWM6CiAgICBmdXR1cmUoKTsKICAgIGZ1dHVyZShmdXR1cmUmJik7CiAgICBmdXR1cmUoY29uc3QgZnV0dXJlJiByaHMpID0gZGVsZXRlOwogICAgfmZ1dHVyZSgpOwogICAgZnV0dXJlJiBvcGVyYXRvcj0oY29uc3QgZnV0dXJlJiByaHMpID0gZGVsZXRlOwogICAgZnV0dXJlJiBvcGVyYXRvcj0oZnV0dXJlJiYpOwoKICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCiAgICBSJiBnZXQoKTsKCiAgICAvLyBmdW5jdGlvbnMgdG8gY2hlY2sgc3RhdGUKICAgIGJvb2wgdmFsaWQoKSBjb25zdDsKCiAgICB2b2lkIHdhaXQoKSBjb25zdDsKICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KICAgICAgICBmdXR1cmVfc3RhdHVzCiAgICAgICAgd2FpdF9mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIHJlbF90aW1lKSBjb25zdDsKICAgIHRlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24+CiAgICAgICAgZnV0dXJlX3N0YXR1cwogICAgICAgIHdhaXRfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbj4mIGFic190aW1lKSBjb25zdDsKfTsKCnRlbXBsYXRlIDw+CmNsYXNzIGZ1dHVyZTx2b2lkPgp7CnB1YmxpYzoKICAgIGZ1dHVyZSgpOwogICAgZnV0dXJlKGZ1dHVyZSYmKTsKICAgIGZ1dHVyZShjb25zdCBmdXR1cmUmIHJocykgPSBkZWxldGU7CiAgICB+ZnV0dXJlKCk7CiAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmIHJocykgPSBkZWxldGU7CiAgICBmdXR1cmUmIG9wZXJhdG9yPShmdXR1cmUmJik7CgogICAgLy8gcmV0cmlldmluZyB0aGUgdmFsdWUKICAgIHZvaWQgZ2V0KCk7CgogICAgLy8gZnVuY3Rpb25zIHRvIGNoZWNrIHN0YXRlCiAgICBib29sIHZhbGlkKCkgY29uc3Q7CgogICAgdm9pZCB3YWl0KCkgY29uc3Q7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CiAgICAgICAgZnV0dXJlX3N0YXR1cwogICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSkgY29uc3Q7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uPgogICAgICAgIGZ1dHVyZV9zdGF0dXMKICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24+JiBhYnNfdGltZSkgY29uc3Q7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgUj4KY2xhc3Mgc2hhcmVkX2Z1dHVyZQp7CnB1YmxpYzoKICAgIHNoYXJlZF9mdXR1cmUoKTsKICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgcmhzKTsKICAgIHNoYXJlZF9mdXR1cmUoZnV0dXJlPFI+JiYpOwogICAgc2hhcmVkX2Z1dHVyZShzaGFyZWRfZnV0dXJlJiYgcmhzKTsKICAgIH5zaGFyZWRfZnV0dXJlKCk7CiAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgcmhzKTsKICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShzaGFyZWRfZnV0dXJlJiYgcmhzKTsKCiAgICAvLyByZXRyaWV2aW5nIHRoZSB2YWx1ZQogICAgY29uc3QgUiYgZ2V0KCkgY29uc3Q7CgogICAgLy8gZnVuY3Rpb25zIHRvIGNoZWNrIHN0YXRlCiAgICBib29sIHZhbGlkKCkgY29uc3Q7CgogICAgdm9pZCB3YWl0KCkgY29uc3Q7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CiAgICAgICAgZnV0dXJlX3N0YXR1cwogICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSkgY29uc3Q7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uPgogICAgICAgIGZ1dHVyZV9zdGF0dXMKICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24+JiBhYnNfdGltZSkgY29uc3Q7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgUj4KY2xhc3Mgc2hhcmVkX2Z1dHVyZTxSJj4KewpwdWJsaWM6CiAgICBzaGFyZWRfZnV0dXJlKCk7CiAgICBzaGFyZWRfZnV0dXJlKGNvbnN0IHNoYXJlZF9mdXR1cmUmIHJocyk7CiAgICBzaGFyZWRfZnV0dXJlKGZ1dHVyZTxSPiYmKTsKICAgIHNoYXJlZF9mdXR1cmUoc2hhcmVkX2Z1dHVyZSYmIHJocyk7CiAgICB+c2hhcmVkX2Z1dHVyZSgpOwogICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9mdXR1cmUmIHJocyk7CiAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oc2hhcmVkX2Z1dHVyZSYmIHJocyk7CgogICAgLy8gcmV0cmlldmluZyB0aGUgdmFsdWUKICAgIFImIGdldCgpIGNvbnN0OwoKICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQogICAgYm9vbCB2YWxpZCgpIGNvbnN0OwoKICAgIHZvaWQgd2FpdCgpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgogICAgICAgIGZ1dHVyZV9zdGF0dXMKICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KICAgICAgICBmdXR1cmVfc3RhdHVzCiAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0Owp9OwoKdGVtcGxhdGUgPD4KY2xhc3Mgc2hhcmVkX2Z1dHVyZTx2b2lkPgp7CnB1YmxpYzoKICAgIHNoYXJlZF9mdXR1cmUoKTsKICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgcmhzKTsKICAgIHNoYXJlZF9mdXR1cmUoZnV0dXJlPFI+JiYpOwogICAgc2hhcmVkX2Z1dHVyZShzaGFyZWRfZnV0dXJlJiYgcmhzKTsKICAgIH5zaGFyZWRfZnV0dXJlKCk7CiAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgcmhzKTsKICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShzaGFyZWRfZnV0dXJlJiYgcmhzKTsKCiAgICAvLyByZXRyaWV2aW5nIHRoZSB2YWx1ZQogICAgdm9pZCBnZXQoKSBjb25zdDsKCiAgICAvLyBmdW5jdGlvbnMgdG8gY2hlY2sgc3RhdGUKICAgIGJvb2wgdmFsaWQoKSBjb25zdDsKCiAgICB2b2lkIHdhaXQoKSBjb25zdDsKICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KICAgICAgICBmdXR1cmVfc3RhdHVzCiAgICAgICAgd2FpdF9mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIHJlbF90aW1lKSBjb25zdDsKICAgIHRlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24+CiAgICAgICAgZnV0dXJlX3N0YXR1cwogICAgICAgIHdhaXRfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbj4mIGFic190aW1lKSBjb25zdDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBSPgpjbGFzcyBhdG9taWNfZnV0dXJlCnsKcHVibGljOgogICAgYXRvbWljX2Z1dHVyZSgpOwogICAgYXRvbWljX2Z1dHVyZShjb25zdCBhdG9taWNfZnV0dXJlJiByaHMpOwogICAgYXRvbWljX2Z1dHVyZShmdXR1cmU8Uj4mJik7CiAgICB+YXRvbWljX2Z1dHVyZSgpOwogICAgYXRvbWljX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mdXR1cmUmIHJocyk7CgogICAgLy8gcmV0cmlldmluZyB0aGUgdmFsdWUKICAgIGNvbnN0IFImIGdldCgpIGNvbnN0OwoKICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQogICAgYm9vbCB2YWxpZCgpIGNvbnN0OwoKICAgIHZvaWQgd2FpdCgpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgogICAgICAgIGZ1dHVyZV9zdGF0dXMKICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KICAgICAgICBmdXR1cmVfc3RhdHVzCiAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0Owp9OwoKdGVtcGxhdGUgPGNsYXNzIFI+CmNsYXNzIGF0b21pY19mdXR1cmU8UiY+CnsKcHVibGljOgogICAgYXRvbWljX2Z1dHVyZSgpOwogICAgYXRvbWljX2Z1dHVyZShjb25zdCBhdG9taWNfZnV0dXJlJiByaHMpOwogICAgYXRvbWljX2Z1dHVyZShmdXR1cmU8Uj4mJik7CiAgICB+YXRvbWljX2Z1dHVyZSgpOwogICAgYXRvbWljX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mdXR1cmUmIHJocyk7CgogICAgLy8gcmV0cmlldmluZyB0aGUgdmFsdWUKICAgIFImIGdldCgpIGNvbnN0OwoKICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQogICAgYm9vbCB2YWxpZCgpIGNvbnN0OwoKICAgIHZvaWQgd2FpdCgpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgogICAgICAgIGZ1dHVyZV9zdGF0dXMKICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KICAgICAgICBmdXR1cmVfc3RhdHVzCiAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0Owp9OwoKdGVtcGxhdGUgPD4KY2xhc3MgYXRvbWljX2Z1dHVyZTx2b2lkPgp7CnB1YmxpYzoKICAgIGF0b21pY19mdXR1cmUoKTsKICAgIGF0b21pY19mdXR1cmUoY29uc3QgYXRvbWljX2Z1dHVyZSYgcmhzKTsKICAgIGF0b21pY19mdXR1cmUoZnV0dXJlPFI+JiYpOwogICAgfmF0b21pY19mdXR1cmUoKTsKICAgIGF0b21pY19mdXR1cmUmIG9wZXJhdG9yPShjb25zdCBhdG9taWNfZnV0dXJlJiByaHMpOwoKICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCiAgICB2b2lkIGdldCgpIGNvbnN0OwoKICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQogICAgYm9vbCB2YWxpZCgpIGNvbnN0OwoKICAgIHZvaWQgd2FpdCgpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgogICAgICAgIGZ1dHVyZV9zdGF0dXMKICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OwogICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KICAgICAgICBmdXR1cmVfc3RhdHVzCiAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0Owp9OwoKdGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzLi4uIEFyZ3M+CiAgZnV0dXJlPHR5cGVuYW1lIHJlc3VsdF9vZjxGKEFyZ3MuLi4pPjo6dHlwZT4KICBhc3luYyhGJiYgZiwgQXJncyYmLi4uIGFyZ3MpOwoKdGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzLi4uIEFyZ3M+CiAgZnV0dXJlPHR5cGVuYW1lIHJlc3VsdF9vZjxGKEFyZ3MuLi4pPjo6dHlwZT4KICBhc3luYyhsYXVuY2ggcG9saWN5LCBGJiYgZiwgQXJncyYmLi4uIGFyZ3MpOwoKdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBwYWNrYWdlZF90YXNrOwkvLyB1bmRlZmluZWQKCnRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcy4uLiBBcmdUeXBlcz4KY2xhc3MgcGFja2FnZWRfdGFzazxSKEFyZ1R5cGVzLi4uKT4KewpwdWJsaWM6CiAgICB0eXBlZGVmIFIgcmVzdWx0X3R5cGU7CgogICAgLy8gY29uc3RydWN0aW9uIGFuZCBkZXN0cnVjdGlvbgogICAgcGFja2FnZWRfdGFzaygpOwogICAgdGVtcGxhdGUgPGNsYXNzIEY+CiAgICAgICAgZXhwbGljaXQgcGFja2FnZWRfdGFzayhGIGYpOwogICAgdGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzIEFsbG9jYXRvcj4KICAgICAgICBleHBsaWNpdCBwYWNrYWdlZF90YXNrKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgQWxsb2NhdG9yJiBhLCBGIGYpOwogICAgZXhwbGljaXQgcGFja2FnZWRfdGFzayhSKCpmKShBcmdUeXBlcy4uLikpOwogICAgdGVtcGxhdGUgPGNsYXNzIEY+CiAgICAgICAgZXhwbGljaXQgcGFja2FnZWRfdGFzayhGJiYgZik7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgRiwgY2xhc3MgQWxsb2NhdG9yPgogICAgICAgIGV4cGxpY2l0IHBhY2thZ2VkX3Rhc2soYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvY2F0b3ImIGEsIEYmJiBmKTsKICAgIH5wYWNrYWdlZF90YXNrKCk7CgogICAgLy8gbm8gY29weQogICAgcGFja2FnZWRfdGFzayhwYWNrYWdlZF90YXNrJikgPSBkZWxldGU7CiAgICBwYWNrYWdlZF90YXNrJiBvcGVyYXRvcj0ocGFja2FnZWRfdGFzayYpID0gZGVsZXRlOwoKICAgIC8vIG1vdmUgc3VwcG9ydAogICAgcGFja2FnZWRfdGFzayhwYWNrYWdlZF90YXNrJiYgb3RoZXIpOwogICAgcGFja2FnZWRfdGFzayYgb3BlcmF0b3I9KHBhY2thZ2VkX3Rhc2smJiBvdGhlcik7CiAgICB2b2lkIHN3YXAocGFja2FnZWRfdGFzayYgb3RoZXIpOwoKICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdDsKCiAgICAvLyByZXN1bHQgcmV0cmlldmFsCiAgICBmdXR1cmU8Uj4gZ2V0X2Z1dHVyZSgpOwoKICAgIC8vIGV4ZWN1dGlvbgogICAgdm9pZCBvcGVyYXRvcigpKEFyZ1R5cGVzLi4uICk7CiAgICB2b2lkIG1ha2VfcmVhZHlfYXRfdGhyZWFkX2V4aXQoQXJnVHlwZXMuLi4pOwoKICAgIHZvaWQgcmVzZXQoKTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBSPgogIHZvaWQgc3dhcChwYWNrYWdlZF90YXNrPFIoQXJnVHlwZXMuLi4pJiwgcGFja2FnZWRfdGFzazxSKEFyZ1R5cGVzLi4uKT4mKTsKCnRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBBbGxvYz4gc3RydWN0IHVzZXNfYWxsb2NhdG9yPHBhY2thZ2VkX3Rhc2s8Uj4sIEFsbG9jPjsKCn0gIC8vIHN0ZAoKKi8KCiNpbmNsdWRlIDxfX2NvbmZpZz4KI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KCiNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKCl9MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAoKLy9lbnVtIGNsYXNzIGZ1dHVyZV9lcnJjCnN0cnVjdCBmdXR1cmVfZXJyYwp7CmVudW0gXyB7CiAgICBicm9rZW5fcHJvbWlzZSwKICAgIGZ1dHVyZV9hbHJlYWR5X3JldHJpZXZlZCwKICAgIHByb21pc2VfYWxyZWFkeV9zYXRpc2ZpZWQsCiAgICBub19zdGF0ZQp9OwoKICAgIF8gX192XzsKCiAgICBmdXR1cmVfZXJyYyhfIF9fdikgOiBfX3ZfKF9fdikge30KICAgIG9wZXJhdG9yIGludCgpIGNvbnN0IHtyZXR1cm4gX192Xzt9Cgp9OwoKLy9lbnVtIGNsYXNzIGxhdW5jaApzdHJ1Y3QgbGF1bmNoCnsKZW51bSBfIHsKICAgIGFueSwKICAgIGFzeW5jLAogICAgc3luYwp9OwoKICAgIF8gX192XzsKCiAgICBsYXVuY2goXyBfX3YpIDogX192XyhfX3YpIHt9CiAgICBvcGVyYXRvciBpbnQoKSBjb25zdCB7cmV0dXJuIF9fdl87fQoKfTsKCi8vZW51bSBjbGFzcyBmdXR1cmVfc3RhdHVzCnN0cnVjdCBmdXR1cmVfc3RhdHVzCnsKZW51bSBfIHsKICAgIHJlYWR5LAogICAgdGltZW91dCwKICAgIGRlZmVycmVkCn07CgogICAgXyBfX3ZfOwoKICAgIGZ1dHVyZV9zdGF0dXMoXyBfX3YpIDogX192XyhfX3YpIHt9CiAgICBvcGVyYXRvciBpbnQoKSBjb25zdCB7cmV0dXJuIF9fdl87fQoKfTsKCl9MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKCiNlbmRpZiAgLy8gX0xJQkNQUF9GVVRVUkUK