LyoKICoKICogRXhhbXBsZSBjb2RlIHRvIGRlbW9uc3RyYXRlIHRoZSBiZW5lZml0cyBvZiBQQk9zIGZvciBmYXN0CiAqIHRyYW5zZmVycyB0byB0aGUgR1BVLgogKgogKiAoYykgMjAwNiBEb21pbmlrIEf2ZGRla2UsIFVuaXZlcnNpdHkgb2YgRG9ydG11bmQKICogZG9taW5pay5nb2VkZGVrZUBtYXRoLnVuaS1kb3J0bXVuZC5kZQogKgogKiBGb3IgZGV0YWlscywgcGxlYXNlIHJlZmVyIHRvIHRoZSB0dXRvcmlhbCBhdmFpbGFibGUgYXQKICogd3d3Lm1hdGhlbWF0aWsudW5pLWRvcnRtdW5kLmRlL35nb2VkZGVrZS9ncGdwdS90dXRvcmlhbDMuaHRtbAogKgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxHTC9nbGV3Lmg+CiNpbmNsdWRlIDxHTC9nbHV0Lmg+CiNpbmNsdWRlIDxDZy9jZy5oPgojaW5jbHVkZSA8Q2cvY2dHTC5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgIG1hY3JvcywgcHJvYmxlbSBzaXplIGRlZmluaXRpb24gZXRjLiAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gUEJPIG1hY3JvIChzZWUgc3BlYyBmb3IgZGV0YWlscykKI2RlZmluZSBCVUZGRVJfT0ZGU0VUKGkpICgoY2hhciAqKU5VTEwgKyAoaSkpCgoKLy8gYXJyYXkgc2l6ZSBOIGlzIHRleHNpemUqdGV4c2l6ZQpzdGF0aWMgY29uc3QgaW50IHRleFNpemUgPSAxMDI1OwpzdGF0aWMgY29uc3QgaW50IE4gPSB0ZXhTaXplKnRleFNpemU7CgovLyBoYXJkLWNvZGVkIGZvciBzaGFkZXIgKyBDZywgZG8gbm90IGNoYW5nZSB0aGlzCnN0YXRpYyBjb25zdCBpbnQgbnVtQXJyYXlzUGVyQ2h1bmsgPSA5OwovLyBpbnB1dCBkYXRhIHNpemUsIGRlZmF1bHQgc2V0dGluZyByZXN1bHRzIGluIGFwcHJveCAxLjYgR0Igb2YgcGh5cyBtZW0uCnN0YXRpYyBjb25zdCBpbnQgbnVtQ2h1bmtzID0gMjA7Ci8vIG51bWJlciBvZiBpdGVyYXRpb25zIHBlciBjaHVuayB0byBlbXVsYXRlIGtlcm5lbCB3b3JrbG9hZApzdGF0aWMgY29uc3QgaW50IG51bUtlcm5lbFN0ZXBzID0gMTsKLy8gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhlIHRlc3QgaXMgcmVwZWF0ZWQsIHRvIHJlZHVjZSB0aW1pbmcgbm9pc2UuCnN0YXRpYyBjb25zdCBpbnQgbnVtSXRlcmF0aW9ucyA9IDEwOwoKCi8vIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIHRvIGNoZWNrIGZvciBHTCBhbmQgQ2cgZXJyb3JzCi8vIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIGNyZWF0ZXMgYW4gKGFydGlmaWNpYWwpIHN5bmMgcG9pbnQgKGJ5IGdsR2V0RXJyb3IoKSkKLy8jZGVmaW5lIERFQlVHREVCVUcKCgovLwovLyBFbmFibGUgdGhpcyAjZGVmaW5lIHRvIGVuYWJsZSBQQk9zIGZvciBnbFRleFN1YkltYWdlKCkgYW5kIGdsUmVhZFBpeGVscygpLgovLyBPdGhlcndpc2UsIFBCT3MgYXJlIG5vdCB1c2VkLgovLwojZGVmaW5lIFVTRV9QQk8KCgovLyBteSBvd24gbWVtY2hlY2sgbWFjcm8sIG9ubHkgd29ya3Mgb24gbGludXguIFVzZSB3aXRoIGNhcmUsIHRoaXMgd2lsbAovLyBzbG93IGRvd24gdGhlIGFwcGxpY2F0aW9uIHNpZ25pZmljYW50bHkuCiNkZWZpbmUgTUVNQ0hFQ0soKSBzeXN0ZW0oInRvcCAtYiAtbjEgfCBncmVwIHRlc3QgfCBhd2sgJ3twcmludCAkNVwiIFwiJDZ9JyIpCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovLwovLyBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHNvbWUgZnVuY3Rpb25zCi8vCnZvaWQgY2dFcnJvckNhbGxiYWNrKHZvaWQpOwp2b2lkIGNoZWNrRXJyb3JzKGNvbnN0IGNoYXIgKmxhYmVsKTsKdm9pZCBjb3B5KGRvdWJsZSogaW4sIGZsb2F0KiBvdXQpOwp2b2lkIGNvcHkoZG91YmxlKiBpbiwgdm9pZCogb3V0KTsKdm9pZCBjb3B5KHZvaWQqIGluLCBkb3VibGUqIG91dCk7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8KLy8gZnJhZ21lbnQgcHJvZ3JhbTogb3V0ID0gYWNjdW0gKyB2ZWMKLy8KY29uc3QgY2hhcioga2VybmVsU291cmNlID0gIiBmbG9hdCBtYWluKCAgICAgICAgICAgICAgICAgICAgIlwKICAgICAgICAiICAgICAgICAgICAgdW5pZm9ybSBzYW1wbGVyUkVDVCBhY2N1bSwgICAgICAgICAgICAgIiBcCiAgICAgICAgIiAgICAgICAgICAgIHVuaWZvcm0gc2FtcGxlclJFQ1QgdmVjMSwgICAgICAgICAgICAgICIgXAogICAgICAgICIgICAgICAgICAgICB1bmlmb3JtIHNhbXBsZXJSRUNUIHZlYzIsICAgICAgICAgICAgICAiIFwKICAgICAgICAiICAgICAgICAgICAgdW5pZm9ybSBzYW1wbGVyUkVDVCB2ZWMzLCAgICAgICAgICAgICAgIiBcCiAgICAgICAgIiAgICAgICAgICAgIHVuaWZvcm0gc2FtcGxlclJFQ1QgdmVjNCwgICAgICAgICAgICAgICIgXAogICAgICAgICIgICAgICAgICAgICB1bmlmb3JtIHNhbXBsZXJSRUNUIHZlYzUsICAgICAgICAgICAgICAiIFwKICAgICAgICAiICAgICAgICAgICAgdW5pZm9ybSBzYW1wbGVyUkVDVCB2ZWM2LCAgICAgICAgICAgICAgIiBcCiAgICAgICAgIiAgICAgICAgICAgIHVuaWZvcm0gc2FtcGxlclJFQ1QgdmVjNywgICAgICAgICAgICAgICIgXAogICAgICAgICIgICAgICAgICAgICB1bmlmb3JtIHNhbXBsZXJSRUNUIHZlYzgsICAgICAgICAgICAgICAiIFwKICAgICAgICAiICAgICAgICAgICAgdW5pZm9ybSBzYW1wbGVyUkVDVCB2ZWM5LCAgICAgICAgICAgICAgIiBcCiAgICAgICAgIiAgICAgICAgICAgIGluIGZsb2F0NCBjb29yZHM6VEVYQ09PUkQwKSA6IENPTE9SIHsgICIgXAogICAgIiAgcmV0dXJuIHRleFJFQ1QoYWNjdW0sY29vcmRzLnh5KSArICAgICAgICAgICAgICAgICIgXAogICAgICAgICIgIHRleFJFQ1QodmVjMSxjb29yZHMueHkpICArICAgICAgICAgICAgICAgICAgICAgICAiIFwKICAgICAgICAiICB0ZXhSRUNUKHZlYzIsY29vcmRzLnh5KSAgKyAgICAgICAgICAgICAgICAgICAgICAgIiBcCiAgICAgICAgIiAgdGV4UkVDVCh2ZWMzLGNvb3Jkcy54eSkgICsgICAgICAgICAgICAgICAgICAgICAgICIgXAogICAgICAgICIgIHRleFJFQ1QodmVjNCxjb29yZHMueHkpICArICAgICAgICAgICAgICAgICAgICAgICAiIFwKICAgICAgICAiICB0ZXhSRUNUKHZlYzUsY29vcmRzLnh5KSAgKyAgICAgICAgICAgICAgICAgICAgICAgIiBcCiAgICAgICAgIiAgdGV4UkVDVCh2ZWM2LGNvb3Jkcy54eSkgICsgICAgICAgICAgICAgICAgICAgICAgICIgXAogICAgICAgICIgIHRleFJFQ1QodmVjNyxjb29yZHMueHkpICArICAgICAgICAgICAgICAgICAgICAgICAiIFwKICAgICAgICAiICB0ZXhSRUNUKHZlYzgsY29vcmRzLnh5KSAgKyAgICAgICAgICAgICAgICAgICAgICAgIiBcCiAgICAgICAgIiAgdGV4UkVDVCh2ZWM5LGNvb3Jkcy54eSk7IH0gICAgICAgICAgICAgICAgICAgICAgICI7CgojaWZkZWYgREVCVUdERUJVRwovLwovLyBDZyBlcnJvciBjYWxsYmFjawovLwp2b2lkIGNnRXJyb3JDYWxsYmFjayh2b2lkKSB7CiAgICBDR2Vycm9yIGxhc3RFcnJvciA9IGNnR2V0RXJyb3IoKTsKICAgIGlmKGxhc3RFcnJvcikKICAgICAgICBwcmludGYoY2dHZXRFcnJvclN0cmluZyhsYXN0RXJyb3IpKTsKICAgIGV4aXQoLTEpOwp9CgovLwovLyBHTCBlcnJvciBjaGVja2luZwovLwp2b2lkIGNoZWNrRXJyb3JzKGNvbnN0IGNoYXIgKmxhYmVsKSB7CiAgICBHTGVudW0gZXJyQ29kZTsKICAgIGNvbnN0IEdMdWJ5dGUgKmVyclN0cjsKICAgIGlmICgoZXJyQ29kZSA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKICAgICAgICBlcnJTdHIgPSBnbHVFcnJvclN0cmluZyhlcnJDb2RlKTsKICAgIHByaW50ZigiJXM6IE9wZW5HTCBFUlJPUiAiLGxhYmVsKTsKICAgIHByaW50ZigoY2hhciopZXJyU3RyKTsKICAgICAgICBwcmludGYoIlxuIik7CiAgICBleGl0KC0yKTsKICAgIH0KfQojZW5kaWYKCgovLwovLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyBmcm9tIGRvdWJsZSB0byBmbG9hdCwgdGhlIHZlcnNpb25zCi8vIHVzaW5nIHRoZSB2b2lkIHBvaW50ZXJzIGFyZSB1c2VkIHdpdGggUEJPcy4KLy8gRm9yIGRldGFpbHMsIHNlZSBiZWxvdyB3aGVyZSBQQk9zIGFyZSBhY3R1YWxseSB1c2VkLgovLyBOb3RlIHRoYXQgSSByZWx5IG9uIHRoZSBjb21waWxlciB0byBtZW1hbGlnbiB0aGVzZSBwcm9wZXJseS4KLy8gV2hvZXZlciBrbm93cyBhIHdheSB0byBkbyB0aGlzIG9wZXJhdGlvbiBmb3IgdmFyaWFibGUgTgovLyAobm90IGNvbXBpbGUtdGltZSBjb25zdGFudCkgaW4gdGhlIG1vc3QgZWZmaWNpZW50IHdheSwKLy8gcGxlYXNlIGRyb3AgbWUgYSBub3RlLgovLwp2b2lkIGNvcHkoZG91YmxlKiBpbiwgZmxvYXQqIG91dCkgewogICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykKICAgIG91dFtpXSA9IChmbG9hdClpbltpXTsKfQp2b2lkIGNvcHkoZG91YmxlKiBpbiwgdm9pZCogb3V0KSB7CiAgICBmbG9hdCogYmxhID0gKGZsb2F0KilvdXQ7CiAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKQogICAgYmxhW2ldID0gKGZsb2F0KWluW2ldOwp9CnZvaWQgY29weSh2b2lkKiBpbiwgZG91YmxlKiBvdXQpIHsKICAgIGZsb2F0KiBibGEgPSAoZmxvYXQqKWluOwogICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykKICAgIG91dFtpXSA9IGJsYVtpXTsKfQoKCi8vCi8vIHRoaXMgZG9lcyBhbGwgdGhlIHJlbGV2YW50IHRoaW5ncwovLwppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgIGFzc2VydCAobnVtQXJyYXlzUGVyQ2h1bmsgPT0gOSk7IC8vIGJlY2F1c2Uga2VybmVsIGlzIGhhcmQgY29kZWQKICAgIC8vCiAgICAvLyBzZXQgdXAgZ2x1dCB0byBnZXQgdmFsaWQgR0wgY29udGV4dCBhbmQKICAgIC8vIGdldCBleHRlbnNpb24gZW50cnkgcG9pbnRzCiAgICAvLwogICAgZ2x1dEluaXQgKCZhcmdjLCBhcmd2KTsKICAgIGdsdXRDcmVhdGVXaW5kb3coIlNUUkVBTUlORyBUVVRPUklBTCIpOwogICAgZ2xld0luaXQoKTsKICAgIC8vCiAgICAvLyB2aWV3cG9ydCB0cmFuc2Zvcm0gZm9yIDE6MSAncGl4ZWw9dGV4ZWw9ZGF0YScgbWFwcGluZwogICAgLy8KICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKICAgIGdsTG9hZElkZW50aXR5KCk7CiAgICBnbHVPcnRobzJEKDAuMCx0ZXhTaXplLDAuMCx0ZXhTaXplKTsKICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwogICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgIGdsVmlld3BvcnQoMCwwLHRleFNpemUsdGV4U2l6ZSk7CiAgICAvLwogICAgLy8gY3JlYXRlIEZCTyBhbmQgYmluZCBpdAogICAgLy8KICAgIEdMdWludCBmYjsKICAgIGdsR2VuRnJhbWVidWZmZXJzRVhUKDEsJmZiKTsKICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCxmYik7CiAgICAvLwogICAgLy8gY3JlYXRlIGEgd2hvbGUgYnVuY2ggb2YgZG91YmxlIHByZWNpc2lvbiBkYXRhCiAgICAvLwogICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgcHJpbnRmKCJDcmVhdGluZyBpbnB1dCBkYXRhLCBpZiB0aGUgZm9sbG93aW5nIGFtb3VudCBcbiIpOwogICAgcHJpbnRmKCJpcyBncmVhdGVyIHRoYW4gdGhlIHBoeXNpY2FsbHkgYXZhaWxhYmxlIFJBTSxcbiIpOwogICAgcHJpbnRmKCJwcmVzcyBDVFJMLUMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgSEQgcGFnaW5nLiBcbiIpOwogICAgLy8gZG91YmxlIHByZWNpc2lvbiBhcnJheXMKICAgIGRvdWJsZSBtZW1yZXF1aXJlbWVudHMgPSAoZG91YmxlKShudW1DaHVua3MqbnVtQXJyYXlzUGVyQ2h1bmsgKyBudW1DaHVua3MpKk4qc2l6ZW9mKGRvdWJsZSk7CiAgICAvLyBzaW5nbGUgcHJlY2lzaW9uIHRleHR1cmVzCiAgICBtZW1yZXF1aXJlbWVudHMgKz0gKG51bUFycmF5c1BlckNodW5rICsgMikgKiBOICogc2l6ZW9mKGZsb2F0KTsKICAgIC8vIGNvbnZlcnQgdG8gbWVnYWJ5dGVzCiAgICBtZW1yZXF1aXJlbWVudHMgLz0gKDEwMjQuMCAqIDEwMjQuMCk7CiAgICBwcmludGYoIkFsbG9jYXRpbmcgJS4yZiBNQi5cbiIsbWVtcmVxdWlyZW1lbnRzKTsKI2lmZGVmIFVTRV9QQk8KICAgIHByaW50ZigiUEJPIHRyYW5zZmVycyBhcmUgZW5hYmxlZC5cbiIpOwojZWxzZQogICAgcHJpbnRmKCJQQk8gdHJhbnNmZXJzIGFyZSBkaXNhYmxlZC5cbiIpOwojZW5kaWYKICAgIC8vIGFycmF5IHRvIHN0b3JlIGludGlhbCB2YWx1ZSBhbmQgZmluYWwgcmVzdWx0LCBpbml0aWFsbHkgemVyb2VkCiAgICBkb3VibGUqIGRhdGEgPSBuZXcgZG91YmxlW05dOwogICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykKICAgIGRhdGFbaV0gPSAwLjA7CiAgICAvLyBpbnB1dCBhcnJheXM6IGFycmF5cyBpbiBjaHVuayBvbmUgY29udGFpbiB2YWx1ZXMgZnJvbSAxLi45LAogICAgLy8gaW4gY2h1bmsgdHdvIGZyb20gMTAuLjE5LCBhbmQgc28gb24KICAgIGRvdWJsZSoqKiBjaHVua3MgPSBuZXcgZG91YmxlKipbbnVtQ2h1bmtzXTsKICAgIGZvciAoaW50IGNodW5rPTA7IGNodW5rPG51bUNodW5rczsgY2h1bmsrKykgewogICAgY2h1bmtzW2NodW5rXSA9IG5ldyBkb3VibGUqW251bUFycmF5c1BlckNodW5rXTsKICAgIGZvciAoaW50IGFycmF5PTA7IGFycmF5PG51bUFycmF5c1BlckNodW5rOyBhcnJheSsrKSB7CiAgICAgICAgY2h1bmtzW2NodW5rXVthcnJheV0gPSBuZXcgZG91YmxlW05dOwogICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspCiAgICAgICAgY2h1bmtzW2NodW5rXVthcnJheV1baV0gPSBjaHVuayoxMC4wICsgYXJyYXkgKyAxOwovLyAgICAgICAgcHJpbnRmKCIlZDogJS4yZlxuIixhcnJheSxjaHVua3NbY2h1bmtdW2FycmF5XVs4OF0pOwogICAgfQogICAgfQogICAgLy8KICAgIC8vIGxvY2FsIHN0b3JhZ2UgZm9yIGNvbnZlcnNpb24KICAgIC8vCiAgICBmbG9hdCogdG1wZmxvYXQgPSBuZXcgZmxvYXRbTl07CiAgICAvLwogICAgLy8gY3JlYXRlIG5lY2Vzc2FyeSB0ZXh0dXJlczoKICAgIC8vIHdlIG5lZWQgdHdvIHRleHR1cmVzIHRvIHBpbmdwb25nIHRoZSBpdGVyYXRpb24sCiAgICAvLyBhbmQgb25lIHNldCBvZiBpbnB1dCB0ZXh0dXJlcyAobnVtQXJyYXlzUGVyQ2h1bmspLgogICAgLy8gUGluZ3BvbmcgdGV4dHVyZXMgYXJlIHplcm9lZCBoZXJlIGFscmVhZHksIGlucHV0IHRleHR1cmVzCiAgICAvLyBhcmUganVzdCBhbGxvY2F0ZWQuCiAgICAvLyBXZSBjb3VsZCBhbGxvY2F0ZSB0ZXh0dXJlcyBmb3IgYWxsIGlucHV0IGFycmF5cyAobnVtQ2h1bmtzIHRpbWVzCiAgICAvLyBudW1BcnJheXNQZXJDaHVuayksIGJ1dCBtZW1vcnkgaXMgYSBwcmVjaW91cyByZXNvdXJjZS4gQWxsb2NhdGluZwogICAgLy8gdGhlbSBpbmNyZWFzZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGJ5IGZhY3RvciBvZiAxLjUgKGluIGFkZGl0aW9uIHRvCiAgICAvLyB0aGUgZG91YmxlIHByZWNpc2lvbiBhcnJheXMpLCBzaW5jZSBnbFRleEltYWdlKCkgaW1wbGllcyBhCiAgICAvLyBtYWxsb2MoKSBpbiBkcml2ZXIgY29udHJvbGxlZCBtZW1vcnkuCiAgICAvLwogICAgR0x1aW50IHBpbmd0ZXhbMl07CiAgICBnbEdlblRleHR1cmVzKDIscGluZ3RleCk7CiAgICAvLyBzZXQgdGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBwaW5ncG9uZyB0ZXh0dXJlcyBhbmQgemVybyB0aGVtCiAgICBjb3B5KGRhdGEsdG1wZmxvYXQpOwogICAgZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgewogICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIscGluZ3RleFtpXSk7CiAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCLCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwogICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQiwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUCk7CiAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCLCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVApOwogICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQiwwLEdMX0ZMT0FUX1IzMl9OVix0ZXhTaXplLHRleFNpemUsMCxHTF9MVU1JTkFOQ0UsR0xfRkxPQVQsdG1wZmxvYXQpOwogICAgfQogICAgLy8gY3JlYXRlIG51bUFycmF5c1BlckNodW5rIGlucHV0IHRleHR1cmVzLCBzZXQgcGFyYW1ldGVycyBhbmQKICAgIC8vIGFsbG9jYXRlIHNwYWNlLiBkbyBub3QgcG9wdWxhdGUgdGhlbSEKICAgIEdMdWludCBpbnB1dFRleHR1cmVzW251bUFycmF5c1BlckNodW5rXTsKICAgIGdsR2VuVGV4dHVyZXMgKG51bUFycmF5c1BlckNodW5rLCBpbnB1dFRleHR1cmVzKTsKICAgIGZvciAoaW50IGFycmF5PTA7IGFycmF5PG51bUFycmF5c1BlckNodW5rOyBhcnJheSsrKSB7CiAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQixpbnB1dFRleHR1cmVzW2FycmF5XSk7CiAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCLCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwogICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQiwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUCk7CiAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCLCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVApOwogICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQiwwLEdMX0ZMT0FUX1IzMl9OVix0ZXhTaXplLHRleFNpemUsMCxHTF9MVU1JTkFOQ0UsR0xfRkxPQVQsTlVMTCk7CiAgICB9CiNpZmRlZiBERUJVR0RFQlVHCiAgICBjaGVja0Vycm9ycygiY3JlYXRlIHRleHR1cmVzIik7CiNlbmRpZgojaWZkZWYgVVNFX1BCTwogICAgLy8KICAgIC8vIGNyZWF0ZSBidWZmZXIgb2JqZWN0cyAobmluZSBmb3IgZG93bmxvYWQsIG9uZSBmb3IgcmVhZGJhY2spCiAgICAvLwogICAgR0x1aW50IGlvQnVmWzEwXTsKICAgIGdsR2VuQnVmZmVycygxMCwgaW9CdWYpOwojZW5kaWYKICAgIC8vCiAgICAvLyBzZXQgdXAgQ2cgcnVudGltZQogICAgLy8KICAgIENHY29udGV4dCBjZ0NvbnRleHQgPSBjZ0NyZWF0ZUNvbnRleHQoKTsKI2lmZGVmIERFQlVHREVCVUcKICAgIGNnU2V0RXJyb3JDYWxsYmFjayhjZ0Vycm9yQ2FsbGJhY2spOwojZW5kaWYKICAgIENHcHJvZmlsZSBmcmFnbWVudFByb2ZpbGUgPSBjZ0dMR2V0TGF0ZXN0UHJvZmlsZShDR19HTF9GUkFHTUVOVCk7CiAgICBjZ0dMU2V0T3B0aW1hbE9wdGlvbnMoZnJhZ21lbnRQcm9maWxlKTsKICAgIC8vCiAgICAvLyBjcmVhdGUga2VybmVsIHByb2dyYW0gYW5kIGxvYWQgaXQKICAgIC8vCiAgICBDR3Byb2dyYW0ga2VybmVsID0gY2dDcmVhdGVQcm9ncmFtIChjZ0NvbnRleHQsQ0dfU09VUkNFLGtlcm5lbFNvdXJjZSxmcmFnbWVudFByb2ZpbGUsTlVMTCxOVUxMKTsKICAgIGNnR0xMb2FkUHJvZ3JhbSAoa2VybmVsKTsKICAgIENHcGFyYW1ldGVyIGFjY3VtUGFyYW0gPSBjZ0dldE5hbWVkUGFyYW1ldGVyIChrZXJuZWwsImFjY3VtIik7CiAgICBDR3BhcmFtZXRlciAqcGFyYW1zID0gbmV3IENHcGFyYW1ldGVyW251bUFycmF5c1BlckNodW5rXTsKICAgIHBhcmFtc1swXSA9IGNnR2V0TmFtZWRQYXJhbWV0ZXIgKGtlcm5lbCwidmVjMSIpOwogICAgcGFyYW1zWzFdID0gY2dHZXROYW1lZFBhcmFtZXRlciAoa2VybmVsLCJ2ZWMyIik7CiAgICBwYXJhbXNbMl0gPSBjZ0dldE5hbWVkUGFyYW1ldGVyIChrZXJuZWwsInZlYzMiKTsKICAgIHBhcmFtc1szXSA9IGNnR2V0TmFtZWRQYXJhbWV0ZXIgKGtlcm5lbCwidmVjNCIpOwogICAgcGFyYW1zWzRdID0gY2dHZXROYW1lZFBhcmFtZXRlciAoa2VybmVsLCJ2ZWM1Iik7CiAgICBwYXJhbXNbNV0gPSBjZ0dldE5hbWVkUGFyYW1ldGVyIChrZXJuZWwsInZlYzYiKTsKICAgIHBhcmFtc1s2XSA9IGNnR2V0TmFtZWRQYXJhbWV0ZXIgKGtlcm5lbCwidmVjNyIpOwogICAgcGFyYW1zWzddID0gY2dHZXROYW1lZFBhcmFtZXRlciAoa2VybmVsLCJ2ZWM4Iik7CiAgICBwYXJhbXNbOF0gPSBjZ0dldE5hbWVkUGFyYW1ldGVyIChrZXJuZWwsInZlYzkiKTsKICAgIGNnR0xFbmFibGVQcm9maWxlKGZyYWdtZW50UHJvZmlsZSk7CiAgICBjZ0dMQmluZFByb2dyYW0oa2VybmVsKTsKICAgIC8vCiAgICAvLyBhdHRhY2ggcGluZyBwb25nIHRleHR1cmVzIHRvIEZCTywKICAgIC8vIGluaXQgcGluZ3BvbmcgbWFuYWdlbWVudCB2YXJpYWJsZXMKICAgIC8vCiAgICBHTHVpbnQgcmVhZFRleCA9IDA7CiAgICBHTHVpbnQgd3JpdGVUZXggPSAxOwogICAgR0xlbnVtIGF0dGFjaG1lbnRwb2ludHNbXSA9IHsgR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMV9FWFQgfTsKICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBhdHRhY2htZW50cG9pbnRzW3JlYWRUZXhdLCBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIscGluZ3RleFtyZWFkVGV4XSwwKTsKICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBhdHRhY2htZW50cG9pbnRzW3dyaXRlVGV4XSwgR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCLHBpbmd0ZXhbd3JpdGVUZXhdLDApOwojaWZkZWYgREVCVUdERUJVRwogICAgY2hlY2tFcnJvcnMoImF0dGFjaGluZyIpOwojZW5kaWYKICAgIC8vCiAgICAvLyBwZXJmb3JtIGNvbXB1dGF0aW9uIGJ5IGxvb3Bpbmcgb3ZlciBhbGwgY2h1bmtzIG9mIGlucHV0IGRhdGEsCiAgICAvLyBzdHJlYW1pbmcgdGhlbSBpbiBhcyB3ZSBwcm9jZWVkLgogICAgLy8KICAgIHByaW50ZigiU3RhcnRpbmcgY2FsY3VsYXRpb25cbiIpOwogICAgZ2xGaW5pc2goKTsKICAgIGRvdWJsZSBzdGFydF9jb21wdXRlID0gY2xvY2soKTsKICAgIGZvciAoaW50IGl0ZXI9MDsgaXRlcjxudW1JdGVyYXRpb25zOyBpdGVyKyspIHsKICAgIGZvciAoaW50IGNodW5rPTA7IGNodW5rPG51bUNodW5rczsgY2h1bmsrKykgewogICAgICAgIC8vCiAgICAgICAgLy8gcG9wdWxhdGUgaW5wdXQgdGV4dHVyZXMgZm9yIGN1cnJlbnQgY2h1bmsgYW5kIHRyYW5zZmVyCiAgICAgICAgLy8gZGF0YSB0byBkcml2ZXItY29udHJvbGxlZCBtZW1vcnkuCiAgICAgICAgLy8KICAgICAgICBmb3IgKGludCBhcnJheT0wOyBhcnJheTxudW1BcnJheXNQZXJDaHVuazsgYXJyYXkrKykgewogICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCLCBpbnB1dFRleHR1cmVzW2FycmF5XSk7CiNpZmRlZiBVU0VfUEJPCiAgICAgICAgLy8KICAgICAgICAvLyBiaW5kIGJ1ZmZlciBvYmplY3QKICAgICAgICAvLwogICAgICAgIGdsQmluZEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0FSQiwgaW9CdWZbYXJyYXldKTsKICAgICAgICAvLwogICAgICAgIC8vIGludmFsaWRhdGUgdGhpcyBidWZmZXIgb2JqZWN0IGJ5IHBhc3NpbmcgTlVMTCBhcyBkYXRhCiAgICAgICAgLy8KICAgICAgICAvLyBOb3RlOiBhY2NvcmRpbmcgdG8gdGhlIHNwZWMgYXQKICAgICAgICAvLyBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvcmVnaXN0cnkvc3BlY3MvQVJCL3ZlcnRleF9idWZmZXJfb2JqZWN0LnR4dAogICAgICAgIC8vIEdMX1NUUkVBTV9EUkFXIGhpbnRzIGF0IHRoZSBkcml2ZXIgdGhhdCB0aGUgZGF0YSBzdG9yZSBjb250ZW50cwogICAgICAgIC8vIHdpbGwgYmUgc3BlY2lmaWVkIG9uY2UgYnkgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdXNlZCBhdCBtb3N0IGEKICAgICAgICAvLyBmZXcgdGltZXMgYXMgdGhlIHNvdXJjZSBvZiBhIEdMIChkcmF3aW5nKSBjb21tYW5kLgogICAgICAgIGdsQnVmZmVyRGF0YShHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0FSQix0ZXhTaXplKnRleFNpemUqc2l6ZW9mKGZsb2F0KSwgTlVMTCwgR0xfU1RSRUFNX0RSQVcpOwogICAgICAgIC8vCiAgICAgICAgLy8gQWNxdWlyZSBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGRhdGEgaXRlbSBpbiB0aGlzIGJ1ZmZlciBvYmplY3QKICAgICAgICAvLyBieSBtYXBwaW5nIGl0IHRvIHRoZSBzby1jYWxsZWQgdW5wYWNrIGJ1ZmZlciB0YXJnZXQuIFRoZSB1bnBhY2sKICAgICAgICAvLyBidWZmZXIgcmVmZXJzIHRvIGEgbG9jYXRpb24gaW4gbWVtb3J5IHRoYXQgZ2V0cyAidW5wYWNrZWQiCiAgICAgICAgLy8gZnJvbSBDUFUgKG1haW4pIG1lbW9yeSBpbnRvIEdQVSBtZW1vcnksIGhlbmNlIHRoZSBzb21ld2hhdAogICAgICAgIC8vIGNvbmZ1c2luZyBsYW5ndWFnZS4KICAgICAgICAvLyBJbXBvcnRhbnQ6IFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgY2h1bmsgb2YgbWVtb3J5IGluIHdoYXQgSQogICAgICAgIC8vIGxpa2UgdG8gY2FsbCAiZHJpdmVyLWNvbnRyb2xsZWQgbWVtb3J5Ii4gRGVwZW5kaW5nIG9uIHRoZQogICAgICAgIC8vIGRyaXZlciwgdGhpcyBtaWdodCBiZSBQQ0llL0FHUCBtZW1vcnksIG9yIGlkZWFsbHkgb25ib2FyZAogICAgICAgIC8vIG1lbW9yeS4KICAgICAgICAvLyBHTF9XUklURV9PTkxZIHRlbGxzIHRoZSBHTCB0aGF0IHdoaWxlIHdlIGhhdmUgY29udHJvbCBvZiB0aGUKICAgICAgICAvLyBtZW1vcnksIHdlIHdpbGwgYWNjZXNzIGl0IHdyaXRlLW9ubHkuIFRoaXMgYWxsb3dzIGZvciBpbnRlcm5hbAogICAgICAgIC8vIG9wdGltaXNhdGlvbnMgYW5kIGluY3JlYXNlcyBvdXIgY2hhbmNlcyB0byBnZXQgZ29vZCBwZXJmb3JtYW5jZS4KICAgICAgICAvLyBJZiB3ZSBtYXBwZWQgdGhpcyBidWZmZXIgcmVhZC93cml0ZSwgaXQgd291bGQgYWxtb3N0IGFsd2F5cyBiZQogICAgICAgIC8vIGxvY2F0ZWQgaW4gc3lzdGVtIG1lbW9yeSwgZnJvbSB3aGljaCByZWFkaW5nIGlzIG11Y2ggZmFzdGVyLgogICAgICAgIC8vCiAgICAgICAgdm9pZCogaW9NZW0gPSBnbE1hcEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0FSQiwgR0xfV1JJVEVfT05MWSk7CiAgICAgICAgYXNzZXJ0KGlvTWVtKTsgLy8gd2UgYXJlIGluIHRyb3VibGUKICAgICAgICAvLwogICAgICAgIC8vICJtZW1jcHkiIHRoZSBkb3VibGUgcHJlY2lzaW9uIGFycmF5IGludG8gdGhlIGRyaXZlciBtZW1vcnksCiAgICAgICAgLy8gZG9pbmcgdGhlIGV4cGxpY2l0IGNvbnZlcnNpb24gdG8gc2luZ2xlIHByZWNpc2lvbi4KICAgICAgICAvLwogICAgICAgIGNvcHkoY2h1bmtzW2NodW5rXVthcnJheV0sIGlvTWVtKTsKICAgICAgICAvLwogICAgICAgIC8vIHJlbGVhc2UgbWVtb3J5LCBpLmUuIGdpdmUgY29udHJvbCBiYWNrIHRvIHRoZSBkcml2ZXIKICAgICAgICAvLwogICAgICAgIGdsVW5tYXBCdWZmZXIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9BUkIpOwogICAgICAgIC8vCiAgICAgICAgLy8gU2luY2UgdGhlIGJ1ZmZlciBvYmplY3QgaXMgc3RpbGwgYm91bmQsIHRoaXMgY2FsbCBwb3B1bGF0ZXMgb3VyCiAgICAgICAgLy8gdGV4dHVyZSBieSBzb3VyY2luZyB0aGUgYnVmZmVyIG9iamVjdC4gSW4gZWZmZWN0LCB0aGlzIG1lYW5zCiAgICAgICAgLy8gdGhhdCBpZGVhbGx5IG5vIGFjdHVhbCBtZW1jcHkgdGFrZXMgcGxhY2UgKGlmIHRoZSBkcml2ZXIKICAgICAgICAvLyBkZWNpZGVkIHRvIG1hcCB0aGUgYnVmZmVyIGluIG9uYm9hcmQgbWVtb3J5IHByZXZpb3VzbHkpLCBvciBhdAogICAgICAgIC8vIG1vc3Qgb25lIG1lbWNweSBpbnNpZGUgZHJpdmVyLWNvbnRyb2xsZWQgbWVtb3J5IHdoaWNoIGlzIG11Y2gKICAgICAgICAvLyBmYXN0ZXIgc2luY2UgdGhlIHByZXZpb3VzIGNvcHkgb2Ygb3VyIGRhdGEgaW50byBkcml2ZXItCiAgICAgICAgLy8gY29udHJvbGxlZCBtZW1vcnkgYWxyZWFkeSByZXN1bHRlZCBpbiBsYXlpbmcgb3V0IHRoZSBkYXRhIGZvcgogICAgICAgIC8vIG9wdGltYWwgcGVyZm9ybWFuY2UuCiAgICAgICAgLy8gSW4gb3RoZXIgd29yZHM6IFRoaXMgY2FsbCBpcyBhdCBtb3N0IGEgcmVhbCBETUEgdHJhbnNmZXIsCiAgICAgICAgLy8gd2l0aG91dCBhbnkgKGV4cGVuc2l2ZSkgaW50ZXJmZXJlbmNlIGJ5IHRoZSBDUFUuCiAgICAgICAgLy8KICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCLCAwLCAwLCAwLCB0ZXhTaXplLCB0ZXhTaXplLCBHTF9MVU1JTkFOQ0UsIEdMX0ZMT0FULCBCVUZGRVJfT0ZGU0VUKDApKTsKICAgICAgICAvLwogICAgICAgIC8vIFVuYmluZCBidWZmZXIgb2JqZWN0IGJ5IGJpbmRpbmcgaXQgdG8gemVyby4KICAgICAgICAvLyBUaGlzIGNhbGwgaXMgY3J1Y2lhbCwgYXMgZG9pbmcgdGhlIGZvbGxvd2luZyBjb21wdXRhdGlvbnMgd2hpbGUKICAgICAgICAvLyB0aGUgYnVmZmVyIG9iamVjdCBpcyBzdGlsbCBib3VuZCB3aWxsIHJlc3VsdCBpbiBhbGwgc29ydHMgb2YKICAgICAgICAvLyB3ZWlyZCBzaWRlIGVmZmVjdHMsIGV2ZW50dWFsbHkgZXZlbiBkZWxpdmVyaW5nIHdyb25nIHJlc3VsdHMuCiAgICAgICAgLy8gUmVmZXIgdG8gdGhlIHNwZWNpZmljYXRpb24gdG8gbGVhcm4gbW9yZSBhYm91dCB3aGljaAogICAgICAgIC8vIEdMIGNhbGxzIGFjdCBkaWZmZXJlbnRseSB3aGlsZSBhIGJ1ZmZlciBpcyBib3VuZC4KICAgICAgICBnbEJpbmRCdWZmZXIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9BUkIsIDApOwojZWxzZQogICAgICAgIC8vCiAgICAgICAgLy8gRG8gYSBjb252ZW50aW9uYWwgdGV4dHVyZSBwb3B1bGF0aW9uLgogICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHZlcnNpb24gaW1wbGllcyBhIHNlcmllcyBvZiBub24tRE1BIG1lbW9yeQogICAgICAgIC8vIG9wZXJhdGlvbnM6CiAgICAgICAgLy8gLSBjb252ZXJzaW9uIGZyb20gZG91YmxlIHRvIHNpbmdsZSBwcmVjaXNpb24gaXMgZG9uZQogICAgICAgIC8vICAgZXhwbGljaXRlbHkgYnkgdGhlIENQVQogICAgICAgIC8vIC0gZ2xUZXhTdWJJbWFnZSgpIGltcGxpZXMgYSBtZW1jcHkgaW50byBkcml2ZXItY29udHJvbGxlZAogICAgICAgIC8vICAgbWVtb3J5LgogICAgICAgIC8vIC0gZ2xUZXhTdWJJbWFnZSgpIGltcGxpZXMgcmVhcnJhbmdpbmcgdGhlIGRhdGEgYXMgdGhlIGRyaXZlcgogICAgICAgIC8vICAgZGVlbXMgbmVjZXNzYXJ5LgogICAgICAgIC8vCiAgICAgICAgLy8gVGhlIHZlcnNpb24gdXNpbmcgUEJPcyBpcyBoZW5jZSBmYXN0ZXIgc2luY2UgdGhlIENQVSBpcyBvbmx5CiAgICAgICAgLy8gaW52b2x2ZWQgb25jZSBpbiB0aGUgZW50aXJlIHByb2Nlc3MsIGNvbnZlcnRpbmcgYW5kCiAgICAgICAgLy8gcmVhcnJhbmdpbmcgaW4gb25lIGdvLgogICAgICAgIC8vIFdlIGRvIGRlZmluaXRlbHkgc2F2ZSBvbiBvbmUgbWVtY3B5LCBhbmQgZXZlbnR1YWxseSBhIHNlY29uZCBvbmUKICAgICAgICAvLyBpZiB0aGUgZHJpdmVyIGRvZXMgbm90IGRlY2lkZSB0byBETUEgdGhlIGRhdGEgYW55d2F5IGFmdGVyIHdlCiAgICAgICAgLy8gcmVsZWFzZSB0aGUgcG9pbnRlciAvIHVubWFwIHRoZSBidWZmZXIuCiAgICAgICAgY29weSAoY2h1bmtzW2NodW5rXVthcnJheV0sdG1wZmxvYXQpOwogICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIsIDAsIDAsIDAsIHRleFNpemUsIHRleFNpemUsIEdMX0xVTUlOQU5DRSwgR0xfRkxPQVQsIHRtcGZsb2F0KTsKI2VuZGlmCiAgICAgICAgLy8KICAgICAgICAvLyBhc3NpZ24gdGV4dHVyZSBhcyBpbnB1dCB0byBzaGFkZXIKICAgICAgICAvLwogICAgICAgIGNnR0xTZXRUZXh0dXJlUGFyYW1ldGVyKHBhcmFtc1thcnJheV0sIGlucHV0VGV4dHVyZXNbYXJyYXldKTsKICAgICAgICBjZ0dMRW5hYmxlVGV4dHVyZVBhcmFtZXRlcihwYXJhbXNbYXJyYXldKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpbnQgaXRlcj0wOyBpdGVyPG51bUtlcm5lbFN0ZXBzOyBpdGVyKyspIHsKICAgICAgICAvLwogICAgICAgIC8vIGFzc2lnbiBhY2N1bSB0ZXh0dXJlIChpbnB1dCBwaW5ncG9uZykgdG8ga2VybmVsCiAgICAgICAgLy8KICAgICAgICBjZ0dMU2V0VGV4dHVyZVBhcmFtZXRlcihhY2N1bVBhcmFtLCBwaW5ndGV4W3JlYWRUZXhdKTsKICAgICAgICBjZ0dMRW5hYmxlVGV4dHVyZVBhcmFtZXRlcihhY2N1bVBhcmFtKTsKICAgICAgICAvLwogICAgICAgIC8vIHJlZGlyZWN0IG91dHB1dCB0byB3cml0ZS1vbmx5IHBpbmdwb25nIHRleHR1cmUKICAgICAgICAvLwogICAgICAgIGdsRHJhd0J1ZmZlcihhdHRhY2htZW50cG9pbnRzW3dyaXRlVGV4XSk7CiAgICAgICAgLy8KICAgICAgICAvLyByZW5kZXIgdmlld3BvcnQtc2l6ZWQgcXVhZCB0byBwZXJmb3JtIGFjdHVhbCBjb21wdXRhdGlvbgogICAgICAgIC8vCiAgICAgICAgZ2xCZWdpbihHTF9RVUFEUyk7CiAgICAgICAgZ2xUZXhDb29yZDJmKDAuMCwgMC4wKTsgZ2xWZXJ0ZXgyZigwLjAsIDAuMCk7CiAgICAgICAgZ2xUZXhDb29yZDJmKHRleFNpemUsIDAuMCk7IGdsVmVydGV4MmYodGV4U2l6ZSwgMC4wKTsKICAgICAgICBnbFRleENvb3JkMmYodGV4U2l6ZSwgdGV4U2l6ZSk7IGdsVmVydGV4MmYodGV4U2l6ZSx0ZXhTaXplKTsKICAgICAgICBnbFRleENvb3JkMmYoMC4wLCB0ZXhTaXplKTsgZ2xWZXJ0ZXgyZigwLjAsIHRleFNpemUpOwogICAgICAgIGdsRW5kKCk7CiAgICAgICAgLy8KICAgICAgICAvLyBzd2FwIHBpbmdwb25nIGlucHV0IGFuZCBvdXRwdXQgdGV4dHVyZXMKICAgICAgICByZWFkVGV4ID0gMS1yZWFkVGV4OwogICAgICAgIHdyaXRlVGV4ID0gMS13cml0ZVRleDsKICAgICAgICB9CiAgICB9CiAgICB9CiNpZmRlZiBERUJVR0RFQlVHCiAgICBjaGVja0Vycm9ycygiY29tcHV0ZSIpOwojZW5kaWYKICAgIGdsRmluaXNoKCk7CiAgICBkb3VibGUgZW5kX2NvbXB1dGUgPSBjbG9jaygpOwogICAgLy8KICAgIC8vIFJlYWQgYmFjayByZXN1bHRzIChpbnRvIGRvdWJsZSBwcmVjaXNpb24gYXJyYXlzKS4KICAgIC8vCiAgICBwcmludGYoIlJlYWRpbmcgYmFjayByZXN1bHRzXG4iKTsKICAgIGdsRmluaXNoKCk7CiAgICBkb3VibGUgc3RhcnRfcmVhZGJhY2sgPSBjbG9jaygpOwojaWZkZWYgVVNFX1BCTwogICAgLy8KICAgIC8vIFJlYWRiYWNrIHVzaW5nIFBCT3MgaXMgcGVyZm9ybWVkIGluIGEgc2ltaWxhciB3YXkgYXMgZG93bmxvYWQgaXMuCiAgICAvLyBGaXJzdCwgd2Ugc2V0IG9uZSB0ZXh0dXJlIGF0dGFjaGVkIHRvIG91ciBQQk8gYXMgc291cmNlIGZvciB0aGUKICAgIC8vIHJlYWRiYWNrIGFuZCBiaW5kIHRoZSBidWZmZXIgdG8gdGhlIHBpeGVsLXBhY2sgdGFyZ2V0LgogICAgLy8gTm90ZTogUEJPcyAwLS04IHdlcmUgdXNlZCBkdXJpbmcgZG93bmxvYWQsIGhlbmNlICM5CiAgICAvLwogICAgZ2xSZWFkQnVmZmVyKGF0dGFjaG1lbnRwb2ludHNbcmVhZFRleF0pOwogICAgZ2xCaW5kQnVmZmVyKEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0FSQiwgaW9CdWZbOV0pOwogICAgLy8KICAgIC8vIGludmFsaWRhdGUgdGhpcyBidWZmZXIgYnkgcGFzc2luZyBOVUxMCiAgICAvLwogICAgLy8gTm90ZTogYWNjb3JkaW5nIHRvIHRoZSBzcGVjIGF0CiAgICAvLyBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvcmVnaXN0cnkvc3BlY3MvQVJCL3ZlcnRleF9idWZmZXJfb2JqZWN0LnR4dAogICAgLy8gR0xfU1RSRUFNX1JFQUQgaGludHMgYXQgdGhlIGRyaXZlciB0aGF0IHRoZSBkYXRhIHN0b3JlIGNvbnRlbnRzCiAgICAvLyB3aWxsIGJlIHNwZWNpZmllZCBvbmNlIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYW5kIHVzZWQgYXQgbW9zdCBhIGZldwogICAgLy8gdGltZXMgYnkgdGhlIGFwcGxpY2F0aW9uLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2lsbCBkby4KICAgIC8vCiAgICBnbEJ1ZmZlckRhdGEoR0xfUElYRUxfUEFDS19CVUZGRVJfQVJCLHRleFNpemUqdGV4U2l6ZSpzaXplb2YoZmxvYXQpLCBOVUxMLCBHTF9TVFJFQU1fUkVBRCk7CiAgICAvLwogICAgLy8gSW4gY29udHJhc3QgdG8gY29udmVudGlvbmFsIGdsUmVhZFBpeGVscygpLCB0aGlzIGNhbGwgcmV0dXJucwogICAgLy8gaW1tZWRpYXRlbHkgYW5kIGp1c3QgdHJpZ2dlcnMgYSBETUEgdHJhbnNmZXIgaW50byB0aGUgYnVmZmVyIG9iamVjdCB3ZQogICAgLy8gYWxsb2NhdGVkIHByZWNpb3VzbHkuCiAgICAvLwogICAgZ2xSZWFkUGl4ZWxzICgwLCAwLCB0ZXhTaXplLCB0ZXhTaXplLCBHTF9MVU1JTkFOQ0UsIEdMX0ZMT0FULCBCVUZGRVJfT0ZGU0VUKDApKTsKICAgIC8vCiAgICAvLyBSZWFkYmFja3MgYXJlIG9ubHkgYXN5bmNocm9uZW91cyBvbiB0aGUgQ1BVIHNpZGUgKHNpbmNlIHRoZSBhYm92ZSBjYWxsCiAgICAvLyByZXR1cm5zIGltbWVkaWF0ZWx5KS4gVG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcywgYSByZWFsIGFwcGxpY2F0aW9uCiAgICAvLyB3b3VsZCBoYXZlIHRvIHBlcmZvcm0gYSBsb3Qgb2YgaW5kZXBlbmRlbnQgd29yayBvbiBzb21lIG90aGVyIGRhdGEKICAgIC8vIHdoaWxlIHRoZSBkYXRhIGlzIERNQSdlZCBpbiB0aGUgYmFja2dyb3VuZC4KICAgIC8vCiAgICAvLyBJbiBvdXIgY2FzZSwgdGhlcmUgaXMgbm8gd29yayB0byBiZSBkb25lLCBzbyB3ZSBhY3F1aXJlIGEgcG9pbnRlciB0bwogICAgLy8gdGhlIGRhdGEgYnkgbWFwcGluZyB0aGUgYnVmZmVyIHRvIHRoZSBwaXhlbCBwYWNrIHRhcmdldC4gV2UgYWdhaW4KICAgIC8vIGluZGljYXRlIHdoYXQgd2Ugd2FudCB0byBkbyB3aXRoIHRoZSBwb2ludGVyIChhY2Nlc3NpbmcgdGhlIGRhdGEKICAgIC8vIHJlYWQtb25seSkuIE5vdGUgdGhhdCB0aGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBpcyBhdmFpbGFibGUuCiAgICAvLwogICAgdm9pZCogbWVtID0gZ2xNYXBCdWZmZXIoR0xfUElYRUxfUEFDS19CVUZGRVJfQVJCLCBHTF9SRUFEX09OTFkpOwogICAgYXNzZXJ0KG1lbSk7CiAgICAvLwogICAgLy8gY29udmVydCBkYXRhIGJhY2sgdG8gZG91YmxlIHByZWNpc2lvbiBzaW5jZSB0aGUgdW5kZXJseWluZyAiYXBwbGljYXRpb24iCiAgICAvLyB3aWxsIGNvbnRpbnVlIHVzaW5nIHRoZSBkYXRhIGluIGRvdWJsZSBwcmVjaXNpb24uCiAgICAvLwogICAgY29weShtZW0sZGF0YSk7CiAgICAvLwogICAgLy8gUmVsZWFzZSBwb2ludGVyIGFuZCBidWZmZXIgb2JqZWN0IGJhY2sgdG8gZHJpdmVyIGNvbnRyb2wsIGFuZCB1bmJpbmQgdGhlCiAgICAvLyBidWZmZXIgb2JqZWN0CiAgICAvLwogICAgZ2xVbm1hcEJ1ZmZlcihHTF9QSVhFTF9QQUNLX0JVRkZFUl9BUkIpOwogICAgZ2xCaW5kQnVmZmVyKEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0FSQiwgMCk7CiNlbHNlCiAgICAvLwogICAgLy8gVGhlIGNvbnZlbnRpb25hbCBnbFJlYWRQaXhlbHMoKSB3aWxsIGJsb2NrIHVudGlsIGFsbCBkYXRhIGhhcyBiZWVuCiAgICAvLyBjb3BpZWQgaW50byB0aGUgYXJyYXkgd2UgcGFzcyBpbiBhcyBsYXN0IGFyZ3VtZW50LgogICAgLy8gVGhpcyBpbmNsdWRlcyB0aGUgdHJhbnNmZXIgYW5kIHRoZSBldmVudHVhbCByZWFycmFuZ2VtZW50IGJhY2sgdG8gYQogICAgLy8gQ1BVLWZyaWVuZGx5IChvciBiZXR0ZXI6IG5vbi1HUFUtb3B0aW1pc2VkKSBsYXlvdXQgaW4gbWVtb3J5LgogICAgLy8KICAgIGdsUmVhZEJ1ZmZlcihhdHRhY2htZW50cG9pbnRzW3JlYWRUZXhdKTsKICAgIGdsUmVhZFBpeGVscygwLCAwLCB0ZXhTaXplLCB0ZXhTaXplLEdMX0xVTUlOQU5DRSxHTF9GTE9BVCx0bXBmbG9hdCk7CiAgICBjb3B5KHRtcGZsb2F0LCBkYXRhKTsKI2VuZGlmCiAgICBnbEZpbmlzaCgpOwogICAgZG91YmxlIGVuZF9yZWFkYmFjayA9IGNsb2NrKCk7CiNpZmRlZiBERUJVR0RFQlVHCiAgICBjaGVja0Vycm9ycygicmVhZGJhY2siKTsKI2VuZGlmCiAgICAvLwogICAgLy8gZG8gcmVzdWx0IGNvbXBhcmlzb24sIGV4ZW1wbGFyaWx5IGZvciBhcnJheSBlbnRyeSA4OAogICAgLy8gc2luY2UgSSBhbSB0b28gbGF6eSB0byBhZGQgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KICAgIC8vCiAgICBkb3VibGUgcmVzID0gMDsKICAgIGZvciAoaW50IGl0ZXI9MDsgaXRlcjxudW1JdGVyYXRpb25zOyBpdGVyKyspIHsKICAgIGZvciAoaW50IGk9MDsgaTxudW1DaHVua3M7IGkrKykKICAgICAgICBmb3IgKGludCBqPTA7IGo8bnVtQXJyYXlzUGVyQ2h1bms7IGorKykKICAgICAgICBmb3IgKGludCBrPTA7IGs8bnVtS2VybmVsU3RlcHM7IGsrKykKICAgICAgICAgICAgcmVzICs9IGkqMTAuMCArIGogKyAxOwogICAgfQogICAgcHJpbnRmKCIlZDogc2hvdWxkIGJlOiAlLjJmLCBpczogJS4yZlxuIiw4OCwgcmVzLCBkYXRhWzg4XSk7CiAgICAvLwogICAgLy8gcHJpbnQgb3V0IHRpbWluZ3MKICAgIC8vCiAgICBkb3VibGUgdGltZV9jb21wdXRlICA9IChlbmRfY29tcHV0ZSAtIHN0YXJ0X2NvbXB1dGUpL0NMT0NLU19QRVJfU0VDOwogICAgZG91YmxlIHRpbWVfcmVhZGJhY2sgPSAoZW5kX3JlYWRiYWNrIC0gc3RhcnRfcmVhZGJhY2spL0NMT0NLU19QRVJfU0VDOwogICAgZG91YmxlIGRhdGFfZG93bmxvYWQgPSAoZG91YmxlKU4qbnVtQ2h1bmtzKm51bUFycmF5c1BlckNodW5rKm51bUl0ZXJhdGlvbnMqc2l6ZW9mKGRvdWJsZSkgLyAoMTAyNC4wKjEwMjQuMCk7CiAgICBkb3VibGUgZGF0YV9yZWFkYmFjayA9IChkb3VibGUpTipzaXplb2YoZG91YmxlKSAvICgxMDI0LjAqMTAyNC4wKTsKICAgIHByaW50ZigiRE9XTkxPQURcbiIpOwogICAgcHJpbnRmKCJUb3RhbCBhbW91bnQgb2YgZG91YmxlcHJlYyBkYXRhIDogJS4yZiBNQlxuIiwgZGF0YV9kb3dubG9hZCk7CiAgICBwcmludGYoIkNvbXB1dGUgdGltZSAgICAgICAgICAgICAgICAgICAgOiAlLjJmIHNlY1xuIiwgdGltZV9jb21wdXRlKTsKICAgIHByaW50ZigiVGhyb3VnaHB1dDogICAgICAgICAgICAgICAgICAgICA6ICUuMmYgTUIvc1xuIiwgZGF0YV9kb3dubG9hZCAvIHRpbWVfY29tcHV0ZSk7CiAgICBwcmludGYoIlJFQURCQUNLXG4iKTsKICAgIHByaW50ZigiVG90YWwgYW1vdW50IG9mIGRvdWJsZXByZWMgZGF0YSA6ICUuMmYgTUJcbiIsIGRhdGFfcmVhZGJhY2spOwogICAgcHJpbnRmKCJDb21wdXRlIHRpbWUgICAgICAgICAgICAgICAgICAgIDogJS4yZiBzZWNcbiIsdGltZV9yZWFkYmFjayk7CiAgICBwcmludGYoIlRocm91Z2hwdXQ6ICAgICAgICAgICAgICAgICAgICAgOiAlLjJmIE1CL3NcbiIsIGRhdGFfcmVhZGJhY2sgLyB0aW1lX3JlYWRiYWNrKTsKICAgIC8vCiAgICAvLyBjbGVhbiB1cAogICAgLy8KICAgIGZvciAoaW50IGNodW5rPTA7IGNodW5rPG51bUNodW5rczsgY2h1bmsrKykgewogICAgICAgIGZvciAoaW50IGFycmF5PTA7IGFycmF5PG51bUFycmF5c1BlckNodW5rOyBhcnJheSsrKQogICAgICAgICAgICBkZWxldGUgW10gY2h1bmtzW2NodW5rXVthcnJheV07CiAgICAgICAgZGVsZXRlIFtdIGNodW5rc1tjaHVua107CiAgICB9CiAgICBkZWxldGUgW10gdG1wZmxvYXQ7CiAgICBkZWxldGUgW10gZGF0YTsKICAgIGRlbGV0ZSBbXSBjaHVua3M7CiAgICBnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCAoMSwmZmIpOwojaWZkZWYgVVNFX1BCTwogICAgZ2xEZWxldGVCdWZmZXJzKDIsIGlvQnVmKTsKI2VuZGlmCiAgICBnbERlbGV0ZVRleHR1cmVzKG51bUFycmF5c1BlckNodW5rLGlucHV0VGV4dHVyZXMpOwogICAgZ2xEZWxldGVUZXh0dXJlcygyLHBpbmd0ZXgpOwoKICAgIHJldHVybiAwOwp9CgoK