LyogY29ubmVjdGlvbi5jIC0gdGhlIGNvbm5lY3Rpb24gdHlwZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKiAKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogKgogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAqCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAqLwoKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKI2luY2x1ZGUgInN0YXRlbWVudC5oIgojaW5jbHVkZSAiY3Vyc29yLmgiCiNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCiNpbmNsdWRlICJ1dGlsLmgiCiNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCIKCiNpbmNsdWRlICJweXRocmVhZC5oIgoKI2RlZmluZSBBQ1RJT05fRklOQUxJWkUgMQojZGVmaW5lIEFDVElPTl9SRVNFVCAyCgpzdGF0aWMgaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsKTsKCgpzdGF0aWMgdm9pZCBfc3FsaXRlM19yZXN1bHRfZXJyb3Ioc3FsaXRlM19jb250ZXh0KiBjdHgsIGNvbnN0IGNoYXIqIGVycm1zZywgaW50IGxlbikKewogICAgLyogaW4gb2xkZXIgU1FMaXRlIHZlcnNpb25zLCBjYWxsaW5nIHNxbGl0ZTNfcmVzdWx0X2Vycm9yIGluIGNhbGxiYWNrcwogICAgICogdHJpZ2dlcnMgYSBidWcgaW4gU1FMaXRlIHRoYXQgbGVhZHMgZWl0aGVyIHRvIGlycml0YXRpbmcgcmVzdWx0cyBvcgogICAgICogc2VnZmF1bHRzLCBkZXBlbmRpbmcgb24gdGhlIFNRTGl0ZSB2ZXJzaW9uICovCiNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAwMwogICAgc3FsaXRlM19yZXN1bHRfZXJyb3IoY3R4LCBlcnJtc2csIGxlbik7CiNlbHNlCiAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgZXJybXNnKTsKI2VuZGlmCn0KCmludCBweXNxbGl0ZV9jb25uZWN0aW9uX2luaXQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKCiAgICBQeU9iamVjdCogZGF0YWJhc2U7CiAgICBpbnQgZGV0ZWN0X3R5cGVzID0gMDsKICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWwgPSBOVUxMOwogICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOwogICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkID0gMTsKICAgIGludCBjYWNoZWRfc3RhdGVtZW50cyA9IDEwMDsKICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOwogICAgaW50IHJjOwogICAgUHlPYmplY3QqIGNsYXNzX2F0dHIgPSBOVUxMOwogICAgUHlPYmplY3QqIGNsYXNzX2F0dHJfc3RyID0gTlVMTDsKICAgIGludCBpc19hcHN3X2Nvbm5lY3Rpb24gPSAwOwogICAgUHlPYmplY3QqIGRhdGFiYXNlX3V0Zjg7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xkaU9pT2kiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJhc2UsICZ0aW1lb3V0LCAmZGV0ZWN0X3R5cGVzLCAmaXNvbGF0aW9uX2xldmVsLCAmY2hlY2tfc2FtZV90aHJlYWQsICZmYWN0b3J5LCAmY2FjaGVkX3N0YXRlbWVudHMpKQogICAgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQgPSBOVUxMOwoKICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IE5VTEw7CiAgICBzZWxmLT5zdGF0ZW1lbnRzID0gTlVMTDsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICBzZWxmLT5yb3dfZmFjdG9yeSA9IFB5X05vbmU7CgogICAgUHlfSU5DUkVGKCZQeVVuaWNvZGVfVHlwZSk7CiAgICBzZWxmLT50ZXh0X2ZhY3RvcnkgPSAoUHlPYmplY3QqKSZQeVVuaWNvZGVfVHlwZTsKCiAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGF0YWJhc2UpIHx8IFB5VW5pY29kZV9DaGVjayhkYXRhYmFzZSkpIHsKICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGF0YWJhc2UpKSB7CiAgICAgICAgICAgIGRhdGFiYXNlX3V0ZjggPSBkYXRhYmFzZTsKICAgICAgICAgICAgUHlfSU5DUkVGKGRhdGFiYXNlX3V0ZjgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRhdGFiYXNlX3V0ZjggPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGRhdGFiYXNlKTsKICAgICAgICAgICAgaWYgKCFkYXRhYmFzZV91dGY4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfb3BlbihQeVN0cmluZ19Bc1N0cmluZyhkYXRhYmFzZV91dGY4KSwgJnNlbGYtPmRiKTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgICAgICBQeV9ERUNSRUYoZGF0YWJhc2VfdXRmOCk7CgogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogQ3JlYXRlIGEgcHlzcWxpdGUgY29ubmVjdGlvbiBmcm9tIGEgQVBTVyBjb25uZWN0aW9uICovCiAgICAgICAgY2xhc3NfYXR0ciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGF0YWJhc2UsICJfX2NsYXNzX18iKTsKICAgICAgICBpZiAoY2xhc3NfYXR0cikgewogICAgICAgICAgICBjbGFzc19hdHRyX3N0ciA9IFB5T2JqZWN0X1N0cihjbGFzc19hdHRyKTsKICAgICAgICAgICAgaWYgKGNsYXNzX2F0dHJfc3RyKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzX2F0dHJfc3RyKSwgIjx0eXBlICdhcHN3LkNvbm5lY3Rpb24nPiIpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAvKiBJbiB0aGUgQVBTVyBDb25uZWN0aW9uIG9iamVjdCwgdGhlIGZpcnN0IGVudHJ5IGFmdGVyCiAgICAgICAgICAgICAgICAgICAgICogUHlPYmplY3RfSEVBRCBpcyB0aGUgc3FsaXRlMyogd2Ugd2FudCB0byBnZXQgaG9sZCBvZi4KICAgICAgICAgICAgICAgICAgICAgKiBMdWNraWx5LCB0aGlzIGlzIHRoZSBzYW1lIGxheW91dCBhcyB3ZSBoYXZlIGluIG91cgogICAgICAgICAgICAgICAgICAgICAqIHB5c3FsaXRlX0Nvbm5lY3Rpb24gKi8KICAgICAgICAgICAgICAgICAgICBzZWxmLT5kYiA9ICgocHlzcWxpdGVfQ29ubmVjdGlvbiopZGF0YWJhc2UpLT5kYjsKCiAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGRhdGFiYXNlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5hcHN3X2Nvbm5lY3Rpb24gPSBkYXRhYmFzZTsKICAgICAgICAgICAgICAgICAgICBpc19hcHN3X2Nvbm5lY3Rpb24gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFB5X1hERUNSRUYoY2xhc3NfYXR0cl9zdHIpOwogICAgICAgIFB5X1hERUNSRUYoY2xhc3NfYXR0cik7CgogICAgICAgIGlmICghaXNfYXBzd19jb25uZWN0aW9uKSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF0YWJhc2UgcGFyYW1ldGVyIG11c3QgYmUgc3RyaW5nIG9yIEFQU1cgQ29ubmVjdGlvbiBvYmplY3QiKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIWlzb2xhdGlvbl9sZXZlbCkgewogICAgICAgIGlzb2xhdGlvbl9sZXZlbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwogICAgICAgIGlmICghaXNvbGF0aW9uX2xldmVsKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIFB5X0lOQ1JFRihpc29sYXRpb25fbGV2ZWwpOwogICAgfQogICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gTlVMTDsKICAgIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChzZWxmLCBpc29sYXRpb25fbGV2ZWwpOwogICAgUHlfREVDUkVGKGlzb2xhdGlvbl9sZXZlbCk7CgogICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlID0gKHB5c3FsaXRlX0NhY2hlKilQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmcHlzcWxpdGVfQ2FjaGVUeXBlLCAiT2kiLCBzZWxmLCBjYWNoZWRfc3RhdGVtZW50cyk7CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5zdGF0ZW1lbnRzID0gUHlMaXN0X05ldygwKTsKICAgIGlmICghc2VsZi0+c3RhdGVtZW50cykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHNlbGYtPmNyZWF0ZWRfc3RhdGVtZW50cyA9IDA7CgogICAgLyogQnkgZGVmYXVsdCwgdGhlIENhY2hlIGNsYXNzIElOQ1JFRnMgdGhlIGZhY3RvcnkgaW4gaXRzIGluaXRpYWxpemVyLCBhbmQKICAgICAqIGRlY3JlZnMgaXQgaW4gaXRzIGRlYWxsb2NhdG9yIG1ldGhvZC4gU2luY2UgdGhpcyB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhcgogICAgICogcmVmZXJlbmNlIGhlcmUsIHdlJ3JlIGJyZWFraW5nIGl0IGJ5IGRlY3JlbWVudGluZyBzZWxmLCBhbmQgdGVsbGluZyB0aGUKICAgICAqIGNhY2hlIGNsYXNzIHRvIG5vdCBkZWNyZWYgdGhlIGZhY3RvcnkgKHNlbGYpIGluIGl0cyBkZWFsbG9jYXRvci4KICAgICAqLwogICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5kZWNyZWZfZmFjdG9yeSA9IDA7CiAgICBQeV9ERUNSRUYoc2VsZik7CgogICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7CiAgICBzZWxmLT5kZXRlY3RfdHlwZXMgPSBkZXRlY3RfdHlwZXM7CiAgICBzZWxmLT50aW1lb3V0ID0gdGltZW91dDsKICAgICh2b2lkKXNxbGl0ZTNfYnVzeV90aW1lb3V0KHNlbGYtPmRiLCAoaW50KSh0aW1lb3V0KjEwMDApKTsKCiAgICBzZWxmLT50aHJlYWRfaWRlbnQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiAgICBzZWxmLT5jaGVja19zYW1lX3RocmVhZCA9IGNoZWNrX3NhbWVfdGhyZWFkOwoKICAgIHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkID0gUHlEaWN0X05ldygpOwogICAgaWYgKCFzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5jb2xsYXRpb25zID0gUHlEaWN0X05ldygpOwogICAgaWYgKCFzZWxmLT5jb2xsYXRpb25zKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHNlbGYtPldhcm5pbmcgICAgICAgICAgICAgICA9IHB5c3FsaXRlX1dhcm5pbmc7CiAgICBzZWxmLT5FcnJvciAgICAgICAgICAgICAgICAgPSBweXNxbGl0ZV9FcnJvcjsKICAgIHNlbGYtPkludGVyZmFjZUVycm9yICAgICAgICA9IHB5c3FsaXRlX0ludGVyZmFjZUVycm9yOwogICAgc2VsZi0+RGF0YWJhc2VFcnJvciAgICAgICAgID0gcHlzcWxpdGVfRGF0YWJhc2VFcnJvcjsKICAgIHNlbGYtPkRhdGFFcnJvciAgICAgICAgICAgICA9IHB5c3FsaXRlX0RhdGFFcnJvcjsKICAgIHNlbGYtPk9wZXJhdGlvbmFsRXJyb3IgICAgICA9IHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3I7CiAgICBzZWxmLT5JbnRlZ3JpdHlFcnJvciAgICAgICAgPSBweXNxbGl0ZV9JbnRlZ3JpdHlFcnJvcjsKICAgIHNlbGYtPkludGVybmFsRXJyb3IgICAgICAgICA9IHB5c3FsaXRlX0ludGVybmFsRXJyb3I7CiAgICBzZWxmLT5Qcm9ncmFtbWluZ0Vycm9yICAgICAgPSBweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yOwogICAgc2VsZi0+Tm90U3VwcG9ydGVkRXJyb3IgICAgID0gcHlzcWxpdGVfTm90U3VwcG9ydGVkRXJyb3I7CgogICAgcmV0dXJuIDA7Cn0KCi8qIEVtcHR5IHRoZSBlbnRpcmUgc3RhdGVtZW50IGNhY2hlIG9mIHRoaXMgY29ubmVjdGlvbiAqLwp2b2lkIHB5c3FsaXRlX2ZsdXNoX3N0YXRlbWVudF9jYWNoZShweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQp7CiAgICBweXNxbGl0ZV9Ob2RlKiBub2RlOwogICAgcHlzcWxpdGVfU3RhdGVtZW50KiBzdGF0ZW1lbnQ7CgogICAgbm9kZSA9IHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+Zmlyc3Q7CgogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICBzdGF0ZW1lbnQgPSAocHlzcWxpdGVfU3RhdGVtZW50Kikobm9kZS0+ZGF0YSk7CiAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICB9CgogICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudF9jYWNoZSk7CiAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUgPSAocHlzcWxpdGVfQ2FjaGUqKVB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZweXNxbGl0ZV9DYWNoZVR5cGUsICJPIiwgc2VsZik7CiAgICBQeV9ERUNSRUYoc2VsZik7CiAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUtPmRlY3JlZl9mYWN0b3J5ID0gMDsKfQoKLyogYWN0aW9uIGluIChBQ1RJT05fUkVTRVQsIEFDVElPTl9GSU5BTElaRSkgKi8Kdm9pZCBweXNxbGl0ZV9kb19hbGxfc3RhdGVtZW50cyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBpbnQgYWN0aW9uKQp7CiAgICBpbnQgaTsKICAgIFB5T2JqZWN0KiB3ZWFrcmVmOwogICAgUHlPYmplY3QqIHN0YXRlbWVudDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUoc2VsZi0+c3RhdGVtZW50cyk7IGkrKykgewogICAgICAgIHdlYWtyZWYgPSBQeUxpc3RfR2V0SXRlbShzZWxmLT5zdGF0ZW1lbnRzLCBpKTsKICAgICAgICBzdGF0ZW1lbnQgPSBQeVdlYWtyZWZfR2V0T2JqZWN0KHdlYWtyZWYpOwogICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gUHlfTm9uZSkgewogICAgICAgICAgICBpZiAoYWN0aW9uID09IEFDVElPTl9SRVNFVCkgewogICAgICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KChweXNxbGl0ZV9TdGF0ZW1lbnQqKXN0YXRlbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfZmluYWxpemUoKHB5c3FsaXRlX1N0YXRlbWVudCopc3RhdGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKdm9pZCBweXNxbGl0ZV9jb25uZWN0aW9uX2RlYWxsb2MocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikKewogICAgUHlPYmplY3QqIHJldCA9IE5VTEw7CgogICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRfY2FjaGUpOwoKICAgIC8qIENsZWFuIHVwIGlmIHVzZXIgaGFzIG5vdCBjYWxsZWQgLmNsb3NlKCkgZXhwbGljaXRseS4gKi8KICAgIGlmIChzZWxmLT5kYikgewogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICBzcWxpdGUzX2Nsb3NlKHNlbGYtPmRiKTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgfSBlbHNlIGlmIChzZWxmLT5hcHN3X2Nvbm5lY3Rpb24pIHsKICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmFwc3dfY29ubmVjdGlvbiwgImNsb3NlIiwgIiIpOwogICAgICAgIFB5X1hERUNSRUYocmV0KTsKICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmFwc3dfY29ubmVjdGlvbik7CiAgICB9CgogICAgaWYgKHNlbGYtPmJlZ2luX3N0YXRlbWVudCkgewogICAgICAgIFB5TWVtX0ZyZWUoc2VsZi0+YmVnaW5fc3RhdGVtZW50KTsKICAgIH0KICAgIFB5X1hERUNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsKICAgIFB5X1hERUNSRUYoc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQpOwogICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfZmFjdG9yeSk7CiAgICBQeV9YREVDUkVGKHNlbGYtPnRleHRfZmFjdG9yeSk7CiAgICBQeV9YREVDUkVGKHNlbGYtPmNvbGxhdGlvbnMpOwogICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRzKTsKCiAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2N1cnNvcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmYWN0b3J5IiwgTlVMTCwgTlVMTH07CiAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CiAgICBQeU9iamVjdCogY3Vyc29yOwoKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3J5KSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgewogICAgICAgIGZhY3RvcnkgPSAoUHlPYmplY3QqKSZweXNxbGl0ZV9DdXJzb3JUeXBlOwogICAgfQoKICAgIGN1cnNvciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmYWN0b3J5LCAiTyIsIHNlbGYpOwoKICAgIGlmIChjdXJzb3IgJiYgc2VsZi0+cm93X2ZhY3RvcnkgIT0gUHlfTm9uZSkgewogICAgICAgIFB5X1hERUNSRUYoKChweXNxbGl0ZV9DdXJzb3IqKWN1cnNvciktPnJvd19mYWN0b3J5KTsKICAgICAgICBQeV9JTkNSRUYoc2VsZi0+cm93X2ZhY3RvcnkpOwogICAgICAgICgocHlzcWxpdGVfQ3Vyc29yKiljdXJzb3IpLT5yb3dfZmFjdG9yeSA9IHNlbGYtPnJvd19mYWN0b3J5OwogICAgfQoKICAgIHJldHVybiBjdXJzb3I7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2Nsb3NlKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeU9iamVjdCogcmV0OwogICAgaW50IHJjOwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcHlzcWxpdGVfZG9fYWxsX3N0YXRlbWVudHMoc2VsZiwgQUNUSU9OX0ZJTkFMSVpFKTsKCiAgICBpZiAoc2VsZi0+ZGIpIHsKICAgICAgICBpZiAoc2VsZi0+YXBzd19jb25uZWN0aW9uKSB7CiAgICAgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+YXBzd19jb25uZWN0aW9uLCAiY2xvc2UiLCAiIik7CiAgICAgICAgICAgIFB5X1hERUNSRUYocmV0KTsKICAgICAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5hcHN3X2Nvbm5lY3Rpb24pOwogICAgICAgICAgICBzZWxmLT5hcHN3X2Nvbm5lY3Rpb24gPSBOVUxMOwogICAgICAgICAgICBzZWxmLT5kYiA9IE5VTEw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgICAgICByYyA9IHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOwogICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VsZi0+ZGIgPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgovKgogKiBDaGVja3MgaWYgYSBjb25uZWN0aW9uIG9iamVjdCBpcyB1c2FibGUgKGkuIGUuIG5vdCBjbG9zZWQpLgogKgogKiAwID0+IGVycm9yOyAxID0+IG9rCiAqLwppbnQgcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihweXNxbGl0ZV9Db25uZWN0aW9uKiBjb24pCnsKICAgIGlmICghY29uLT5kYikgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCAiQ2Fubm90IG9wZXJhdGUgb24gYSBjbG9zZWQgZGF0YWJhc2UuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAxOwogICAgfQp9CgpQeU9iamVjdCogX3B5c3FsaXRlX2Nvbm5lY3Rpb25fYmVnaW4ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikKewogICAgaW50IHJjOwogICAgY29uc3QgY2hhciogdGFpbDsKICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OwoKICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQsIC0xLCAmc3RhdGVtZW50LCAmdGFpbCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICByYyA9IHB5c3FsaXRlX3N0ZXAoc3RhdGVtZW50LCBzZWxmKTsKICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgewogICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAxOwogICAgfSBlbHNlIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICB9CgogICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgfQoKZXJyb3I6CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgaW50IHJjOwogICAgY29uc3QgY2hhciogdGFpbDsKICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHNlbGYtPmluVHJhbnNhY3Rpb24pIHsKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsICJDT01NSVQiLCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOwogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgIH0KCiAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGVwKHN0YXRlbWVudCwgc2VsZik7CiAgICAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7CiAgICAgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgc3RhdGVtZW50KTsKICAgICAgICB9CgogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICB9CgogICAgfQoKZXJyb3I6CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX3JvbGxiYWNrKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBpbnQgcmM7CiAgICBjb25zdCBjaGFyKiB0YWlsOwogICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoc2VsZi0+aW5UcmFuc2FjdGlvbikgewogICAgICAgIHB5c3FsaXRlX2RvX2FsbF9zdGF0ZW1lbnRzKHNlbGYsIEFDVElPTl9SRVNFVCk7CgogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShzZWxmLT5kYiwgIlJPTExCQUNLIiwgLTEsICZzdGF0ZW1lbnQsICZ0YWlsKTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CgogICAgICAgIHJjID0gcHlzcWxpdGVfc3RlcChzdGF0ZW1lbnQsIHNlbGYpOwogICAgICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgewogICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgfQoKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgfQoKICAgIH0KCmVycm9yOgogICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9Cgp2b2lkIF9weXNxbGl0ZV9zZXRfcmVzdWx0KHNxbGl0ZTNfY29udGV4dCogY29udGV4dCwgUHlPYmplY3QqIHB5X3ZhbCkKewogICAgbG9uZyBsb25ndmFsOwogICAgY29uc3QgY2hhciogYnVmZmVyOwogICAgUHlfc3NpemVfdCBidWZsZW47CiAgICBQeU9iamVjdCogc3RyaW5ndmFsOwoKICAgIGlmICgoIXB5X3ZhbCkgfHwgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHNxbGl0ZTNfcmVzdWx0X251bGwoY29udGV4dCk7CiAgICB9IGVsc2UgaWYgKHB5X3ZhbCA9PSBQeV9Ob25lKSB7CiAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2socHlfdmFsKSkgewogICAgICAgIGxvbmd2YWwgPSBQeUludF9Bc0xvbmcocHlfdmFsKTsKICAgICAgICBzcWxpdGUzX3Jlc3VsdF9pbnQ2NChjb250ZXh0LCAoUFlfTE9OR19MT05HKWxvbmd2YWwpOwogICAgfSBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICBzcWxpdGUzX3Jlc3VsdF9kb3VibGUoY29udGV4dCwgUHlGbG9hdF9Bc0RvdWJsZShweV92YWwpKTsKICAgIH0gZWxzZSBpZiAoUHlCdWZmZXJfQ2hlY2socHlfdmFsKSkgewogICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocHlfdmFsLCAmYnVmZmVyLCAmYnVmbGVuKSAhPSAwKSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzcWxpdGUzX3Jlc3VsdF9ibG9iKGNvbnRleHQsIGJ1ZmZlciwgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHB5X3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHB5X3ZhbCk7CiAgICAgICAgaWYgKHN0cmluZ3ZhbCkgewogICAgICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBUT0RPOiByYWlzZSBlcnJvciAqLwogICAgfQp9CgpQeU9iamVjdCogX3B5c3FsaXRlX2J1aWxkX3B5X3BhcmFtcyhzcWxpdGUzX2NvbnRleHQgKmNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlKiogYXJndikKewogICAgUHlPYmplY3QqIGFyZ3M7CiAgICBpbnQgaTsKICAgIHNxbGl0ZTNfdmFsdWUqIGN1cl92YWx1ZTsKICAgIFB5T2JqZWN0KiBjdXJfcHlfdmFsdWU7CiAgICBjb25zdCBjaGFyKiB2YWxfc3RyOwogICAgUFlfTE9OR19MT05HIHZhbF9pbnQ7CiAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKICAgIHZvaWQqIHJhd19idWZmZXI7CgogICAgYXJncyA9IFB5VHVwbGVfTmV3KGFyZ2MpOwogICAgaWYgKCFhcmdzKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgIGN1cl92YWx1ZSA9IGFyZ3ZbaV07CiAgICAgICAgc3dpdGNoIChzcWxpdGUzX3ZhbHVlX3R5cGUoYXJndltpXSkpIHsKICAgICAgICAgICAgY2FzZSBTUUxJVEVfSU5URUdFUjoKICAgICAgICAgICAgICAgIHZhbF9pbnQgPSBzcWxpdGUzX3ZhbHVlX2ludDY0KGN1cl92YWx1ZSk7CiAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeUludF9Gcm9tTG9uZygobG9uZyl2YWxfaW50KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFNRTElURV9GTE9BVDoKICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5RmxvYXRfRnJvbURvdWJsZShzcWxpdGUzX3ZhbHVlX2RvdWJsZShjdXJfdmFsdWUpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFNRTElURV9URVhUOgogICAgICAgICAgICAgICAgdmFsX3N0ciA9IChjb25zdCBjaGFyKilzcWxpdGUzX3ZhbHVlX3RleHQoY3VyX3ZhbHVlKTsKICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHZhbF9zdHIsIHN0cmxlbih2YWxfc3RyKSwgTlVMTCk7CiAgICAgICAgICAgICAgICAvKiBUT0RPOiBoYXZlIGEgd2F5IHRvIHNob3cgZXJyb3JzIGhlcmUgKi8KICAgICAgICAgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFNRTElURV9CTE9COgogICAgICAgICAgICAgICAgYnVmbGVuID0gc3FsaXRlM192YWx1ZV9ieXRlcyhjdXJfdmFsdWUpOwogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlCdWZmZXJfTmV3KGJ1Zmxlbik7CiAgICAgICAgICAgICAgICBpZiAoIWN1cl9weV92YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoY3VyX3B5X3ZhbHVlLCAmcmF3X2J1ZmZlciwgJmJ1ZmxlbikpIHsKICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VyX3B5X3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHJhd19idWZmZXIsIHNxbGl0ZTNfdmFsdWVfYmxvYihjdXJfdmFsdWUpLCBidWZsZW4pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU1FMSVRFX05VTEw6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeV9Ob25lOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFjdXJfcHlfdmFsdWUpIHsKICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIFB5VHVwbGVfU2V0SXRlbShhcmdzLCBpLCBjdXJfcHlfdmFsdWUpOwoKICAgIH0KCiAgICByZXR1cm4gYXJnczsKfQoKdm9pZCBfcHlzcWxpdGVfZnVuY19jYWxsYmFjayhzcWxpdGUzX2NvbnRleHQqIGNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlKiogYXJndikKewogICAgUHlPYmplY3QqIGFyZ3M7CiAgICBQeU9iamVjdCogcHlfZnVuYzsKICAgIFB5T2JqZWN0KiBweV9yZXR2YWwgPSBOVUxMOwoKICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CgogICAgdGhyZWFkc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwoKICAgIHB5X2Z1bmMgPSAoUHlPYmplY3QqKXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOwoKICAgIGFyZ3MgPSBfcHlzcWxpdGVfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIGFyZ3YpOwogICAgaWYgKGFyZ3MpIHsKICAgICAgICBweV9yZXR2YWwgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHB5X2Z1bmMsIGFyZ3MpOwogICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgIH0KCiAgICBpZiAocHlfcmV0dmFsKSB7CiAgICAgICAgX3B5c3FsaXRlX3NldF9yZXN1bHQoY29udGV4dCwgcHlfcmV0dmFsKTsKICAgICAgICBQeV9ERUNSRUYocHlfcmV0dmFsKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgewogICAgICAgICAgICBQeUVycl9QcmludCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgfQogICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGZ1bmN0aW9uIHJhaXNlZCBleGNlcHRpb24iLCAtMSk7CiAgICB9CgogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKfQoKc3RhdGljIHZvaWQgX3B5c3FsaXRlX3N0ZXBfY2FsbGJhY2soc3FsaXRlM19jb250ZXh0ICpjb250ZXh0LCBpbnQgYXJnYywgc3FsaXRlM192YWx1ZSoqIHBhcmFtcykKewogICAgUHlPYmplY3QqIGFyZ3M7CiAgICBQeU9iamVjdCogZnVuY3Rpb25fcmVzdWx0ID0gTlVMTDsKICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CiAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsKICAgIFB5T2JqZWN0KiBzdGVwbWV0aG9kID0gTlVMTDsKCiAgICBQeUdJTFN0YXRlX1NUQVRFIHRocmVhZHN0YXRlOwoKICAgIHRocmVhZHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKCiAgICBhZ2dyZWdhdGVfY2xhc3MgPSAoUHlPYmplY3QqKXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOwoKICAgIGFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IChQeU9iamVjdCoqKXNxbGl0ZTNfYWdncmVnYXRlX2NvbnRleHQoY29udGV4dCwgc2l6ZW9mKFB5T2JqZWN0KikpOwoKICAgIGlmICgqYWdncmVnYXRlX2luc3RhbmNlID09IDApIHsKICAgICAgICAqYWdncmVnYXRlX2luc3RhbmNlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGFnZ3JlZ2F0ZV9jbGFzcywgIiIpOwoKICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICAqYWdncmVnYXRlX2luc3RhbmNlID0gMDsKICAgICAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgewogICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3NxbGl0ZTNfcmVzdWx0X2Vycm9yKGNvbnRleHQsICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ19faW5pdF9fJyBtZXRob2QgcmFpc2VkIGVycm9yIiwgLTEpOwogICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgIH0KICAgIH0KCiAgICBzdGVwbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygqYWdncmVnYXRlX2luc3RhbmNlLCAic3RlcCIpOwogICAgaWYgKCFzdGVwbWV0aG9kKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBhcmdzID0gX3B5c3FsaXRlX2J1aWxkX3B5X3BhcmFtcyhjb250ZXh0LCBhcmdjLCBwYXJhbXMpOwogICAgaWYgKCFhcmdzKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHN0ZXBtZXRob2QsIGFyZ3MpOwogICAgUHlfREVDUkVGKGFyZ3MpOwoKICAgIGlmICghZnVuY3Rpb25fcmVzdWx0KSB7CiAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgewogICAgICAgICAgICBQeUVycl9QcmludCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgfQogICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdzdGVwJyBtZXRob2QgcmFpc2VkIGVycm9yIiwgLTEpOwogICAgfQoKZXJyb3I6CiAgICBQeV9YREVDUkVGKHN0ZXBtZXRob2QpOwogICAgUHlfWERFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOwoKICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7Cn0KCnZvaWQgX3B5c3FsaXRlX2ZpbmFsX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCogY29udGV4dCkKewogICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdCA9IE5VTEw7CiAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsKICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CgogICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKCiAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CgogICAgYWdncmVnYXRlX2NsYXNzID0gKFB5T2JqZWN0KilzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKCiAgICBhZ2dyZWdhdGVfaW5zdGFuY2UgPSAoUHlPYmplY3QqKilzcWxpdGUzX2FnZ3JlZ2F0ZV9jb250ZXh0KGNvbnRleHQsIHNpemVvZihQeU9iamVjdCopKTsKICAgIGlmICghKmFnZ3JlZ2F0ZV9pbnN0YW5jZSkgewogICAgICAgIC8qIHRoaXMgYnJhbmNoIGlzIGV4ZWN1dGVkIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gaW4gdGhlIGFnZ3JlZ2F0ZSdzCiAgICAgICAgICogX19pbml0X18gKi8KCiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJmaW5hbGl6ZSIsICIiKTsKICAgIGlmICghZnVuY3Rpb25fcmVzdWx0KSB7CiAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgewogICAgICAgICAgICBQeUVycl9QcmludCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgfQogICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIsIC0xKTsKICAgIH0gZWxzZSB7CiAgICAgICAgX3B5c3FsaXRlX3NldF9yZXN1bHQoY29udGV4dCwgZnVuY3Rpb25fcmVzdWx0KTsKICAgIH0KCmVycm9yOgogICAgUHlfWERFQ1JFRigqYWdncmVnYXRlX2luc3RhbmNlKTsKICAgIFB5X1hERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKCiAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwp9Cgp2b2lkIF9weXNxbGl0ZV9kcm9wX3VudXNlZF9zdGF0ZW1lbnRfcmVmZXJlbmNlcyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQp7CiAgICBQeU9iamVjdCogbmV3X2xpc3Q7CiAgICBQeU9iamVjdCogd2Vha3JlZjsKICAgIGludCBpOwoKICAgIC8qIHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgaW4gYSB3aGlsZSAqLwogICAgaWYgKHNlbGYtPmNyZWF0ZWRfc3RhdGVtZW50cysrIDwgMjAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHNlbGYtPmNyZWF0ZWRfc3RhdGVtZW50cyA9IDA7CgogICAgbmV3X2xpc3QgPSBQeUxpc3RfTmV3KDApOwogICAgaWYgKCFuZXdfbGlzdCkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUoc2VsZi0+c3RhdGVtZW50cyk7IGkrKykgewogICAgICAgIHdlYWtyZWYgPSBQeUxpc3RfR2V0SXRlbShzZWxmLT5zdGF0ZW1lbnRzLCBpKTsKICAgICAgICBpZiAoUHlXZWFrcmVmX0dldE9iamVjdCh3ZWFrcmVmKSAhPSBQeV9Ob25lKSB7CiAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKG5ld19saXN0LCB3ZWFrcmVmKSAhPSAwKSB7CiAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3X2xpc3QpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnRzKTsKICAgIHNlbGYtPnN0YXRlbWVudHMgPSBuZXdfbGlzdDsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2Z1bmN0aW9uKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAibmFyZyIsICJmdW5jIiwgTlVMTCwgTlVMTH07CgogICAgUHlPYmplY3QqIGZ1bmM7CiAgICBjaGFyKiBuYW1lOwogICAgaW50IG5hcmc7CiAgICBpbnQgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic2lPIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZuYXJnLCAmZnVuYykpCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9mdW5jdGlvbihzZWxmLT5kYiwgbmFtZSwgbmFyZywgU1FMSVRFX1VURjgsICh2b2lkKilmdW5jLCBfcHlzcWxpdGVfZnVuY19jYWxsYmFjaywgTlVMTCwgTlVMTCk7CgogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIC8qIFdvcmthcm91bmQgZm9yIFNRTGl0ZSBidWc6IG5vIGVycm9yIGNvZGUgb3Igc3RyaW5nIGlzIGF2YWlsYWJsZSBoZXJlICovCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBjcmVhdGluZyBmdW5jdGlvbiIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgZnVuYywgUHlfTm9uZSk7CgogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICByZXR1cm4gUHlfTm9uZTsKICAgIH0KfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2FnZ3JlZ2F0ZShweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIGFnZ3JlZ2F0ZV9jbGFzczsKCiAgICBpbnQgbl9hcmc7CiAgICBjaGFyKiBuYW1lOwogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAibmFtZSIsICJuX2FyZyIsICJhZ2dyZWdhdGVfY2xhc3MiLCBOVUxMIH07CiAgICBpbnQgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic2lPOmNyZWF0ZV9hZ2dyZWdhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZuX2FyZywgJmFnZ3JlZ2F0ZV9jbGFzcykpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uKHNlbGYtPmRiLCBuYW1lLCBuX2FyZywgU1FMSVRFX1VURjgsICh2b2lkKilhZ2dyZWdhdGVfY2xhc3MsIDAsICZfcHlzcWxpdGVfc3RlcF9jYWxsYmFjaywgJl9weXNxbGl0ZV9maW5hbF9jYWxsYmFjayk7CiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgU1FMaXRlIGJ1Zzogbm8gZXJyb3IgY29kZSBvciBzdHJpbmcgaXMgYXZhaWxhYmxlIGhlcmUgKi8KICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIGNyZWF0aW5nIGFnZ3JlZ2F0ZSIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgYWdncmVnYXRlX2NsYXNzLCBQeV9Ob25lKTsKCiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9CgpzdGF0aWMgaW50IF9hdXRob3JpemVyX2NhbGxiYWNrKHZvaWQqIHVzZXJfYXJnLCBpbnQgYWN0aW9uLCBjb25zdCBjaGFyKiBhcmcxLCBjb25zdCBjaGFyKiBhcmcyICwgY29uc3QgY2hhciogZGJuYW1lLCBjb25zdCBjaGFyKiBhY2Nlc3NfYXR0ZW1wdF9zb3VyY2UpCnsKICAgIFB5T2JqZWN0ICpyZXQ7CiAgICBpbnQgcmM7CiAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOwoKICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKICAgIHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKXVzZXJfYXJnLCAiaXNzc3MiLCBhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgYWNjZXNzX2F0dGVtcHRfc291cmNlKTsKCiAgICBpZiAoIXJldCkgewogICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgIH0KCiAgICAgICAgcmMgPSBTUUxJVEVfREVOWTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJldCkpIHsKICAgICAgICAgICAgcmMgPSAoaW50KVB5SW50X0FzTG9uZyhyZXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJjID0gU1FMSVRFX0RFTlk7CiAgICAgICAgfQogICAgICAgIFB5X0RFQ1JFRihyZXQpOwogICAgfQoKICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7CiAgICByZXR1cm4gcmM7Cn0KCnN0YXRpYyBpbnQgX3Byb2dyZXNzX2hhbmRsZXIodm9pZCogdXNlcl9hcmcpCnsKICAgIGludCByYzsKICAgIFB5T2JqZWN0ICpyZXQ7CiAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOwoKICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKICAgIHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKXVzZXJfYXJnLCAiIik7CgogICAgaWYgKCFyZXQpIHsKICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CiAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICB9CgogICAgICAgIC8qIGFib3J0IHF1ZXJ5IGlmIGVycm9yIG9jY3VycmVkICovCiAgICAgICAgcmMgPSAxOyAKICAgIH0gZWxzZSB7CiAgICAgICAgcmMgPSAoaW50KVB5T2JqZWN0X0lzVHJ1ZShyZXQpOwogICAgICAgIFB5X0RFQ1JFRihyZXQpOwogICAgfQoKICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7CiAgICByZXR1cm4gcmM7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9hdXRob3JpemVyKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBQeU9iamVjdCogYXV0aG9yaXplcl9jYjsKCiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJhdXRob3JpemVyX2NhbGxiYWNrIiwgTlVMTCB9OwogICAgaW50IHJjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86c2V0X2F1dGhvcml6ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmF1dGhvcml6ZXJfY2IpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmMgPSBzcWxpdGUzX3NldF9hdXRob3JpemVyKHNlbGYtPmRiLCBfYXV0aG9yaXplcl9jYWxsYmFjaywgKHZvaWQqKWF1dGhvcml6ZXJfY2IpOwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIHNldHRpbmcgYXV0aG9yaXplciBjYWxsYmFjayIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgYXV0aG9yaXplcl9jYiwgUHlfTm9uZSk7CgogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICByZXR1cm4gUHlfTm9uZTsKICAgIH0KfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3Byb2dyZXNzX2hhbmRsZXIocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBwcm9ncmVzc19oYW5kbGVyOwogICAgaW50IG47CgogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAicHJvZ3Jlc3NfaGFuZGxlciIsICJuIiwgTlVMTCB9OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pOnNldF9wcm9ncmVzc19oYW5kbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZwcm9ncmVzc19oYW5kbGVyLCAmbikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAocHJvZ3Jlc3NfaGFuZGxlciA9PSBQeV9Ob25lKSB7CiAgICAgICAgLyogTm9uZSBjbGVhcnMgdGhlIHByb2dyZXNzIGhhbmRsZXIgcHJldmlvdXNseSBzZXQgKi8KICAgICAgICBzcWxpdGUzX3Byb2dyZXNzX2hhbmRsZXIoc2VsZi0+ZGIsIDAsIDAsICh2b2lkKikwKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3FsaXRlM19wcm9ncmVzc19oYW5kbGVyKHNlbGYtPmRiLCBuLCBfcHJvZ3Jlc3NfaGFuZGxlciwgcHJvZ3Jlc3NfaGFuZGxlcik7CiAgICAgICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIHByb2dyZXNzX2hhbmRsZXIsIFB5X05vbmUpOwogICAgfQoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgppbnQgcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpCnsKICAgIGlmIChzZWxmLT5jaGVja19zYW1lX3RocmVhZCkgewogICAgICAgIGlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gc2VsZi0+dGhyZWFkX2lkZW50KSB7CiAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAiU1FMaXRlIG9iamVjdHMgY3JlYXRlZCBpbiBhIHRocmVhZCBjYW4gb25seSBiZSB1c2VkIGluIHRoYXQgc2FtZSB0aHJlYWQuIgogICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG9iamVjdCB3YXMgY3JlYXRlZCBpbiB0aHJlYWQgaWQgJWxkIGFuZCB0aGlzIGlzIHRocmVhZCBpZCAlbGQiLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT50aHJlYWRfaWRlbnQsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyBQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9nZXRfaXNvbGF0aW9uX2xldmVsKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIHZvaWQqIHVudXNlZCkKewogICAgUHlfSU5DUkVGKHNlbGYtPmlzb2xhdGlvbl9sZXZlbCk7CiAgICByZXR1cm4gc2VsZi0+aXNvbGF0aW9uX2xldmVsOwp9CgpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZ2V0X3RvdGFsX2NoYW5nZXMocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgdm9pZCogdW51c2VkKQp7CiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzcWxpdGUzX3RvdGFsX2NoYW5nZXMoc2VsZi0+ZGIpKTsKICAgIH0KfQoKc3RhdGljIGludCBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCkKewogICAgUHlPYmplY3QqIHJlczsKICAgIFB5T2JqZWN0KiBiZWdpbl9zdGF0ZW1lbnQ7CiAgICBjaGFyKiBiZWdpbl9zdGF0ZW1lbnRfc3RyOwoKICAgIFB5X1hERUNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsKCiAgICBpZiAoc2VsZi0+YmVnaW5fc3RhdGVtZW50KSB7CiAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpOwogICAgICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IE5VTEw7CiAgICB9CgogICAgaWYgKGlzb2xhdGlvbl9sZXZlbCA9PSBQeV9Ob25lKSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHNlbGYtPmlzb2xhdGlvbl9sZXZlbCA9IFB5X05vbmU7CgogICAgICAgIHJlcyA9IHB5c3FsaXRlX2Nvbm5lY3Rpb25fY29tbWl0KHNlbGYsIE5VTEwpOwogICAgICAgIGlmICghcmVzKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgUHlfREVDUkVGKHJlcyk7CgogICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoaXNvbGF0aW9uX2xldmVsKTsKICAgICAgICBzZWxmLT5pc29sYXRpb25fbGV2ZWwgPSBpc29sYXRpb25fbGV2ZWw7CgogICAgICAgIGJlZ2luX3N0YXRlbWVudCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIkJFR0lOICIpOwogICAgICAgIGlmICghYmVnaW5fc3RhdGVtZW50KSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgUHlTdHJpbmdfQ29uY2F0KCZiZWdpbl9zdGF0ZW1lbnQsIGlzb2xhdGlvbl9sZXZlbCk7CiAgICAgICAgaWYgKCFiZWdpbl9zdGF0ZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgYmVnaW5fc3RhdGVtZW50X3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGJlZ2luX3N0YXRlbWVudCk7CiAgICAgICAgaWYgKCFiZWdpbl9zdGF0ZW1lbnRfc3RyKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihiZWdpbl9zdGF0ZW1lbnQpOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IFB5TWVtX01hbGxvYyhzdHJsZW4oYmVnaW5fc3RhdGVtZW50X3N0cikgKyAyKTsKICAgICAgICBpZiAoIXNlbGYtPmJlZ2luX3N0YXRlbWVudCkgewogICAgICAgICAgICBQeV9ERUNSRUYoYmVnaW5fc3RhdGVtZW50KTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgc3RyY3B5KHNlbGYtPmJlZ2luX3N0YXRlbWVudCwgYmVnaW5fc3RhdGVtZW50X3N0cik7CiAgICAgICAgUHlfREVDUkVGKGJlZ2luX3N0YXRlbWVudCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2NhbGwocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBzcWw7CiAgICBweXNxbGl0ZV9TdGF0ZW1lbnQqIHN0YXRlbWVudDsKICAgIFB5T2JqZWN0KiB3ZWFrcmVmOwogICAgaW50IHJjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyIsICZzcWwpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgX3B5c3FsaXRlX2Ryb3BfdW51c2VkX3N0YXRlbWVudF9yZWZlcmVuY2VzKHNlbGYpOwoKICAgIHN0YXRlbWVudCA9IFB5T2JqZWN0X05ldyhweXNxbGl0ZV9TdGF0ZW1lbnQsICZweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlKTsKICAgIGlmICghc3RhdGVtZW50KSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmMgPSBweXNxbGl0ZV9zdGF0ZW1lbnRfY3JlYXRlKHN0YXRlbWVudCwgc2VsZiwgc3FsKTsKCiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgaWYgKHJjID09IFBZU1FMSVRFX1RPT19NVUNIX1NRTCkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfV2FybmluZywgIllvdSBjYW4gb25seSBleGVjdXRlIG9uZSBzdGF0ZW1lbnQgYXQgYSB0aW1lLiIpOwogICAgICAgIH0gZWxzZSBpZiAocmMgPT0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEUpIHsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1dhcm5pbmcsICJTUUwgaXMgb2Ygd3JvbmcgdHlwZS4gTXVzdCBiZSBzdHJpbmcgb3IgdW5pY29kZS4iKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoc3RhdGVtZW50KTsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICB9CgogICAgICAgIFB5X0NMRUFSKHN0YXRlbWVudCk7CiAgICB9IGVsc2UgewogICAgICAgIHdlYWtyZWYgPSBQeVdlYWtyZWZfTmV3UmVmKChQeU9iamVjdCopc3RhdGVtZW50LCBOVUxMKTsKICAgICAgICBpZiAoIXdlYWtyZWYpIHsKICAgICAgICAgICAgUHlfQ0xFQVIoc3RhdGVtZW50KTsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CgogICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnN0YXRlbWVudHMsIHdlYWtyZWYpICE9IDApIHsKICAgICAgICAgICAgUHlfQ0xFQVIod2Vha3JlZik7CiAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgfQoKICAgICAgICBQeV9ERUNSRUYod2Vha3JlZik7CiAgICB9CgplcnJvcjoKICAgIHJldHVybiAoUHlPYmplY3QqKXN0YXRlbWVudDsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZShweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIGN1cnNvciA9IDA7CiAgICBQeU9iamVjdCogcmVzdWx0ID0gMDsKICAgIFB5T2JqZWN0KiBtZXRob2QgPSAwOwoKICAgIGN1cnNvciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCAiY3Vyc29yIiwgIiIpOwogICAgaWYgKCFjdXJzb3IpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZSIpOwogICAgaWYgKCFtZXRob2QpIHsKICAgICAgICBQeV9DTEVBUihjdXJzb3IpOwogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOwogICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICBQeV9DTEVBUihjdXJzb3IpOwogICAgfQoKZXJyb3I6CiAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgICBQeV9YREVDUkVGKG1ldGhvZCk7CgogICAgcmV0dXJuIGN1cnNvcjsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZW1hbnkocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBjdXJzb3IgPSAwOwogICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7CiAgICBQeU9iamVjdCogbWV0aG9kID0gMDsKCiAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsKICAgIGlmICghY3Vyc29yKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGN1cnNvciwgImV4ZWN1dGVtYW55Iik7CiAgICBpZiAoIW1ldGhvZCkgewogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ldGhvZCwgYXJncyk7CiAgICBpZiAoIXJlc3VsdCkgewogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7CiAgICB9CgplcnJvcjoKICAgIFB5X1hERUNSRUYocmVzdWx0KTsKICAgIFB5X1hERUNSRUYobWV0aG9kKTsKCiAgICByZXR1cm4gY3Vyc29yOwp9CgpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9leGVjdXRlc2NyaXB0KHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBQeU9iamVjdCogY3Vyc29yID0gMDsKICAgIFB5T2JqZWN0KiByZXN1bHQgPSAwOwogICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7CgogICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QqKXNlbGYsICJjdXJzb3IiLCAiIik7CiAgICBpZiAoIWN1cnNvcikgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjdXJzb3IsICJleGVjdXRlc2NyaXB0Iik7CiAgICBpZiAoIW1ldGhvZCkgewogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ldGhvZCwgYXJncyk7CiAgICBpZiAoIXJlc3VsdCkgewogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7CiAgICB9CgplcnJvcjoKICAgIFB5X1hERUNSRUYocmVzdWx0KTsKICAgIFB5X1hERUNSRUYobWV0aG9kKTsKCiAgICByZXR1cm4gY3Vyc29yOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTExBVElPTiBDT0RFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGludApweXNxbGl0ZV9jb2xsYXRpb25fY2FsbGJhY2soCiAgICAgICAgdm9pZCogY29udGV4dCwKICAgICAgICBpbnQgdGV4dDFfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0MV9kYXRhLAogICAgICAgIGludCB0ZXh0Ml9sZW5ndGgsIGNvbnN0IHZvaWQqIHRleHQyX2RhdGEpCnsKICAgIFB5T2JqZWN0KiBjYWxsYmFjayA9IChQeU9iamVjdCopY29udGV4dDsKICAgIFB5T2JqZWN0KiBzdHJpbmcxID0gMDsKICAgIFB5T2JqZWN0KiBzdHJpbmcyID0gMDsKICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGU7CgogICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CiAgICBpbnQgcmVzdWx0ID0gMDsKCiAgICBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CgogICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgc3RyaW5nMSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyKil0ZXh0MV9kYXRhLCB0ZXh0MV9sZW5ndGgpOwogICAgc3RyaW5nMiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyKil0ZXh0Ml9kYXRhLCB0ZXh0Ml9sZW5ndGgpOwoKICAgIGlmICghc3RyaW5nMSB8fCAhc3RyaW5nMikgewogICAgICAgIGdvdG8gZmluYWxseTsgLyogZmFpbGVkIHRvIGFsbG9jYXRlIHN0cmluZ3MgKi8KICAgIH0KCiAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNhbGxiYWNrLCBzdHJpbmcxLCBzdHJpbmcyLCBOVUxMKTsKCiAgICBpZiAoIXJldHZhbCkgewogICAgICAgIC8qIGV4ZWN1dGlvbiBmYWlsZWQgKi8KICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgcmVzdWx0ID0gUHlJbnRfQXNMb25nKHJldHZhbCk7CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJlc3VsdCA9IDA7CiAgICB9CgpmaW5hbGx5OgogICAgUHlfWERFQ1JFRihzdHJpbmcxKTsKICAgIFB5X1hERUNSRUYoc3RyaW5nMik7CiAgICBQeV9YREVDUkVGKHJldHZhbCk7CgogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgUHlPYmplY3QgKgpweXNxbGl0ZV9jb25uZWN0aW9uX2ludGVycnVwdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKICAgIHNxbGl0ZTNfaW50ZXJydXB0KHNlbGYtPmRiKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR2YWwgPSBQeV9Ob25lOwoKZmluYWxseToKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qIEZ1bmN0aW9uIGF1dGhvcjogUGF1bCBLaXBwZXMgPGtpcHBlc3BAZ21haWwuY29tPgogKiBDbGFzcyBtZXRob2Qgb2YgQ29ubmVjdGlvbiB0byBjYWxsIHRoZSBQeXRob24gZnVuY3Rpb24gX2l0ZXJkdW1wCiAqIG9mIHRoZSBzcWxpdGUzIG1vZHVsZS4KICovCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX2Nvbm5lY3Rpb25faXRlcmR1bXAocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOwogICAgUHlPYmplY3QqIG1vZHVsZSA9IE5VTEw7CiAgICBQeU9iamVjdCogbW9kdWxlX2RpY3Q7CiAgICBQeU9iamVjdCogcHlmbl9pdGVyZHVtcDsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKE1PRFVMRV9OQU1FICIuZHVtcCIpOwogICAgaWYgKCFtb2R1bGUpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgbW9kdWxlX2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7CiAgICBpZiAoIW1vZHVsZV9kaWN0KSB7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKICAgIHB5Zm5faXRlcmR1bXAgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIl9pdGVyZHVtcCIpOwogICAgaWYgKCFweWZuX2l0ZXJkdW1wKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJGYWlsZWQgdG8gb2J0YWluIF9pdGVyZHVtcCgpIHJlZmVyZW5jZSIpOwogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CiAgICBpZiAoIWFyZ3MpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CiAgICBQeV9JTkNSRUYoc2VsZik7CiAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMCwgKFB5T2JqZWN0KilzZWxmKTsKICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGxPYmplY3QocHlmbl9pdGVyZHVtcCwgYXJncyk7CgpmaW5hbGx5OgogICAgUHlfWERFQ1JFRihhcmdzKTsKICAgIFB5X1hERUNSRUYobW9kdWxlKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIGNhbGxhYmxlOwogICAgUHlPYmplY3QqIHVwcGVyY2FzZV9uYW1lID0gMDsKICAgIFB5T2JqZWN0KiBuYW1lOwogICAgUHlPYmplY3QqIHJldHZhbDsKICAgIGNoYXIqIGNoazsKICAgIGludCByYzsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgewogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hTzpjcmVhdGVfY29sbGF0aW9uKG5hbWUsIGNhbGxiYWNrKSIsICZQeVN0cmluZ19UeXBlLCAmbmFtZSwgJmNhbGxhYmxlKSkgewogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICB1cHBlcmNhc2VfbmFtZSA9IFB5T2JqZWN0X0NhbGxNZXRob2QobmFtZSwgInVwcGVyIiwgIiIpOwogICAgaWYgKCF1cHBlcmNhc2VfbmFtZSkgewogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBjaGsgPSBQeVN0cmluZ19Bc1N0cmluZyh1cHBlcmNhc2VfbmFtZSk7CiAgICB3aGlsZSAoKmNoaykgewogICAgICAgIGlmICgoKmNoayA+PSAnMCcgJiYgKmNoayA8PSAnOScpCiAgICAgICAgIHx8ICgqY2hrID49ICdBJyAmJiAqY2hrIDw9ICdaJykKICAgICAgICAgfHwgKCpjaGsgPT0gJ18nKSkKICAgICAgICB7CiAgICAgICAgICAgIGNoaysrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCAiaW52YWxpZCBjaGFyYWN0ZXIgaW4gY29sbGF0aW9uIG5hbWUiKTsKICAgICAgICAgICAgZ290byBmaW5hbGx5OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoY2FsbGFibGUgIT0gUHlfTm9uZSAmJiAhUHlDYWxsYWJsZV9DaGVjayhjYWxsYWJsZSkpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKTsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgaWYgKGNhbGxhYmxlICE9IFB5X05vbmUpIHsKICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSwgY2FsbGFibGUpOwogICAgfSBlbHNlIHsKICAgICAgICBQeURpY3RfRGVsSXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSk7CiAgICB9CgogICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9jb2xsYXRpb24oc2VsZi0+ZGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyh1cHBlcmNhc2VfbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUxJVEVfVVRGOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWxsYWJsZSAhPSBQeV9Ob25lKSA/IGNhbGxhYmxlIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWxsYWJsZSAhPSBQeV9Ob25lKSA/IHB5c3FsaXRlX2NvbGxhdGlvbl9jYWxsYmFjayA6IE5VTEwpOwogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIFB5RGljdF9EZWxJdGVtKHNlbGYtPmNvbGxhdGlvbnMsIHVwcGVyY2FzZV9uYW1lKTsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCmZpbmFsbHk6CiAgICBQeV9YREVDUkVGKHVwcGVyY2FzZV9uYW1lKTsKCiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHZhbCA9IE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgfQoKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qIENhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIuIFJldHVybnMgaXRzZWxmIGFzIGEKICogY29udmVuaWVuY2UgdG8gdGhlIGNhbGxlci4gKi8Kc3RhdGljIFB5T2JqZWN0ICoKcHlzcWxpdGVfY29ubmVjdGlvbl9lbnRlcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlfSU5DUkVGKHNlbGYpOwogICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKfQoKLyoqIENhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIuIElmIHRoZXJlIHdhcyBhbnkKICogZXhjZXB0aW9uLCBhIHJvbGxiYWNrIHRha2VzIHBsYWNlOyBvdGhlcndpc2Ugd2UgY29tbWl0LiAqLwpzdGF0aWMgUHlPYmplY3QgKgpweXNxbGl0ZV9jb25uZWN0aW9uX2V4aXQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIFB5T2JqZWN0KiBleGNfdHlwZSwgKmV4Y192YWx1ZSwgKmV4Y190YjsKICAgIGNoYXIqIG1ldGhvZF9uYW1lOwogICAgUHlPYmplY3QqIHJlc3VsdDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZleGNfdHlwZSwgJmV4Y192YWx1ZSwgJmV4Y190YikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoZXhjX3R5cGUgPT0gUHlfTm9uZSAmJiBleGNfdmFsdWUgPT0gUHlfTm9uZSAmJiBleGNfdGIgPT0gUHlfTm9uZSkgewogICAgICAgIG1ldGhvZF9uYW1lID0gImNvbW1pdCI7CiAgICB9IGVsc2UgewogICAgICAgIG1ldGhvZF9uYW1lID0gInJvbGxiYWNrIjsKICAgIH0KCiAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgbWV0aG9kX25hbWUsICIiKTsKICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBQeV9ERUNSRUYocmVzdWx0KTsKCiAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOwogICAgcmV0dXJuIFB5X0ZhbHNlOwp9CgpzdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3QuIik7CgpzdGF0aWMgUHlHZXRTZXREZWYgY29ubmVjdGlvbl9nZXRzZXRbXSA9IHsKICAgIHsiaXNvbGF0aW9uX2xldmVsIiwgIChnZXR0ZXIpcHlzcWxpdGVfY29ubmVjdGlvbl9nZXRfaXNvbGF0aW9uX2xldmVsLCAoc2V0dGVyKXB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbH0sCiAgICB7InRvdGFsX2NoYW5nZXMiLCAgKGdldHRlcilweXNxbGl0ZV9jb25uZWN0aW9uX2dldF90b3RhbF9jaGFuZ2VzLCAoc2V0dGVyKTB9LAogICAge05VTEx9Cn07CgpzdGF0aWMgUHlNZXRob2REZWYgY29ubmVjdGlvbl9tZXRob2RzW10gPSB7CiAgICB7ImN1cnNvciIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2N1cnNvciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm4gYSBjdXJzb3IgZm9yIHRoZSBjb25uZWN0aW9uLiIpfSwKICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jbG9zZSwgTUVUSF9OT0FSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJDbG9zZXMgdGhlIGNvbm5lY3Rpb24uIil9LAogICAgeyJjb21taXQiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jb21taXQsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiQ29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiIpfSwKICAgIHsicm9sbGJhY2siLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9yb2xsYmFjaywgTUVUSF9OT0FSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJSb2xsIGJhY2sgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIil9LAogICAgeyJjcmVhdGVfZnVuY3Rpb24iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jcmVhdGVfZnVuY3Rpb24sIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiY3JlYXRlX2FnZ3JlZ2F0ZSIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2NyZWF0ZV9hZ2dyZWdhdGUsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIG5ldyBhZ2dyZWdhdGUuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7InNldF9hdXRob3JpemVyIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2F1dGhvcml6ZXIsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICAgIFB5RG9jX1NUUigiU2V0cyBhdXRob3JpemVyIGNhbGxiYWNrLiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJzZXRfcHJvZ3Jlc3NfaGFuZGxlciIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9wcm9ncmVzc19oYW5kbGVyLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgICBQeURvY19TVFIoIlNldHMgcHJvZ3Jlc3MgaGFuZGxlciBjYWxsYmFjay4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiZXhlY3V0ZSIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2V4ZWN1dGUsIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiZXhlY3V0ZW1hbnkiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGVjdXRlbWFueSwgTUVUSF9WQVJBUkdTLAogICAgICAgIFB5RG9jX1NUUigiUmVwZWF0ZWRseSBleGVjdXRlcyBhIFNRTCBzdGF0ZW1lbnQuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7ImV4ZWN1dGVzY3JpcHQiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGVjdXRlc2NyaXB0LCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIGF0IG9uY2UuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7ImNyZWF0ZV9jb2xsYXRpb24iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jcmVhdGVfY29sbGF0aW9uLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgY29sbGF0aW9uIGZ1bmN0aW9uLiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJpbnRlcnJ1cHQiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9pbnRlcnJ1cHQsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiQWJvcnQgYW55IHBlbmRpbmcgZGF0YWJhc2Ugb3BlcmF0aW9uLiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJpdGVyZHVtcCIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2l0ZXJkdW1wLCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIlJldHVybnMgaXRlcmF0b3IgdG8gdGhlIGR1bXAgb2YgdGhlIGRhdGFiYXNlIGluIGFuIFNRTCB0ZXh0IGZvcm1hdC4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZW50ZXIsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiRm9yIGNvbnRleHQgbWFuYWdlci4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGl0LCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJGb3IgY29udGV4dCBtYW5hZ2VyLiBOb24tc3RhbmRhcmQuIil9LAogICAge05VTEwsIE5VTEx9Cn07CgpzdGF0aWMgc3RydWN0IFB5TWVtYmVyRGVmIGNvbm5lY3Rpb25fbWVtYmVyc1tdID0KewogICAgeyJXYXJuaW5nIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIFdhcm5pbmcpLCBST30sCiAgICB7IkVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIEVycm9yKSwgUk99LAogICAgeyJJbnRlcmZhY2VFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBJbnRlcmZhY2VFcnJvciksIFJPfSwKICAgIHsiRGF0YWJhc2VFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBEYXRhYmFzZUVycm9yKSwgUk99LAogICAgeyJEYXRhRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgRGF0YUVycm9yKSwgUk99LAogICAgeyJPcGVyYXRpb25hbEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIE9wZXJhdGlvbmFsRXJyb3IpLCBST30sCiAgICB7IkludGVncml0eUVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIEludGVncml0eUVycm9yKSwgUk99LAogICAgeyJJbnRlcm5hbEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIEludGVybmFsRXJyb3IpLCBST30sCiAgICB7IlByb2dyYW1taW5nRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgUHJvZ3JhbW1pbmdFcnJvciksIFJPfSwKICAgIHsiTm90U3VwcG9ydGVkRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgTm90U3VwcG9ydGVkRXJyb3IpLCBST30sCiAgICB7InJvd19mYWN0b3J5IiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIHJvd19mYWN0b3J5KX0sCiAgICB7InRleHRfZmFjdG9yeSIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCB0ZXh0X2ZhY3RvcnkpfSwKICAgIHtOVUxMfQp9OwoKUHlUeXBlT2JqZWN0IHB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICIuQ29ubmVjdGlvbiIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfQ29ubmVjdGlvbiksICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgKHRlcm5hcnlmdW5jKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY2FsbCwgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIGNvbm5lY3Rpb25fZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgY29ubmVjdGlvbl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIGNvbm5lY3Rpb25fbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICBjb25uZWN0aW9uX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAoaW5pdHByb2MpcHlzcWxpdGVfY29ubmVjdGlvbl9pbml0LCAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpleHRlcm4gaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0dXBfdHlwZXModm9pZCkKewogICAgcHlzcWxpdGVfQ29ubmVjdGlvblR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CiAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZweXNxbGl0ZV9Db25uZWN0aW9uVHlwZSk7Cn0K