LyogbW9kdWxlLmMgLSB0aGUgbW9kdWxlIGl0c2VsZgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAiY29ubmVjdGlvbi5oIgojaW5jbHVkZSAic3RhdGVtZW50LmgiCiNpbmNsdWRlICJjdXJzb3IuaCIKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCiNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgojaW5jbHVkZSAicm93LmgiCgojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDMKI2RlZmluZSBIQVZFX1NIQVJFRF9DQUNIRQojZW5kaWYKCi8qIHN0YXRpYyBvYmplY3RzIGF0IG1vZHVsZS1sZXZlbCAqLwoKUHlPYmplY3QqIHB5c3FsaXRlX0Vycm9yLCAqcHlzcWxpdGVfV2FybmluZywgKnB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAqcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwKICAgICpweXNxbGl0ZV9JbnRlcm5hbEVycm9yLCAqcHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgKnB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsCiAgICAqcHlzcWxpdGVfSW50ZWdyaXR5RXJyb3IsICpweXNxbGl0ZV9EYXRhRXJyb3IsICpweXNxbGl0ZV9Ob3RTdXBwb3J0ZWRFcnJvciwgKnB5c3FsaXRlX09wdGltaXplZFVuaWNvZGU7CgpQeU9iamVjdCogY29udmVydGVyczsKaW50IF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrczsKaW50IHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZDsKCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2Nvbm5lY3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICBrd2FyZ3MpCnsKICAgIC8qIFB5dGhvbiBzZWVtcyB0byBoYXZlIG5vIHdheSBvZiBleHRyYWN0aW5nIGEgc2luZ2xlIGtleXdvcmQtYXJnIGF0CiAgICAgKiBDLWxldmVsLCBzbyB0aGlzIGNvZGUgaXMgcmVkdW5kYW50IHdpdGggdGhlIG9uZSBpbiBjb25uZWN0aW9uX2luaXQgaW4KICAgICAqIGNvbm5lY3Rpb24uYyBhbmQgbXVzdCBhbHdheXMgYmUgY29waWVkIGZyb20gdGhlcmUgLi4uICovCgogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhYmFzZSIsICJ0aW1lb3V0IiwgImRldGVjdF90eXBlcyIsICJpc29sYXRpb25fbGV2ZWwiLCAiY2hlY2tfc2FtZV90aHJlYWQiLCAiZmFjdG9yeSIsICJjYWNoZWRfc3RhdGVtZW50cyIsIE5VTEwsIE5VTEx9OwogICAgUHlPYmplY3QqIGRhdGFiYXNlOwogICAgaW50IGRldGVjdF90eXBlcyA9IDA7CiAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsOwogICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOwogICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkID0gMTsKICAgIGludCBjYWNoZWRfc3RhdGVtZW50czsKICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOwoKICAgIFB5T2JqZWN0KiByZXN1bHQ7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xkaU9pT2kiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJhc2UsICZ0aW1lb3V0LCAmZGV0ZWN0X3R5cGVzLCAmaXNvbGF0aW9uX2xldmVsLCAmY2hlY2tfc2FtZV90aHJlYWQsICZmYWN0b3J5LCAmY2FjaGVkX3N0YXRlbWVudHMpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSB7CiAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJnB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlOwogICAgfQoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZmFjdG9yeSwgYXJncywga3dhcmdzKTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CgpQeURvY19TVFJWQVIobW9kdWxlX2Nvbm5lY3RfZG9jLAoiY29ubmVjdChkYXRhYmFzZVssIHRpbWVvdXQsIGlzb2xhdGlvbl9sZXZlbCwgZGV0ZWN0X3R5cGVzLCBmYWN0b3J5XSlcblwKXG5cCk9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgU1FMaXRlIGRhdGFiYXNlIGZpbGUgKmRhdGFiYXNlKi4gWW91IGNhbiB1c2VcblwKXCI6bWVtb3J5OlwiIHRvIG9wZW4gYSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2UgdGhhdCByZXNpZGVzIGluXG5cClJBTSBpbnN0ZWFkIG9mIG9uIGRpc2suIik7CgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9jb21wbGV0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgogICAgICAgIGt3YXJncykKewogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzdGF0ZW1lbnQiLCBOVUxMLCBOVUxMfTsKICAgIGNoYXIqIHN0YXRlbWVudDsKCiAgICBQeU9iamVjdCogcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMiLCBrd2xpc3QsICZzdGF0ZW1lbnQpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICBpZiAoc3FsaXRlM19jb21wbGV0ZShzdGF0ZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gUHlfRmFsc2U7CiAgICB9CgogICAgUHlfSU5DUkVGKHJlc3VsdCk7CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKUHlEb2NfU1RSVkFSKG1vZHVsZV9jb21wbGV0ZV9kb2MsCiJjb21wbGV0ZV9zdGF0ZW1lbnQoc3FsKVxuXApcblwKQ2hlY2tzIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgY29tcGxldGUgU1FMIHN0YXRlbWVudC4gTm9uLXN0YW5kYXJkLiIpOwoKI2lmZGVmIEhBVkVfU0hBUkVEX0NBQ0hFCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICBrd2FyZ3MpCnsKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZG9fZW5hYmxlIiwgTlVMTCwgTlVMTH07CiAgICBpbnQgZG9fZW5hYmxlOwogICAgaW50IHJjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImkiLCBrd2xpc3QsICZkb19lbmFibGUpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfZW5hYmxlX3NoYXJlZF9jYWNoZShkb19lbmFibGUpOwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkNoYW5naW5nIHRoZSBzaGFyZWRfY2FjaGUgZmxhZyBmYWlsZWQiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9CgpQeURvY19TVFJWQVIobW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGVfZG9jLAoiZW5hYmxlX3NoYXJlZF9jYWNoZShkb19lbmFibGUpXG5cClxuXApFbmFibGUgb3IgZGlzYWJsZSBzaGFyZWQgY2FjaGUgbW9kZSBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkLlxuXApFeHBlcmltZW50YWwvTm9uLXN0YW5kYXJkLiIpOwojZW5kaWYgLyogSEFWRV9TSEFSRURfQ0FDSEUgKi8KCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXIoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeVR5cGVPYmplY3QqIHR5cGU7CiAgICBQeU9iamVjdCogY2FzdGVyOwogICAgaW50IHJjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmdHlwZSwgJmNhc3RlcikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKiBhIGJhc2ljIHR5cGUgaXMgYWRhcHRlZDsgdGhlcmUncyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlCiAgICAgKiAoOTkgJSBvZiBhbGwgdXNhZ2VzKSAqLwogICAgaWYgKHR5cGUgPT0gJlB5SW50X1R5cGUgfHwgdHlwZSA9PSAmUHlMb25nX1R5cGUgfHwgdHlwZSA9PSAmUHlGbG9hdF9UeXBlCiAgICAgICAgICAgIHx8IHR5cGUgPT0gJlB5U3RyaW5nX1R5cGUgfHwgdHlwZSA9PSAmUHlVbmljb2RlX1R5cGUgfHwgdHlwZSA9PSAmUHlCdWZmZXJfVHlwZSkgewogICAgICAgIHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZCA9IDE7CiAgICB9CgogICAgcmMgPSBweXNxbGl0ZV9taWNyb3Byb3RvY29sc19hZGQodHlwZSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgY2FzdGVyKTsKICAgIGlmIChyYyA9PSAtMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKUHlEb2NfU1RSVkFSKG1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyX2RvYywKInJlZ2lzdGVyX2FkYXB0ZXIodHlwZSwgY2FsbGFibGUpXG5cClxuXApSZWdpc3RlcnMgYW4gYWRhcHRlciB3aXRoIHB5c3FsaXRlJ3MgYWRhcHRlciByZWdpc3RyeS4gTm9uLXN0YW5kYXJkLiIpOwoKc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIG9yaWdfbmFtZTsKICAgIFB5T2JqZWN0KiBuYW1lID0gTlVMTDsKICAgIFB5T2JqZWN0KiBjYWxsYWJsZTsKICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU08iLCAmb3JpZ19uYW1lLCAmY2FsbGFibGUpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogY29udmVydCB0aGUgbmFtZSB0byB1cHBlciBjYXNlICovCiAgICBuYW1lID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvcmlnX25hbWUsICJ1cHBlciIsICIiKTsKICAgIGlmICghbmFtZSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgaWYgKFB5RGljdF9TZXRJdGVtKGNvbnZlcnRlcnMsIG5hbWUsIGNhbGxhYmxlKSAhPSAwKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR2YWwgPSBQeV9Ob25lOwplcnJvcjoKICAgIFB5X1hERUNSRUYobmFtZSk7CiAgICByZXR1cm4gcmV0dmFsOwp9CgpQeURvY19TVFJWQVIobW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlcl9kb2MsCiJyZWdpc3Rlcl9jb252ZXJ0ZXIodHlwZW5hbWUsIGNhbGxhYmxlKVxuXApcblwKUmVnaXN0ZXJzIGEgY29udmVydGVyIHdpdGggcHlzcWxpdGUuIE5vbi1zdGFuZGFyZC4iKTsKCnN0YXRpYyBQeU9iamVjdCogZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpQeURvY19TVFJWQVIoZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3NfZG9jLAoiZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MoZmxhZylcblwKXG5cCkVuYWJsZSBvciBkaXNhYmxlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aHJvd2luZyBlcnJvcnMgdG8gc3RkZXJyLiIpOwoKc3RhdGljIHZvaWQgY29udmVydGVyc19pbml0KFB5T2JqZWN0KiBkaWN0KQp7CiAgICBjb252ZXJ0ZXJzID0gUHlEaWN0X05ldygpOwogICAgaWYgKCFjb252ZXJ0ZXJzKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJjb252ZXJ0ZXJzIiwgY29udmVydGVycyk7Cn0KCnN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewogICAgeyJjb25uZWN0IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29ubmVjdCwKICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtb2R1bGVfY29ubmVjdF9kb2N9LAogICAgeyJjb21wbGV0ZV9zdGF0ZW1lbnQiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9jb21wbGV0ZSwKICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtb2R1bGVfY29tcGxldGVfZG9jfSwKI2lmZGVmIEhBVkVfU0hBUkVEX0NBQ0hFCiAgICB7ImVuYWJsZV9zaGFyZWRfY2FjaGUiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9lbmFibGVfc2hhcmVkX2NhY2hlLAogICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG1vZHVsZV9lbmFibGVfc2hhcmVkX2NhY2hlX2RvY30sCiNlbmRpZgogICAgeyJyZWdpc3Rlcl9hZGFwdGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyLAogICAgIE1FVEhfVkFSQVJHUywgbW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXJfZG9jfSwKICAgIHsicmVnaXN0ZXJfY29udmVydGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXIsCiAgICAgTUVUSF9WQVJBUkdTLCBtb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyX2RvY30sCiAgICB7ImFkYXB0IiwgIChQeUNGdW5jdGlvbilweXNxbGl0ZV9hZGFwdCwgTUVUSF9WQVJBUkdTLAogICAgIHB5c3FsaXRlX2FkYXB0X2RvY30sCiAgICB7ImVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzIiwgIChQeUNGdW5jdGlvbillbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcywKICAgICBNRVRIX1ZBUkFSR1MsIGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzX2RvY30sCiAgICB7TlVMTCwgTlVMTH0KfTsKCnN0cnVjdCBfSW50Q29uc3RhbnRQYWlyIHsKICAgIGNoYXIqIGNvbnN0YW50X25hbWU7CiAgICBpbnQgY29uc3RhbnRfdmFsdWU7Cn07Cgp0eXBlZGVmIHN0cnVjdCBfSW50Q29uc3RhbnRQYWlyIEludENvbnN0YW50UGFpcjsKCnN0YXRpYyBJbnRDb25zdGFudFBhaXIgX2ludF9jb25zdGFudHNbXSA9IHsKICAgIHsiUEFSU0VfREVDTFRZUEVTIiwgUEFSU0VfREVDTFRZUEVTfSwKICAgIHsiUEFSU0VfQ09MTkFNRVMiLCBQQVJTRV9DT0xOQU1FU30sCgogICAgeyJTUUxJVEVfT0siLCBTUUxJVEVfT0t9LAogICAgeyJTUUxJVEVfREVOWSIsIFNRTElURV9ERU5ZfSwKICAgIHsiU1FMSVRFX0lHTk9SRSIsIFNRTElURV9JR05PUkV9LAogICAgeyJTUUxJVEVfQ1JFQVRFX0lOREVYIiwgU1FMSVRFX0NSRUFURV9JTkRFWH0sCiAgICB7IlNRTElURV9DUkVBVEVfVEFCTEUiLCBTUUxJVEVfQ1JFQVRFX1RBQkxFfSwKICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX0lOREVYIiwgU1FMSVRFX0NSRUFURV9URU1QX0lOREVYfSwKICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1RBQkxFIiwgU1FMSVRFX0NSRUFURV9URU1QX1RBQkxFfSwKICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1RSSUdHRVIiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVFJJR0dFUn0sCiAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9WSUVXIiwgU1FMSVRFX0NSRUFURV9URU1QX1ZJRVd9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RSSUdHRVIiLCBTUUxJVEVfQ1JFQVRFX1RSSUdHRVJ9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1ZJRVciLCBTUUxJVEVfQ1JFQVRFX1ZJRVd9LAogICAgeyJTUUxJVEVfREVMRVRFIiwgU1FMSVRFX0RFTEVURX0sCiAgICB7IlNRTElURV9EUk9QX0lOREVYIiwgU1FMSVRFX0RST1BfSU5ERVh9LAogICAgeyJTUUxJVEVfRFJPUF9UQUJMRSIsIFNRTElURV9EUk9QX1RBQkxFfSwKICAgIHsiU1FMSVRFX0RST1BfVEVNUF9JTkRFWCIsIFNRTElURV9EUk9QX1RFTVBfSU5ERVh9LAogICAgeyJTUUxJVEVfRFJPUF9URU1QX1RBQkxFIiwgU1FMSVRFX0RST1BfVEVNUF9UQUJMRX0sCiAgICB7IlNRTElURV9EUk9QX1RFTVBfVFJJR0dFUiIsIFNRTElURV9EUk9QX1RFTVBfVFJJR0dFUn0sCiAgICB7IlNRTElURV9EUk9QX1RFTVBfVklFVyIsIFNRTElURV9EUk9QX1RFTVBfVklFV30sCiAgICB7IlNRTElURV9EUk9QX1RSSUdHRVIiLCBTUUxJVEVfRFJPUF9UUklHR0VSfSwKICAgIHsiU1FMSVRFX0RST1BfVklFVyIsIFNRTElURV9EUk9QX1ZJRVd9LAogICAgeyJTUUxJVEVfSU5TRVJUIiwgU1FMSVRFX0lOU0VSVH0sCiAgICB7IlNRTElURV9QUkFHTUEiLCBTUUxJVEVfUFJBR01BfSwKICAgIHsiU1FMSVRFX1JFQUQiLCBTUUxJVEVfUkVBRH0sCiAgICB7IlNRTElURV9TRUxFQ1QiLCBTUUxJVEVfU0VMRUNUfSwKICAgIHsiU1FMSVRFX1RSQU5TQUNUSU9OIiwgU1FMSVRFX1RSQU5TQUNUSU9OfSwKICAgIHsiU1FMSVRFX1VQREFURSIsIFNRTElURV9VUERBVEV9LAogICAgeyJTUUxJVEVfQVRUQUNIIiwgU1FMSVRFX0FUVEFDSH0sCiAgICB7IlNRTElURV9ERVRBQ0giLCBTUUxJVEVfREVUQUNIfSwKI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAyMDAxCiAgICB7IlNRTElURV9BTFRFUl9UQUJMRSIsIFNRTElURV9BTFRFUl9UQUJMRX0sCiAgICB7IlNRTElURV9SRUlOREVYIiwgU1FMSVRFX1JFSU5ERVh9LAojZW5kaWYKI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAzMDAwCiAgICB7IlNRTElURV9BTkFMWVpFIiwgU1FMSVRFX0FOQUxZWkV9LAojZW5kaWYKICAgIHsoY2hhciopTlVMTCwgMH0KfTsKClB5TU9ESU5JVF9GVU5DIGluaXRfc3FsaXRlMyh2b2lkKQp7CiAgICBQeU9iamVjdCAqbW9kdWxlLCAqZGljdDsKICAgIFB5T2JqZWN0ICp0bXBfb2JqOwogICAgaW50IGk7CgogICAgbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgiX3NxbGl0ZTMiLCBtb2R1bGVfbWV0aG9kcyk7CgogICAgaWYgKCFtb2R1bGUgfHwKICAgICAgICAocHlzcWxpdGVfcm93X3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChweXNxbGl0ZV9jdXJzb3Jfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX2NhY2hlX3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChweXNxbGl0ZV9zdGF0ZW1lbnRfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX3ByZXBhcmVfcHJvdG9jb2xfc2V0dXBfdHlwZXMoKSA8IDApCiAgICAgICApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9Db25uZWN0aW9uVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ29ubmVjdGlvbiIsIChQeU9iamVjdCopICZweXNxbGl0ZV9Db25uZWN0aW9uVHlwZSk7CiAgICBQeV9JTkNSRUYoJnB5c3FsaXRlX0N1cnNvclR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkN1cnNvciIsIChQeU9iamVjdCopICZweXNxbGl0ZV9DdXJzb3JUeXBlKTsKICAgIFB5X0lOQ1JFRigmcHlzcWxpdGVfQ2FjaGVUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJTdGF0ZW1lbnQiLCAoUHlPYmplY3QqKSZweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlKTsKICAgIFB5X0lOQ1JFRigmcHlzcWxpdGVfU3RhdGVtZW50VHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ2FjaGUiLCAoUHlPYmplY3QqKSAmcHlzcWxpdGVfQ2FjaGVUeXBlKTsKICAgIFB5X0lOQ1JFRigmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiUHJlcGFyZVByb3RvY29sIiwgKFB5T2JqZWN0KikgJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUpOwogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9Sb3dUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJSb3ciLCAoUHlPYmplY3QqKSAmcHlzcWxpdGVfUm93VHlwZSk7CgogICAgaWYgKCEoZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIC8qKiogQ3JlYXRlIERCLUFQSSBFeGNlcHRpb24gaGllcmFyY2h5ICovCgogICAgaWYgKCEocHlzcWxpdGVfRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5FcnJvciIsIFB5RXhjX1N0YW5kYXJkRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRXJyb3IiLCBweXNxbGl0ZV9FcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfV2FybmluZyA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLldhcm5pbmciLCBQeUV4Y19TdGFuZGFyZEVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIldhcm5pbmciLCBweXNxbGl0ZV9XYXJuaW5nKTsKCiAgICAvKiBFcnJvciBzdWJjbGFzc2VzICovCgogICAgaWYgKCEocHlzcWxpdGVfSW50ZXJmYWNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcmZhY2VFcnJvciIsIHB5c3FsaXRlX0Vycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVyZmFjZUVycm9yIiwgcHlzcWxpdGVfSW50ZXJmYWNlRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5EYXRhYmFzZUVycm9yIiwgcHlzcWxpdGVfRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRGF0YWJhc2VFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IpOwoKICAgIC8qIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3Igc3ViY2xhc3NlcyAqLwoKICAgIGlmICghKHB5c3FsaXRlX0ludGVybmFsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcm5hbEVycm9yIiwgcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlcm5hbEVycm9yIiwgcHlzcWxpdGVfSW50ZXJuYWxFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLk9wZXJhdGlvbmFsRXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wZXJhdGlvbmFsRXJyb3IiLCBweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yKTsKCiAgICBpZiAoIShweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuUHJvZ3JhbW1pbmdFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUHJvZ3JhbW1pbmdFcnJvciIsIHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX0ludGVncml0eUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuSW50ZWdyaXR5RXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZWdyaXR5RXJyb3IiLCBweXNxbGl0ZV9JbnRlZ3JpdHlFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfRGF0YUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuRGF0YUVycm9yIiwgcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJEYXRhRXJyb3IiLCBweXNxbGl0ZV9EYXRhRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX05vdFN1cHBvcnRlZEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuTm90U3VwcG9ydGVkRXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk5vdFN1cHBvcnRlZEVycm9yIiwgcHlzcWxpdGVfTm90U3VwcG9ydGVkRXJyb3IpOwoKICAgIC8qIFdlIGp1c3QgbmVlZCAic29tZXRoaW5nIiB1bmlxdWUgZm9yIHB5c3FsaXRlX09wdGltaXplZFVuaWNvZGUuIEl0IGRvZXMgbm90IHJlYWxseQogICAgICogbmVlZCB0byBiZSBhIHN0cmluZyBzdWJjbGFzcy4gSnVzdCBhbnl0aGluZyB0aGF0IGNhbiBhY3QgYXMgYSBzcGVjaWFsCiAgICAgKiBtYXJrZXIgZm9yIHVzLiBTbyBJIHB1bGxlZCBQeUNlbGxfVHlwZSBvdXQgb2YgbXkgbWFnaWMgaGF0LgogICAgICovCiAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikmUHlDZWxsX1R5cGUpOwogICAgcHlzcWxpdGVfT3B0aW1pemVkVW5pY29kZSA9IChQeU9iamVjdCopJlB5Q2VsbF9UeXBlOwogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wdGltaXplZFVuaWNvZGUiLCBweXNxbGl0ZV9PcHRpbWl6ZWRVbmljb2RlKTsKCiAgICAvKiBTZXQgaW50ZWdlciBjb25zdGFudHMgKi8KICAgIGZvciAoaSA9IDA7IF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X25hbWUgIT0gMDsgaSsrKSB7CiAgICAgICAgdG1wX29iaiA9IFB5SW50X0Zyb21Mb25nKF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X3ZhbHVlKTsKICAgICAgICBpZiAoIXRtcF9vYmopIHsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CiAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgX2ludF9jb25zdGFudHNbaV0uY29uc3RhbnRfbmFtZSwgdG1wX29iaik7CiAgICAgICAgUHlfREVDUkVGKHRtcF9vYmopOwogICAgfQoKICAgIGlmICghKHRtcF9vYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFBZU1FMSVRFX1ZFUlNJT04pKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAidmVyc2lvbiIsIHRtcF9vYmopOwogICAgUHlfREVDUkVGKHRtcF9vYmopOwoKICAgIGlmICghKHRtcF9vYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHNxbGl0ZTNfbGlidmVyc2lvbigpKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgInNxbGl0ZV92ZXJzaW9uIiwgdG1wX29iaik7CiAgICBQeV9ERUNSRUYodG1wX29iaik7CgogICAgLyogaW5pdGlhbGl6ZSBtaWNyb3Byb3RvY29scyBsYXllciAqLwogICAgcHlzcWxpdGVfbWljcm9wcm90b2NvbHNfaW5pdChkaWN0KTsKCiAgICAvKiBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGNvbnZlcnRlcnMgKi8KICAgIGNvbnZlcnRlcnNfaW5pdChkaWN0KTsKCiAgICBfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MgPSAwOwoKICAgIHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZCA9IDA7CgogICAgLyogT3JpZ2luYWwgY29tbWVudCBmcm9tIF9ic2RkYi5jIGluIHRoZSBQeXRob24gY29yZS4gVGhpcyBpcyBhbHNvIHN0aWxsCiAgICAgKiBuZWVkZWQgbm93YWRheXMgZm9yIFB5dGhvbiAyLjMvMi40LgogICAgICogCiAgICAgKiBQeUV2YWxfSW5pdFRocmVhZHMgaXMgY2FsbGVkIGhlcmUgZHVlIHRvIGEgcXVpcmsgaW4gcHl0aG9uIDEuNQogICAgICogLSAyLjIuMSAoYXQgbGVhc3QpIGFjY29yZGluZyB0byBSdXNzZWxsIFdpbGxpYW1zb24gPG1lcmVsQHd0Lm5ldD46CiAgICAgKiBUaGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgaXMgbm90IGluaXRpYWxpemVkIHVudGlsIHRoZSBmaXJzdAogICAgICogdGhyZWFkIGlzIGNyZWF0ZWQgdXNpbmcgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoKSBvciBmb3JrKCkgaXMKICAgICAqIGNhbGxlZC4gIHRoYXQgd291bGQgY2F1c2UgdGhlIEFMTE9XX1RIUkVBRFMgaGVyZSB0byBzZWdmYXVsdCBkdWUKICAgICAqIHRvIGEgbnVsbCBwb2ludGVyIHJlZmVyZW5jZSBpZiBubyB0aHJlYWRzIG9yIGNoaWxkIHByb2Nlc3NlcwogICAgICogaGF2ZSBiZWVuIGNyZWF0ZWQuICBUaGlzIHdvcmtzIGFyb3VuZCB0aGF0IGFuZCBpcyBhIG5vLW9wIGlmCiAgICAgKiB0aHJlYWRzIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgogICAgICogIChzZWUgcHlic2RkYi11c2VycyBtYWlsaW5nIGxpc3QgcG9zdCBvbiAyMDAyLTA4LTA3KQogICAgICovCiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7CiNlbmRpZgoKZXJyb3I6CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIE1PRFVMRV9OQU1FICI6IGluaXQgZmFpbGVkIik7CiAgICB9Cn0K