LyogbW9kdWxlLmMgLSB0aGUgbW9kdWxlIGl0c2VsZgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAiY29ubmVjdGlvbi5oIgojaW5jbHVkZSAic3RhdGVtZW50LmgiCiNpbmNsdWRlICJjdXJzb3IuaCIKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCiNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgojaW5jbHVkZSAicm93LmgiCgojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDMKI2RlZmluZSBIQVZFX1NIQVJFRF9DQUNIRQojZW5kaWYKCi8qIHN0YXRpYyBvYmplY3RzIGF0IG1vZHVsZS1sZXZlbCAqLwoKUHlPYmplY3QqIHB5c3FsaXRlX0Vycm9yLCAqcHlzcWxpdGVfV2FybmluZywgKnB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAqcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwKICAgICpweXNxbGl0ZV9JbnRlcm5hbEVycm9yLCAqcHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgKnB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsCiAgICAqcHlzcWxpdGVfSW50ZWdyaXR5RXJyb3IsICpweXNxbGl0ZV9EYXRhRXJyb3IsICpweXNxbGl0ZV9Ob3RTdXBwb3J0ZWRFcnJvciwgKnB5c3FsaXRlX09wdGltaXplZFVuaWNvZGU7CgpQeU9iamVjdCogX3B5c3FsaXRlX2NvbnZlcnRlcnM7CmludCBfcHlzcWxpdGVfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3M7CmludCBweXNxbGl0ZV9CYXNlVHlwZUFkYXB0ZWQ7CgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9jb25uZWN0KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCiAgICAgICAga3dhcmdzKQp7CiAgICAvKiBQeXRob24gc2VlbXMgdG8gaGF2ZSBubyB3YXkgb2YgZXh0cmFjdGluZyBhIHNpbmdsZSBrZXl3b3JkLWFyZyBhdAogICAgICogQy1sZXZlbCwgc28gdGhpcyBjb2RlIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBvbmUgaW4gY29ubmVjdGlvbl9pbml0IGluCiAgICAgKiBjb25uZWN0aW9uLmMgYW5kIG11c3QgYWx3YXlzIGJlIGNvcGllZCBmcm9tIHRoZXJlIC4uLiAqLwoKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKICAgIFB5T2JqZWN0KiBkYXRhYmFzZTsKICAgIGludCBkZXRlY3RfdHlwZXMgPSAwOwogICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbDsKICAgIFB5T2JqZWN0KiBmYWN0b3J5ID0gTlVMTDsKICAgIGludCBjaGVja19zYW1lX3RocmVhZCA9IDE7CiAgICBpbnQgY2FjaGVkX3N0YXRlbWVudHM7CiAgICBkb3VibGUgdGltZW91dCA9IDUuMDsKCiAgICBQeU9iamVjdCogcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98ZGlPaU9pIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFiYXNlLCAmdGltZW91dCwgJmRldGVjdF90eXBlcywgJmlzb2xhdGlvbl9sZXZlbCwgJmNoZWNrX3NhbWVfdGhyZWFkLCAmZmFjdG9yeSwgJmNhY2hlZF9zdGF0ZW1lbnRzKSkKICAgIHsKICAgICAgICByZXR1cm4gTlVMTDsgCiAgICB9CgogICAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgewogICAgICAgIGZhY3RvcnkgPSAoUHlPYmplY3QqKSZweXNxbGl0ZV9Db25uZWN0aW9uVHlwZTsKICAgIH0KCiAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZhY3RvcnksIGFyZ3MsIGt3YXJncyk7CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKUHlEb2NfU1RSVkFSKG1vZHVsZV9jb25uZWN0X2RvYywKImNvbm5lY3QoZGF0YWJhc2VbLCB0aW1lb3V0LCBpc29sYXRpb25fbGV2ZWwsIGRldGVjdF90eXBlcywgZmFjdG9yeV0pXG5cClxuXApPcGVucyBhIGNvbm5lY3Rpb24gdG8gdGhlIFNRTGl0ZSBkYXRhYmFzZSBmaWxlICpkYXRhYmFzZSouIFlvdSBjYW4gdXNlXG5cClwiOm1lbW9yeTpcIiB0byBvcGVuIGEgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlIHRoYXQgcmVzaWRlcyBpblxuXApSQU0gaW5zdGVhZCBvZiBvbiBkaXNrLiIpOwoKc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfY29tcGxldGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICBrd2FyZ3MpCnsKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic3RhdGVtZW50IiwgTlVMTCwgTlVMTH07CiAgICBjaGFyKiBzdGF0ZW1lbnQ7CgogICAgUHlPYmplY3QqIHJlc3VsdDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzIiwga3dsaXN0LCAmc3RhdGVtZW50KSkKICAgIHsKICAgICAgICByZXR1cm4gTlVMTDsgCiAgICB9CgogICAgaWYgKHNxbGl0ZTNfY29tcGxldGUoc3RhdGVtZW50KSkgewogICAgICAgIHJlc3VsdCA9IFB5X1RydWU7CiAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IFB5X0ZhbHNlOwogICAgfQoKICAgIFB5X0lOQ1JFRihyZXN1bHQpOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KClB5RG9jX1NUUlZBUihtb2R1bGVfY29tcGxldGVfZG9jLAoiY29tcGxldGVfc3RhdGVtZW50KHNxbClcblwKXG5cCkNoZWNrcyBpZiBhIHN0cmluZyBjb250YWlucyBhIGNvbXBsZXRlIFNRTCBzdGF0ZW1lbnQuIE5vbi1zdGFuZGFyZC4iKTsKCiNpZmRlZiBIQVZFX1NIQVJFRF9DQUNIRQpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9lbmFibGVfc2hhcmVkX2NhY2hlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCiAgICAgICAga3dhcmdzKQp7CiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRvX2VuYWJsZSIsIE5VTEwsIE5VTEx9OwogICAgaW50IGRvX2VuYWJsZTsKICAgIGludCByYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpIiwga3dsaXN0LCAmZG9fZW5hYmxlKSkKICAgIHsKICAgICAgICByZXR1cm4gTlVMTDsgCiAgICB9CgogICAgcmMgPSBzcWxpdGUzX2VuYWJsZV9zaGFyZWRfY2FjaGUoZG9fZW5hYmxlKTsKCiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJDaGFuZ2luZyB0aGUgc2hhcmVkX2NhY2hlIGZsYWcgZmFpbGVkIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICByZXR1cm4gUHlfTm9uZTsKICAgIH0KfQoKUHlEb2NfU1RSVkFSKG1vZHVsZV9lbmFibGVfc2hhcmVkX2NhY2hlX2RvYywKImVuYWJsZV9zaGFyZWRfY2FjaGUoZG9fZW5hYmxlKVxuXApcblwKRW5hYmxlIG9yIGRpc2FibGUgc2hhcmVkIGNhY2hlIG1vZGUgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC5cblwKRXhwZXJpbWVudGFsL05vbi1zdGFuZGFyZC4iKTsKI2VuZGlmIC8qIEhBVkVfU0hBUkVEX0NBQ0hFICovCgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlUeXBlT2JqZWN0KiB0eXBlOwogICAgUHlPYmplY3QqIGNhc3RlcjsKICAgIGludCByYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJnR5cGUsICZjYXN0ZXIpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogYSBiYXNpYyB0eXBlIGlzIGFkYXB0ZWQ7IHRoZXJlJ3MgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaWYgdGhhdCdzIG5vdCB0aGUgY2FzZQogICAgICogKDk5ICUgb2YgYWxsIHVzYWdlcykgKi8KICAgIGlmICh0eXBlID09ICZQeUludF9UeXBlIHx8IHR5cGUgPT0gJlB5TG9uZ19UeXBlIHx8IHR5cGUgPT0gJlB5RmxvYXRfVHlwZQogICAgICAgICAgICB8fCB0eXBlID09ICZQeVN0cmluZ19UeXBlIHx8IHR5cGUgPT0gJlB5VW5pY29kZV9UeXBlIHx8IHR5cGUgPT0gJlB5QnVmZmVyX1R5cGUpIHsKICAgICAgICBweXNxbGl0ZV9CYXNlVHlwZUFkYXB0ZWQgPSAxOwogICAgfQoKICAgIHJjID0gcHlzcWxpdGVfbWljcm9wcm90b2NvbHNfYWRkKHR5cGUsIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIGNhc3Rlcik7CiAgICBpZiAocmMgPT0gLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KClB5RG9jX1NUUlZBUihtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcl9kb2MsCiJyZWdpc3Rlcl9hZGFwdGVyKHR5cGUsIGNhbGxhYmxlKVxuXApcblwKUmVnaXN0ZXJzIGFuIGFkYXB0ZXIgd2l0aCBweXNxbGl0ZSdzIGFkYXB0ZXIgcmVnaXN0cnkuIE5vbi1zdGFuZGFyZC4iKTsKCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIFB5T2JqZWN0KiBvcmlnX25hbWU7CiAgICBQeU9iamVjdCogbmFtZSA9IE5VTEw7CiAgICBQeU9iamVjdCogY2FsbGFibGU7CiAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlNPIiwgJm9yaWdfbmFtZSwgJmNhbGxhYmxlKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIGNvbnZlcnQgdGhlIG5hbWUgdG8gdXBwZXIgY2FzZSAqLwogICAgbmFtZSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qob3JpZ19uYW1lLCAidXBwZXIiLCAiIik7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIGlmIChQeURpY3RfU2V0SXRlbShfcHlzcWxpdGVfY29udmVydGVycywgbmFtZSwgY2FsbGFibGUpICE9IDApIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHZhbCA9IFB5X05vbmU7CmVycm9yOgogICAgUHlfWERFQ1JFRihuYW1lKTsKICAgIHJldHVybiByZXR2YWw7Cn0KClB5RG9jX1NUUlZBUihtb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyX2RvYywKInJlZ2lzdGVyX2NvbnZlcnRlcih0eXBlbmFtZSwgY2FsbGFibGUpXG5cClxuXApSZWdpc3RlcnMgYSBjb252ZXJ0ZXIgd2l0aCBweXNxbGl0ZS4gTm9uLXN0YW5kYXJkLiIpOwoKc3RhdGljIFB5T2JqZWN0KiBlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZfcHlzcWxpdGVfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KClB5RG9jX1NUUlZBUihlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrc19kb2MsCiJlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyhmbGFnKVxuXApcblwKRW5hYmxlIG9yIGRpc2FibGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRocm93aW5nIGVycm9ycyB0byBzdGRlcnIuIik7CgpzdGF0aWMgdm9pZCBjb252ZXJ0ZXJzX2luaXQoUHlPYmplY3QqIGRpY3QpCnsKICAgIF9weXNxbGl0ZV9jb252ZXJ0ZXJzID0gUHlEaWN0X05ldygpOwogICAgaWYgKCFfcHlzcWxpdGVfY29udmVydGVycykgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiY29udmVydGVycyIsIF9weXNxbGl0ZV9jb252ZXJ0ZXJzKTsKfQoKc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CiAgICB7ImNvbm5lY3QiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9jb25uZWN0LAogICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG1vZHVsZV9jb25uZWN0X2RvY30sCiAgICB7ImNvbXBsZXRlX3N0YXRlbWVudCIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2NvbXBsZXRlLAogICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG1vZHVsZV9jb21wbGV0ZV9kb2N9LAojaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKICAgIHsiZW5hYmxlX3NoYXJlZF9jYWNoZSIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUsCiAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGVfZG9jfSwKI2VuZGlmCiAgICB7InJlZ2lzdGVyX2FkYXB0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXIsCiAgICAgTUVUSF9WQVJBUkdTLCBtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcl9kb2N9LAogICAgeyJyZWdpc3Rlcl9jb252ZXJ0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlciwKICAgICBNRVRIX1ZBUkFSR1MsIG1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXJfZG9jfSwKICAgIHsiYWRhcHQiLCAgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2FkYXB0LCBNRVRIX1ZBUkFSR1MsCiAgICAgcHlzcWxpdGVfYWRhcHRfZG9jfSwKICAgIHsiZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MiLCAgKFB5Q0Z1bmN0aW9uKWVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzLAogICAgIE1FVEhfVkFSQVJHUywgZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3NfZG9jfSwKICAgIHtOVUxMLCBOVUxMfQp9OwoKc3RydWN0IF9JbnRDb25zdGFudFBhaXIgewogICAgY2hhciogY29uc3RhbnRfbmFtZTsKICAgIGludCBjb25zdGFudF92YWx1ZTsKfTsKCnR5cGVkZWYgc3RydWN0IF9JbnRDb25zdGFudFBhaXIgSW50Q29uc3RhbnRQYWlyOwoKc3RhdGljIEludENvbnN0YW50UGFpciBfaW50X2NvbnN0YW50c1tdID0gewogICAgeyJQQVJTRV9ERUNMVFlQRVMiLCBQQVJTRV9ERUNMVFlQRVN9LAogICAgeyJQQVJTRV9DT0xOQU1FUyIsIFBBUlNFX0NPTE5BTUVTfSwKCiAgICB7IlNRTElURV9PSyIsIFNRTElURV9PS30sCiAgICB7IlNRTElURV9ERU5ZIiwgU1FMSVRFX0RFTll9LAogICAgeyJTUUxJVEVfSUdOT1JFIiwgU1FMSVRFX0lHTk9SRX0sCiAgICB7IlNRTElURV9DUkVBVEVfSU5ERVgiLCBTUUxJVEVfQ1JFQVRFX0lOREVYfSwKICAgIHsiU1FMSVRFX0NSRUFURV9UQUJMRSIsIFNRTElURV9DUkVBVEVfVEFCTEV9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfSU5ERVgiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfSU5ERVh9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfVEFCTEUiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVEFCTEV9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfVFJJR0dFUiIsIFNRTElURV9DUkVBVEVfVEVNUF9UUklHR0VSfSwKICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1ZJRVciLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVklFV30sCiAgICB7IlNRTElURV9DUkVBVEVfVFJJR0dFUiIsIFNRTElURV9DUkVBVEVfVFJJR0dFUn0sCiAgICB7IlNRTElURV9DUkVBVEVfVklFVyIsIFNRTElURV9DUkVBVEVfVklFV30sCiAgICB7IlNRTElURV9ERUxFVEUiLCBTUUxJVEVfREVMRVRFfSwKICAgIHsiU1FMSVRFX0RST1BfSU5ERVgiLCBTUUxJVEVfRFJPUF9JTkRFWH0sCiAgICB7IlNRTElURV9EUk9QX1RBQkxFIiwgU1FMSVRFX0RST1BfVEFCTEV9LAogICAgeyJTUUxJVEVfRFJPUF9URU1QX0lOREVYIiwgU1FMSVRFX0RST1BfVEVNUF9JTkRFWH0sCiAgICB7IlNRTElURV9EUk9QX1RFTVBfVEFCTEUiLCBTUUxJVEVfRFJPUF9URU1QX1RBQkxFfSwKICAgIHsiU1FMSVRFX0RST1BfVEVNUF9UUklHR0VSIiwgU1FMSVRFX0RST1BfVEVNUF9UUklHR0VSfSwKICAgIHsiU1FMSVRFX0RST1BfVEVNUF9WSUVXIiwgU1FMSVRFX0RST1BfVEVNUF9WSUVXfSwKICAgIHsiU1FMSVRFX0RST1BfVFJJR0dFUiIsIFNRTElURV9EUk9QX1RSSUdHRVJ9LAogICAgeyJTUUxJVEVfRFJPUF9WSUVXIiwgU1FMSVRFX0RST1BfVklFV30sCiAgICB7IlNRTElURV9JTlNFUlQiLCBTUUxJVEVfSU5TRVJUfSwKICAgIHsiU1FMSVRFX1BSQUdNQSIsIFNRTElURV9QUkFHTUF9LAogICAgeyJTUUxJVEVfUkVBRCIsIFNRTElURV9SRUFEfSwKICAgIHsiU1FMSVRFX1NFTEVDVCIsIFNRTElURV9TRUxFQ1R9LAogICAgeyJTUUxJVEVfVFJBTlNBQ1RJT04iLCBTUUxJVEVfVFJBTlNBQ1RJT059LAogICAgeyJTUUxJVEVfVVBEQVRFIiwgU1FMSVRFX1VQREFURX0sCiAgICB7IlNRTElURV9BVFRBQ0giLCBTUUxJVEVfQVRUQUNIfSwKICAgIHsiU1FMSVRFX0RFVEFDSCIsIFNRTElURV9ERVRBQ0h9LAojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDIwMDEKICAgIHsiU1FMSVRFX0FMVEVSX1RBQkxFIiwgU1FMSVRFX0FMVEVSX1RBQkxFfSwKICAgIHsiU1FMSVRFX1JFSU5ERVgiLCBTUUxJVEVfUkVJTkRFWH0sCiNlbmRpZgojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDAKICAgIHsiU1FMSVRFX0FOQUxZWkUiLCBTUUxJVEVfQU5BTFlaRX0sCiNlbmRpZgogICAgeyhjaGFyKilOVUxMLCAwfQp9OwoKUHlNT0RJTklUX0ZVTkMgaW5pdF9zcWxpdGUzKHZvaWQpCnsKICAgIFB5T2JqZWN0ICptb2R1bGUsICpkaWN0OwogICAgUHlPYmplY3QgKnRtcF9vYmo7CiAgICBpbnQgaTsKCiAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlKCJfc3FsaXRlMyIsIG1vZHVsZV9tZXRob2RzKTsKCiAgICBpZiAoIW1vZHVsZSB8fAogICAgICAgIChweXNxbGl0ZV9yb3dfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX2N1cnNvcl9zZXR1cF90eXBlcygpIDwgMCkgfHwKICAgICAgICAocHlzcWxpdGVfY29ubmVjdGlvbl9zZXR1cF90eXBlcygpIDwgMCkgfHwKICAgICAgICAocHlzcWxpdGVfY2FjaGVfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX3N0YXRlbWVudF9zZXR1cF90eXBlcygpIDwgMCkgfHwKICAgICAgICAocHlzcWxpdGVfcHJlcGFyZV9wcm90b2NvbF9zZXR1cF90eXBlcygpIDwgMCkKICAgICAgICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBQeV9JTkNSRUYoJnB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDb25uZWN0aW9uIiwgKFB5T2JqZWN0KikgJnB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlKTsKICAgIFB5X0lOQ1JFRigmcHlzcWxpdGVfQ3Vyc29yVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ3Vyc29yIiwgKFB5T2JqZWN0KikgJnB5c3FsaXRlX0N1cnNvclR5cGUpOwogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9DYWNoZVR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlN0YXRlbWVudCIsIChQeU9iamVjdCopJnB5c3FsaXRlX1N0YXRlbWVudFR5cGUpOwogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDYWNoZSIsIChQeU9iamVjdCopICZweXNxbGl0ZV9DYWNoZVR5cGUpOwogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9QcmVwYXJlUHJvdG9jb2xUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJQcmVwYXJlUHJvdG9jb2wiLCAoUHlPYmplY3QqKSAmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSk7CiAgICBQeV9JTkNSRUYoJnB5c3FsaXRlX1Jvd1R5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlJvdyIsIChQeU9iamVjdCopICZweXNxbGl0ZV9Sb3dUeXBlKTsKCiAgICBpZiAoIShkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2R1bGUpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgLyoqKiBDcmVhdGUgREItQVBJIEV4Y2VwdGlvbiBoaWVyYXJjaHkgKi8KCiAgICBpZiAoIShweXNxbGl0ZV9FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkVycm9yIiwgUHlFeGNfU3RhbmRhcmRFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJFcnJvciIsIHB5c3FsaXRlX0Vycm9yKTsKCiAgICBpZiAoIShweXNxbGl0ZV9XYXJuaW5nID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuV2FybmluZyIsIFB5RXhjX1N0YW5kYXJkRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiV2FybmluZyIsIHB5c3FsaXRlX1dhcm5pbmcpOwoKICAgIC8qIEVycm9yIHN1YmNsYXNzZXMgKi8KCiAgICBpZiAoIShweXNxbGl0ZV9JbnRlcmZhY2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkludGVyZmFjZUVycm9yIiwgcHlzcWxpdGVfRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZXJmYWNlRXJyb3IiLCBweXNxbGl0ZV9JbnRlcmZhY2VFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfRGF0YWJhc2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkRhdGFiYXNlRXJyb3IiLCBweXNxbGl0ZV9FcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJEYXRhYmFzZUVycm9yIiwgcHlzcWxpdGVfRGF0YWJhc2VFcnJvcik7CgogICAgLyogcHlzcWxpdGVfRGF0YWJhc2VFcnJvciBzdWJjbGFzc2VzICovCgogICAgaWYgKCEocHlzcWxpdGVfSW50ZXJuYWxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkludGVybmFsRXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVybmFsRXJyb3IiLCBweXNxbGl0ZV9JbnRlcm5hbEVycm9yKTsKCiAgICBpZiAoIShweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuT3BlcmF0aW9uYWxFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiT3BlcmF0aW9uYWxFcnJvciIsIHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5Qcm9ncmFtbWluZ0Vycm9yIiwgcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJQcm9ncmFtbWluZ0Vycm9yIiwgcHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfSW50ZWdyaXR5RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlZ3JpdHlFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlZ3JpdHlFcnJvciIsIHB5c3FsaXRlX0ludGVncml0eUVycm9yKTsKCiAgICBpZiAoIShweXNxbGl0ZV9EYXRhRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5EYXRhRXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkRhdGFFcnJvciIsIHB5c3FsaXRlX0RhdGFFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfTm90U3VwcG9ydGVkRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5Ob3RTdXBwb3J0ZWRFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiTm90U3VwcG9ydGVkRXJyb3IiLCBweXNxbGl0ZV9Ob3RTdXBwb3J0ZWRFcnJvcik7CgogICAgLyogV2UganVzdCBuZWVkICJzb21ldGhpbmciIHVuaXF1ZSBmb3IgcHlzcWxpdGVfT3B0aW1pemVkVW5pY29kZS4gSXQgZG9lcyBub3QgcmVhbGx5CiAgICAgKiBuZWVkIHRvIGJlIGEgc3RyaW5nIHN1YmNsYXNzLiBKdXN0IGFueXRoaW5nIHRoYXQgY2FuIGFjdCBhcyBhIHNwZWNpYWwKICAgICAqIG1hcmtlciBmb3IgdXMuIFNvIEkgcHVsbGVkIFB5Q2VsbF9UeXBlIG91dCBvZiBteSBtYWdpYyBoYXQuCiAgICAgKi8KICAgIFB5X0lOQ1JFRigoUHlPYmplY3QqKSZQeUNlbGxfVHlwZSk7CiAgICBweXNxbGl0ZV9PcHRpbWl6ZWRVbmljb2RlID0gKFB5T2JqZWN0KikmUHlDZWxsX1R5cGU7CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiT3B0aW1pemVkVW5pY29kZSIsIHB5c3FsaXRlX09wdGltaXplZFVuaWNvZGUpOwoKICAgIC8qIFNldCBpbnRlZ2VyIGNvbnN0YW50cyAqLwogICAgZm9yIChpID0gMDsgX2ludF9jb25zdGFudHNbaV0uY29uc3RhbnRfbmFtZSAhPSAwOyBpKyspIHsKICAgICAgICB0bXBfb2JqID0gUHlJbnRfRnJvbUxvbmcoX2ludF9jb25zdGFudHNbaV0uY29uc3RhbnRfdmFsdWUpOwogICAgICAgIGlmICghdG1wX29iaikgewogICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgIH0KICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBfaW50X2NvbnN0YW50c1tpXS5jb25zdGFudF9uYW1lLCB0bXBfb2JqKTsKICAgICAgICBQeV9ERUNSRUYodG1wX29iaik7CiAgICB9CgogICAgaWYgKCEodG1wX29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUFlTUUxJVEVfVkVSU0lPTikpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJ2ZXJzaW9uIiwgdG1wX29iaik7CiAgICBQeV9ERUNSRUYodG1wX29iaik7CgogICAgaWYgKCEodG1wX29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3FsaXRlM19saWJ2ZXJzaW9uKCkpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAic3FsaXRlX3ZlcnNpb24iLCB0bXBfb2JqKTsKICAgIFB5X0RFQ1JFRih0bXBfb2JqKTsKCiAgICAvKiBpbml0aWFsaXplIG1pY3JvcHJvdG9jb2xzIGxheWVyICovCiAgICBweXNxbGl0ZV9taWNyb3Byb3RvY29sc19pbml0KGRpY3QpOwoKICAgIC8qIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgY29udmVydGVycyAqLwogICAgY29udmVydGVyc19pbml0KGRpY3QpOwoKICAgIF9weXNxbGl0ZV9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyA9IDA7CgogICAgcHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkID0gMDsKCiAgICAvKiBPcmlnaW5hbCBjb21tZW50IGZyb20gX2JzZGRiLmMgaW4gdGhlIFB5dGhvbiBjb3JlLiBUaGlzIGlzIGFsc28gc3RpbGwKICAgICAqIG5lZWRlZCBub3dhZGF5cyBmb3IgUHl0aG9uIDIuMy8yLjQuCiAgICAgKiAKICAgICAqIFB5RXZhbF9Jbml0VGhyZWFkcyBpcyBjYWxsZWQgaGVyZSBkdWUgdG8gYSBxdWlyayBpbiBweXRob24gMS41CiAgICAgKiAtIDIuMi4xIChhdCBsZWFzdCkgYWNjb3JkaW5nIHRvIFJ1c3NlbGwgV2lsbGlhbXNvbiA8bWVyZWxAd3QubmV0PjoKICAgICAqIFRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jayBpcyBub3QgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIGZpcnN0CiAgICAgKiB0aHJlYWQgaXMgY3JlYXRlZCB1c2luZyB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpIG9yIGZvcmsoKSBpcwogICAgICogY2FsbGVkLiAgdGhhdCB3b3VsZCBjYXVzZSB0aGUgQUxMT1dfVEhSRUFEUyBoZXJlIHRvIHNlZ2ZhdWx0IGR1ZQogICAgICogdG8gYSBudWxsIHBvaW50ZXIgcmVmZXJlbmNlIGlmIG5vIHRocmVhZHMgb3IgY2hpbGQgcHJvY2Vzc2VzCiAgICAgKiBoYXZlIGJlZW4gY3JlYXRlZC4gIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQgYW5kIGlzIGEgbm8tb3AgaWYKICAgICAqIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCiAgICAgKiAgKHNlZSBweWJzZGRiLXVzZXJzIG1haWxpbmcgbGlzdCBwb3N0IG9uIDIwMDItMDgtMDcpCiAgICAgKi8KI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUV2YWxfSW5pdFRocmVhZHMoKTsKI2VuZGlmCgplcnJvcjoKICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgTU9EVUxFX05BTUUgIjogaW5pdCBmYWlsZWQiKTsKICAgIH0KfQo=