From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21822 invoked by alias); 10 Oct 2012 23:46:00 -0000 Received: (qmail 21814 invoked by uid 22791); 10 Oct 2012 23:45:58 -0000 X-SWARE-Spam-Status: No, hits=-6.1 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,RP_MATCHES_RCVD,TW_AV,TW_CF,TW_CP,TW_FN,TW_MX,TW_TM X-Spam-Check-By: sourceware.org Received: from mail-oa0-f47.google.com (HELO mail-oa0-f47.google.com) (209.85.219.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 10 Oct 2012 23:45:45 +0000 Received: by mail-oa0-f47.google.com with SMTP id h1so1261195oag.20 for ; Wed, 10 Oct 2012 16:45:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:x-system-of-record:x-gm-message-state; bh=cVnu4hoITsAAv7j5rHbLkrWBOX3zQ7cdg5C6MfoT+xM=; b=LR/43evwW2QxOryL2jkJFp/Jphb28KtQtVJeSFg3qjCbCt6g+m38HKOqd6QIsFEA4N SjhAJ9fIcHBa4meu45/OIhZS1Op6VMboS3B4TUermGYXepdmn4uc2qAWk20KXZD4EDQ4 x87C9T+MFlZxV/Yl0j3UOh+kR9lEHu1Rt0IPqpJfuLM+BtNjnYwjHkKMLLiGFiNHayNS fQEaSwkqZgKIVf9Au9dfEeVxdIxNMfkxMC4MBz+Y8g2cbgr1AaKCYMcrrn4Uw3LRTodV HIzbgReIlhnmekWt7U++cQfCroLLbhBG27SVF4Ewk+uwomtmgi2WQdw4EQwUTybUOEFO mk3w== MIME-Version: 1.0 Received: by 10.60.13.9 with SMTP id d9mr19977784oec.92.1349912744575; Wed, 10 Oct 2012 16:45:44 -0700 (PDT) Received: by 10.182.75.74 with HTTP; Wed, 10 Oct 2012 16:45:44 -0700 (PDT) In-Reply-To: <506F27AF.3070805@redhat.com> References: <20120307004630.A503DB21B6@azwildcat.mtv.corp.google.com> <4FF7D1C6.90407@redhat.com> <4FF96D0C.5060406@redhat.com> <4FFBF9F5.6020306@redhat.com> <5008708E.1030109@redhat.com> <506F27AF.3070805@redhat.com> Date: Thu, 11 Oct 2012 00:13:00 -0000 Message-ID: Subject: Re: User directed Function Multiversioning via Function Overloading (issue5752064) From: Sriraman Tallam To: Jason Merrill Cc: Xinliang David Li , mark@codesourcery.com, nathan@codesourcery.com, "H.J. Lu" , Richard Guenther , Jan Hubicka , Uros Bizjak , reply@codereview.appspotmail.com, GCC Patches Content-Type: multipart/mixed; boundary=e89a8ff1c0d09e430104cbbd0dfd X-System-Of-Record: true X-Gm-Message-State: ALoCoQkxbKPzqKP/3IXgIDeX+ieyMf5a1exAGhoN7ZjmTN8fbe+2S/KfAbagfZupVHCz/uZHNUKpopRCj3w2vFW1Jj6jRfondxyHX3yYrtM0iHdFaNbL58nsnc9R1LtBXpa8h634n2biZo7lP4BWE+n06Osqg3oOa48fys2UiZ/M1XmyKIq8zjLwKjQzWS8wxHMb8SJMH5dn X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2012-10/txt/msg01065.txt.bz2 --e89a8ff1c0d09e430104cbbd0dfd Content-Type: text/plain; charset=ISO-8859-1 Content-length: 5222 Hi Jason, I have addressed all your comments and attached the new patch. On Fri, Oct 5, 2012 at 11:32 AM, Jason Merrill wrote: > On 08/24/2012 08:34 PM, Sriraman Tallam wrote: >> >> + /* For function versions, their parms and types match >> + but they are not duplicates. Record function versions >> + as and when they are found. */ >> + if (TREE_CODE (fn) == FUNCTION_DECL >> + && TREE_CODE (method) == FUNCTION_DECL >> + && (DECL_FUNCTION_SPECIFIC_TARGET (fn) >> + || DECL_FUNCTION_SPECIFIC_TARGET (method)) >> + && targetm.target_option.function_versions (fn, method)) >> + { >> + targetm.set_version_assembler_name (fn); >> + targetm.set_version_assembler_name (method); >> + continue; >> + } > > > This seems like an odd place to be setting assembler names; better to just > have the existing mangle_decl_assembler_name hook add the appropriate suffix > when it's called normally. I moved this to mangle_decl_assembler_name. Still, functions may go from not being a version to then becoming versions after a new definition is detected. In such cases, I explicitly call mangle_decl to modify the assembler name. > > >> + Also, mark this function as needed if it is marked inline but >> + is a multi-versioned function. */ > > > Why? If it's used, it should be marked needed though the normal process. How do I do this? If a versioned function is marked inline, I need to keep it but it has no explicit callers. How do I mark that it is needed? > >> + error_at (location_of (DECL_NAME (OVL_CURRENT (fn))), >> + "Call to multiversioned function %<%D(%A)%> with" >> + " no default version", DECL_NAME (OVL_CURRENT (fn)), >> + build_tree_list_vec (*args)); > > > location_of just returns input_location if you ask it for the location of an > identifier, so you might as well use error with no explicit location. And > why not print candidates->fn instead of pasting the name/args? Also, > lowercase "call". I removed this since the check already happens elsewhere. > >> + { >> + tree dispatcher_decl = NULL; >> + struct cgraph_node *node = cgraph_get_node (fn); >> + if (node != NULL) >> + dispatcher_decl = cgraph_get_node (fn)->version_dispatcher_decl; >> + if (dispatcher_decl == NULL) >> + { >> + error_at (input_location, "Call to multiversioned function" >> + " without a default is not allowed"); >> + return NULL; >> + } >> + retrofit_lang_decl (dispatcher_decl); >> + gcc_assert (dispatcher_decl != NULL); >> + fn = dispatcher_decl; >> + } > > > Let's move this logic into a separate function that returns the dispatcher > function. Done. > >> + /* Both functions must be marked versioned. */ >> + gcc_assert (DECL_FUNCTION_VERSIONED (cand1->fn) >> + && DECL_FUNCTION_VERSIONED (cand2->fn)); > > > Why can't you compare a versioned function and a non-versioned one? Right, there was a big bug in my code. I have changed this now. This should address your question. > > The code in joust should go further down in the function, before the > handling of two declarations of the same function. Done. > >> + /* For multiversioned functions, aggregate all the versions here for >> + generating the dispatcher body later if necessary. */ >> + >> + if (TREE_CODE (candidates->fn) == FUNCTION_DECL >> + && DECL_FUNCTION_VERSIONED (candidates->fn)) >> + { >> >> + VEC (tree, heap) *fn_ver_vec = NULL; >> + struct z_candidate *ver = candidates; >> >> + fn_ver_vec = VEC_alloc (tree, heap, 2); >> + for (;ver; ver = ver->next) >> + VEC_safe_push (tree, heap, fn_ver_vec, ver->fn); >> + gcc_assert (targetm.get_function_versions_dispatcher); >> + targetm.get_function_versions_dispatcher (fn_ver_vec); >> + VEC_free (tree, heap, fn_ver_vec); >> + } > > > This seems to assume that all the functions in the list of candidates are > versioned, but there might be unrelated functions from different namespaces. > Also, doing this every time someone calls a versioned function seems like > the wrong place; I would think it would be better to build up a list of > versions as you seed declarations, and then use that list to define the > dispatcher at EOF if it's needed. This was the bug I was referring to earlier. I have moved this to a separate function. I thought it is better to do this on demand. I have changed the code so that the aggregation and dispatcher generation happens exactly once. > >> + if (TREE_CODE (decl) == FUNCTION_DECL >> + && DECL_FUNCTION_VERSIONED (decl) >> + && DECL_ASSEMBLER_NAME_SET_P (decl)) >> + write_source_name (DECL_ASSEMBLER_NAME (decl)); >> + else >> + write_source_name (DECL_NAME (decl)); > > > Again, I think it's better to handle the suffix via > mangle_decl_assembler_name. Removed. Thanks for the comments. Please let me know what you think about the new patch. -Sri. > > Jason > --e89a8ff1c0d09e430104cbbd0dfd Content-Type: text/plain; charset=US-ASCII; name="mv_fe_patch_101012.txt" Content-Disposition: attachment; filename="mv_fe_patch_101012.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h853083q0 Content-length: 103005 T3ZlcnZpZXcgb2YgdGhlIHBhdGNoIHdoaWNoIGFkZHMgc3VwcG9ydCB0byBz cGVjaWZ5IGZ1bmN0aW9uIHZlcnNpb25zLiAgVGhpcyBpcwpvbmx5IGVuYWJs ZWQgZm9yIHRhcmdldCBpMzg2LgoKRXhhbXBsZToKCmludCBmb28gKCk7ICAv KiBEZWZhdWx0IHZlcnNpb24gKi8KaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9f ICgodGFyZ2V0KCJhdngscG9wY250IikpKTsvKlNwZWNpYWxpemVkIGZvciBh dnggYW5kIHBvcGNudCAqLwppbnQgZm9vICgpIF9fYXR0cmlidXRlX18gKCh0 YXJnZXQoImFyY2g9Y29yZTIsc3NzZTMiKSkpOy8qU3BlY2lhbGl6ZWQgZm9y IGNvcmUyIGFuZCBzc3NlMyovCgppbnQgbWFpbiAoKQp7CiBpbnQgKCpwKSgp ID0gJmZvbzsKIHJldHVybiBmb28gKCkgKyAoKnApKCk7Cn0KCmludCBmb28g KCkKewogcmV0dXJuIDA7Cn0KCmludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0 KCJhdngscG9wY250IikpKQpmb28gKCkKewogcmV0dXJuIDA7Cn0KCmludCBf X2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWNvcmUyLHNzc2UzIikpKQpm b28gKCkKewogcmV0dXJuIDA7Cn0KClRoZSBhYm92ZSBleGFtcGxlIGhhcyBm b28gZGVmaW5lZCAzIHRpbWVzLCBidXQgYWxsIDMgZGVmaW5pdGlvbnMgb2Yg Zm9vIGFyZQpkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgZnVuY3Rp b24uIFRoZSBjYWxsIHRvIGZvbyBpbiBtYWluLCBkaXJlY3RseSBhbmQKdmlh IGEgcG9pbnRlciwgYXJlIGNhbGxzIHRvIHRoZSBtdWx0aS12ZXJzaW9uZWQg ZnVuY3Rpb24gZm9vIHdoaWNoIGlzIGRpc3BhdGNoZWQKdG8gdGhlIHJpZ2h0 IGZvbyBhdCBydW4tdGltZS4KCkZyb250LWVuZCBjaGFuZ2VzOgoKVGhlIGZy b250LWVuZCBjaGFuZ2VzIGFyZSBjYWxscyBhdCBhcHByb3ByaWF0ZSBwbGFj ZXMgdG8gdGFyZ2V0IGhvb2tzIHRoYXQKZGV0ZXJtaW5lIHRoZSBmb2xsb3dp bmc6CgoqIERldGVybWluZSBpZiB0d28gZnVuY3Rpb24gZGVjbHMgd2l0aCB0 aGUgc2FtZSBzaWduYXR1cmUgYXJlIHZlcnNpb25zLgoqIERldGVybWluZSB0 aGUgYXNzZW1ibGVyIG5hbWUgb2YgYSBmdW5jdGlvbiB2ZXJzaW9uLgoqIEdl bmVyYXRlIHRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uIGZvciBhIHNldCBvZiBm dW5jdGlvbiB2ZXJzaW9ucy4KKiBDb21wYXJlIHZlcnNpb25zIHRvIHNlZSBp ZiBvbmUgaGFzIGEgaGlnaGVyIHByaW9yaXR5IG92ZXIgdGhlIG90aGVyLgoK QWxsIHRoZSBpbXBsZW1lbnRhdGlvbiBoYXBwZW5zIGluIHRoZSB0YXJnZXQt c3BlY2lmaWMgY29uZmlnL2kzODYvaTM4Ni5jLgoKV2hhdCBkb2VzIHRoZSBw YXRjaCBkbz8KCiogVHJhY2tpbmcgZGVjbHMgdGhhdCBjb3JyZXNwb25kIHRv IGZ1bmN0aW9uIHZlcnNpb25zIG9mIGZ1bmN0aW9uCm5hbWUsIHNheSAiZm9v IjoKCldoZW4gdGhlIGZyb250LWVuZCBzZWVzIG1vcmUgdGhhbiBvbmUgZGVj bCBmb3IgImZvbyIsIGl0IGNhbGxzIGEgdGFyZ2V0IGhvb2sgdG8KZGV0ZXJt aW5lIGlmIHRoZXkgYXJlIHZlcnNpb25zLiBUbyBwcmV2ZW50IGR1cGxpY2F0 ZSBkZWZpbml0aW9uIGVycm9ycyB3aXRoIG90aGVyCiB2ZXJzaW9ucyBvZiAi Zm9vIiwgImRlY2xzX21hdGNoIiBmdW5jdGlvbiBpbiBjcC9kZWNsLmMgaXMg bWFkZSB0byByZXR1cm4gZmFsc2UKIHdoZW4gMiBkZWNscyBoYXZlIGFyZSBk ZWVtZWQgdmVyc2lvbnMgYnkgdGhlIHRhcmdldC4gVGhpcyB3aWxsIG1ha2Ug YWxsIGZ1bmN0aW9uCnZlcnNpb25zIG9mICJmb28iIHRvIGJlIGFkZGVkIHRv IHRoZSBvdmVybG9hZCBsaXN0IG9mICJmb28iLgoKKiBDaGFuZ2UgdGhlIGFz c2VtYmxlciBuYW1lcyBvZiB0aGUgZnVuY3Rpb24gdmVyc2lvbnMuCgpGb3Ig aTM4NiwgdGhlIHRhcmdldCBjaGFuZ2VzIHRoZSBhc3NlbWJsZXIgbmFtZXMg b2YgdGhlIGZ1bmN0aW9uIHZlcnNpb25zIGJ5CiBzdWZmaXhpbmcgdGhlIHNv cnRlZCBsaXN0IG9mIGFyZ3MgdG8gInRhcmdldCIgdG8gdGhlIGZ1bmN0aW9u IG5hbWUgb2YgImZvbyIuIEZvcgpleGFtcGxlLCBoZSBhc3NlbWJsZXIgbmFt ZSBvZiAidm9pZCBmb28gKCkgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCAoInNz ZTQiKSkpIiB3aWxsCmJlY29tZSBfWjNmb292LnNzZTQuICBUaGUgdGFyZ2V0 IGhvb2sgbWFuZ2xlX2RlY2xfYXNzZW1ibGVyX25hbWUgaXMgdXNlZCBmb3Ig dGhpcy4KCiogT3ZlcmxvYWQgcmVzb2x1dGlvbjoKCiBGdW5jdGlvbiAiYnVp bGRfb3Zlcl9jYWxsIiBpbiBjcC9jYWxsLmMgc2VlcyBhIGNhbGwgdG8gZnVu Y3Rpb24KImZvbyIsIHdoaWNoIGlzIG11bHRpLXZlcnNpb25lZC4gVGhlIG92 ZXJsb2FkIHJlc29sdXRpb24gaGFwcGVucyBpbgpmdW5jdGlvbiAiam91c3Qi IGluICJjcC9jYWxsLmMiLiBIZXJlLCB0aGUgY2FsbCB0byAiZm9vIiBoYXMg YWxsCnBvc3NpYmxlIHZlcnNpb25zIG9mICJmb28iIGFzIGNhbmRpZGF0ZXMu IEFsbCB0aGUgY2FuZGlkYXRlcyBvZiAiZm9vIiBhcmUKc3RvcmVkIGluIHRo ZSBjZ3JhcGggZGF0YSBzdHJ1Y3R1cmVzLiBFYWNoIHZlcnNpb24gb2YgZm9v IGlzIGNoYWluZWQgaW4gYSAKZG91Ymx5LWxpbmtlZCBsaXN0IHdpdGggdGhl IGRlZmF1bHQgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGVsZW1lbnQuICBUaGlz IGFsbG93cwphbnkgcGFzcyB0byBhY2Nlc3MgYWxsIHRoZSBzZW1hbnRpY2Fs bHkgaWRlbnRpY2FsIHZlcnNpb25zLiBBIGNhbGwgdG8gYQptdWx0aS12ZXJz aW9uZWQgZnVuY3Rpb24gd2lsbCBiZSByZXBsYWNlZCBieSBhIGNhbGwgdG8g YSBkaXNwYXRjaGVyIGZ1bmN0aW9uLApkZXRlcm1pbmVkIGJ5IGEgdGFyZ2V0 IGhvb2ssIHRvIGV4ZWN1dGUgdGhlIHJpZ2h0IGZ1bmN0aW9uIHZlcnNpb24g YXQgcnVuLXRpbWUuCgpPcHRpbWl6YXRpb24gdG8gZGlyZWN0bHkgY2FsbCBh IHZlcnNpb24gd2hlbiBwb3NzaWJsZToKQWxzbywgaW4gam91c3QsIHdoZXJl IG92ZXJsb2FkIHJlc29sdXRpb24gaGFwcGVucywgYSBtdWx0aXZlcnNpb25l ZCBmdW5jdGlvbgpyZXNvbHV0aW9uIGlzIG1hZGUgdG8gcmV0dXJuIHRoZSBt b3N0IHNwZWNpYWxpemVkIHZlcnNpb24uICBUaGlzIGlzIHRoZSB2ZXJzaW9u CnRoYXQgd2lsbCBiZSBjaGVja2VkIGZvciBkaXNwYXRjaGluZyBmaXJzdCBh bmQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdGFyZ2V0LgpOb3csIGlmIHRoZSBj YWxsZXIgY2FuIGlubGluZSB0aGlzIGZ1bmN0aW9uIHZlcnNpb24gdGhlbiBh IGRpcmVjdCBjYWxsIGlzIG1hZGUKdG8gdGhpcyBmdW5jdGlvbiB2ZXJzaW9u IHJhdGhlciB0aGFuIGdvIHRocm91Z2ggdGhlIGRpc3BhdGNoZXIuIFdoZW4g YSBkaXJlY3QKY2FsbCBjYW5ub3QgYmUgbWFkZSwgYSBjYWxsIHRvIHRoZSBk aXNwYXRjaGVyIGZ1bmN0aW9uIGlzIGNyZWF0ZWQuCgoqIENyZWF0aW5nIHRo ZSBkaXNwYXRjaGVyIGJvZHkuCgpUaGUgZGlzcGF0Y2hlciBib2R5LCBjYWxs ZWQgdGhlIHJlc29sdmVyIGlzIG1hZGUgb25seSB3aGVuIHRoZXJlIGlzIGEg Y2FsbCB0byBhCm11bHRpdmVyc2lvbmVkIGZ1bmN0aW9uIGRpc3BhdGNoZXIg b3IgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiBpcyB0YWtlbi4gVGhpcwpp cyBnZW5lcmF0ZWQgZHVyaW5nIGJ1aWxkX2NncmFwaF9lZGdlcyBmb3IgYSBj YWxsIG9yIGNncmFwaF9tYXJrX2FkZHJlc3NfdGFrZW4KZm9yIGEgcG9pbnRl ciByZWZlcmVuY2UuIFRoaXMgaXMgZG9uZSBieSBhbm90aGVyIHRhcmdldCBo b29rLgoKKiBEaXNwYXRjaCBvcmRlcmluZy4KClRoZSBvcmRlciBpbiB3aGlj aCB0aGUgZnVuY3Rpb24gdmVyc2lvbnMgYXJlIGNoZWNrZWQgZHVyaW5nIGRp c3BhdGNoIGlzIGJhc2VkCm9uIGEgcHJpb3JpdHkgdmFsdWUgYXNzaWduZWQg Zm9yIHRoZSBJU0EgdGhhdCBpcyBjYXRlcmVkLiBNb3JlIHNwZWNpYWxpemVk IAp2ZXJzaW9ucyBhcmUgY2hlY2tlZCBmb3IgZGlzcGF0Y2hpbmcgZmlyc3Qu ICBUaGlzIGlzIHRvIG1pdGlnYXRlIHRoZSBhbWJpZ3VpdHkKdGhhdCBjYW4g YXJpc2Ugd2hlbiBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIHZlcnNpb24gaXMg dmFsaWQgZm9yIGV4ZWN1dGlvbiBvbgphIHBhcnRpY3VsYXIgcGxhdGZvcm0u ICBUaGlzIGlzIG5vdCBhIHBlcmZlY3Qgc29sdXRpb24gYW5kIGluIGZ1dHVy ZSwgdGhlIHVzZXIKc2hvdWxkIGJlIGFsbG93ZWQgdG8gYXNzaWduIGEgZGlz cGF0Y2hpbmcgcHJpb3JpdHkgdmFsdWUgdG8gZWFjaCB2ZXJzaW9uLgoKCSog ZG9jL3RtLnRleGkuaW4gKFRBUkdFVF9PUFRJT05fRlVOQ1RJT05fVkVSU0lP TlMpOiBOZXcgaG9vayBkZXNjcmlwdGlvbi4KCSogKFRBUkdFVF9DT01QQVJF X1ZFUlNJT05fUFJJT1JJVFkpOiBOZXcgaG9vayBkZXNjcmlwdGlvbi4KCSog KFRBUkdFVF9HRVRfRlVOQ1RJT05fVkVSU0lPTlNfRElTUEFUQ0hFUik6IE5l dyBob29rIGRlc2NyaXB0aW9uLgoJKiAoVEFSR0VUX0dFTkVSQVRFX1ZFUlNJ T05fRElTUEFUQ0hFUl9CT0RZKTogTmV3IGhvb2sgZGVzY3JpcHRpb24uCgkq IGRvYy90bS50ZXhpOiBSZWdlbmVyYXRlLgoJKiBjZ3JhcGhidWlsZC5jIChi dWlsZF9jZ3JhcGhfZWRnZXMpOiBHZW5lcmF0ZSBib2R5IG9mIG11bHRpdmVy c2lvbgoJZnVuY3Rpb24gZGlzcGF0Y2hlci4KCSogYy1mYW1pbHkvYy1jb21t b24uYyAoaGFuZGxlX3RhcmdldF9hdHRyaWJ1dGUpOiBXYXJuIGZvciBpbnZh bGlkIGF0dHJpYnV0ZXMuCgkqIHRhcmdldC5kZWYgKGNvbXBhcmVfdmVyc2lv bl9wcmlvcml0eSk6IE5ldyB0YXJnZXQgaG9vay4KCSogKGdlbmVyYXRlX3Zl cnNpb25fZGlzcGF0Y2hlcl9ib2R5KTogTmV3IHRhcmdldCBob29rLgoJKiAo Z2V0X2Z1bmN0aW9uX3ZlcnNpb25zX2Rpc3BhdGNoZXIpOiBOZXcgdGFyZ2V0 IGhvb2suCgkqIChmdW5jdGlvbl92ZXJzaW9ucyk6IE5ldyB0YXJnZXQgaG9v ay4KCSogY2dyYXBoLmMgKGNncmFwaF9tYXJrX2FkZHJlc3NfdGFrZW5fbm9k ZSk6IEdlbmVyYXRlIGJvZHkgb2YgbXVsdGl2ZXJzaW9uCglmdW5jdGlvbiBk aXNwYXRjaGVyLgoJKiBjZ3JhcGguaCAoY2dyYXBoX25vZGUpOiBOZXcgbWVt YmVycyB2ZXJzaW9uX2Rpc3BhdGNoZXJfZGVjbCwKCXByZXZfZnVuY3Rpb25f dmVyc2lvbiwgbmV4dF9mdW5jdGlvbl92ZXJzaW9uLCBkaXNwYXRjaGVyX2Z1 bmN0aW9uLgoJKiB0cmVlLmggKERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEKTog TmV3IG1hY3JvLgoJKHRyZWVfZnVuY3Rpb25fZGVjbCk6IE5ldyBiaXQtZmll bGQgdmVyc2lvbmVkX2Z1bmN0aW9uLgoJKiB0ZXN0c3VpdGUvZysrLmRnL212 MS5DOiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2crKy5kZy9tdjIuQzogTmV3 IHRlc3QuCgkqIHRlc3RzdWl0ZS9nKysuZGcvbXYzLkM6IE5ldyB0ZXN0LgoJ KiB0ZXN0c3VpdGUvZysrLmRnL212NC5DOiBOZXcgdGVzdC4KCSogY3AvY2xh c3MuYzoKCShhZGRfbWV0aG9kKTogQ2hhbmdlIGFzc2VtYmxlciBuYW1lcyBv ZiBmdW5jdGlvbiB2ZXJzaW9ucy4KCShyZXNvbHZlX2FkZHJlc3Nfb2Zfb3Zl cmxvYWRlZF9mdW5jdGlvbik6IFNhdmUgYWxsIGZ1bmN0aW9uCgl2ZXJzaW9u IGNhbmRpZGF0ZXMuIENyZWF0ZSBkaXNwYXRjaGVyIGRlY2wgYW5kIHJldHVy biBhZGRyZXNzIG9mCglkaXNwYXRjaGVyIGluc3RlYWQuCgkqIGNwL2RlY2wu YyAoZGVjbHNfbWF0Y2gpOiBNYWtlIGRlY2xzIHVubWF0Y2hlZCBmb3IgdmVy c2lvbmVkCglmdW5jdGlvbnMuCgkoZHVwbGljYXRlX2RlY2xzKTogUmVtb3Zl IGFtYmlndWl0eSBmb3IgdmVyc2lvbmVkIGZ1bmN0aW9ucy4gCgkoY3h4X2Nv bWRhdF9ncm91cCk6IE1ha2UgY29tZGF0IGdyb3VwIG9mIHZlcnNpb25lZCBm dW5jdGlvbnMgYmUgdGhlCglzYW1lLgoJKiBjcC9lcnJvci5jIChkdW1wX2V4 Y2VwdGlvbl9zcGVjKTogRHVtcCBhc3NlbWJsZXIgbmFtZSBmb3IgZnVuY3Rp b24KCXZlcnNpb25zLgoJKiBjcC9zZW1hbnRpY3MuYyAoZXhwYW5kX29yX2Rl ZmVyX2ZuXzEpOiBNYXJrIGFzIG5lZWRlZCB2ZXJzaW9uZWQKCWZ1bmN0aW9u cyB0aGF0IGFyZSBhbHNvIG1hcmtlZCBpbmxpbmUuCgkqIGNwL2RlY2wyLmM6 KGNoZWNrX2NsYXNzZm4pOiBDaGVjayBhdHRyaWJ1dGVzIG9mIHZlcnNpb25l ZCBmdW5jdGlvbnMKCWZvciBtYXRjaC4KCSogY3AvY2FsbC5jOiAoYnVpbGRf bmV3X2Z1bmN0aW9uX2NhbGwpOiBDaGVjayBpZiB2ZXJzaW9uZWQgZnVuY3Rp b25zCgloYXZlIGEgZGVmYXVsdCB2ZXJzaW9uLgoJKGJ1aWxkX292ZXJfY2Fs bCk6IE1ha2UgY2FsbHMgdG8gbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb25zCgl0 byBjYWxsIHRoZSBkaXNwYXRjaGVyLgoJKGpvdXN0KTogRm9yIGNhbGxzIHRv IG11bHRpLXZlcnNpb25lZCBmdW5jdGlvbnMsIG1ha2UgdGhlIG1vc3QKCXNw ZWNpYWxpemVkIGZ1bmN0aW9uIHZlcnNpb24gd2luLgoJKHRvdXJuZXkpOiBH ZW5lcmF0ZSBkaXNwYXRjaGVyIGRlY2wgZm9yIGZ1bmN0aW9uIHZlcnNpb25z LgoJKGdldF9mdW5jdGlvbl92ZXJzaW9uX2Rpc3BhdGNoZXIpOiBOZXcgZnVu Y3Rpb24uCgkoZ2VuZXJhdGVfZnVuY3Rpb25fdmVyc2lvbnNfZGlzcGF0Y2hl cik6IE5ldyBmdW5jdGlvbi4KCSogTWFrZWZpbGUuaW46IEFkZCBtdWx0aXZl cnNpb24ubwoJKiBjb25maWcvaTM4Ni9pMzg2LmMgKGFkZF9jb25kaXRpb25f dG9fYmIpOiBOZXcgZnVuY3Rpb24uCgkoZ2V0X2J1aWx0aW5fY29kZV9mb3Jf dmVyc2lvbik6IE5ldyBmdW5jdGlvbi4KCShpeDg2X2NvbXBhcmVfdmVyc2lv bl9wcmlvcml0eSk6IE5ldyBmdW5jdGlvbi4KCShmZWF0dXJlX2NvbXBhcmUp OiBOZXcgZnVuY3Rpb24uCgkoZGlzcGF0Y2hfZnVuY3Rpb25fdmVyc2lvbnMp OiBOZXcgZnVuY3Rpb24uCgkqIChpeDg2X2Z1bmN0aW9uX3ZlcnNpb25zKTog TmV3IGZ1bmN0aW9uLgoJKiAoYXR0cl9zdHJjbXApOiBOZXcgZnVuY3Rpb24u CgkqIChzb3J0ZWRfYXR0cl9zdHJpbmcpOiBOZXcgZnVuY3Rpb24uCgkqIChp eDg2X21hbmdsZV9mdW5jdGlvbl92ZXJzaW9uX2Fzc2VtYmxlcl9uYW1lKTog TmV3IGZ1bmN0aW9uLgoJKiAoaXg4Nl9tYW5nbGVfZGVjbF9hc3NlbWJsZXJf bmFtZSk6IE5ldyBmdW5jdGlvbi4KCSogKG1ha2VfbmFtZSk6IE5ldyBmdW5j dGlvbi4KCSogKG1ha2VfZGlzcGF0Y2hlcl9kZWNsKTogTmV3IGZ1bmN0aW9u LgoJKiAoaXNfZnVuY3Rpb25fZGVmYXVsdF92ZXJzaW9uKTogTmV3IGZ1bmN0 aW9uLgoJKiAoaXg4Nl9nZXRfZnVuY3Rpb25fdmVyc2lvbnNfZGlzcGF0Y2hl cik6IE5ldyBmdW5jdGlvbi4KCSogKG1ha2VfYXR0cmlidXRlKTogTmV3IGZ1 bmN0aW9uLgoJKiAobWFrZV9yZXNvbHZlcl9mdW5jKTogTmV3IGZ1bmN0aW9u LgoJKiAoaXg4Nl9nZW5lcmF0ZV92ZXJzaW9uX2Rpc3BhdGNoZXJfYm9keSk6 IE5ldyBmdW5jdGlvbi4KCSogKFRBUkdFVF9DT01QQVJFX1ZFUlNJT05fUFJJ T1JJVFkpOiBOZXcgbWFjcm8uCgkqIChUQVJHRVRfR0VUX0ZVTkNUSU9OX1ZF UlNJT05TX0RJU1BBVENIRVIpOiBOZXcgbWFjcm8uCgkqIChUQVJHRVRfR0VO RVJBVEVfVkVSU0lPTl9ESVNQQVRDSEVSX0JPRFkpOiBOZXcgbWFjcm8uCgkq IChUQVJHRVRfT1BUSU9OX0ZVTkNUSU9OX1ZFUlNJT05TKTogTmV3IG1hY3Jv LgoJKiAoVEFSR0VUX01BTkdMRV9ERUNMX0FTU0VNQkxFUl9OQU1FKTogTmV3 IG1hY3JvLgoJCgpJbmRleDogZ2NjL2RvYy90bS50ZXhpCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIGdjYy9kb2MvdG0udGV4aQkocmV2aXNpb24gMTkw NDkzKQorKysgZ2NjL2RvYy90bS50ZXhpCSh3b3JraW5nIGNvcHkpCkBAIC05 ODk0LDYgKzk4OTQsMTEgQEAgY2hhbmdlZCB2aWEgdGhlIG9wdGltaXplIGF0 dHJpYnV0ZSBvciBwcmFnbWEsIHNlZQogQGNvZGV7VEFSR0VUX09WRVJSSURF X09QVElPTlNfQUZURVJfQ0hBTkdFfQogQGVuZCBkZWZ0eXBlZm4KIAorQGRl ZnR5cGVmbiB7VGFyZ2V0IEhvb2t9IGJvb2wgVEFSR0VUX09QVElPTl9GVU5D VElPTl9WRVJTSU9OUyAodHJlZSBAdmFye2RlY2wxfSwgdHJlZSBAdmFye2Rl Y2wyfSkKK1RoaXMgdGFyZ2V0IGhvb2sgcmV0dXJucyBAY29kZXt0cnVlfSBp ZiBAdmFye0ZOMX0gYW5kIEB2YXJ7Rk4yfSBhcmUKK3ZlcnNpb25zIG9mIHRo ZSBzYW1lIGZ1bmN0aW9uLgorQGVuZCBkZWZ0eXBlZm4KKwogQGRlZnR5cGVm biB7VGFyZ2V0IEhvb2t9IGJvb2wgVEFSR0VUX0NBTl9JTkxJTkVfUCAodHJl ZSBAdmFye2NhbGxlcn0sIHRyZWUgQHZhcntjYWxsZWV9KQogVGhpcyB0YXJn ZXQgaG9vayByZXR1cm5zIEBjb2Rle2ZhbHNlfSBpZiB0aGUgQHZhcntjYWxs ZXJ9IGZ1bmN0aW9uCiBjYW5ub3QgaW5saW5lIEB2YXJ7Y2FsbGVlfSwgYmFz ZWQgb24gdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uLiAgQnkKQEAgLTEw OTI1LDYgKzEwOTMwLDI3IEBAIFRoZSByZXN1bHQgaXMgYW5vdGhlciB0cmVl IGNvbnRhaW5pbmcgYSBzaW1wbGlmaWVkCiBjYWxsJ3MgcmVzdWx0LiAgSWYg QHZhcntpZ25vcmV9IGlzIHRydWUgdGhlIHZhbHVlIHdpbGwgYmUgaWdub3Jl ZC4KIEBlbmQgZGVmdHlwZWZuCiAKK0BkZWZ0eXBlZm4ge1RhcmdldCBIb29r fSBpbnQgVEFSR0VUX0NPTVBBUkVfVkVSU0lPTl9QUklPUklUWSAodHJlZSBA dmFye2RlY2wxfSwgdHJlZSBAdmFye2RlY2wyfSkKK1RoaXMgaG9vayBpcyB1 c2VkIHRvIGNvbXBhcmUgdGhlIHRhcmdldCBhdHRyaWJ1dGVzIGluIHR3byBm dW5jdGlvbnMgdG8KK2ZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24ncyBmZWF0 dXJlcyBnZXQgaGlnaGVyIHByaW9yaXR5LiAgVGhpcyBpcyB1c2VkCitkdXJp bmcgbXVsdGktdmVyc2lvbmluZyB0byBmaWd1cmUgb3V0IHRoZSBvcmRlciBv ZiBkaXNwYXRjaGluZy4gQHZhcntkZWNsMX0KK2FuZCBAdmFye2RlY2wyfSBh cmUgdGhlIHR3byBmdW5jdGlvbiBkZWNscyB0aGF0IHdpbGwgYmUgY29tcGFy ZWQuCitAZW5kIGRlZnR5cGVmbgorCitAZGVmdHlwZWZuIHtUYXJnZXQgSG9v a30gdHJlZSBUQVJHRVRfR0VUX0ZVTkNUSU9OX1ZFUlNJT05TX0RJU1BBVENI RVIgKHZvaWQgKkB2YXJ7YXJnbGlzdH0pCitUaGlzIGhvb2sgaXMgdXNlZCB0 byBnZXQgdGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24gZm9yIGEgc2V0IG9mIGZ1 bmN0aW9uCit2ZXJzaW9ucy4gIFRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uIGlz IGNhbGxlZCB0byBpbnZva2UgdGhlIHJpZ250IGZ1bmN0aW9uCit2ZXJzaW9u IGF0IHJ1bi10aW1lLiBAdmFye2FyZ2xpc3R9IGlzIHRoZSB2ZWN0b3Igb2Yg ZnVuY3Rpb24gdmVyc2lvbnMKK3RoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQg Zm9yIGRpc3BhdGNoLgorQGVuZCBkZWZ0eXBlZm4KKworQGRlZnR5cGVmbiB7 VGFyZ2V0IEhvb2t9IHRyZWUgVEFSR0VUX0dFTkVSQVRFX1ZFUlNJT05fRElT UEFUQ0hFUl9CT0RZICh2b2lkICpAdmFye2FyZ30pCitUaGlzIGhvb2sgaXMg dXNlZCB0byBnZW5lcmF0ZSB0aGUgZGlzcGF0Y2hlciBsb2dpYyB0byBpbnZv a2UgdGhlIHJpZ2h0CitmdW5jdGlvbiB2ZXJzaW9uIGF0IHJ1bnRpbWUgZm9y IGEgZ2l2ZW4gc2V0IG9mIGZ1bmN0aW9uIHZlcnNpb25zLgorQHZhcnthcmd9 IHBvaW50cyB0byB0aGUgY2FsbGdyYXBoIG5vZGUgb2YgdGhlIGRpc3BhdGNo ZXIgZnVuY3Rpb24gd2hvc2UKK2JvZHkgbXVzdCBiZSBnZW5lcmF0ZWQuCitA ZW5kIGRlZnR5cGVmbgorCiBAZGVmdHlwZWZuIHtUYXJnZXQgSG9va30ge2Nv bnN0IGNoYXIgKn0gVEFSR0VUX0lOVkFMSURfV0lUSElOX0RPTE9PUCAoY29u c3RfcnR4IEB2YXJ7aW5zbn0pCiAKIFRha2UgYW4gaW5zdHJ1Y3Rpb24gaW4g QHZhcntpbnNufSBhbmQgcmV0dXJuIE5VTEwgaWYgaXQgaXMgdmFsaWQgd2l0 aGluIGEKSW5kZXg6IGdjYy9kb2MvdG0udGV4aS5pbgo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBnY2MvZG9jL3RtLnRleGkuaW4JKHJldmlzaW9uIDE5 MDQ5MykKKysrIGdjYy9kb2MvdG0udGV4aS5pbgkod29ya2luZyBjb3B5KQpA QCAtOTc2Myw2ICs5NzYzLDExIEBAIGNoYW5nZWQgdmlhIHRoZSBvcHRpbWl6 ZSBhdHRyaWJ1dGUgb3IgcHJhZ21hLCBzZWUKIEBjb2Rle1RBUkdFVF9PVkVS UklERV9PUFRJT05TX0FGVEVSX0NIQU5HRX0KIEBlbmQgZGVmdHlwZWZuCiAK K0Bob29rIFRBUkdFVF9PUFRJT05fRlVOQ1RJT05fVkVSU0lPTlMKK1RoaXMg dGFyZ2V0IGhvb2sgcmV0dXJucyBAY29kZXt0cnVlfSBpZiBAdmFye0ZOMX0g YW5kIEB2YXJ7Rk4yfSBhcmUKK3ZlcnNpb25zIG9mIHRoZSBzYW1lIGZ1bmN0 aW9uLgorQGVuZCBkZWZ0eXBlZm4KKwogQGhvb2sgVEFSR0VUX0NBTl9JTkxJ TkVfUAogVGhpcyB0YXJnZXQgaG9vayByZXR1cm5zIEBjb2Rle2ZhbHNlfSBp ZiB0aGUgQHZhcntjYWxsZXJ9IGZ1bmN0aW9uCiBjYW5ub3QgaW5saW5lIEB2 YXJ7Y2FsbGVlfSwgYmFzZWQgb24gdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0 aW9uLiAgQnkKQEAgLTEwNzgzLDYgKzEwNzg4LDI3IEBAIFRoZSByZXN1bHQg aXMgYW5vdGhlciB0cmVlIGNvbnRhaW5pbmcgYSBzaW1wbGlmaWVkCiBjYWxs J3MgcmVzdWx0LiAgSWYgQHZhcntpZ25vcmV9IGlzIHRydWUgdGhlIHZhbHVl IHdpbGwgYmUgaWdub3JlZC4KIEBlbmQgZGVmdHlwZWZuCiAKK0Bob29rIFRB UkdFVF9DT01QQVJFX1ZFUlNJT05fUFJJT1JJVFkKK1RoaXMgaG9vayBpcyB1 c2VkIHRvIGNvbXBhcmUgdGhlIHRhcmdldCBhdHRyaWJ1dGVzIGluIHR3byBm dW5jdGlvbnMgdG8KK2ZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24ncyBmZWF0 dXJlcyBnZXQgaGlnaGVyIHByaW9yaXR5LiAgVGhpcyBpcyB1c2VkCitkdXJp bmcgbXVsdGktdmVyc2lvbmluZyB0byBmaWd1cmUgb3V0IHRoZSBvcmRlciBv ZiBkaXNwYXRjaGluZy4gQHZhcntkZWNsMX0KK2FuZCBAdmFye2RlY2wyfSBh cmUgdGhlIHR3byBmdW5jdGlvbiBkZWNscyB0aGF0IHdpbGwgYmUgY29tcGFy ZWQuCitAZW5kIGRlZnR5cGVmbgorCitAaG9vayBUQVJHRVRfR0VUX0ZVTkNU SU9OX1ZFUlNJT05TX0RJU1BBVENIRVIKK1RoaXMgaG9vayBpcyB1c2VkIHRv IGdldCB0aGUgZGlzcGF0Y2hlciBmdW5jdGlvbiBmb3IgYSBzZXQgb2YgZnVu Y3Rpb24KK3ZlcnNpb25zLiAgVGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24gaXMg Y2FsbGVkIHRvIGludm9rZSB0aGUgcmlnbnQgZnVuY3Rpb24KK3ZlcnNpb24g YXQgcnVuLXRpbWUuIEB2YXJ7YXJnbGlzdH0gaXMgdGhlIHZlY3RvciBvZiBm dW5jdGlvbiB2ZXJzaW9ucwordGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBm b3IgZGlzcGF0Y2guCitAZW5kIGRlZnR5cGVmbgorCitAaG9vayBUQVJHRVRf R0VORVJBVEVfVkVSU0lPTl9ESVNQQVRDSEVSX0JPRFkKK1RoaXMgaG9vayBp cyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkaXNwYXRjaGVyIGxvZ2ljIHRvIGlu dm9rZSB0aGUgcmlnaHQKK2Z1bmN0aW9uIHZlcnNpb24gYXQgcnVudGltZSBm b3IgYSBnaXZlbiBzZXQgb2YgZnVuY3Rpb24gdmVyc2lvbnMuCitAdmFye2Fy Z30gcG9pbnRzIHRvIHRoZSBjYWxsZ3JhcGggbm9kZSBvZiB0aGUgZGlzcGF0 Y2hlciBmdW5jdGlvbiB3aG9zZQorYm9keSBtdXN0IGJlIGdlbmVyYXRlZC4K K0BlbmQgZGVmdHlwZWZuCisKIEBob29rIFRBUkdFVF9JTlZBTElEX1dJVEhJ Tl9ET0xPT1AKIAogVGFrZSBhbiBpbnN0cnVjdGlvbiBpbiBAdmFye2luc259 IGFuZCByZXR1cm4gTlVMTCBpZiBpdCBpcyB2YWxpZCB3aXRoaW4gYQpJbmRl eDogZ2NjL2NncmFwaGJ1aWxkLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gZ2NjL2NncmFwaGJ1aWxkLmMJKHJldmlzaW9uIDE5MDQ5MykKKysrIGdj Yy9jZ3JhcGhidWlsZC5jCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3 IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJ ZiBub3Qgc2VlCiAjaW5jbHVkZSAiaXBhLXV0aWxzLmgiCiAjaW5jbHVkZSAi ZXhjZXB0LmgiCiAjaW5jbHVkZSAiaXBhLWlubGluZS5oIgorI2luY2x1ZGUg InRhcmdldC5oIgogCiAvKiBDb250ZXh0IG9mIHJlY29yZF9yZWZlcmVuY2Uu ICAqLwogc3RydWN0IHJlY29yZF9yZWZlcmVuY2VfY3R4CkBAIC0yODgsNyAr Mjg5LDYgQEAgbWFya19zdG9yZSAoZ2ltcGxlIHN0bXQsIHRyZWUgdCwgdm9p ZCAqZGF0YSkKICAgICAgfQogICByZXR1cm4gZmFsc2U7CiB9Ci0KIC8qIENy ZWF0ZSBjZ3JhcGggZWRnZXMgZm9yIGZ1bmN0aW9uIGNhbGxzLgogICAgQWxz byBsb29rIGZvciBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBoYXZpbmcgYWRk cmVzc2VzIHRha2VuLiAgKi8KIApAQCAtMzE3LDggKzMxNywyMiBAQCBidWls ZF9jZ3JhcGhfZWRnZXMgKHZvaWQpCiAJCQkJCQkJIGJiKTsKIAkgICAgICBk ZWNsID0gZ2ltcGxlX2NhbGxfZm5kZWNsIChzdG10KTsKIAkgICAgICBpZiAo ZGVjbCkKLQkJY2dyYXBoX2NyZWF0ZV9lZGdlIChub2RlLCBjZ3JhcGhfZ2V0 X2NyZWF0ZV9ub2RlIChkZWNsKSwKLQkJCQkgICAgc3RtdCwgYmItPmNvdW50 LCBmcmVxKTsKKwkJeworCQkgIHN0cnVjdCBjZ3JhcGhfbm9kZSAqY2FsbGVl ID0gY2dyYXBoX2dldF9jcmVhdGVfbm9kZSAoZGVjbCk7CisJICAgICAgICAg IC8qIElmIGEgY2FsbCB0byBhIG11bHRpdmVyc2lvbmVkIGZ1bmN0aW9uIGRp c3BhdGNoZXIgaXMKKwkJICAgICBmb3VuZCwgZ2VuZXJhdGUgdGhlIGJvZHkg dG8gZGlzcGF0Y2ggdGhlIHJpZ2h0IGZ1bmN0aW9uCisJCSAgICAgYXQgcnVu LXRpbWUuICAqLworCQkgIGlmIChjYWxsZWUtPmRpc3BhdGNoZXJfZnVuY3Rp b24pCisJCSAgICB7CisJCSAgICAgIHRyZWUgcmVzb2x2ZXJfZGVjbDsKKwkJ ICAgICAgZ2NjX2Fzc2VydCAoY2FsbGVlLT5uZXh0X2Z1bmN0aW9uX3ZlcnNp b24pOworCQkgICAgICBnY2NfYXNzZXJ0ICh0YXJnZXRtLmdlbmVyYXRlX3Zl cnNpb25fZGlzcGF0Y2hlcl9ib2R5KTsKKwkJICAgICAgcmVzb2x2ZXJfZGVj bAorCQkJID0gdGFyZ2V0bS5nZW5lcmF0ZV92ZXJzaW9uX2Rpc3BhdGNoZXJf Ym9keSAoY2FsbGVlKTsKKwkJICAgICAgZ2NjX2Fzc2VydCAocmVzb2x2ZXJf ZGVjbCAhPSBOVUxMX1RSRUUpOworCQkgICAgfQorCQkgIGNncmFwaF9jcmVh dGVfZWRnZSAobm9kZSwgY2FsbGVlLCBzdG10LCBiYi0+Y291bnQsIGZyZXEp OworCSAgICAgICAgfQogCSAgICAgIGVsc2UKIAkJY2dyYXBoX2NyZWF0ZV9p bmRpcmVjdF9lZGdlIChub2RlLCBzdG10LAogCQkJCQkgICAgIGdpbXBsZV9j YWxsX2ZsYWdzIChzdG10KSwKSW5kZXg6IGdjYy9jLWZhbWlseS9jLWNvbW1v bi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jLWZhbWlseS9j LWNvbW1vbi5jCShyZXZpc2lvbiAxOTA0OTMpCisrKyBnY2MvYy1mYW1pbHkv Yy1jb21tb24uYwkod29ya2luZyBjb3B5KQpAQCAtODUwMiw5ICs4NTAyLDIy IEBAIGhhbmRsZV90YXJnZXRfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVl IG5hbWUsIHRyCiAgICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsICIl cUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKICAgICAgICpub19hZGRf YXR0cnMgPSB0cnVlOwogICAgIH0KLSAgZWxzZSBpZiAoISB0YXJnZXRtLnRh cmdldF9vcHRpb24udmFsaWRfYXR0cmlidXRlX3AgKCpub2RlLCBuYW1lLCBh cmdzLAotCQkJCQkJICAgICAgZmxhZ3MpKQotICAgICpub19hZGRfYXR0cnMg PSB0cnVlOworICBlbHNlCisgICAgeworICAgICAgLyogV2hlbiBhIHRhcmdl dCBhdHRyaWJ1dGUgaXMgaW52YWxpZCwgaXQgbWF5IGFsc28gYmUgYmVjYXVz ZSB0aGUKKwkgdGFyZ2V0IGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQg dGhlIGF0dHJpYnV0ZSBtYXRjaC4gIEZvcgorICAgICAgICAgaW5zdGFuY2Us IHRhcmdldCBhdHRyaWJ1dGUgInh4eCIgaXMgaW52YWxpZCB3aGVuIC1teHh4 IGlzIHVzZWQuCisgICAgICAgICBXaGVuIHVzZWQgd2l0aCBtdWx0aXZlcnNp b25pbmcsIHJlbW92aW5nIHRoZSBhdHRyaWJ1dGUgd2lsbCBsZWFkCisgICAg ICAgICB0byBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgaWYgYSBkZWZhdWx0IHZl cnNpb24gaXMgcHJvdmlkZWQuCisJIFNvLCBnZW5lcmF0ZSBhIHdhcm5pbmcg aGVyZSBhbmQgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUuICAqLworICAgICAgaWYg KCF0YXJnZXRtLnRhcmdldF9vcHRpb24udmFsaWRfYXR0cmlidXRlX3AgKCpu b2RlLCBuYW1lLCBhcmdzLCBmbGFncykpCisJeworCSAgd2FybmluZyAoT1BU X1dhdHRyaWJ1dGVzLAorCQkgICAiSW52YWxpZCB0YXJnZXQgYXR0cmlidXRl IGluIGZ1bmN0aW9uICVxRSwgaWdub3JlZC4iLAorCQkgICAqbm9kZSk7CisJ ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKKwl9CisgICAgfQogCiAgIHJldHVy biBOVUxMX1RSRUU7CiB9CkluZGV4OiBnY2MvdGFyZ2V0LmRlZgo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Ci0tLSBnY2MvdGFyZ2V0LmRlZgkocmV2aXNpb24g MTkwNDkzKQorKysgZ2NjL3RhcmdldC5kZWYJKHdvcmtpbmcgY29weSkKQEAg LTEyOTgsNiArMTI5OCwzMSBAQCBERUZIT09LCiAgdHJlZSwgKHRyZWUgZm5k ZWNsLCBpbnQgbl9hcmdzLCB0cmVlICphcmdwLCBib29sIGlnbm9yZSksCiAg aG9va190cmVlX3RyZWVfaW50X3RyZWVwX2Jvb2xfbnVsbCkKIAorLyogVGFy Z2V0IGhvb2sgdG8gY29tcGFyZSB0aGUgcHJpb3JpdHkgb2YgdGFyZ2V0IGZl YXR1cmVzIGluIGZ1bmN0aW9uIERFQ0wxCisgICBhbmQgREVDTDIuICBJdCBy ZXR1cm5zIHBvc2l0aXZlIHZhbHVlIGlmIERFQ0wxIGlzIGhpZ2hlciBwcmlv cml0eSwKKyAgIG5lZ2F0aXZlIHZhbHVlIGlmIERFQ0wyIGlzIGhpZ2hlciBw cmlvcml0eSBhbmQgMCBpZiB0aGV5IGFyZSB0aGUKKyAgIHNhbWUuICAqLwor REVGSE9PSworKGNvbXBhcmVfdmVyc2lvbl9wcmlvcml0eSwKKyAiIiwKKyBp bnQsICh0cmVlIGRlY2wxLCB0cmVlIGRlY2wyKSwgTlVMTCkKKworLyogVGFy Z2V0IGhvb2sgdG8gZ2VuZXJhdGUgdGhlIGRpc3BhdGNoZXIgYm9keSBmb3Ig YSBmdW5jdGlvbiB2ZXJzaW9uCisgICBkaXNwYXRjaGVyIEFSRywgd2hpY2gg aXMgYSBjZ3JhcGhfbm9kZSBwb2ludGVyLiAgKi8KKworREVGSE9PSworKGdl bmVyYXRlX3ZlcnNpb25fZGlzcGF0Y2hlcl9ib2R5LAorICIiLAorIHRyZWUs ICh2b2lkICphcmcpLCBOVUxMKSAKKworLyogVGFyZ2V0IGhvb2sgdG8gZ2Vu ZXJhdGUgYSBmdW5jdGlvbiB2ZXJzaW9uIGRpc3BhdGNoZXIgREVDTCBmb3Ig dGhlIGxpc3QKKyAgIG9mIGZ1bmN0aW9uIHZlcnNpb25zIGluIGFyZ2xpc3Qs IHdoaWNoIGlzIGEgdmVjdG9yIG9mIGRlY2xzLiAgKi8KKworREVGSE9PSwor KGdldF9mdW5jdGlvbl92ZXJzaW9uc19kaXNwYXRjaGVyLAorICIiLAorIHRy ZWUsICh2b2lkICphcmdsaXN0KSwgTlVMTCkKKwogLyogUmV0dXJucyBhIGNv ZGUgZm9yIGEgdGFyZ2V0LXNwZWNpZmljIGJ1aWx0aW4gdGhhdCBpbXBsZW1l bnRzCiAgICByZWNpcHJvY2FsIG9mIHRoZSBmdW5jdGlvbiwgb3IgTlVMTF9U UkVFIGlmIG5vdCBhdmFpbGFibGUuICAqLwogREVGSE9PSwpAQCAtMjcwNSw2 ICsyNzMwLDE0IEBAIERFRkhPT0sKICB2b2lkLCAodm9pZCksCiAgaG9va192 b2lkX3ZvaWQpCiAKKy8qIFJldHVybnMgdHJ1ZSBpZiBERUNMMSBhbmQgREVD TDIgYXJlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLiAgKi8KKwor REVGSE9PSworKGZ1bmN0aW9uX3ZlcnNpb25zLAorICIiLAorIGJvb2wsICh0 cmVlIGRlY2wxLCB0cmVlIGRlY2wyKSwKKyBob29rX2Jvb2xfdHJlZV90cmVl X2ZhbHNlKQorCiAvKiBGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgb25lIGZ1 bmN0aW9uIGNhbiBpbmxpbmUgYW5vdGhlciBmdW5jdGlvbi4gICovCiAjdW5k ZWYgSE9PS19QUkVGSVgKICNkZWZpbmUgSE9PS19QUkVGSVggIlRBUkdFVF8i CkluZGV4OiBnY2MvY2dyYXBoLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gZ2NjL2NncmFwaC5jCShyZXZpc2lvbiAxOTA0OTMpCisrKyBnY2MvY2dy YXBoLmMJKHdvcmtpbmcgY29weSkKQEAgLTEyODEsNiArMTI4MSwxNCBAQCBj Z3JhcGhfbWFya19hZGRyZXNzX3Rha2VuX25vZGUgKHN0cnVjdCBjZ3JhcGhf bm9kZQogICBub2RlLT5zeW1ib2wuYWRkcmVzc190YWtlbiA9IDE7CiAgIG5v ZGUgPSBjZ3JhcGhfZnVuY3Rpb25fb3JfdGh1bmtfbm9kZSAobm9kZSwgTlVM TCk7CiAgIG5vZGUtPnN5bWJvbC5hZGRyZXNzX3Rha2VuID0gMTsKKyAgLyog SWYgdGhlIGFkZHJlc3Mgb2YgYSBtdWx0aXZlcnNpb25lZCBmdW5jdGlvbiBk aXNwYXRjaGVyIGlzIHRha2VuLAorICAgICBnZW5lcmF0ZSB0aGUgYm9keSB0 byBkaXNwYXRjaCB0aGUgcmlnaHQgZnVuY3Rpb24gYXQgcnVuLXRpbWUuICBU aGlzCisgICAgIGlzIG5lZWRlZCBhcyB0aGUgYWRkcmVzcyBjYW4gYmUgdXNl ZCB0byBkbyBhbiBpbmRpcmVjdCBjYWxsLiAgKi8KKyAgaWYgKG5vZGUtPmRp c3BhdGNoZXJfZnVuY3Rpb24pCisgICAgeworICAgICAgZ2NjX2Fzc2VydCAo bm9kZS0+bmV4dF9mdW5jdGlvbl92ZXJzaW9uKTsKKyAgICAgIHRhcmdldG0u Z2VuZXJhdGVfdmVyc2lvbl9kaXNwYXRjaGVyX2JvZHkgKG5vZGUpOworICAg IH0KIH0KIAogLyogUmV0dXJuIGxvY2FsIGluZm8gZm9yIHRoZSBjb21waWxl ZCBmdW5jdGlvbi4gICovCkluZGV4OiBnY2MvY2dyYXBoLmgKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gZ2NjL2NncmFwaC5oCShyZXZpc2lvbiAxOTA0 OTMpCisrKyBnY2MvY2dyYXBoLmgJKHdvcmtpbmcgY29weSkKQEAgLTIyMCw2 ICsyMjAsMjYgQEAgc3RydWN0IEdUWSgoKSkgY2dyYXBoX25vZGUgewogICBz dHJ1Y3QgY2dyYXBoX25vZGUgKnByZXZfc2libGluZ19jbG9uZTsKICAgc3Ry dWN0IGNncmFwaF9ub2RlICpjbG9uZXM7CiAgIHN0cnVjdCBjZ3JhcGhfbm9k ZSAqY2xvbmVfb2Y7CisKKyAgLyogVE9ETzogUHV0IHZlcnNpb25fZGlzcGF0 Y2hlcl9kZWNsLCBwcmV2X2Z1bmN0aW9uX3ZlcnNpb24sCisgICAgIG5leHRf ZnVuY3Rpb25fdmVyc2lvbiBpbnRvIGEgc3RydWN0IGZvciByZWFkYWJpbGl0 eS4KKworICAgICBJZiB0aGlzIG5vZGUgY29ycmVzcG9uZHMgdG8gYSBmdW5j dGlvbiB2ZXJzaW9uLCB0aGlzIHBvaW50cworICAgICB0byB0aGUgZGlzcGF0 Y2hlciBmdW5jdGlvbiBkZWNsIHdoaWNoIGlzIHRoZSBmdW5jdGlvbiB0aGF0 IG11c3QKKyAgICAgYmUgY2FsbGVkIHRvIGV4ZWN1dGUgdGhlIHJpZ2h0IGZ1 bmN0aW9uIHZlcnNpb24gYXQgcnVuLXRpbWUuCisKKyAgICAgSWYgdGhpcyBu b2RlIGlzIGEgZGlzcGF0Y2hlciBmb3IgZnVuY3Rpb24gdmVyc2lvbnMsIHRo aXMgcG9pbnRzCisgICAgIHRvIHJlc29sdmVyIGZ1bmN0aW9uLCB3aGljaCBo b2xkcyAgdGhlIGZ1bmN0aW9uIGJvZHkgZm9yIHRoZQorICAgICBkaXNwYXRj aGVyLiAgKi8KKyAgdHJlZSB2ZXJzaW9uX2Rpc3BhdGNoZXJfZGVjbDsKKwor ICAvKiBDaGFpbnMgYWxsIHRoZSBzZW1hbnRpY2FsbHkgaWRlbnRpY2FsIGZ1 bmN0aW9uIHZlcnNpb25zLiAgVGhlCisgICAgIGZpcnN0IGZ1bmN0aW9uIGlu IHRoaXMgY2hhaW4gaXMgdGhlIGRlZmF1bHQgZnVuY3Rpb24uICAqLworICBz dHJ1Y3QgY2dyYXBoX25vZGUgKnByZXZfZnVuY3Rpb25fdmVyc2lvbjsKKyAg LyogSWYgdGhpcyBub2RlIGlzIGEgZGlzcGF0Y2hlciBmb3IgZnVuY3Rpb24g dmVyc2lvbnMsIHRoaXMgYWxzbyBwb2ludHMKKyAgICAgdG8gdGhlIGRlZmF1 bHQgZnVuY3Rpb24gdmVyc2lvbi4gICovCisgIHN0cnVjdCBjZ3JhcGhfbm9k ZSAqbmV4dF9mdW5jdGlvbl92ZXJzaW9uOworCiAgIC8qIEZvciBmdW5jdGlv bnMgd2l0aCBtYW55IGNhbGxzIHNpdGVzIGl0IGhvbGRzIG1hcCBmcm9tIGNh bGwgZXhwcmVzc2lvbgogICAgICB0byB0aGUgZWRnZSB0byBzcGVlZCB1cCBj Z3JhcGhfZWRnZSBmdW5jdGlvbi4gICovCiAgIGh0YWJfdCBHVFkoKHBhcmFt X2lzIChzdHJ1Y3QgY2dyYXBoX2VkZ2UpKSkgY2FsbF9zaXRlX2hhc2g7CkBA IC0yNzEsNiArMjkxLDcgQEAgc3RydWN0IEdUWSgoKSkgY2dyYXBoX25vZGUg ewogICAvKiA/PyBXZSBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgdGhpcy4g IFdlIGhhdmUgZW5vdWdoIGJpdHMgaW4KICAgICAgY2dyYXBoIHRvIGNhbGN1 bGF0ZSBpdC4gICovCiAgIHVuc2lnbmVkIHRtX2Nsb25lIDogMTsKKyAgdW5z aWduZWQgZGlzcGF0Y2hlcl9mdW5jdGlvbiA6IDE7CiB9OwogCiBERUZfVkVD X1Aoc3ltdGFiX25vZGUpOwpAQCAtNjQ4LDYgKzY2OSw3IEBAIHZvaWQgY2dy YXBoX3JlYnVpbGRfcmVmZXJlbmNlcyAodm9pZCk7CiBpbnQgY29tcHV0ZV9j YWxsX3N0bXRfYmJfZnJlcXVlbmN5ICh0cmVlLCBiYXNpY19ibG9jayBiYik7 CiB2b2lkIHJlY29yZF9yZWZlcmVuY2VzX2luX2luaXRpYWxpemVyICh0cmVl LCBib29sKTsKIAorCiAvKiBJbiBpcGEuYyAgKi8KIGJvb2wgc3ltdGFiX3Jl bW92ZV91bnJlYWNoYWJsZV9ub2RlcyAoYm9vbCwgRklMRSAqKTsKIGNncmFw aF9ub2RlX3NldCBjZ3JhcGhfbm9kZV9zZXRfbmV3ICh2b2lkKTsKSW5kZXg6 IGdjYy90cmVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Ry ZWUuaAkocmV2aXNpb24gMTkwNDkzKQorKysgZ2NjL3RyZWUuaAkod29ya2lu ZyBjb3B5KQpAQCAtMzQzNiw2ICszNDM2LDEyIEBAIGV4dGVybiBWRUModHJl ZSwgZ2MpICoqZGVjbF9kZWJ1Z19hcmdzX2luc2VydCAodHJlCiAjZGVmaW5l IERFQ0xfRlVOQ1RJT05fU1BFQ0lGSUNfT1BUSU1JWkFUSU9OKE5PREUpIFwK ICAgIChGVU5DVElPTl9ERUNMX0NIRUNLIChOT0RFKS0+ZnVuY3Rpb25fZGVj bC5mdW5jdGlvbl9zcGVjaWZpY19vcHRpbWl6YXRpb24pCiAKKy8qIEluIEZV TkNUSU9OX0RFQ0wsIHRoaXMgaXMgc2V0IGlmIHRoaXMgZnVuY3Rpb24gaGFz IG90aGVyIHZlcnNpb25zIGdlbmVyYXRlZAorICAgdXNpbmcgInRhcmdldCIg YXR0cmlidXRlcy4gIFRoZSBkZWZhdWx0IHZlcnNpb24gaXMgdGhlIG9uZSB3 aGljaCBkb2VzIG5vdAorICAgaGF2ZSBhbnkgInRhcmdldCIgYXR0cmlidXRl IHNldC4gKi8KKyNkZWZpbmUgREVDTF9GVU5DVElPTl9WRVJTSU9ORUQoTk9E RSlcCisgICAoRlVOQ1RJT05fREVDTF9DSEVDSyAoTk9ERSktPmZ1bmN0aW9u X2RlY2wudmVyc2lvbmVkX2Z1bmN0aW9uKQorCiAvKiBGVU5DVElPTl9ERUNM IGluaGVyaXRzIGZyb20gREVDTF9OT05fQ09NTU9OIGJlY2F1c2Ugb2YgdGhl IHVzZSBvZiB0aGUKICAgIGFyZ3VtZW50cy9yZXN1bHQvc2F2ZWRfdHJlZSBm aWVsZHMgYnkgZnJvbnQgZW5kcy4gICBJdCB3YXMgZWl0aGVyIGluaGVyaXQK ICAgIEZVTkNUSU9OX0RFQ0wgZnJvbSBub25fY29tbW9uLCBvciBpbmhlcml0 IG5vbl9jb21tb24gZnJvbSBGVU5DVElPTl9ERUNMLApAQCAtMzQ4MCw4ICsz NDg2LDggQEAgc3RydWN0IEdUWSgoKSkgdHJlZV9mdW5jdGlvbl9kZWNsIHsK ICAgdW5zaWduZWQgbG9vcGluZ19jb25zdF9vcl9wdXJlX2ZsYWcgOiAxOwog ICB1bnNpZ25lZCBoYXNfZGVidWdfYXJnc19mbGFnIDogMTsKICAgdW5zaWdu ZWQgdG1fY2xvbmVfZmxhZyA6IDE7Ci0KLSAgLyogMSBiaXQgbGVmdCAqLwor ICB1bnNpZ25lZCB2ZXJzaW9uZWRfZnVuY3Rpb24gOiAxOworICAvKiBObyBi aXRzIGxlZnQuICAqLwogfTsKIAogLyogVGhlIHNvdXJjZSBsYW5ndWFnZSBv ZiB0aGUgdHJhbnNsYXRpb24tdW5pdC4gICovCkluZGV4OiBnY2MvdGVzdHN1 aXRlL2crKy5kZy9tdjIuQwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBn Y2MvdGVzdHN1aXRlL2crKy5kZy9tdjIuQwkocmV2aXNpb24gMCkKKysrIGdj Yy90ZXN0c3VpdGUvZysrLmRnL212Mi5DCShyZXZpc2lvbiAwKQpAQCAtMCww ICsxLDExOSBAQAorLyogVGVzdCBjYXNlIHRvIGNoZWNrIGlmIE11bHRpdmVy c2lvbmluZyBjaG9vc2VzIHRoZSBjb3JyZWN0CisgICBkaXNwYXRjaGluZyBv cmRlciB3aGVuIHZlcnNpb25zIGFyZSBmb3IgdmFyaW91cyBJU0FzLiAgKi8K Ky8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi0qIHg4Nl82NC0qLSog fSB9ICovCisvKiB7IGRnLXJlcXVpcmUtaWZ1bmMgIiIgfSAgKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1tbm8tc3NlIC1tbm8tbW14IC1tbm8tcG9wY250 IC1tbm8tYXZ4IiB9ICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyog RGVmYXVsdCB2ZXJzaW9uLiAgKi8KK2ludCBmb28gKCk7CisvKiBUaGUgZGlz cGF0Y2ggY2hlY2tzIHNob3VsZCBiZSBpbiB0aGUgZXhhY3QgcmV2ZXJzZSBv cmRlciBvZiB0aGUKKyAgIGRlY2xhcmF0aW9ucyBiZWxvdy4gICovCitpbnQg Zm9vICgpIF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCJtbXgiKSkpOworaW50 IGZvbyAoKSBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgic3NlIikpKTsKK2lu dCBmb28gKCkgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCAoInNzZTIiKSkpOwor aW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgic3NlMyIpKSk7 CitpbnQgZm9vICgpIF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCJzc3NlMyIp KSk7CitpbnQgZm9vICgpIF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCJzc2U0 LjEiKSkpOworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgi c3NlNC4yIikpKTsKK2ludCBmb28gKCkgX19hdHRyaWJ1dGVfXyAoKHRhcmdl dCAoInBvcGNudCIpKSk7CitpbnQgZm9vICgpIF9fYXR0cmlidXRlX18gKCh0 YXJnZXQgKCJhdngiKSkpOworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9fICgo dGFyZ2V0ICgiYXZ4MiIpKSk7CisKK2ludCBtYWluICgpCit7CisKKyAgaW50 IHZhbCA9IGZvbyAoKTsKKworICBpZiAoX19idWlsdGluX2NwdV9zdXBwb3J0 cyAoImF2eDIiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSAxKTsKKyAgZWxzZSBp ZiAoX19idWlsdGluX2NwdV9zdXBwb3J0cyAoImF2eCIpKQorICAgIGFzc2Vy dCAodmFsID09IDIpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBv cnRzICgicG9wY250IikpCisgICAgYXNzZXJ0ICh2YWwgPT0gMyk7CisgIGVs c2UgaWYgKF9fYnVpbHRpbl9jcHVfc3VwcG9ydHMgKCJzc2U0LjIiKSkKKyAg ICBhc3NlcnQgKHZhbCA9PSA0KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2Nw dV9zdXBwb3J0cyAoInNzZTQuMSIpKQorICAgIGFzc2VydCAodmFsID09IDUp OworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgic3NzZTMi KSkKKyAgICBhc3NlcnQgKHZhbCA9PSA2KTsKKyAgZWxzZSBpZiAoX19idWls dGluX2NwdV9zdXBwb3J0cyAoInNzZTMiKSkKKyAgICBhc3NlcnQgKHZhbCA9 PSA3KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9zdXBwb3J0cyAoInNz ZTIiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSA4KTsKKyAgZWxzZSBpZiAoX19i dWlsdGluX2NwdV9zdXBwb3J0cyAoInNzZSIpKQorICAgIGFzc2VydCAodmFs ID09IDkpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgi bW14IikpCisgICAgYXNzZXJ0ICh2YWwgPT0gMTApOworICBlbHNlCisgICAg YXNzZXJ0ICh2YWwgPT0gMCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAor Zm9vICgpCit7CisgIHJldHVybiAwOworfQorCitpbnQgX19hdHRyaWJ1dGVf XyAoKHRhcmdldCgibW14IikpKQorZm9vICgpCit7CisgIHJldHVybiAxMDsK K30KKworaW50IF9fYXR0cmlidXRlX18gKCh0YXJnZXQoInNzZSIpKSkKK2Zv byAoKQoreworICByZXR1cm4gOTsKK30KKworaW50IF9fYXR0cmlidXRlX18g KCh0YXJnZXQoInNzZTIiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDg7Cit9 CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJzc2UzIikpKQorZm9v ICgpCit7CisgIHJldHVybiA3OworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAo KHRhcmdldCgic3NzZTMiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDY7Cit9 CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJzc2U0LjEiKSkpCitm b28gKCkKK3sKKyAgcmV0dXJuIDU7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9f ICgodGFyZ2V0KCJzc2U0LjIiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDQ7 Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJwb3BjbnQiKSkp Citmb28gKCkKK3sKKyAgcmV0dXJuIDM7Cit9CisKK2ludCBfX2F0dHJpYnV0 ZV9fICgodGFyZ2V0KCJhdngiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDI7 Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhdngyIikpKQor Zm9vICgpCit7CisgIHJldHVybiAxOworfQpJbmRleDogZ2NjL3Rlc3RzdWl0 ZS9nKysuZGcvbXY0LkMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2Nj L3Rlc3RzdWl0ZS9nKysuZGcvbXY0LkMJKHJldmlzaW9uIDApCisrKyBnY2Mv dGVzdHN1aXRlL2crKy5kZy9tdjQuQwkocmV2aXNpb24gMCkKQEAgLTAsMCAr MSwyMyBAQAorLyogVGVzdCBjYXNlIHRvIGNoZWNrIGlmIHRoZSBjb21waWxl ciBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZQorICAgd2hlbiB0aGUgZGVm YXVsdCB2ZXJzaW9uIG9mIGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24gaXMg YWJzZW50CisgICBhbmQgaXRzIHBvaW50ZXIgaXMgdGFrZW4uICAqLworCisv KiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgaT84Ni0qLSogeDg2XzY0LSot KiB9IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1tbm8tc3NlIC1tbm8t cG9wY250IiB9ICovCisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgi c3NlIikpKQorZm9vICgpCit7CisgIHJldHVybiAxOworfQoraW50IF9fYXR0 cmlidXRlX18gKCh0YXJnZXQgKCJwb3BjbnQiKSkpCitmb28gKCkKK3sKKyAg cmV0dXJuIDA7Cit9CisKK2ludCBtYWluICgpCit7CisgIGludCAoKnApKCkg PSAmZm9vOyAvKiB7IGRnLWVycm9yICJQb2ludGVyIHRvIGEgbXVsdGl2ZXJz aW9uZWQgZnVuY3Rpb24gd2l0aG91dCBhIGRlZmF1bHQgaXMgbm90IGFsbG93 ZWQiIHt9IH0gKi8KKyAgcmV0dXJuICgqcCkoKTsKK30KSW5kZXg6IGdjYy90 ZXN0c3VpdGUvZysrLmRnL212MS5DCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K LS0tIGdjYy90ZXN0c3VpdGUvZysrLmRnL212MS5DCShyZXZpc2lvbiAwKQor KysgZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvbXYxLkMJKHJldmlzaW9uIDApCkBA IC0wLDAgKzEsMTMwIEBACisvKiBUZXN0IGNhc2UgdG8gY2hlY2sgaWYgTXVs dGl2ZXJzaW9uaW5nIHdvcmtzLiAgKi8KKy8qIHsgZGctZG8gcnVuIHsgdGFy Z2V0IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9ICovCisvKiB7IGRnLXJlcXVp cmUtaWZ1bmMgIiIgfSAgKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mUElD IC1tbm8tYXZ4IC1tbm8tcG9wY250IiB9ICovCisKKyNpbmNsdWRlIDxhc3Nl cnQuaD4KKworLyogRGVmYXVsdCB2ZXJzaW9uLiAgKi8KK2ludCBmb28gKCk7 CisvKiBUaGUgb3RoZXIgdmVyc2lvbnMgb2YgZm9vLiAgTWl4IHVwIHRoZSBv cmRlcmluZyBhbmQgCisgICBjaGVjayBpZiB0aGUgZGlzcGF0Y2hpbmcgZG9l cyBpdCBpbiB0aGUgb3JkZXIgb2YgcHJpb3JpdHkuICovCisvKiBDaGVjayBj b21iaW5hdGlvbiBvZiB0YXJnZXQgYXR0cmlidXRlcy4gICovCitpbnQgZm9v ICgpIF9fYXR0cmlidXRlX18gKCh0YXJnZXQoImFyY2g9Y29yZWk3LHBvcGNu dCIpKSk7CisvKiBUaGUgdGFyZ2V0IG9wZXJhbmRzIGluIHRoaXMgZGVjbGFy YXRpb24gYW5kIHRoZSBkZWZpbml0aW9uIGFyZSByZS1vcmRlcmVkLgorICAg VGhpcyBzaG91bGQgc3RpbGwgd29yay4gICovCitpbnQgZm9vICgpIF9fYXR0 cmlidXRlX18gKCh0YXJnZXQoInNzc2UzLGF2eDIiKSkpOworCisvKiBDaGVj ayBmb3IgYWxsIHRhcmdldCBhdHRyaWJ1dGVzIGZvciB3aGljaCBkaXNwYXRj aGVycyBhcmUgYXZhaWxhYmxlLiAgKi8KKy8qIENoZWNrIGFyY2g9ICovCitp bnQgZm9vICgpIF9fYXR0cmlidXRlX18oKHRhcmdldCgiYXJjaD1jb3JlMiIp KSk7CitpbnQgZm9vICgpIF9fYXR0cmlidXRlX18oKHRhcmdldCgiYXJjaD1j b3JlaTciKSkpOworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9fKCh0YXJnZXQo ImFyY2g9YXRvbSIpKSk7CisvKiBDaGVjayBJU0FzICAqLworaW50IGZvbyAo KSBfX2F0dHJpYnV0ZV9fKCh0YXJnZXQoImF2eCIpKSk7CitpbnQgZm9vICgp IF9fYXR0cmlidXRlX18gKCh0YXJnZXQoImFyY2g9Y29yZTIsc3NlNC4yIikp KTsKKy8qIENoZWNrIG1vcmUgYXJjaD0uICAqLworaW50IGZvbyAoKSBfX2F0 dHJpYnV0ZV9fKCh0YXJnZXQoImFyY2g9YW1kZmFtMTAiKSkpOworaW50IGZv byAoKSBfX2F0dHJpYnV0ZV9fKCh0YXJnZXQoImFyY2g9YmR2ZXIxIikpKTsK K2ludCBmb28gKCkgX19hdHRyaWJ1dGVfXygodGFyZ2V0KCJhcmNoPWJkdmVy MiIpKSk7CisKK2ludCAoKnApKCkgPSAmZm9vOworaW50IG1haW4gKCkKK3sK KyAgaW50IHZhbCA9IGZvbyAoKTsKKyAgYXNzZXJ0ICh2YWwgPT0gICgqcCko KSk7CisKKyAgLyogQ2hlY2sgaW4gdGhlIGV4YWN0IHNhbWUgb3JkZXIgaW4g d2hpY2ggdGhlIGRpc3BhdGNoaW5nCisgICAgIGlzIGV4cGVjdGVkIHRvIGhh cHBlbi4gICovCisgIGlmIChfX2J1aWx0aW5fY3B1X2lzICgiYmR2ZXIxIikp CisgICAgYXNzZXJ0ICh2YWwgPT0gMSk7CisgIGVsc2UgaWYgKF9fYnVpbHRp bl9jcHVfaXMgKCJiZHZlcjIiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSAyKTsK KyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9zdXBwb3J0cyAoImF2eDIiKQor CSAgICYmIF9fYnVpbHRpbl9jcHVfc3VwcG9ydHMgKCJzc3NlMyIpKQorICAg IGFzc2VydCAodmFsID09IDMpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1 X3N1cHBvcnRzICgiYXZ4IikpCisgICAgYXNzZXJ0ICh2YWwgPT0gNCk7Cisg IGVsc2UgaWYgKF9fYnVpbHRpbl9jcHVfaXMgKCJjb3JlaTciKQorCSAgICYm IF9fYnVpbHRpbl9jcHVfc3VwcG9ydHMgKCJwb3BjbnQiKSkKKyAgICBhc3Nl cnQgKHZhbCA9PSA1KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9pcyAo ImNvcmVpNyIpKQorICAgIGFzc2VydCAodmFsID09IDYpOworICBlbHNlIGlm IChfX2J1aWx0aW5fY3B1X2lzICgiYW1kZmFtMTBoIikpCisgICAgYXNzZXJ0 ICh2YWwgPT0gNyk7CisgIGVsc2UgaWYgKF9fYnVpbHRpbl9jcHVfaXMgKCJj b3JlMiIpCisJICAgJiYgX19idWlsdGluX2NwdV9zdXBwb3J0cyAoInNzZTQu MiIpKQorICAgIGFzc2VydCAodmFsID09IDgpOworICBlbHNlIGlmIChfX2J1 aWx0aW5fY3B1X2lzICgiY29yZTIiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSA5 KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9pcyAoImF0b20iKSkKKyAg ICBhc3NlcnQgKHZhbCA9PSAxMCk7CisgIGVsc2UKKyAgICBhc3NlcnQgKHZh bCA9PSAwKTsKKyAgCisgIHJldHVybiAwOworfQorCitpbnQgZm9vICgpCit7 CisgIHJldHVybiAwOworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdl dCgiYXJjaD1jb3JlaTcscG9wY250IikpKQorZm9vICgpCit7CisgIHJldHVy biA1OworfQoraW50IF9fYXR0cmlidXRlX18gKCh0YXJnZXQoImF2eDIsc3Nz ZTMiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDM7Cit9CisKK2ludCBfX2F0 dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWNvcmUyIikpKQorZm9vICgpCit7 CisgIHJldHVybiA5OworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdl dCgiYXJjaD1jb3JlaTciKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDY7Cit9 CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWF0b20iKSkp Citmb28gKCkKK3sKKyAgcmV0dXJuIDEwOworfQorCitpbnQgX19hdHRyaWJ1 dGVfXyAoKHRhcmdldCgiYXZ4IikpKQorZm9vICgpCit7CisgIHJldHVybiA0 OworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgiYXJjaD1jb3Jl Mixzc2U0LjIiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDg7Cit9CisKK2lu dCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWFtZGZhbTEwIikpKQor Zm9vICgpCit7CisgIHJldHVybiA3OworfQorCitpbnQgX19hdHRyaWJ1dGVf XyAoKHRhcmdldCgiYXJjaD1iZHZlcjEiKSkpCitmb28gKCkKK3sKKyAgcmV0 dXJuIDE7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNo PWJkdmVyMiIpKSkKK2ZvbyAoKQoreworICByZXR1cm4gMjsKK30KSW5kZXg6 IGdjYy90ZXN0c3VpdGUvZysrLmRnL212My5DCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KLS0tIGdjYy90ZXN0c3VpdGUvZysrLmRnL212My5DCShyZXZpc2lv biAwKQorKysgZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvbXYzLkMJKHJldmlzaW9u IDApCkBAIC0wLDAgKzEsMzcgQEAKKy8qIFRlc3QgY2FzZSB0byBjaGVjayBp ZiBhIGNhbGwgdG8gYSBtdWx0aXZlcnNpb25lZCBmdW5jdGlvbgorICAgaXMg cmVwbGFjZWQgd2l0aCBhIGRpcmVjdCBjYWxsIHRvIHRoZSBwYXJ0aWN1bGFy IHZlcnNpb24gd2hlbgorICAgdGhlIG1vc3Qgc3BlY2lhbGl6ZWQgdmVyc2lv bidzIHRhcmdldCBhdHRyaWJ1dGVzIG1hdGNoIHRoZQorICAgY2FsbGVyLiAg CisgIAorICAgSW4gdGhpcyBwcm9ncmFtLCBmb28gaXMgbXVsdGl2ZXJzaW9u ZWQgYnV0IHRoZXJlIGlzIG5vIGRlZmF1bHQKKyAgIGZ1bmN0aW9uLiAgVGhp cyBpcyBhbiBlcnJvciBpZiB0aGUgY2FsbCBoYXMgdG8gZ28gdGhyb3VnaCBh CisgICBkaXNwYXRjaGVyLiAgSG93ZXZlciwgdGhlIGNhbGwgdG8gZm9vIGlu IGJhciBjYW4gYmUgcmVwbGFjZWQKKyAgIHdpdGggYSBkaXJlY3QgY2FsbCB0 byB0aGUgcG9wY250IHZlcnNpb24gb2YgZm9vLiAgSGVuY2UsIHRoaXMKKyAg IHRlc3Qgc2hvdWxkIHBhc3MuICAqLworCisvKiB7IGRnLWRvIHJ1biB7IHRh cmdldCBpPzg2LSotKiB4ODZfNjQtKi0qIH0gfSAqLworLyogeyBkZy1vcHRp b25zICItTzIgLW1uby1zc2UgLW1uby1wb3BjbnQiIH0gKi8KKworCisvKiBE ZWZhdWx0IHZlcnNpb24uICAqLworaW50IF9fYXR0cmlidXRlX18gKCh0YXJn ZXQgKCJzc2UiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDE7Cit9CitpbnQg X19hdHRyaWJ1dGVfXyAoKHRhcmdldCAoInBvcGNudCIpKSkKK2ZvbyAoKQor eworICByZXR1cm4gMDsKK30KKworaW50IF9fYXR0cmlidXRlX18gKCh0YXJn ZXQgKCJwb3BjbnQiKSkpCitiYXIgKCkKK3sKKyAgcmV0dXJuIGZvbyAoKTsK K30KKworaW50IG1haW4gKCkKK3sKKyAgcmV0dXJuIGJhciAoKTsKK30KSW5k ZXg6IGdjYy9jcC9jbGFzcy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t IGdjYy9jcC9jbGFzcy5jCShyZXZpc2lvbiAxOTA0OTMpCisrKyBnY2MvY3Av Y2xhc3MuYwkod29ya2luZyBjb3B5KQpAQCAtMTA5MSw3ICsxMDkxLDMyIEBA IGFkZF9tZXRob2QgKHRyZWUgdHlwZSwgdHJlZSBtZXRob2QsIHRyZWUgdXNp bmdfZGVjCiAJICAgICAgfHwgc2FtZV90eXBlX3AgKFRSRUVfVFlQRSAoZm5f dHlwZSksCiAJCQkgICAgICBUUkVFX1RZUEUgKG1ldGhvZF90eXBlKSkpKQog CXsKLQkgIGlmICh1c2luZ19kZWNsKQorCSAgLyogRm9yIGZ1bmN0aW9uIHZl cnNpb25zLCB0aGVpciBwYXJtcyBhbmQgdHlwZXMgbWF0Y2gKKwkgICAgIGJ1 dCB0aGV5IGFyZSBub3QgZHVwbGljYXRlcy4gIFJlY29yZCBmdW5jdGlvbiB2 ZXJzaW9ucworCSAgICAgYXMgYW5kIHdoZW4gdGhleSBhcmUgZm91bmQuICAq LworCSAgaWYgKFRSRUVfQ09ERSAoZm4pID09IEZVTkNUSU9OX0RFQ0wKKwkg ICAgICAmJiBUUkVFX0NPREUgKG1ldGhvZCkgPT0gRlVOQ1RJT05fREVDTAor CSAgICAgICYmIChERUNMX0ZVTkNUSU9OX1NQRUNJRklDX1RBUkdFVCAoZm4p CisJCSAgfHwgREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKG1ldGhv ZCkpCisJICAgICAgJiYgdGFyZ2V0bS50YXJnZXRfb3B0aW9uLmZ1bmN0aW9u X3ZlcnNpb25zIChmbiwgbWV0aG9kKSkKKyAJICAgIHsKKwkgICAgICAvKiBN YXJrIGZ1bmN0aW9ucyBhcyB2ZXJzaW9ucyBpZiBuZWNlc3NhcnkuICBNb2Rp ZnkgdGhlIG1hbmdsZWQKKwkJIGRlY2wgbmFtZSBpZiBuZWNlc3NhcnkuICAq LworCSAgICAgIGlmICghREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKGZuKSkK KwkJeworCQkgIERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChmbikgPSAxOwor CQkgIGlmIChERUNMX0FTU0VNQkxFUl9OQU1FX1NFVF9QIChmbikpCisJCSAg ICBtYW5nbGVfZGVjbCAoZm4pOworCQl9CisJICAgICAgaWYgKCFERUNMX0ZV TkNUSU9OX1ZFUlNJT05FRCAobWV0aG9kKSkKKwkJeworCQkgIERFQ0xfRlVO Q1RJT05fVkVSU0lPTkVEIChtZXRob2QpID0gMTsKKwkJICBpZiAoREVDTF9B U1NFTUJMRVJfTkFNRV9TRVRfUCAobWV0aG9kKSkKKwkJICAgIG1hbmdsZV9k ZWNsIChtZXRob2QpOworCQl9CisJICAgICAgY29udGludWU7CisJICAgIH0K KwkgIGVsc2UgaWYgKHVzaW5nX2RlY2wpCiAJICAgIHsKIAkgICAgICBpZiAo REVDTF9DT05URVhUIChmbikgPT0gdHlwZSkKIAkJLyogRGVmZXIgdG8gdGhl IGxvY2FsIGZ1bmN0aW9uLiAgKi8KQEAgLTY5MjIsNiArNjk0Nyw3IEBAIHJl c29sdmVfYWRkcmVzc19vZl9vdmVybG9hZGVkX2Z1bmN0aW9uICh0cmVlIHRh cmdlCiAgIHRyZWUgbWF0Y2hlcyA9IE5VTExfVFJFRTsKICAgdHJlZSBmbjsK ICAgdHJlZSB0YXJnZXRfZm5fdHlwZTsKKyAgVkVDICh0cmVlLCBoZWFwKSAq Zm5fdmVyX3ZlYyA9IE5VTEw7CiAKICAgLyogQnkgdGhlIHRpbWUgd2UgZ2V0 IGhlcmUsIHdlIHNob3VsZCBiZSBzZWVpbmcgb25seSByZWFsCiAgICAgIHBv aW50ZXItdG8tbWVtYmVyIHR5cGVzLCBub3QgdGhlIGludGVybmFsIFBPSU5U RVJfVFlQRSB0bwpAQCAtNjk4Niw5ICs3MDEyLDE5IEBAIHJlc29sdmVfYWRk cmVzc19vZl9vdmVybG9hZGVkX2Z1bmN0aW9uICh0cmVlIHRhcmdlCiAJICBp ZiAoREVDTF9BTlRJQ0lQQVRFRCAoZm4pKQogCSAgICBjb250aW51ZTsKIAot CSAgLyogU2VlIGlmIHRoZXJlJ3MgYSBtYXRjaC4gICovCisJICAvKiBTZWUg aWYgdGhlcmUncyBhIG1hdGNoLiAgIEZvciBmdW5jdGlvbnMgdGhhdCBhcmUg bXVsdGktdmVyc2lvbmVkLAorCSAgICAgYWxsIHRoZSB2ZXJzaW9ucyBtYXRj aC4gICovCiAJICBpZiAoc2FtZV90eXBlX3AgKHRhcmdldF9mbl90eXBlLCBz dGF0aWNfZm5fdHlwZSAoZm4pKSkKLQkgICAgbWF0Y2hlcyA9IHRyZWVfY29u cyAoZm4sIE5VTExfVFJFRSwgbWF0Y2hlcyk7CisJICAgIHsKKwkgICAgICBt YXRjaGVzID0gdHJlZV9jb25zIChmbiwgTlVMTF9UUkVFLCBtYXRjaGVzKTsK KwkgICAgICAvKklmIHZlcnNpb25lZCwgcHVzaCBhbGwgcG9zc2libGUgdmVy c2lvbnMgaW50byBhIHZlY3Rvci4gICovCisJICAgICAgaWYgKERFQ0xfRlVO Q1RJT05fVkVSU0lPTkVEIChmbikpCisJCXsKKwkJICBpZiAoZm5fdmVyX3Zl YyA9PSBOVUxMKQorCQkgICBmbl92ZXJfdmVjID0gVkVDX2FsbG9jICh0cmVl LCBoZWFwLCAyKTsKKwkJICBWRUNfc2FmZV9wdXNoICh0cmVlLCBoZWFwLCBm bl92ZXJfdmVjLCBmbik7IAorCQl9CisJICAgIH0KIAl9CiAgICAgfQogCkBA IC03MDgwLDEzICs3MTE2LDI2IEBAIHJlc29sdmVfYWRkcmVzc19vZl9vdmVy bG9hZGVkX2Z1bmN0aW9uICh0cmVlIHRhcmdlCiAgICAgewogICAgICAgLyog VGhlcmUgd2VyZSB0b28gbWFueSBtYXRjaGVzLiAgRmlyc3QgY2hlY2sgaWYg dGhleSdyZSBhbGwKIAkgdGhlIHNhbWUgZnVuY3Rpb24uICAqLwotICAgICAg dHJlZSBtYXRjaDsKKyAgICAgIHRyZWUgbWF0Y2ggPSBOVUxMX1RSRUU7CiAK ICAgICAgIGZuID0gVFJFRV9QVVJQT1NFIChtYXRjaGVzKTsKLSAgICAgIGZv ciAobWF0Y2ggPSBUUkVFX0NIQUlOIChtYXRjaGVzKTsgbWF0Y2g7IG1hdGNo ID0gVFJFRV9DSEFJTiAobWF0Y2gpKQotCWlmICghZGVjbHNfbWF0Y2ggKGZu LCBUUkVFX1BVUlBPU0UgKG1hdGNoKSkpCi0JICBicmVhazsKIAorICAgICAg LyogRm9yIG11bHRpLXZlcnNpb25lZCBmdW5jdGlvbnMsIG1vcmUgdGhhbiBv bmUgbWF0Y2ggaXMganVzdCBmaW5lLgorCSBDYWxsIGRlY2xzX21hdGNoIHRv IG1ha2Ugc3VyZSB0aGV5IGFyZSBkaWZmZXJlbnQgYmVjYXVzZSB0aGV5IGFy ZQorCSB2ZXJzaW9uZWQuICAqLworICAgICAgaWYgKERFQ0xfRlVOQ1RJT05f VkVSU0lPTkVEIChmbikpCisJeworICAgICAgICAgIGZvciAobWF0Y2ggPSBU UkVFX0NIQUlOIChtYXRjaGVzKTsgbWF0Y2g7IG1hdGNoID0gVFJFRV9DSEFJ TiAobWF0Y2gpKQorICAJICAgIGlmIChkZWNsc19tYXRjaCAoZm4sIFRSRUVf UFVSUE9TRSAobWF0Y2gpKSkKKwkgICAgICBicmVhazsKKwl9CisgICAgICBl bHNlCisJeworICAgICAgICAgIGZvciAobWF0Y2ggPSBUUkVFX0NIQUlOICht YXRjaGVzKTsgbWF0Y2g7IG1hdGNoID0gVFJFRV9DSEFJTiAobWF0Y2gpKQor ICAJICAgIGlmICghZGVjbHNfbWF0Y2ggKGZuLCBUUkVFX1BVUlBPU0UgKG1h dGNoKSkpCisJICAgICAgYnJlYWs7CisJfQorCiAgICAgICBpZiAobWF0Y2gp CiAJewogCSAgaWYgKGZsYWdzICYgdGZfZXJyb3IpCkBAIC03MTQ4LDYgKzcx OTcsMjggQEAgcmVzb2x2ZV9hZGRyZXNzX29mX292ZXJsb2FkZWRfZnVuY3Rp b24gKHRyZWUgdGFyZ2UKICAgICAgIHBlcmZvcm1fb3JfZGVmZXJfYWNjZXNz X2NoZWNrIChhY2Nlc3NfcGF0aCwgZm4sIGZuLCBmbGFncyk7CiAgICAgfQog CisgIC8qIElmIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgaXMgbXVs dGktdmVyc2lvbmVkIGlzIHJlcXVlc3RlZCwgdGhlCisgICAgIHBvaW50ZXIg dG8gdGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24gaXMgcmV0dXJuZWQgaW5zdGVh ZC4gIFRoaXMgd29ya3MKKyAgICAgd2VsbCBiZWNhdXNlIGluZGlyZWN0bHkg Y2FsbGluZyB0aGUgZnVuY3Rpb24gd2lsbCBkaXNwYXRjaCB0aGUgcmlnaHQK KyAgICAgZnVuY3Rpb24gdmVyc2lvbiBhdCBydW4tdGltZS4gICovCisgIGlm IChERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAoZm4pKQorICAgIHsKKyAgICAg IHRyZWUgZGlzcGF0Y2hlcl9kZWNsID0gTlVMTDsKKyAgICAgIGdjY19hc3Nl cnQgKGZuX3Zlcl92ZWMgIT0gTlVMTCk7CisgICAgICBnY2NfYXNzZXJ0ICh0 YXJnZXRtLmdldF9mdW5jdGlvbl92ZXJzaW9uc19kaXNwYXRjaGVyKTsKKyAg ICAgIGRpc3BhdGNoZXJfZGVjbCA9IHRhcmdldG0uZ2V0X2Z1bmN0aW9uX3Zl cnNpb25zX2Rpc3BhdGNoZXIgKGZuX3Zlcl92ZWMpOworICAgICAgaWYgKCFk aXNwYXRjaGVyX2RlY2wpCisJeworCSAgZXJyb3JfYXQgKGlucHV0X2xvY2F0 aW9uLCAiUG9pbnRlciB0byBhIG11bHRpdmVyc2lvbmVkIGZ1bmN0aW9uIgor CQkgICAgIiB3aXRob3V0IGEgZGVmYXVsdCBpcyBub3QgYWxsb3dlZCIpOwor CSAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsKKwl9CisgICAgICByZXRyb2Zp dF9sYW5nX2RlY2wgKGRpc3BhdGNoZXJfZGVjbCk7CisgICAgICBtYXJrX3Vz ZWQgKGZuKTsKKyAgICAgIFZFQ19mcmVlICh0cmVlLCBoZWFwLCBmbl92ZXJf dmVjKTsKKyAgICAgIGZuID0gZGlzcGF0Y2hlcl9kZWNsOworICAgIH0KKwog ICBpZiAoVFlQRV9QVFJGTl9QICh0YXJnZXRfdHlwZSkgfHwgVFlQRV9QVFJN RU1GVU5DX1AgKHRhcmdldF90eXBlKSkKICAgICByZXR1cm4gY3BfYnVpbGRf YWRkcl9leHByIChmbiwgZmxhZ3MpOwogICBlbHNlCkluZGV4OiBnY2MvY3Av ZGVjbC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jcC9kZWNs LmMJKHJldmlzaW9uIDE5MDQ5MykKKysrIGdjYy9jcC9kZWNsLmMJKHdvcmtp bmcgY29weSkKQEAgLTUzLDYgKzUzLDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNl ZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpbmNsdWRlICJw b2ludGVyLXNldC5oIgogI2luY2x1ZGUgInNwbGF5LXRyZWUuaCIKICNpbmNs dWRlICJwbHVnaW4uaCIKKyNpbmNsdWRlICJjZ3JhcGguaCIKIAogLyogUG9z c2libGUgY2FzZXMgb2YgYmFkIHNwZWNpZmllcnMgdHlwZSB1c2VkIGJ5IGJh ZF9zcGVjaWZpZXJzLiAqLwogZW51bSBiYWRfc3BlY19wbGFjZSB7CkBAIC05 NzIsNiArOTczLDI5IEBAIGRlY2xzX21hdGNoICh0cmVlIG5ld2RlY2wsIHRy ZWUgb2xkZGVjbCkKICAgICAgIGlmICh0MSAhPSB0MikKIAlyZXR1cm4gMDsK IAorICAgICAgLyogVGhlIGRlY2xzIGRvbnQgbWF0Y2ggaWYgdGhleSBjb3Jy ZXNwb25kIHRvIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMKKwkgb2YgdGhlIHNh bWUgZnVuY3Rpb24uICAqLworICAgICAgaWYgKGNvbXBwYXJtcyAocDEsIHAy KQorCSAgJiYgc2FtZV90eXBlX3AgKFRSRUVfVFlQRSAoZjEpLCBUUkVFX1RZ UEUgKGYyKSkgCisJICAmJiB0YXJnZXRtLnRhcmdldF9vcHRpb24uZnVuY3Rp b25fdmVyc2lvbnMgKG5ld2RlY2wsIG9sZGRlY2wpKQorCXsKKwkgIC8qIE1h cmsgZnVuY3Rpb25zIGFzIHZlcnNpb25zIGlmIG5lY2Vzc2FyeS4gIE1vZGlm eSB0aGUgbWFuZ2xlZCBkZWNsCisJICAgICBuYW1lIGlmIG5lY2Vzc2FyeS4g ICovCisJICBpZiAoIURFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChuZXdkZWNs KSkKKwkgICAgeworCSAgICAgIERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChu ZXdkZWNsKSA9IDE7CisJICAgICAgaWYgKERFQ0xfQVNTRU1CTEVSX05BTUVf U0VUX1AgKG5ld2RlY2wpKQorCSAgICAgICAgbWFuZ2xlX2RlY2wgKG5ld2Rl Y2wpOworCSAgICB9CisJICBpZiAoIURFQ0xfRlVOQ1RJT05fVkVSU0lPTkVE IChvbGRkZWNsKSkKKwkgICAgeworCSAgICAgIERFQ0xfRlVOQ1RJT05fVkVS U0lPTkVEIChvbGRkZWNsKSA9IDE7CisJICAgICAgaWYgKERFQ0xfQVNTRU1C TEVSX05BTUVfU0VUX1AgKG9sZGRlY2wpKQorCSAgICAgICBtYW5nbGVfZGVj bCAob2xkZGVjbCk7CisJICAgIH0KKwkgIHJldHVybiAwOworCX0KKwogICAg ICAgaWYgKENQX0RFQ0xfQ09OVEVYVCAobmV3ZGVjbCkgIT0gQ1BfREVDTF9D T05URVhUIChvbGRkZWNsKQogCSAgJiYgISAoREVDTF9FWFRFUk5fQ19QIChu ZXdkZWNsKQogCQkmJiBERUNMX0VYVEVSTl9DX1AgKG9sZGRlY2wpKSkKQEAg LTE0OTAsNyArMTUxNCwxMSBAQCBkdXBsaWNhdGVfZGVjbHMgKHRyZWUgbmV3 ZGVjbCwgdHJlZSBvbGRkZWNsLCBib29sCiAJICAgICAgZXJyb3IgKCJwcmV2 aW91cyBkZWNsYXJhdGlvbiAlcSsjRCBoZXJlIiwgb2xkZGVjbCk7CiAJICAg ICAgcmV0dXJuIE5VTExfVFJFRTsKIAkgICAgfQotCSAgZWxzZSBpZiAoY29t cHBhcm1zIChUWVBFX0FSR19UWVBFUyAoVFJFRV9UWVBFIChuZXdkZWNsKSks CisJICAvKiBGb3IgZnVuY3Rpb24gdmVyc2lvbnMsIHBhcmFtcyBhbmQgdHlw ZXMgbWF0Y2gsIGJ1dCB0aGV5CisJICAgICBhcmUgbm90IGFtYmlndW91cy4g ICovCisJICBlbHNlIGlmICgoIURFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChu ZXdkZWNsKQorCQkgICAgJiYgIURFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChv bGRkZWNsKSkKKwkJICAgJiYgY29tcHBhcm1zIChUWVBFX0FSR19UWVBFUyAo VFJFRV9UWVBFIChuZXdkZWNsKSksCiAJCQkgICAgICBUWVBFX0FSR19UWVBF UyAoVFJFRV9UWVBFIChvbGRkZWNsKSkpKQogCSAgICB7CiAJICAgICAgZXJy b3IgKCJuZXcgZGVjbGFyYXRpb24gJXEjRCIsIG5ld2RlY2wpOwpAQCAtMjI2 Miw2ICsyMjkwLDExIEBAIGR1cGxpY2F0ZV9kZWNscyAodHJlZSBuZXdkZWNs LCB0cmVlIG9sZGRlY2wsIGJvb2wKICAgZWxzZSBpZiAoREVDTF9QUkVTRVJW RV9QIChuZXdkZWNsKSkKICAgICBERUNMX1BSRVNFUlZFX1AgKG9sZGRlY2wp ID0gMTsKIAorICAvKiBJZiB0aGUgb2xkZGVjbCBpcyBhIHZlcnNpb24sIHNv IGlzIHRoZSBuZXdkZWNsLiAgKi8KKyAgaWYgKFRSRUVfQ09ERSAobmV3ZGVj bCkgPT0gRlVOQ1RJT05fREVDTAorICAgICAgJiYgREVDTF9GVU5DVElPTl9W RVJTSU9ORUQgKG9sZGRlY2wpKQorICAgIERFQ0xfRlVOQ1RJT05fVkVSU0lP TkVEIChuZXdkZWNsKSA9IDE7CisKICAgaWYgKFRSRUVfQ09ERSAobmV3ZGVj bCkgPT0gRlVOQ1RJT05fREVDTCkKICAgICB7CiAgICAgICBpbnQgZnVuY3Rp b25fc2l6ZTsKQEAgLTE0MDI0LDcgKzE0MDU3LDExIEBAIGN4eF9jb21kYXRf Z3JvdXAgKHRyZWUgZGVjbCkKIAkgIGVsc2UKIAkgICAgYnJlYWs7CiAJfQot ICAgICAgbmFtZSA9IERFQ0xfQVNTRU1CTEVSX05BTUUgKGRlY2wpOworICAg ICAgaWYgKFRSRUVfQ09ERSAoZGVjbCkgPT0gRlVOQ1RJT05fREVDTAorCSAg JiYgREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKGRlY2wpKQorCW5hbWUgPSBE RUNMX05BTUUgKGRlY2wpOworICAgICAgZWxzZQorICAgICAgICBuYW1lID0g REVDTF9BU1NFTUJMRVJfTkFNRSAoZGVjbCk7CiAgICAgfQogCiAgIHJldHVy biBuYW1lOwpJbmRleDogZ2NjL2NwL2Vycm9yLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gZ2NjL2NwL2Vycm9yLmMJKHJldmlzaW9uIDE5MDQ5MykK KysrIGdjYy9jcC9lcnJvci5jCSh3b3JraW5nIGNvcHkpCkBAIC0xNTM5LDgg KzE1MzksMTUgQEAgZHVtcF9leGNlcHRpb25fc3BlYyAodHJlZSB0LCBpbnQg ZmxhZ3MpCiBzdGF0aWMgdm9pZAogZHVtcF9mdW5jdGlvbl9uYW1lICh0cmVl IHQsIGludCBmbGFncykKIHsKLSAgdHJlZSBuYW1lID0gREVDTF9OQU1FICh0 KTsKKyAgdHJlZSBuYW1lOwogCisgIC8qIEZvciBmdW5jdGlvbiB2ZXJzaW9u cywgdXNlIHRoZSBhc3NlbWJsZXIgbmFtZSBhcyB0aGUgZGVjbCBuYW1lIGlz CisgICAgIHRoZSBzYW1lIGZvciBhbGwgdmVyc2lvbnMuICAqLworICBpZiAo REVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKHQpKQorICAgIG5hbWUgPSBERUNM X0FTU0VNQkxFUl9OQU1FICh0KTsKKyAgZWxzZQorICAgIG5hbWUgPSBERUNM X05BTUUgKHQpOworCiAgIC8qIFdlIGNhbiBnZXQgaGVyZSB3aXRoIGEgZGVj bCB0aGF0IHdhcyBzeW50aGVzaXplZCBieSBsYW5ndWFnZS0KICAgICAgaW5k ZXBlbmRlbnQgbWFjaGluZXJ5IChlLmcuIGNvdmVyYWdlLmMpIGluIHdoaWNo IGNhc2UgaXQgd29uJ3QKICAgICAgaGF2ZSBhIGxhbmdfc3BlY2lmaWMgc3Ry dWN0dXJlIGF0dGFjaGVkIGFuZCBERUNMX0NPTlNUUlVDVE9SX1AKSW5kZXg6 IGdjYy9jcC9zZW1hbnRpY3MuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t LSBnY2MvY3Avc2VtYW50aWNzLmMJKHJldmlzaW9uIDE5MDQ5MykKKysrIGdj Yy9jcC9zZW1hbnRpY3MuYwkod29ya2luZyBjb3B5KQpAQCAtMzc3NSw4ICsz Nzc1LDExIEBAIGV4cGFuZF9vcl9kZWZlcl9mbl8xICh0cmVlIGZuKQogICAg ICAgLyogSWYgdGhlIHVzZXIgd2FudHMgdXMgdG8ga2VlcCBhbGwgaW5saW5l IGZ1bmN0aW9ucywgdGhlbiBtYXJrCiAJIHRoaXMgZnVuY3Rpb24gYXMgbmVl ZGVkIHNvIHRoYXQgZmluaXNoX2ZpbGUgd2lsbCBtYWtlIHN1cmUgdG8KIAkg b3V0cHV0IGl0IGxhdGVyLiAgU2ltaWxhcmx5LCBhbGwgZGxsZXhwb3J0J2Qg ZnVuY3Rpb25zIG11c3QKLQkgYmUgZW1pdHRlZDsgdGhlcmUgbWF5IGJlIGNh bGxlcnMgaW4gb3RoZXIgRExMcy4gICovCi0gICAgICBpZiAoKGZsYWdfa2Vl cF9pbmxpbmVfZnVuY3Rpb25zCisJIGJlIGVtaXR0ZWQ7IHRoZXJlIG1heSBi ZSBjYWxsZXJzIGluIG90aGVyIERMTHMuCisJIEFsc28sIG1hcmsgdGhpcyBm dW5jdGlvbiBhcyBuZWVkZWQgaWYgaXQgaXMgbWFya2VkIGlubGluZSBidXQK KwkgaXMgYSBtdWx0aS12ZXJzaW9uZWQgZnVuY3Rpb24uICAqLworICAgICAg aWYgKCgoZmxhZ19rZWVwX2lubGluZV9mdW5jdGlvbnMKKwkgICAgfHwgREVD TF9GVU5DVElPTl9WRVJTSU9ORUQgKGZuKSkKIAkgICAmJiBERUNMX0RFQ0xB UkVEX0lOTElORV9QIChmbikKIAkgICAmJiAhREVDTF9SRUFMTFlfRVhURVJO IChmbikpCiAJICB8fCAoZmxhZ19rZWVwX2lubGluZV9kbGxleHBvcnQKSW5k ZXg6IGdjYy9jcC9kZWNsMi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t IGdjYy9jcC9kZWNsMi5jCShyZXZpc2lvbiAxOTA0OTMpCisrKyBnY2MvY3Av ZGVjbDIuYwkod29ya2luZyBjb3B5KQpAQCAtNjc0LDkgKzY3NCwxMyBAQCBj aGVja19jbGFzc2ZuICh0cmVlIGN0eXBlLCB0cmVlIGZ1bmN0aW9uLCB0cmVl IHRlbQogCSAgaWYgKGlzX3RlbXBsYXRlICE9IChUUkVFX0NPREUgKGZuZGVj bCkgPT0gVEVNUExBVEVfREVDTCkpCiAJICAgIGNvbnRpbnVlOwogCisJICAv KiBXaGlsZSBmaW5kaW5nIGEgbWF0Y2gsIHNhbWUgdHlwZXMgYW5kIHBhcmFt cyBhcmUgbm90IGVub3VnaAorCSAgICAgaWYgdGhlIGZ1bmN0aW9uIGlzIHZl cnNpb25lZC4gIEFsc28gY2hlY2sgdmVyc2lvbiAoInRhcmdldCIpCisJICAg ICBhdHRyaWJ1dGVzLiAgKi8KIAkgIGlmIChzYW1lX3R5cGVfcCAoVFJFRV9U WVBFIChUUkVFX1RZUEUgKGZ1bmN0aW9uKSksCiAJCQkgICBUUkVFX1RZUEUg KFRSRUVfVFlQRSAoZm5kZWNsKSkpCiAJICAgICAgJiYgY29tcHBhcm1zIChw MSwgcDIpCisJICAgICAgJiYgIXRhcmdldG0udGFyZ2V0X29wdGlvbi5mdW5j dGlvbl92ZXJzaW9ucyAoZnVuY3Rpb24sIGZuZGVjbCkKIAkgICAgICAmJiAo IWlzX3RlbXBsYXRlCiAJCSAgfHwgY29tcF90ZW1wbGF0ZV9wYXJtcyAodGVt cGxhdGVfcGFybXMsCiAJCQkJCSAgREVDTF9URU1QTEFURV9QQVJNUyAoZm5k ZWNsKSkpCkluZGV4OiBnY2MvY3AvY2FsbC5jCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KLS0tIGdjYy9jcC9jYWxsLmMJKHJldmlzaW9uIDE5MDQ5MykKKysr IGdjYy9jcC9jYWxsLmMJKHdvcmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcg QEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElm IG5vdCBzZWUKICNpbmNsdWRlICJsYW5naG9va3MuaCIKICNpbmNsdWRlICJj LWZhbWlseS9jLW9iamMuaCIKICNpbmNsdWRlICJ0aW1ldmFyLmgiCisjaW5j bHVkZSAiY2dyYXBoLmgiCiAKIC8qIFRoZSB2YXJpb3VzIGtpbmRzIG9mIGNv bnZlcnNpb24uICAqLwogCkBAIC02NDA3LDYgKzY0MDgsMzUgQEAgbWFnaWNf dmFyYXJnc19wICh0cmVlIGZuKQogICByZXR1cm4gZmFsc2U7CiB9CiAKKy8q IFJldHVybnMgdGhlIGRlY2wgb2YgdGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24g aWYgRk4gaXMgYSBmdW5jdGlvbiB2ZXJzaW9uLiAgKi8KKworc3RhdGljIHRy ZWUKK2dldF9mdW5jdGlvbl92ZXJzaW9uX2Rpc3BhdGNoZXIgKHRyZWUgZm4p Cit7CisgIHRyZWUgZGlzcGF0Y2hlcl9kZWNsID0gTlVMTDsKKyAgc3RydWN0 IGNncmFwaF9ub2RlICpub2RlID0gTlVMTDsKKworICBnY2NfYXNzZXJ0IChU UkVFX0NPREUgKGZuKSA9PSBGVU5DVElPTl9ERUNMCisJICAgICAgJiYgREVD TF9GVU5DVElPTl9WRVJTSU9ORUQgKGZuKSk7CisKKyAgbm9kZSA9IGNncmFw aF9nZXRfbm9kZSAoZm4pOworCisgIGlmIChub2RlICE9IE5VTEwpCisgICAg ZGlzcGF0Y2hlcl9kZWNsID0gbm9kZS0+dmVyc2lvbl9kaXNwYXRjaGVyX2Rl Y2w7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoZGlzcGF0 Y2hlcl9kZWNsID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3JfYXQgKGlu cHV0X2xvY2F0aW9uLCAiQ2FsbCB0byBtdWx0aXZlcnNpb25lZCBmdW5jdGlv biIKKyAgICAgICAgICAgICAgICAiIHdpdGhvdXQgYSBkZWZhdWx0IGlzIG5v dCBhbGxvd2VkIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIHJl dHJvZml0X2xhbmdfZGVjbCAoZGlzcGF0Y2hlcl9kZWNsKTsKKyAgZ2NjX2Fz c2VydCAoZGlzcGF0Y2hlcl9kZWNsICE9IE5VTEwpOworICByZXR1cm4gZGlz cGF0Y2hlcl9kZWNsOworfQorCiAvKiBTdWJyb3V0aW5lIG9mIHRoZSB2YXJp b3VzIGJ1aWxkXypfY2FsbCBmdW5jdGlvbnMuICBPdmVybG9hZCByZXNvbHV0 aW9uCiAgICBoYXMgY2hvc2VuIGEgd2lubmluZyBjYW5kaWRhdGUgQ0FORDsg YnVpbGQgdXAgYSBDQUxMX0VYUFIgYWNjb3JkaW5nbHkuCiAgICBBUkdTIGlz IGEgVFJFRV9MSVNUIG9mIHRoZSB1bmNvbnZlcnRlZCBhcmd1bWVudHMgdG8g dGhlIGNhbGwuICBGTEFHUyBpcyBhCkBAIC02ODU4LDYgKzY4ODgsMjAgQEAg YnVpbGRfb3Zlcl9jYWxsIChzdHJ1Y3Qgel9jYW5kaWRhdGUgKmNhbmQsIGlu dCBmbGEKICAgaWYgKCFhbHJlYWR5X3VzZWQpCiAgICAgbWFya191c2VkIChm bik7CiAKKyAgLyogRm9yIGNhbGxzIHRvIGEgbXVsdGktdmVyc2lvbmVkIGZ1 bmN0aW9uLCBvdmVybG9hZCByZXNvbHV0aW9uCisgICAgIHJldHVybnMgdGhl IGZ1bmN0aW9uIHdpdGggdGhlIGhpZ2hlc3QgdGFyZ2V0IHByaW9yaXR5LCB0 aGF0IGlzLAorICAgICB0aGUgdmVyc2lvbiB0aGF0IHdpbGwgY2hlY2tlZCBm b3IgZGlzcGF0Y2hpbmcgZmlyc3QuICBJZiB0aGlzCisgICAgIHZlcnNpb24g aXMgaW5saW5hYmxlLCBhIGRpcmVjdCBjYWxsIHRvIHRoaXMgdmVyc2lvbiBj YW4gYmUgbWFkZQorICAgICBvdGhlcndpc2UgdGhlIGNhbGwgc2hvdWxkIGdv IHRocm91Z2ggdGhlIGRpc3BhdGNoZXIuICAqLworCisgIGlmIChERUNMX0ZV TkNUSU9OX1ZFUlNJT05FRCAoZm4pCisgICAgICAmJiAhdGFyZ2V0bS50YXJn ZXRfb3B0aW9uLmNhbl9pbmxpbmVfcCAoY3VycmVudF9mdW5jdGlvbl9kZWNs LCBmbikpCisgICAgeworICAgICAgZm4gPSBnZXRfZnVuY3Rpb25fdmVyc2lv bl9kaXNwYXRjaGVyIChmbik7CisgICAgICBpZiAoZm4gPT0gTlVMTCkKKwly ZXR1cm4gTlVMTDsKKyAgICB9CisKICAgaWYgKERFQ0xfVklOREVYIChmbikg JiYgKGZsYWdzICYgTE9PS1VQX05PTlZJUlRVQUwpID09IDApCiAgICAgewog ICAgICAgdHJlZSB0OwpAQCAtODEzNiw2ICs4MTgwLDM4IEBAIGpvdXN0IChz dHJ1Y3Qgel9jYW5kaWRhdGUgKmNhbmQxLCBzdHJ1Y3Qgel9jYW5kaWRhCiAg ICAgICAmJiAoSVNfVFlQRV9PUl9ERUNMX1AgKGNhbmQxLT5mbikpKQogICAg IHJldHVybiAxOwogCisgIC8qIEZvciBDYW5kaWRhdGVzIG9mIGEgbXVsdGkt dmVyc2lvbmVkIGZ1bmN0aW9uLCAgbWFrZSB0aGUgdmVyc2lvbiB3aXRoCisg ICAgIHRoZSBoaWdoZXN0IHByaW9yaXR5IHdpbi4gIFRoaXMgdmVyc2lvbiB3 aWxsIGJlIGNoZWNrZWQgZm9yIGRpc3BhdGNoaW5nCisgICAgIGZpcnN0LiAg SWYgdGhpcyB2ZXJzaW9uIGNhbiBiZSBpbmxpbmVkIGludG8gdGhlIGNhbGxl ciwgdGhlIGZyb250LWVuZAorICAgICB3aWxsIHNpbXBseSBtYWtlIGEgZGly ZWN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4gICovCisKKyAgaWYgKFRSRUVf Q09ERSAoY2FuZDEtPmZuKSA9PSBGVU5DVElPTl9ERUNMCisgICAgICAmJiBE RUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAoY2FuZDEtPmZuKQorICAgICAgJiYg VFJFRV9DT0RFIChjYW5kMi0+Zm4pID09IEZVTkNUSU9OX0RFQ0wKKyAgICAg ICYmIERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChjYW5kMi0+Zm4pKQorICAg IHsKKyAgICAgIHRyZWUgZjEgPSBUUkVFX1RZUEUgKGNhbmQxLT5mbik7Cisg ICAgICB0cmVlIGYyID0gVFJFRV9UWVBFIChjYW5kMi0+Zm4pOworICAgICAg dHJlZSBwMSA9IFRZUEVfQVJHX1RZUEVTIChmMSk7CisgICAgICB0cmVlIHAy ID0gVFlQRV9BUkdfVFlQRVMgKGYyKTsKKyAgICAgCisgICAgICAvKiBDaGVj ayBpZiBjYW5kMS0+Zm4gYW5kIGNhbmQyLT5mbiBhcmUgdmVyc2lvbnMgb2Yg dGhlIHNhbWUgZnVuY3Rpb24uICBJdAorICAgICAgICAgaXMgcG9zc2libGUg dGhhdCBjYW5kMS0+Zm4gYW5kIGNhbmQyLT5mbiBhcmUgZnVuY3Rpb24gdmVy c2lvbnMgYnV0IG9mCisgICAgICAgICBkaWZmZXJlbnQgZnVuY3Rpb25zLiAg Q2hlY2sgdHlwZXMgdG8gc2VlIGlmIHRoZXkgYXJlIHZlcnNpb25zIG9mIHRo ZSBzYW1lCisgICAgICAgICBmdW5jdGlvbi4gICovCisgICAgICBpZiAoY29t cHBhcm1zIChwMSwgcDIpCisJICAmJiBzYW1lX3R5cGVfcCAoVFJFRV9UWVBF IChmMSksIFRSRUVfVFlQRSAoZjIpKSkKKwl7CisJICAvKiBBbHdheXMgbWFr ZSB0aGUgdmVyc2lvbiB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHksIG1vcmUK KwkgICAgIHNwZWNpYWxpemVkLCB3aW4uICAqLworCSAgZ2NjX2Fzc2VydCAo dGFyZ2V0bS5jb21wYXJlX3ZlcnNpb25fcHJpb3JpdHkpOworCSAgaWYgKHRh cmdldG0uY29tcGFyZV92ZXJzaW9uX3ByaW9yaXR5IChjYW5kMS0+Zm4sIGNh bmQyLT5mbikgPj0gMCkKKwkgICAgcmV0dXJuIDE7CisJICBlbHNlCisJICAg IHJldHVybiAtMTsKKwl9CisgICAgfQorCiAgIC8qIGEgdmlhYmxlIGZ1bmN0 aW9uIEYxCiAgICAgIGlzIGRlZmluZWQgdG8gYmUgYSBiZXR0ZXIgZnVuY3Rp b24gdGhhbiBhbm90aGVyIHZpYWJsZSBmdW5jdGlvbiBGMiAgaWYKICAgICAg Zm9yICBhbGwgYXJndW1lbnRzIGksIElDU2koRjEpIGlzIG5vdCBhIHdvcnNl IGNvbnZlcnNpb24gc2VxdWVuY2UgdGhhbgpAQCAtODQ1Niw2ICs4NTMyLDM3 IEBAIHR3ZWFrOgogICByZXR1cm4gMDsKIH0KIAorLyogRnVuY3Rpb24gRk4g aXMgbXVsdGktdmVyc2lvbmVkIGFuZCBDQU5ESURBVEVTIGNvbnRhaW5zIHRo ZSBsaXN0IG9mIGFsbAorICAgb3ZlcmxvYWRlZCBjYW5kaWRhdGVzIGZvciBG Ti4gIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgYWxsIGZ1bmN0aW9ucyBmcm9t CisgICBDQU5ESURBVEVTIHRoYXQgYXJlIGZ1bmN0aW9uIHZlcnNpb25zIG9m IEZOIGFuZCBnZW5lcmF0ZXMgYSBkaXNwYXRjaGVyCisgICBmdW5jdGlvbiBm b3IgdGhpcyBtdWx0aS12ZXJzaW9uZWQgZnVuY3Rpb24gZ3JvdXAuICAqLwor CitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfZnVuY3Rpb25fdmVyc2lvbnNfZGlz cGF0Y2hlciAodHJlZSBmbiwgc3RydWN0IHpfY2FuZGlkYXRlICpjYW5kaWRh dGVzKQoreworICB0cmVlIGYxID0gVFJFRV9UWVBFIChmbik7CisgIHRyZWUg cDEgPSBUWVBFX0FSR19UWVBFUyAoZjEpOworICBWRUMgKHRyZWUsIGhlYXAp ICpmbl92ZXJfdmVjID0gTlVMTDsKKyAgc3RydWN0IHpfY2FuZGlkYXRlICp2 ZXIgPSBjYW5kaWRhdGVzOworCisgIGZuX3Zlcl92ZWMgPSBWRUNfYWxsb2Mg KHRyZWUsIGhlYXAsIDIpOworCisgIGZvciAoO3ZlcjsgdmVyID0gdmVyLT5u ZXh0KQorICAgIHsKKyAgICAgIHRyZWUgZjIgPSBUUkVFX1RZUEUgKHZlci0+ Zm4pOworICAgICAgdHJlZSBwMiA9IFRZUEVfQVJHX1RZUEVTIChmMik7Cisg ICAgICAvKiBJZiB0aGlzIGNhbmRpZGF0ZSBpcyBhIHZlcnNpb24gb2YgRk4s IHR5cGVzIG11c3QgbWF0Y2guICAqLworICAgICAgaWYgKERFQ0xfRlVOQ1RJ T05fVkVSU0lPTkVEICh2ZXItPmZuKQorICAgICAgICAgICYmIGNvbXBwYXJt cyAocDEsIHAyKQorCSAgJiYgc2FtZV90eXBlX3AgKFRSRUVfVFlQRSAoZjEp LCBUUkVFX1RZUEUgKGYyKSkpCisgICAgICAgIFZFQ19zYWZlX3B1c2ggKHRy ZWUsIGhlYXAsIGZuX3Zlcl92ZWMsIHZlci0+Zm4pOworICAgIH0KKworICBn Y2NfYXNzZXJ0ICh0YXJnZXRtLmdldF9mdW5jdGlvbl92ZXJzaW9uc19kaXNw YXRjaGVyKTsKKyAgdGFyZ2V0bS5nZXRfZnVuY3Rpb25fdmVyc2lvbnNfZGlz cGF0Y2hlciAoZm5fdmVyX3ZlYyk7CisgIFZFQ19mcmVlICh0cmVlLCBoZWFw LCBmbl92ZXJfdmVjKTsgCit9CisKIC8qIEdpdmVuIGEgbGlzdCBvZiBjYW5k aWRhdGVzIGZvciBvdmVybG9hZGluZywgZmluZCB0aGUgYmVzdCBvbmUsIGlm IGFueS4KICAgIFRoaXMgYWxnb3JpdGhtIGhhcyBhIHdvcnN0IGNhc2Ugb2Yg TygybikgKHdpbm5lciBpcyBsYXN0KSwgYW5kIGEgYmVzdAogICAgY2FzZSBv ZiBPKG4vMikgKHRvdGFsbHkgYW1iaWd1b3VzKTsgbXVjaCBiZXR0ZXIgdGhh biBhIHNvcnRpbmcKQEAgLTg1MDgsNiArODYxNSwxNyBAQCB0b3VybmV5IChz dHJ1Y3Qgel9jYW5kaWRhdGUgKmNhbmRpZGF0ZXMsIHRzdWJzdF9mbAogCXJl dHVybiBOVUxMOwogICAgIH0KIAorICAvKiBGb3IgbXVsdGl2ZXJzaW9uZWQg ZnVuY3Rpb25zLCBhZ2dyZWdhdGUgYWxsIHRoZSB2ZXJzaW9ucyBoZXJlIGZv cgorICAgICBnZW5lcmF0aW5nIHRoZSBkaXNwYXRjaGVyIGJvZHkgbGF0ZXIg aWYgbmVjZXNzYXJ5LiAgQ2hlY2sgdG8gc2VlIGlmCisgICAgIHRoZSBkaXNw YXRjaGVyIGlzIGFscmVhZHkgZ2VuZXJhdGVkIHRvIGF2b2lkIGRvaW5nIHRo aXMgbW9yZSB0aGFuCisgICAgIG9uY2UuICAqLworCisgIGlmIChUUkVFX0NP REUgKGNoYW1wLT5mbikgPT0gRlVOQ1RJT05fREVDTAorICAgICAgJiYgREVD TF9GVU5DVElPTl9WRVJTSU9ORUQgKGNoYW1wLT5mbikKKyAgICAgICYmIChj Z3JhcGhfZ2V0X25vZGUgKGNoYW1wLT5mbikgPT0gTlVMTAorCSAgfHwgY2dy YXBoX2dldF9ub2RlIChjaGFtcC0+Zm4pLT52ZXJzaW9uX2Rpc3BhdGNoZXJf ZGVjbCA9PSBOVUxMKSkKKyAgICAgIGdlbmVyYXRlX2Z1bmN0aW9uX3ZlcnNp b25zX2Rpc3BhdGNoZXIgKGNoYW1wLT5mbiwgY2FuZGlkYXRlcyk7CisKICAg cmV0dXJuIGNoYW1wOwogfQogCkluZGV4OiBnY2MvY29uZmlnL2kzODYvaTM4 Ni5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jb25maWcvaTM4 Ni9pMzg2LmMJKHJldmlzaW9uIDE5MDQ5MykKKysrIGdjYy9jb25maWcvaTM4 Ni9pMzg2LmMJKHdvcmtpbmcgY29weSkKQEAgLTYyLDYgKzYyLDggQEAgYWxv bmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBz ZWUKICNpbmNsdWRlICJvcHRzLmgiCiAjaW5jbHVkZSAiZGlhZ25vc3RpYy5o IgogI2luY2x1ZGUgImR1bXBmaWxlLmgiCisjaW5jbHVkZSAidHJlZS1wYXNz LmgiCisjaW5jbHVkZSAidHJlZS1mbG93LmgiCiAKIGVudW0gdXBwZXJfMTI4 Yml0c19zdGF0ZQogewpAQCAtMjgwMzAsNiArMjgwMzIsOTg0IEBAIGl4ODZf aW5pdF9tbXhfc3NlX2J1aWx0aW5zICh2b2lkKQogICAgIH0KIH0KIAorCisv KiBUaGlzIGFkZHMgYSBjb25kaXRpb24gdG8gdGhlIGJhc2ljX2Jsb2NrIE5F V19CQiBpbiBmdW5jdGlvbiBGVU5DVElPTl9ERUNMCisgICB0byByZXR1cm4g YSBwb2ludGVyIHRvIFZFUlNJT05fREVDTCBpZiB0aGUgb3V0Y29tZSBvZiB0 aGUgZXhwcmVzc2lvbgorICAgZm9ybWVkIGJ5IFBSRURJQ0FURV9DSEFJTiBp cyB0cnVlLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBkdXJpbmcK KyAgIHZlcnNpb24gZGlzcGF0Y2ggdG8gZGVjaWRlIHdoaWNoIGZ1bmN0aW9u IHZlcnNpb24gdG8gZXhlY3V0ZS4gIEl0IHJldHVybnMKKyAgIHRoZSBiYXNp YyBibG9jayBhdCB0aGUgZW5kLCB0byB3aGljaCBtb3JlIGNvbmRpdGlvbnMg Y2FuIGJlIGFkZGVkLiAgKi8KKworc3RhdGljIGJhc2ljX2Jsb2NrCithZGRf Y29uZGl0aW9uX3RvX2JiICh0cmVlIGZ1bmN0aW9uX2RlY2wsIHRyZWUgdmVy c2lvbl9kZWNsLAorCQkgICAgIHRyZWUgcHJlZGljYXRlX2NoYWluLCBiYXNp Y19ibG9jayBuZXdfYmIpCit7CisgIGdpbXBsZSByZXR1cm5fc3RtdDsKKyAg dHJlZSBjb252ZXJ0X2V4cHIsIHJlc3VsdF92YXI7CisgIGdpbXBsZSBjb252 ZXJ0X3N0bXQ7CisgIGdpbXBsZSBjYWxsX2NvbmRfc3RtdDsKKyAgZ2ltcGxl IGlmX2Vsc2Vfc3RtdDsKKworICBiYXNpY19ibG9jayBiYjEsIGJiMiwgYmIz OworICBlZGdlIGUxMiwgZTIzOworCisgIHRyZWUgY29uZF92YXIsIGFuZF9l eHByX3ZhciA9IE5VTExfVFJFRTsKKyAgZ2ltcGxlX3NlcSBnc2VxOworCisg IHRyZWUgb2xkX2N1cnJlbnRfZnVuY3Rpb25fZGVjbDsKKyAgdHJlZSBwcmVk aWNhdGVfZGVjbCwgcHJlZGljYXRlX2FyZzsKKworICBvbGRfY3VycmVudF9m dW5jdGlvbl9kZWNsID0gY3VycmVudF9mdW5jdGlvbl9kZWNsOworICBwdXNo X2NmdW4gKERFQ0xfU1RSVUNUX0ZVTkNUSU9OIChmdW5jdGlvbl9kZWNsKSk7 CisgIGN1cnJlbnRfZnVuY3Rpb25fZGVjbCA9IGZ1bmN0aW9uX2RlY2w7CisK KyAgZ2NjX2Fzc2VydCAobmV3X2JiICE9IE5VTEwpOworICBnc2VxID0gYmJf c2VxIChuZXdfYmIpOworCisKKyAgY29udmVydF9leHByID0gYnVpbGQxIChD T05WRVJUX0VYUFIsIHB0cl90eXBlX25vZGUsCisJICAgICAJCSBidWlsZF9m b2xkX2FkZHJfZXhwciAodmVyc2lvbl9kZWNsKSk7CisgIHJlc3VsdF92YXIg PSBjcmVhdGVfdG1wX3ZhciAocHRyX3R5cGVfbm9kZSwgTlVMTCk7CisgIGNv bnZlcnRfc3RtdCA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKHJlc3VsdF92YXIs IGNvbnZlcnRfZXhwcik7IAorICByZXR1cm5fc3RtdCA9IGdpbXBsZV9idWls ZF9yZXR1cm4gKHJlc3VsdF92YXIpOworCisgIGlmIChwcmVkaWNhdGVfY2hh aW4gPT0gTlVMTF9UUkVFKQorICAgIHsKKyAgICAgIGdpbXBsZV9zZXFfYWRk X3N0bXQgKCZnc2VxLCBjb252ZXJ0X3N0bXQpOworICAgICAgZ2ltcGxlX3Nl cV9hZGRfc3RtdCAoJmdzZXEsIHJldHVybl9zdG10KTsKKyAgICAgIHNldF9i Yl9zZXEgKG5ld19iYiwgZ3NlcSk7CisgICAgICBnaW1wbGVfc2V0X2JiIChj b252ZXJ0X3N0bXQsIG5ld19iYik7CisgICAgICBnaW1wbGVfc2V0X2JiIChy ZXR1cm5fc3RtdCwgbmV3X2JiKTsKKyAgICAgIHBvcF9jZnVuICgpOworICAg ICAgY3VycmVudF9mdW5jdGlvbl9kZWNsID0gb2xkX2N1cnJlbnRfZnVuY3Rp b25fZGVjbDsKKyAgICAgIHJldHVybiBuZXdfYmI7CisgICAgfQorCisgIHdo aWxlIChwcmVkaWNhdGVfY2hhaW4gIT0gTlVMTCkKKyAgICB7CisgICAgICBj b25kX3ZhciA9IGNyZWF0ZV90bXBfdmFyIChpbnRlZ2VyX3R5cGVfbm9kZSwg TlVMTCk7CisgICAgICBwcmVkaWNhdGVfZGVjbCA9IFRSRUVfUFVSUE9TRSAo cHJlZGljYXRlX2NoYWluKTsKKyAgICAgIHByZWRpY2F0ZV9hcmcgPSBUUkVF X1ZBTFVFIChwcmVkaWNhdGVfY2hhaW4pOworICAgICAgY2FsbF9jb25kX3N0 bXQgPSBnaW1wbGVfYnVpbGRfY2FsbCAocHJlZGljYXRlX2RlY2wsIDEsIHBy ZWRpY2F0ZV9hcmcpOworICAgICAgZ2ltcGxlX2NhbGxfc2V0X2xocyAoY2Fs bF9jb25kX3N0bXQsIGNvbmRfdmFyKTsKKworICAgICAgZ2ltcGxlX3NldF9i bG9jayAoY2FsbF9jb25kX3N0bXQsIERFQ0xfSU5JVElBTCAoZnVuY3Rpb25f ZGVjbCkpOworICAgICAgZ2ltcGxlX3NldF9iYiAoY2FsbF9jb25kX3N0bXQs IG5ld19iYik7CisgICAgICBnaW1wbGVfc2VxX2FkZF9zdG10ICgmZ3NlcSwg Y2FsbF9jb25kX3N0bXQpOworCisgICAgICBwcmVkaWNhdGVfY2hhaW4gPSBU UkVFX0NIQUlOIChwcmVkaWNhdGVfY2hhaW4pOworICAgICAgCisgICAgICBp ZiAoYW5kX2V4cHJfdmFyID09IE5VTEwpCisgICAgICAgIGFuZF9leHByX3Zh ciA9IGNvbmRfdmFyOworICAgICAgZWxzZQorCXsKKwkgIGdpbXBsZSBhc3Np Z25fc3RtdDsKKwkgIC8qIFVzZSBNSU5fRVhQUiB0byBjaGVjayBpZiBhbnkg aW50ZWdlciBpcyB6ZXJvPy4KKwkgICAgIGFuZF9leHByX3ZhciA9IG1pbl9l eHByIDxjb25kX3ZhciwgYW5kX2V4cHJfdmFyPiAgKi8KKwkgIGFzc2lnbl9z dG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAoYW5kX2V4cHJfdmFyLAorCQkJ ICBidWlsZDIgKE1JTl9FWFBSLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkg IGNvbmRfdmFyLCBhbmRfZXhwcl92YXIpKTsKKworCSAgZ2ltcGxlX3NldF9i bG9jayAoYXNzaWduX3N0bXQsIERFQ0xfSU5JVElBTCAoZnVuY3Rpb25fZGVj bCkpOworCSAgZ2ltcGxlX3NldF9iYiAoYXNzaWduX3N0bXQsIG5ld19iYik7 CisJICBnaW1wbGVfc2VxX2FkZF9zdG10ICgmZ3NlcSwgYXNzaWduX3N0bXQp OworCX0KKyAgICB9CisKKyAgaWZfZWxzZV9zdG10ID0gZ2ltcGxlX2J1aWxk X2NvbmQgKEdUX0VYUFIsIGFuZF9leHByX3ZhciwKKwkgIAkJICAgICAgICAg ICAgaW50ZWdlcl96ZXJvX25vZGUsCisJCQkJICAgIE5VTExfVFJFRSwgTlVM TF9UUkVFKTsKKyAgZ2ltcGxlX3NldF9ibG9jayAoaWZfZWxzZV9zdG10LCBE RUNMX0lOSVRJQUwgKGZ1bmN0aW9uX2RlY2wpKTsKKyAgZ2ltcGxlX3NldF9i YiAoaWZfZWxzZV9zdG10LCBuZXdfYmIpOworICBnaW1wbGVfc2VxX2FkZF9z dG10ICgmZ3NlcSwgaWZfZWxzZV9zdG10KTsKKworICBnaW1wbGVfc2VxX2Fk ZF9zdG10ICgmZ3NlcSwgY29udmVydF9zdG10KTsKKyAgZ2ltcGxlX3NlcV9h ZGRfc3RtdCAoJmdzZXEsIHJldHVybl9zdG10KTsKKyAgc2V0X2JiX3NlcSAo bmV3X2JiLCBnc2VxKTsKKworICBiYjEgPSBuZXdfYmI7CisgIGUxMiA9IHNw bGl0X2Jsb2NrIChiYjEsIGlmX2Vsc2Vfc3RtdCk7CisgIGJiMiA9IGUxMi0+ ZGVzdDsKKyAgZTEyLT5mbGFncyAmPSB+RURHRV9GQUxMVEhSVTsKKyAgZTEy LT5mbGFncyB8PSBFREdFX1RSVUVfVkFMVUU7CisKKyAgZTIzID0gc3BsaXRf YmxvY2sgKGJiMiwgcmV0dXJuX3N0bXQpOworCisgIGdpbXBsZV9zZXRfYmIg KGNvbnZlcnRfc3RtdCwgYmIyKTsKKyAgZ2ltcGxlX3NldF9iYiAocmV0dXJu X3N0bXQsIGJiMik7CisKKyAgYmIzID0gZTIzLT5kZXN0OworICBtYWtlX2Vk Z2UgKGJiMSwgYmIzLCBFREdFX0ZBTFNFX1ZBTFVFKTsgCisKKyAgcmVtb3Zl X2VkZ2UgKGUyMyk7CisgIG1ha2VfZWRnZSAoYmIyLCBFWElUX0JMT0NLX1BU UiwgMCk7CisKKyAgcG9wX2NmdW4gKCk7CisgIGN1cnJlbnRfZnVuY3Rpb25f ZGVjbCA9IG9sZF9jdXJyZW50X2Z1bmN0aW9uX2RlY2w7CisKKyAgcmV0dXJu IGJiMzsKK30KKworLyogVGhpcyBwYXJzZXMgdGhlIGF0dHJpYnV0ZSBhcmd1 bWVudHMgdG8gdGFyZ2V0IGluIERFQ0wgYW5kIGRldGVybWluZXMKKyAgIHRo ZSByaWdodCBidWlsdGluIHRvIHVzZSB0byBtYXRjaCB0aGUgcGxhdGZvcm0g c3BlY2lmaWNhdGlvbi4KKyAgIEZvciBub3csIG9ubHkgb25lIHRhcmdldCBh cmd1bWVudCAoImFyY2g9IiBvciAiPC1tPnh4eCIpIGlzIGFsbG93ZWQuCisg ICBJdCByZXR1cm5zIHRoZSBwcmlvcml0eSB2YWx1ZSBmb3IgdGhpcyB2ZXJz aW9uIGRlY2wuICBJZiBQUkVESUNBVEVfTElTVAorICAgaXMgbm90IE5VTEws IGl0IHN0b3JlcyB0aGUgbGlzdCBvZiBjcHUgZmVhdHVyZXMgdGhhdCBuZWVk IHRvIGJlIGNoZWNrZWQKKyAgIGJlZm9yZSBkaXNwYXRjaGluZyB0aGlzIGZ1 bmN0aW9uLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorZ2V0X2J1aWx0 aW5fY29kZV9mb3JfdmVyc2lvbiAodHJlZSBkZWNsLCB0cmVlICpwcmVkaWNh dGVfbGlzdCkKK3sKKyAgdHJlZSBhdHRyczsKKyAgc3RydWN0IGNsX3Rhcmdl dF9vcHRpb24gY3VyX3RhcmdldDsKKyAgdHJlZSB0YXJnZXRfbm9kZTsKKyAg c3RydWN0IGNsX3RhcmdldF9vcHRpb24gKm5ld190YXJnZXQ7CisgIGNvbnN0 IGNoYXIgKmFyZ19zdHIgPSBOVUxMOworICBjb25zdCBjaGFyICphdHRyc19z dHIgPSBOVUxMOworICBjaGFyICp0b2tfc3RyID0gTlVMTDsKKyAgY2hhciAq dG9rZW47CisgIHVuc2lnbmVkIGludCBwcmlvcml0eSA9IDA7CisKKyAgLyog UHJpb3JpdHkgb2YgaTM4NiBmZWF0dXJlcywgZ3JlYXRlciB2YWx1ZSBpcyBo aWdoZXIgcHJpb3JpdHkuICAgVGhpcyBpcworICAgICB1c2VkIHRvIGRlY2lk ZSB0aGUgb3JkZXIgaW4gd2hpY2ggZnVuY3Rpb24gZGlzcGF0Y2ggbXVzdCBo YXBwZW4uICBGb3IKKyAgICAgaW5zdGFuY2UsIGEgdmVyc2lvbiBzcGVjaWFs aXplZCBmb3IgU1NFNC4yIHNob3VsZCBiZSBjaGVja2VkIGZvciBkaXNwYXRj aAorICAgICBiZWZvcmUgYSB2ZXJzaW9uIGZvciBTU0UzLCBhcyBTU0U0LjIg aW1wbGllcyBTU0UzLiAgKi8KKyAgZW51bSBmZWF0dXJlX3ByaW9yaXR5Cisg IHsKKyAgICBQX1pFUk8gPSAwLAorICAgIFBfTU1YLAorICAgIFBfU1NFLAor ICAgIFBfU1NFMiwKKyAgICBQX1NTRTMsCisgICAgUF9TU1NFMywKKyAgICBQ X1BST0NfU1NTRTMsCisgICAgUF9TU0U0X2EsCisgICAgUF9QUk9DX1NTRTRf YSwKKyAgICBQX1NTRTRfMSwKKyAgICBQX1NTRTRfMiwKKyAgICBQX1BST0Nf U1NFNF8yLAorICAgIFBfUE9QQ05ULAorICAgIFBfQVZYLAorICAgIFBfQVZY MiwKKyAgICBQX0ZNQSwKKyAgICBQX1BST0NfRk1BCisgIH07CisKKyAgLyog VGhlc2UgYXJlIHRoZSB0YXJnZXQgYXR0cmlidXRlIHN0cmluZ3MgZm9yIHdo aWNoIGEgZGlzcGF0Y2hlciBpcworICAgICBhdmFpbGFibGUsIGZyb20gZm9s ZF9idWlsdGluX2NwdS4gICovCisKKyAgc3RhdGljIHN0cnVjdCBfZmVhdHVy ZV9saXN0CisgICAgeworICAgICAgY29uc3QgY2hhciAqY29uc3QgbmFtZTsK KyAgICAgIGNvbnN0IGVudW0gZmVhdHVyZV9wcmlvcml0eSBwcmlvcml0eTsK KyAgICB9CisgIGNvbnN0IGZlYXR1cmVfbGlzdFtdID0KKyAgICB7CisgICAg ICB7Im1teCIsIFBfTU1YfSwKKyAgICAgIHsic3NlIiwgUF9TU0V9LAorICAg ICAgeyJzc2UyIiwgUF9TU0UyfSwKKyAgICAgIHsic3NlMyIsIFBfU1NFM30s CisgICAgICB7InNzc2UzIiwgUF9TU1NFM30sCisgICAgICB7InNzZTQuMSIs IFBfU1NFNF8xfSwKKyAgICAgIHsic3NlNC4yIiwgUF9TU0U0XzJ9LAorICAg ICAgeyJwb3BjbnQiLCBQX1BPUENOVH0sCisgICAgICB7ImF2eCIsIFBfQVZY fSwKKyAgICAgIHsiYXZ4MiIsIFBfQVZYMn0KKyAgICB9OworCisKKyAgc3Rh dGljIHVuc2lnbmVkIGludCBOVU1fRkVBVFVSRVMKKyAgICA9IHNpemVvZiAo ZmVhdHVyZV9saXN0KSAvIHNpemVvZiAoc3RydWN0IF9mZWF0dXJlX2xpc3Qp OworCisgIHVuc2lnbmVkIGludCBpOworCisgIHRyZWUgcHJlZGljYXRlX2No YWluID0gTlVMTF9UUkVFOworICB0cmVlIHByZWRpY2F0ZV9kZWNsLCBwcmVk aWNhdGVfYXJnOworCisgIGF0dHJzID0gbG9va3VwX2F0dHJpYnV0ZSAoInRh cmdldCIsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpOworICBnY2NfYXNzZXJ0 IChhdHRycyAhPSBOVUxMKTsKKworICBhdHRycyA9IFRSRUVfVkFMVUUgKFRS RUVfVkFMVUUgKGF0dHJzKSk7CisKKyAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RF IChhdHRycykgPT0gU1RSSU5HX0NTVCk7CisgIGF0dHJzX3N0ciA9IFRSRUVf U1RSSU5HX1BPSU5URVIgKGF0dHJzKTsKKworCisgIC8qIEhhbmRsZSBhcmNo PSBpZiBzcGVjaWZpZWQuICBGb3IgcHJpb3JpdHksIHNldCBpdCB0byBiZSAx IG1vcmUgdGhhbgorICAgICB0aGUgYmVzdCBpbnN0cnVjdGlvbiBzZXQgdGhl IHByb2Nlc3NvciBjYW4gaGFuZGxlLiAgRm9yIGluc3RhbmNlLCBpZgorICAg ICB0aGVyZSBpcyBhIHZlcnNpb24gZm9yIGF0b20gYW5kIGEgdmVyc2lvbiBm b3Igc3NzZTMgKHRoZSBoaWdoZXN0IElTQQorICAgICBwcmlvcml0eSBmb3Ig YXRvbSksIHRoZSBhdG9tIHZlcnNpb24gbXVzdCBiZSBjaGVja2VkIGZvciBk aXNwYXRjaAorICAgICBiZWZvcmUgdGhlIHNzc2UzIHZlcnNpb24uICovCisg IGlmIChzdHJzdHIgKGF0dHJzX3N0ciwgImFyY2g9IikgIT0gTlVMTCkKKyAg ICB7CisgICAgICBjbF90YXJnZXRfb3B0aW9uX3NhdmUgKCZjdXJfdGFyZ2V0 LCAmZ2xvYmFsX29wdGlvbnMpOworICAgICAgdGFyZ2V0X25vZGUgPSBpeDg2 X3ZhbGlkX3RhcmdldF9hdHRyaWJ1dGVfdHJlZSAoYXR0cnMpOworICAgIAor ICAgICAgZ2NjX2Fzc2VydCAodGFyZ2V0X25vZGUpOworICAgICAgbmV3X3Rh cmdldCA9IFRSRUVfVEFSR0VUX09QVElPTiAodGFyZ2V0X25vZGUpOworICAg ICAgZ2NjX2Fzc2VydCAobmV3X3RhcmdldCk7CisgICAgICAKKyAgICAgIGlm IChuZXdfdGFyZ2V0LT5hcmNoX3NwZWNpZmllZCAmJiBuZXdfdGFyZ2V0LT5h cmNoID4gMCkKKwl7CisJICBzd2l0Y2ggKG5ld190YXJnZXQtPmFyY2gpCisJ ICAgIHsKKwkgICAgY2FzZSBQUk9DRVNTT1JfQ09SRTJfMzI6CisJICAgIGNh c2UgUFJPQ0VTU09SX0NPUkUyXzY0OgorCSAgICAgIGFyZ19zdHIgPSAiY29y ZTIiOworCSAgICAgIHByaW9yaXR5ID0gUF9QUk9DX1NTU0UzOworCSAgICAg IGJyZWFrOworCSAgICBjYXNlIFBST0NFU1NPUl9DT1JFSTdfMzI6CisJICAg IGNhc2UgUFJPQ0VTU09SX0NPUkVJN182NDoKKwkgICAgICBhcmdfc3RyID0g ImNvcmVpNyI7CisJICAgICAgcHJpb3JpdHkgPSBQX1BST0NfU1NFNF8yOwor CSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBST0NFU1NPUl9BVE9NOgorCSAg ICAgIGFyZ19zdHIgPSAiYXRvbSI7CisJICAgICAgcHJpb3JpdHkgPSBQX1BS T0NfU1NTRTM7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUFJPQ0VTU09S X0FNREZBTTEwOgorCSAgICAgIGFyZ19zdHIgPSAiYW1kZmFtMTBoIjsKKwkg ICAgICBwcmlvcml0eSA9IFBfUFJPQ19TU0U0X2E7CisJICAgICAgYnJlYWs7 CisJICAgIGNhc2UgUFJPQ0VTU09SX0JEVkVSMToKKwkgICAgICBhcmdfc3Ry ID0gImJkdmVyMSI7CisJICAgICAgcHJpb3JpdHkgPSBQX1BST0NfRk1BOwor CSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBST0NFU1NPUl9CRFZFUjI6CisJ ICAgICAgYXJnX3N0ciA9ICJiZHZlcjIiOworCSAgICAgIHByaW9yaXR5ID0g UF9QUk9DX0ZNQTsKKwkgICAgICBicmVhazsKKwkgICAgfSAgCisJfSAgICAK KyAgICAKKyAgICAgIGNsX3RhcmdldF9vcHRpb25fcmVzdG9yZSAoJmdsb2Jh bF9vcHRpb25zLCAmY3VyX3RhcmdldCk7CisJCisgICAgICBpZiAocHJlZGlj YXRlX2xpc3QgJiYgYXJnX3N0ciA9PSBOVUxMKQorCXsKKwkgIGVycm9yX2F0 IChERUNMX1NPVVJDRV9MT0NBVElPTiAoZGVjbCksCisJICAgIAkiTm8gZGlz cGF0Y2hlciBmb3VuZCBmb3IgdGhlIHZlcnNpb25pbmcgYXR0cmlidXRlcyIp OworCSAgcmV0dXJuIDA7CisJfQorICAgIAorICAgICAgaWYgKHByZWRpY2F0 ZV9saXN0KQorCXsKKyAgICAgICAgICBwcmVkaWNhdGVfZGVjbCA9IGl4ODZf YnVpbHRpbnMgWyhpbnQpIElYODZfQlVJTFRJTl9DUFVfSVNdOworICAgICAg ICAgIC8qIEZvciBhIEMgc3RyaW5nIGxpdGVyYWwgdGhlIGxlbmd0aCBpbmNs dWRlcyB0aGUgdHJhaWxpbmcgTlVMTC4gICovCisgICAgICAgICAgcHJlZGlj YXRlX2FyZyA9IGJ1aWxkX3N0cmluZ19saXRlcmFsIChzdHJsZW4gKGFyZ19z dHIpICsgMSwgYXJnX3N0cik7CisgICAgICAgICAgcHJlZGljYXRlX2NoYWlu ID0gdHJlZV9jb25zIChwcmVkaWNhdGVfZGVjbCwgcHJlZGljYXRlX2FyZywK KwkJCQkgICAgICAgcHJlZGljYXRlX2NoYWluKTsKKwl9CisgICAgfQorCisg IC8qIFByb2Nlc3MgZmVhdHVyZSBuYW1lLiAgKi8KKyAgdG9rX3N0ciA9ICAo Y2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGF0dHJzX3N0cikgKyAxKTsKKyAg c3RyY3B5ICh0b2tfc3RyLCBhdHRyc19zdHIpOworICB0b2tlbiA9IHN0cnRv ayAodG9rX3N0ciwgIiwiKTsKKyAgcHJlZGljYXRlX2RlY2wgPSBpeDg2X2J1 aWx0aW5zIFsoaW50KSBJWDg2X0JVSUxUSU5fQ1BVX1NVUFBPUlRTXTsKKwor ICB3aGlsZSAodG9rZW4gIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBEbyBu b3QgcHJvY2VzcyAiYXJjaD0iICAqLworICAgICAgaWYgKHN0cm5jbXAgKHRv a2VuLCAiYXJjaD0iLCA1KSA9PSAwKQorCXsKKwkgIHRva2VuID0gc3RydG9r IChOVUxMLCAiLCIpOworCSAgY29udGludWU7CisJfQorICAgICAgZm9yIChp ID0gMDsgaSA8IE5VTV9GRUFUVVJFUzsgKytpKQorCXsKKwkgIGlmIChzdHJj bXAgKHRva2VuLCBmZWF0dXJlX2xpc3RbaV0ubmFtZSkgPT0gMCkKKwkgICAg eworCSAgICAgIGlmIChwcmVkaWNhdGVfbGlzdCkKKwkJeworCQkgIHByZWRp Y2F0ZV9hcmcgPSBidWlsZF9zdHJpbmdfbGl0ZXJhbCAoCisJCQkJICBzdHJs ZW4gKGZlYXR1cmVfbGlzdFtpXS5uYW1lKSArIDEsCisJCQkJICBmZWF0dXJl X2xpc3RbaV0ubmFtZSk7CisJCSAgcHJlZGljYXRlX2NoYWluID0gdHJlZV9j b25zIChwcmVkaWNhdGVfZGVjbCwgcHJlZGljYXRlX2FyZywKKwkJCQkJICAg ICAgIHByZWRpY2F0ZV9jaGFpbik7CisJCX0KKwkgICAgICAvKiBGaW5kIHRo ZSBtYXhpbXVtIHByaW9yaXR5IGZlYXR1cmUuICAqLworCSAgICAgIGlmIChm ZWF0dXJlX2xpc3RbaV0ucHJpb3JpdHkgPiBwcmlvcml0eSkKKwkJcHJpb3Jp dHkgPSBmZWF0dXJlX2xpc3RbaV0ucHJpb3JpdHk7CisKKwkgICAgICBicmVh azsKKwkgICAgfQorCX0KKyAgICAgIGlmIChwcmVkaWNhdGVfbGlzdCAmJiBp ID09IE5VTV9GRUFUVVJFUykKKwl7CisJICBlcnJvcl9hdCAoREVDTF9TT1VS Q0VfTE9DQVRJT04gKGRlY2wpLAorCQkgICAgIk5vIGRpc3BhdGNoZXIgZm91 bmQgZm9yICVzIiwgdG9rZW4pOworCSAgcmV0dXJuIDA7CisJfQorICAgICAg dG9rZW4gPSBzdHJ0b2sgKE5VTEwsICIsIik7CisgICAgfQorICBmcmVlICh0 b2tfc3RyKTsKKworICBpZiAocHJlZGljYXRlX2xpc3QgJiYgcHJlZGljYXRl X2NoYWluID09IE5VTExfVFJFRSkKKyAgICB7CisgICAgICBlcnJvcl9hdCAo REVDTF9TT1VSQ0VfTE9DQVRJT04gKGRlY2wpLAorCSAgICAgICAgIk5vIGRp c3BhdGNoZXIgZm91bmQgZm9yIHRoZSB2ZXJzaW9uaW5nIGF0dHJpYnV0ZXMg OiAlcyIsCisJICAgICAgICBhdHRyc19zdHIpOworICAgICAgcmV0dXJuIDA7 CisgICAgfQorICBlbHNlIGlmIChwcmVkaWNhdGVfbGlzdCkKKyAgICB7Cisg ICAgICBwcmVkaWNhdGVfY2hhaW4gPSBucmV2ZXJzZSAocHJlZGljYXRlX2No YWluKTsKKyAgICAgICpwcmVkaWNhdGVfbGlzdCA9IHByZWRpY2F0ZV9jaGFp bjsKKyAgICB9CisKKyAgcmV0dXJuIHByaW9yaXR5OyAKK30KKworLyogVGhp cyBjb21wYXJlcyB0aGUgcHJpb3JpdHkgb2YgdGFyZ2V0IGZlYXR1cmVzIGlu IGZ1bmN0aW9uIERFQ0wxCisgICBhbmQgREVDTDIuICBJdCByZXR1cm5zIHBv c2l0aXZlIHZhbHVlIGlmIERFQ0wxIGlzIGhpZ2hlciBwcmlvcml0eSwKKyAg IG5lZ2F0aXZlIHZhbHVlIGlmIERFQ0wyIGlzIGhpZ2hlciBwcmlvcml0eSBh bmQgMCBpZiB0aGV5IGFyZSB0aGUKKyAgIHNhbWUuICAqLworCitzdGF0aWMg aW50CitpeDg2X2NvbXBhcmVfdmVyc2lvbl9wcmlvcml0eSAodHJlZSBkZWNs MSwgdHJlZSBkZWNsMikKK3sKKyAgdW5zaWduZWQgaW50IHByaW9yaXR5MSA9 IDA7CisgIHVuc2lnbmVkIGludCBwcmlvcml0eTIgPSAwOworCisgIGlmIChs b29rdXBfYXR0cmlidXRlICgidGFyZ2V0IiwgREVDTF9BVFRSSUJVVEVTIChk ZWNsMSkpICE9IE5VTEwpCisgICAgcHJpb3JpdHkxID0gZ2V0X2J1aWx0aW5f Y29kZV9mb3JfdmVyc2lvbiAoZGVjbDEsIE5VTEwpOworCisgIGlmIChsb29r dXBfYXR0cmlidXRlICgidGFyZ2V0IiwgREVDTF9BVFRSSUJVVEVTIChkZWNs MikpICE9IE5VTEwpCisgICAgcHJpb3JpdHkyID0gZ2V0X2J1aWx0aW5fY29k ZV9mb3JfdmVyc2lvbiAoZGVjbDIsIE5VTEwpOworCisgIHJldHVybiAoaW50 KXByaW9yaXR5MSAtIChpbnQpcHJpb3JpdHkyOworfQorCisvKiBWMSBhbmQg VjIgcG9pbnQgdG8gZnVuY3Rpb24gdmVyc2lvbnMgd2l0aCBkaWZmZXJlbnQg cHJpb3JpdGllcworICAgYmFzZWQgb24gdGhlIHRhcmdldCBJU0EuICBUaGlz IGZ1bmN0aW9uIGNvbXBhcmVzIHRoZWlyIHByaW9yaXRpZXMuICAqLworIAor c3RhdGljIGludAorZmVhdHVyZV9jb21wYXJlIChjb25zdCB2b2lkICp2MSwg Y29uc3Qgdm9pZCAqdjIpCit7CisgIHR5cGVkZWYgc3RydWN0IF9mdW5jdGlv bl92ZXJzaW9uX2luZm8KKyAgICB7CisgICAgICB0cmVlIHZlcnNpb25fZGVj bDsKKyAgICAgIHRyZWUgcHJlZGljYXRlX2NoYWluOworICAgICAgdW5zaWdu ZWQgaW50IGRpc3BhdGNoX3ByaW9yaXR5OworICAgIH0gZnVuY3Rpb25fdmVy c2lvbl9pbmZvOworCisgIGNvbnN0IGZ1bmN0aW9uX3ZlcnNpb25faW5mbyBj MSA9ICooY29uc3QgZnVuY3Rpb25fdmVyc2lvbl9pbmZvICopdjE7CisgIGNv bnN0IGZ1bmN0aW9uX3ZlcnNpb25faW5mbyBjMiA9ICooY29uc3QgZnVuY3Rp b25fdmVyc2lvbl9pbmZvICopdjI7CisgIHJldHVybiAoYzIuZGlzcGF0Y2hf cHJpb3JpdHkgLSBjMS5kaXNwYXRjaF9wcmlvcml0eSk7Cit9CisKKy8qIFRo aXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHRoZSBkaXNwYXRjaCBmdW5jdGlvbiBm b3IKKyAgIG11bHRpLXZlcnNpb25lZCBmdW5jdGlvbnMuICBESVNQQVRDSF9E RUNMIGlzIHRoZSBmdW5jdGlvbiB3aGljaCB3aWxsCisgICBjb250YWluIHRo ZSBkaXNwYXRjaCBsb2dpYy4gIEZOREVDTFMgYXJlIHRoZSBmdW5jdGlvbiBj aG9pY2VzIGZvcgorICAgZGlzcGF0Y2gsIGFuZCBpcyBhIHRyZWUgY2hhaW4u ICBFTVBUWV9CQiBpcyB0aGUgYmFzaWMgYmxvY2sgcG9pbnRlcgorICAgaW4g RElTUEFUQ0hfREVDTCBpbiB3aGljaCB0aGUgZGlzcGF0Y2ggY29kZSBpcyBn ZW5lcmF0ZWQuICAqLworCitzdGF0aWMgaW50CitkaXNwYXRjaF9mdW5jdGlv bl92ZXJzaW9ucyAodHJlZSBkaXNwYXRjaF9kZWNsLAorCQkJICAgIHZvaWQg KmZuZGVjbHNfcCwKKwkJCSAgICBiYXNpY19ibG9jayAqZW1wdHlfYmIpCit7 CisgIHRyZWUgZGVmYXVsdF9kZWNsOworICBnaW1wbGUgaWZ1bmNfY3B1X2lu aXRfc3RtdDsKKyAgZ2ltcGxlX3NlcSBnc2VxOworICB0cmVlIG9sZF9jdXJy ZW50X2Z1bmN0aW9uX2RlY2w7CisgIGludCBpeDsKKyAgdHJlZSBlbGU7Cisg IFZFQyAodHJlZSwgaGVhcCkgKmZuZGVjbHM7CisgIHVuc2lnbmVkIGludCBu dW1fdmVyc2lvbnMgPSAwOworICB1bnNpZ25lZCBpbnQgYWN0dWFsX3ZlcnNp b25zID0gMDsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgc3RydWN0IF9mdW5j dGlvbl92ZXJzaW9uX2luZm8KKyAgICB7CisgICAgICB0cmVlIHZlcnNpb25f ZGVjbDsKKyAgICAgIHRyZWUgcHJlZGljYXRlX2NoYWluOworICAgICAgdW5z aWduZWQgaW50IGRpc3BhdGNoX3ByaW9yaXR5OworICAgIH0qZnVuY3Rpb25f dmVyc2lvbl9pbmZvOworCisgIGdjY19hc3NlcnQgKGRpc3BhdGNoX2RlY2wg IT0gTlVMTAorCSAgICAgICYmIGZuZGVjbHNfcCAhPSBOVUxMCisJICAgICAg JiYgZW1wdHlfYmIgIT0gTlVMTCk7CisKKyAgLypmbmRlY2xzX3AgaXMgYWN0 dWFsbHkgYSB2ZWN0b3IuICAqLworICBmbmRlY2xzID0gKFZFQyAodHJlZSwg aGVhcCkgKilmbmRlY2xzX3A7CisKKyAgLyogQXRsZWFzdCBvbmUgbW9yZSB2 ZXJzaW9uIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQuICAqLworICBudW1fdmVy c2lvbnMgPSBWRUNfbGVuZ3RoICh0cmVlLCBmbmRlY2xzKTsKKyAgZ2NjX2Fz c2VydCAobnVtX3ZlcnNpb25zID49IDIpOworCisgIGZ1bmN0aW9uX3ZlcnNp b25faW5mbyA9IChzdHJ1Y3QgX2Z1bmN0aW9uX3ZlcnNpb25faW5mbyAqKQor ICAgIHhtYWxsb2MgKChudW1fdmVyc2lvbnMgLSAxKSAqIHNpemVvZiAoc3Ry dWN0IF9mdW5jdGlvbl92ZXJzaW9uX2luZm8pKTsKKworICAvKiBUaGUgZmly c3QgdmVyc2lvbiBpbiB0aGUgdmVjdG9yIGlzIHRoZSBkZWZhdWx0IGRlY2wu ICAqLworICBkZWZhdWx0X2RlY2wgPSBWRUNfaW5kZXggKHRyZWUsIGZuZGVj bHMsIDApOworCisgIG9sZF9jdXJyZW50X2Z1bmN0aW9uX2RlY2wgPSBjdXJy ZW50X2Z1bmN0aW9uX2RlY2w7CisgIHB1c2hfY2Z1biAoREVDTF9TVFJVQ1Rf RlVOQ1RJT04gKGRpc3BhdGNoX2RlY2wpKTsKKyAgY3VycmVudF9mdW5jdGlv bl9kZWNsID0gZGlzcGF0Y2hfZGVjbDsKKworICBnc2VxID0gYmJfc2VxICgq ZW1wdHlfYmIpOworICAvKiBGdW5jdGlvbiB2ZXJzaW9uIGRpc3BhdGNoIGlz IHZpYSBJRlVOQy4gIElGVU5DIHJlc29sdmVycyBmaXJlIGJlZm9yZQorICAg ICBjb25zdHJ1Y3RvcnMsIHNvIGV4cGxpY2l0eSBjYWxsIF9fYnVpbHRpbl9j cHVfaW5pdCBoZXJlLiAgKi8KKyAgaWZ1bmNfY3B1X2luaXRfc3RtdCA9IGdp bXBsZV9idWlsZF9jYWxsX3ZlYyAoCisgICAgICAgICAgICAgICAgICAgICBp eDg2X2J1aWx0aW5zIFsoaW50KSBJWDg2X0JVSUxUSU5fQ1BVX0lOSVRdLCBO VUxMKTsKKyAgZ2ltcGxlX3NlcV9hZGRfc3RtdCAoJmdzZXEsIGlmdW5jX2Nw dV9pbml0X3N0bXQpOworICBnaW1wbGVfc2V0X2JiIChpZnVuY19jcHVfaW5p dF9zdG10LCAqZW1wdHlfYmIpOworICBzZXRfYmJfc2VxICgqZW1wdHlfYmIs IGdzZXEpOworCisgIHBvcF9jZnVuICgpOworICBjdXJyZW50X2Z1bmN0aW9u X2RlY2wgPSBvbGRfY3VycmVudF9mdW5jdGlvbl9kZWNsOworCisKKyAgZm9y IChpeCA9IDE7IFZFQ19pdGVyYXRlICh0cmVlLCBmbmRlY2xzLCBpeCwgZWxl KTsgKytpeCkKKyAgICB7CisgICAgICB0cmVlIHZlcnNpb25fZGVjbCA9IGVs ZTsKKyAgICAgIHRyZWUgcHJlZGljYXRlX2NoYWluID0gTlVMTF9UUkVFOwor ICAgICAgdW5zaWduZWQgaW50IHByaW9yaXR5OworICAgICAgLyogR2V0IGF0 dHJpYnV0ZSBzdHJpbmcsIHBhcnNlIGl0IGFuZCBmaW5kIHRoZSByaWdodCBw cmVkaWNhdGUgZGVjbC4KKyAgICAgICAgIFRoZSBwcmVkaWNhdGUgZnVuY3Rp b24gY291bGQgYmUgYSBsZW5ndGh5IGNvbWJpbmF0aW9uIG9mIG1hbnkKKwkg ZmVhdHVyZXMsIGxpa2UgYXJjaC10eXBlIGFuZCB2YXJpb3VzIGlzYS12YXJp YW50cy4gICovCisgICAgICBwcmlvcml0eSA9IGdldF9idWlsdGluX2NvZGVf Zm9yX3ZlcnNpb24gKHZlcnNpb25fZGVjbCwKKwkgCQkJICAgICAgICAgICAg ICAgJnByZWRpY2F0ZV9jaGFpbik7CisKKyAgICAgIGlmIChwcmVkaWNhdGVf Y2hhaW4gPT0gTlVMTF9UUkVFKQorCWNvbnRpbnVlOworCisgICAgICBhY3R1 YWxfdmVyc2lvbnMrKzsKKyAgICAgIGZ1bmN0aW9uX3ZlcnNpb25faW5mbyBb aXggLSAxXS52ZXJzaW9uX2RlY2wgPSB2ZXJzaW9uX2RlY2w7CisgICAgICBm dW5jdGlvbl92ZXJzaW9uX2luZm8gW2l4IC0gMV0ucHJlZGljYXRlX2NoYWlu ID0gcHJlZGljYXRlX2NoYWluOworICAgICAgZnVuY3Rpb25fdmVyc2lvbl9p bmZvIFtpeCAtIDFdLmRpc3BhdGNoX3ByaW9yaXR5ID0gcHJpb3JpdHk7Cisg ICAgfQorCisgIC8qIFNvcnQgdGhlIHZlcnNpb25zIGFjY29yZGluZyB0byBk ZXNjZW5kaW5nIG9yZGVyIG9mIGRpc3BhdGNoIHByaW9yaXR5LiAgVGhlCisg ICAgIHByaW9yaXR5IGlzIGJhc2VkIG9uIHRoZSBJU0EuICBUaGlzIGlzIG5v dCBhIHBlcmZlY3Qgc29sdXRpb24uICBUaGVyZQorICAgICBjb3VsZCBzdGls bCBiZSBhbWJpZ3VpdHkuICBJZiBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIHZl cnNpb24gaXMgc3VpdGFibGUKKyAgICAgdG8gZXhlY3V0ZSwgIHdoaWNoIG9u ZSBzaG91bGQgYmUgZGlzcGF0Y2hlZD8gIEluIGZ1dHVyZSwgYWxsb3cgdGhl IHVzZXIKKyAgICAgdG8gc3BlY2lmeSBhIGRpc3BhdGNoICBwcmlvcml0eSBu ZXh0IHRvIHRoZSB2ZXJzaW9uLiAgKi8KKyAgcXNvcnQgKGZ1bmN0aW9uX3Zl cnNpb25faW5mbywgYWN0dWFsX3ZlcnNpb25zLAorICAgICAgICAgc2l6ZW9m IChzdHJ1Y3QgX2Z1bmN0aW9uX3ZlcnNpb25faW5mbyksIGZlYXR1cmVfY29t cGFyZSk7CisKKyAgZm9yICAoaSA9IDA7IGkgPCBhY3R1YWxfdmVyc2lvbnM7 ICsraSkKKyAgICAqZW1wdHlfYmIgPSBhZGRfY29uZGl0aW9uX3RvX2JiIChk aXNwYXRjaF9kZWNsLAorCQkJCSAgICAgZnVuY3Rpb25fdmVyc2lvbl9pbmZv W2ldLnZlcnNpb25fZGVjbCwKKwkJCQkgICAgIGZ1bmN0aW9uX3ZlcnNpb25f aW5mb1tpXS5wcmVkaWNhdGVfY2hhaW4sCisJCQkJICAgICAqZW1wdHlfYmIp OworCisgIC8qIGRpc3BhdGNoIGRlZmF1bHQgdmVyc2lvbiBhdCB0aGUgZW5k LiAgKi8KKyAgKmVtcHR5X2JiID0gYWRkX2NvbmRpdGlvbl90b19iYiAoZGlz cGF0Y2hfZGVjbCwgZGVmYXVsdF9kZWNsLAorCQkJCSAgIE5VTEwsICplbXB0 eV9iYik7CisKKyAgZnJlZSAoZnVuY3Rpb25fdmVyc2lvbl9pbmZvKTsKKyAg cmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVl IGlmIGZuMSBhbmQgZm4yIGFyZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBmdW5j dGlvbi4KKyAgIFJldHVybnMgZmFsc2UgaWYgb25seSBvbmUgb2YgdGhlIGZ1 bmN0aW9uIGRlY2xzIGhhcyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZQorICAgc2V0 IG9yIGlmIHRoZSB0YXJnZXRzIG9mIHRoZSBmdW5jdGlvbiBkZWNscyBhcmUg ZGlmZmVyZW50LiAgVGhpcyBhc3N1bWVzCisgICB0aGUgZm4xIGFuZCBmbjIg aGF2ZSB0aGUgc2FtZSBzaWduYXR1cmUuICAqLworCitzdGF0aWMgYm9vbAor aXg4Nl9mdW5jdGlvbl92ZXJzaW9ucyAodHJlZSBmbjEsIHRyZWUgZm4yKQor eworICB0cmVlIGF0dHIxLCBhdHRyMjsKKyAgc3RydWN0IGNsX3RhcmdldF9v cHRpb24gKnRhcmdldDEsICp0YXJnZXQyOworCisgIGlmIChUUkVFX0NPREUg KGZuMSkgIT0gRlVOQ1RJT05fREVDTAorICAgICAgfHwgVFJFRV9DT0RFIChm bjIpICE9IEZVTkNUSU9OX0RFQ0wpCisgICAgcmV0dXJuIGZhbHNlOworCisg IGF0dHIxID0gREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGZuMSk7 CisgIGF0dHIyID0gREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGZu Mik7CisKKyAgaWYgKGF0dHIxID09IE5VTExfVFJFRSAmJiBhdHRyMiA9PSBO VUxMX1RSRUUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgoYXR0cjEg PT0gTlVMTF9UUkVFICYmIGF0dHIyICE9IE5VTExfVFJFRSkKKyAgICAgIHx8 IChhdHRyMSAhPSBOVUxMX1RSRUUgJiYgYXR0cjIgPT0gTlVMTF9UUkVFKSkK KyAgICByZXR1cm4gdHJ1ZTsKKworICB0YXJnZXQxID0gVFJFRV9UQVJHRVRf T1BUSU9OIChhdHRyMSk7CisgIHRhcmdldDIgPSBUUkVFX1RBUkdFVF9PUFRJ T04gKGF0dHIyKTsKKworICBpZiAodGFyZ2V0MS0+eF9peDg2X2lzYV9mbGFn cyA9PSB0YXJnZXQyLT54X2l4ODZfaXNhX2ZsYWdzCisgICAgICAmJiB0YXJn ZXQxLT54X3RhcmdldF9mbGFncyA9PSB0YXJnZXQyLT54X3RhcmdldF9mbGFn cworICAgICAgJiYgdGFyZ2V0MS0+YXJjaCA9PSB0YXJnZXQyLT5hcmNoCisg ICAgICAmJiB0YXJnZXQxLT50dW5lID09IHRhcmdldDItPnR1bmUKKyAgICAg ICYmIHRhcmdldDEtPnhfaXg4Nl9mcG1hdGggPT0gdGFyZ2V0Mi0+eF9peDg2 X2ZwbWF0aAorICAgICAgJiYgdGFyZ2V0MS0+YnJhbmNoX2Nvc3QgPT0gdGFy Z2V0Mi0+YnJhbmNoX2Nvc3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJl dHVybiB0cnVlOworfQorCisvKiBDb21wYXJhdG9yIGZ1bmN0aW9uIHRvIGJl IHVzZWQgaW4gcXNvcnQgcm91dGluZSB0byBzb3J0IGF0dHJpYnV0ZQorICAg c3BlY2lmaWNhdGlvbiBzdHJpbmdzIHRvICJ0YXJnZXQiLiAgKi8KKworc3Rh dGljIGludAorYXR0cl9zdHJjbXAgKGNvbnN0IHZvaWQgKnYxLCBjb25zdCB2 b2lkICp2MikKK3sKKyAgY29uc3QgY2hhciAqYzEgPSAqKGNoYXIgKmNvbnN0 Kil2MTsKKyAgY29uc3QgY2hhciAqYzIgPSAqKGNoYXIgKmNvbnN0Kil2MjsK KyAgcmV0dXJuIHN0cmNtcCAoYzEsIGMyKTsKK30KKworLyogU1RSIGlzIHRo ZSBhcmd1bWVudCB0byB0YXJnZXQgYXR0cmlidXRlLiAgVGhpcyBmdW5jdGlv biB0b2tlbml6ZXMKKyAgIHRoZSBjb21tYSBzZXBhcmF0ZWQgYXJndW1lbnRz LCBzb3J0cyB0aGVtIGFuZCByZXR1cm5zIGEgc3RyaW5nIHdoaWNoCisgICBp cyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tbWEgc2VwYXJhdGVk IGFyZ3VtZW50cy4gICBJdCBhbHNvCisgICByZXBsYWNlcyBub24taWRlbnRp ZmllciBjaGFyYWN0ZXJzICI9LC0iIHdpdGggIl8iLiAgKi8KKworc3RhdGlj IGNoYXIgKgorc29ydGVkX2F0dHJfc3RyaW5nIChjb25zdCBjaGFyICpzdHIp Cit7CisgIGNoYXIgKiphcmdzID0gTlVMTDsKKyAgY2hhciAqYXR0cl9zdHIs ICpyZXRfc3RyOworICBjaGFyICphdHRyID0gTlVMTDsKKyAgdW5zaWduZWQg aW50IGFyZ251bSA9IDE7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAo aSA9IDA7IGkgPCBzdHJsZW4gKHN0cik7IGkrKykKKyAgICBpZiAoc3RyW2ld ID09ICcsJykKKyAgICAgIGFyZ251bSsrOworCisgIGF0dHJfc3RyID0gKGNo YXIgKil4bWFsbG9jIChzdHJsZW4gKHN0cikgKyAxKTsKKyAgc3RyY3B5IChh dHRyX3N0ciwgc3RyKTsKKworICAvKiBSZXBsYWNlICI9LC0iIHdpdGggIl8i LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHN0cmxlbiAoYXR0cl9zdHIpOyBp KyspCisgICAgaWYgKGF0dHJfc3RyW2ldID09ICc9JyB8fCBhdHRyX3N0cltp XT09ICctJykKKyAgICAgIGF0dHJfc3RyW2ldID0gJ18nOworCisgIGlmIChh cmdudW0gPT0gMSkKKyAgICByZXR1cm4gYXR0cl9zdHI7CisKKyAgYXJncyA9 IChjaGFyICoqKXhtYWxsb2MgKGFyZ251bSAqIHNpemVvZiAoY2hhciAqKSk7 CisKKyAgaSA9IDA7CisgIGF0dHIgPSBzdHJ0b2sgKGF0dHJfc3RyLCAiLCIp OworICB3aGlsZSAoYXR0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFyZ3Nb aV0gPSBhdHRyOworICAgICAgaSsrOworICAgICAgYXR0ciA9IHN0cnRvayAo TlVMTCwgIiwiKTsKKyAgICB9CisKKyAgcXNvcnQgKGFyZ3MsIGFyZ251bSwg c2l6ZW9mIChjaGFyKiksIGF0dHJfc3RyY21wKTsKKworICByZXRfc3RyID0g KGNoYXIgKil4bWFsbG9jIChzdHJsZW4gKHN0cikgKyAxKTsKKyAgc3RyY3B5 IChyZXRfc3RyLCBhcmdzWzBdKTsKKyAgZm9yIChpID0gMTsgaSA8IGFyZ251 bTsgaSsrKQorICAgIHsKKyAgICAgIHN0cmNhdCAocmV0X3N0ciwgIl8iKTsK KyAgICAgIHN0cmNhdCAocmV0X3N0ciwgYXJnc1tpXSk7CisgICAgfQorCisg IGZyZWUgKGFyZ3MpOworICBmcmVlIChhdHRyX3N0cik7CisgIHJldHVybiBy ZXRfc3RyOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGFz c2VtYmxlciBuYW1lIGZvciBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgIHZlcnNp b25zLiAgSWYgREVDTCBpcyBhIGZ1bmN0aW9uIHZlcnNpb24gYW5kIGhhcyBh ICJ0YXJnZXQiCisgICBhdHRyaWJ1dGUsIGl0IGFwcGVuZHMgdGhlIGF0dHJp YnV0ZSBzdHJpbmcgdG8gaXRzIGFzc2VtYmxlciBuYW1lLiAgKi8KKworc3Rh dGljIHRyZWUKK2l4ODZfbWFuZ2xlX2Z1bmN0aW9uX3ZlcnNpb25fYXNzZW1i bGVyX25hbWUgKHRyZWUgZGVjbCwgdHJlZSBpZCkKK3sKKyAgdHJlZSB2ZXJz aW9uX2F0dHI7CisgIGNvbnN0IGNoYXIgKm9yaWdfbmFtZSwgKnZlcnNpb25f c3RyaW5nLCAqYXR0cl9zdHI7CisgIGNoYXIgKmFzc2VtYmxlcl9uYW1lOwor CisgIGlmIChERUNMX0RFQ0xBUkVEX0lOTElORV9QIChkZWNsKQorICAgICAg JiYgbG9va3VwX2F0dHJpYnV0ZSAoImdudV9pbmxpbmUiLAorCQkJICAgREVD TF9BVFRSSUJVVEVTIChkZWNsKSkpCisgICAgZXJyb3JfYXQgKERFQ0xfU09V UkNFX0xPQ0FUSU9OIChkZWNsKSwKKwkgICAgICAiRnVuY3Rpb24gdmVyc2lv bnMgY2Fubm90IGJlIG1hcmtlZCBhcyBnbnVfaW5saW5lLCIKKwkgICAgICAi IGJvZGllcyBoYXZlIHRvIGJlIGdlbmVyYXRlZFxuIik7CisKKyAgaWYgKERF Q0xfVklSVFVBTF9QIChkZWNsKQorICAgICAgfHwgREVDTF9WSU5ERVggKGRl Y2wpKQorICAgIGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAoZGVj bCksCisJICAgICAgIlZpcnR1YWwgZnVuY3Rpb24gdmVyc2lvbmluZyBub3Qg c3VwcG9ydGVkXG4iKTsKKworICB2ZXJzaW9uX2F0dHIgPSBsb29rdXBfYXR0 cmlidXRlICgidGFyZ2V0IiwgREVDTF9BVFRSSUJVVEVTIChkZWNsKSk7CisK KyAgLyogdGFyZ2V0IGF0dHJpYnV0ZSBzdHJpbmcgaXMgTlVMTCBmb3IgZGVm YXVsdCBmdW5jdGlvbnMuICAqLworICBpZiAodmVyc2lvbl9hdHRyID09IE5V TExfVFJFRSkKKyAgICByZXR1cm4gaWQ7CisKKyAgb3JpZ19uYW1lID0gSURF TlRJRklFUl9QT0lOVEVSIChpZCk7CisgIHZlcnNpb25fc3RyaW5nCisgICAg PSBUUkVFX1NUUklOR19QT0lOVEVSIChUUkVFX1ZBTFVFIChUUkVFX1ZBTFVF ICh2ZXJzaW9uX2F0dHIpKSk7CisKKyAgYXR0cl9zdHIgPSBzb3J0ZWRfYXR0 cl9zdHJpbmcgKHZlcnNpb25fc3RyaW5nKTsKKyAgYXNzZW1ibGVyX25hbWUg PSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG9yaWdfbmFtZSkKKwkJCQkg ICAgICsgc3RybGVuIChhdHRyX3N0cikgKyAyKTsKKworICBzcHJpbnRmIChh c3NlbWJsZXJfbmFtZSwgIiVzLiVzIiwgb3JpZ19uYW1lLCBhdHRyX3N0cik7 CisgIGlmIChkdW1wX2ZpbGUpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiQXNz ZW1ibGVyIG5hbWUgc2V0IHRvICVzIGZvciBmdW5jdGlvbiB2ZXJzaW9uICVz XG4iLAorCSAgICAgYXNzZW1ibGVyX25hbWUsIElERU5USUZJRVJfUE9JTlRF UiAoaWQpKTsKKworICAvKiBBbGxvdyBhc3NlbWJsZXIgbmFtZSB0byBiZSBt b2RpZmllZCBpZiBhbHJlYWR5IHNldC4gICovCisgIGlmIChERUNMX0FTU0VN QkxFUl9OQU1FX1NFVF9QIChkZWNsKSkKKyAgICBTRVRfREVDTF9SVEwgKGRl Y2wsIE5VTEwpOworCisgIHJldHVybiBnZXRfaWRlbnRpZmllciAoYXNzZW1i bGVyX25hbWUpOworfQorCitzdGF0aWMgdHJlZSAKK2l4ODZfbWFuZ2xlX2Rl Y2xfYXNzZW1ibGVyX25hbWUgKHRyZWUgZGVjbCwgdHJlZSBpZCkKK3sKKyAg LyogRm9yIGZ1bmN0aW9uIHZlcnNpb24sIGFkZCB0aGUgdGFyZ2V0IHN1ZmZp eCB0byB0aGUgYXNzZW1ibGVyIG5hbWUuICAqLworICBpZiAoVFJFRV9DT0RF IChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCisgICAgICAmJiBERUNMX0ZVTkNU SU9OX1ZFUlNJT05FRCAoZGVjbCkpCisgICAgcmV0dXJuIGl4ODZfbWFuZ2xl X2Z1bmN0aW9uX3ZlcnNpb25fYXNzZW1ibGVyX25hbWUgKGRlY2wsIGlkKTsK KworICByZXR1cm4gaWQ7Cit9CisKKy8qIFJldHVybiBhIG5ldyBuYW1lIGJ5 IGFwcGVuZGluZyBTVUZGSVggdG8gdGhlIERFQ0wgbmFtZS4gIElmCisgICBt YWtlX3VuaXF1ZSBpcyB0cnVlLCBhcHBlbmQgdGhlIGZ1bGwgcGF0aCBuYW1l LiAgKi8KKworc3RhdGljIGNoYXIgKgorbWFrZV9uYW1lICh0cmVlIGRlY2ws IGNvbnN0IGNoYXIgKnN1ZmZpeCwgYm9vbCBtYWtlX3VuaXF1ZSkKK3sKKyAg Y2hhciAqZ2xvYmFsX3Zhcl9uYW1lOworICBpbnQgbmFtZV9sZW47CisgIGNv bnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKnVuaXF1ZV9uYW1lID0g TlVMTDsKKworICBuYW1lID0gSURFTlRJRklFUl9QT0lOVEVSIChERUNMX0FT U0VNQkxFUl9OQU1FIChkZWNsKSk7CisKKyAgLyogR2V0IGEgdW5pcXVlIG5h bWUgdGhhdCBjYW4gYmUgdXNlZCBnbG9iYWxseSB3aXRob3V0IGFueSBjaGFu Y2VzCisgICAgIG9mIGNvbGxpc2lvbiBhdCBsaW5rIHRpbWUuICAqLworICBp ZiAobWFrZV91bmlxdWUpCisgICAgdW5pcXVlX25hbWUgPSBJREVOVElGSUVS X1BPSU5URVIgKGdldF9maWxlX2Z1bmN0aW9uX25hbWUgKCJcMCIpKTsKKwor ICBuYW1lX2xlbiA9IHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHN1ZmZpeCkg KyAyOworCisgIGlmIChtYWtlX3VuaXF1ZSkKKyAgICBuYW1lX2xlbiArPSBz dHJsZW4gKHVuaXF1ZV9uYW1lKSArIDE7CisgIGdsb2JhbF92YXJfbmFtZSA9 IChjaGFyICopIHhtYWxsb2MgKG5hbWVfbGVuKTsKKworICAvKiBVc2UgJy4n IHRvIGNvbmNhdGVuYXRlIG5hbWVzIGFzIGl0IGlzIGRlbWFuZ2xlciBmcmll bmRseS4gICovCisgIGlmIChtYWtlX3VuaXF1ZSkKKyAgICAgIHNucHJpbnRm IChnbG9iYWxfdmFyX25hbWUsIG5hbWVfbGVuLCAiJXMuJXMuJXMiLCBuYW1l LAorCQl1bmlxdWVfbmFtZSwgc3VmZml4KTsKKyAgZWxzZQorICAgICAgc25w cmludGYgKGdsb2JhbF92YXJfbmFtZSwgbmFtZV9sZW4sICIlcy4lcyIsIG5h bWUsIHN1ZmZpeCk7CisKKyAgcmV0dXJuIGdsb2JhbF92YXJfbmFtZTsKK30K KworLyogTWFrZSBhIGRpc3BhdGNoZXIgZGVjbGFyYXRpb24gZm9yIHRoZSBt dWx0aS12ZXJzaW9uZWQgZnVuY3Rpb24gREVDTC4KKyAgIENhbGxzIHRvIERF Q0wgZnVuY3Rpb24gd2lsbCBiZSByZXBsYWNlZCB3aXRoIGNhbGxzIHRvIHRo ZSBkaXNwYXRjaGVyCisgICBieSB0aGUgZnJvbnQtZW5kLiAgUmV0dXJuIHRo ZSBkZWNsIGNyZWF0ZWQuICAqLworCitzdGF0aWMgdHJlZQorbWFrZV9kaXNw YXRjaGVyX2RlY2wgKGNvbnN0IHRyZWUgZGVjbCkKK3sKKyAgdHJlZSBmdW5j X2RlY2w7CisgIGNoYXIgKmZ1bmNfbmFtZSwgKnJlc29sdmVyX25hbWU7Cisg IHRyZWUgZm5fdHlwZSwgZnVuY190eXBlOworICBib29sIGlzX3VuaXEgPSBm YWxzZTsKKworICBpZiAoVFJFRV9QVUJMSUMgKGRlY2wpID09IDApCisgICAg aXNfdW5pcSA9IHRydWU7CisKKyAgZnVuY19uYW1lID0gbWFrZV9uYW1lIChk ZWNsLCAiaWZ1bmMiLCBpc191bmlxKTsKKyAgcmVzb2x2ZXJfbmFtZSA9IG1h a2VfbmFtZSAoZGVjbCwgInJlc29sdmVyIiwgaXNfdW5pcSk7CisgIGdjY19h c3NlcnQgKHJlc29sdmVyX25hbWUpOworCisgIGZuX3R5cGUgPSBUUkVFX1RZ UEUgKGRlY2wpOworICBmdW5jX3R5cGUgPSBidWlsZF9mdW5jdGlvbl90eXBl IChUUkVFX1RZUEUgKGZuX3R5cGUpLAorCQkJCSAgIFRZUEVfQVJHX1RZUEVT IChmbl90eXBlKSk7CisgIAorICBmdW5jX2RlY2wgPSBidWlsZF9mbl9kZWNs IChmdW5jX25hbWUsIGZ1bmNfdHlwZSk7CisgIFRSRUVfVVNFRCAoZnVuY19k ZWNsKSA9IDE7CisgIERFQ0xfQ09OVEVYVCAoZnVuY19kZWNsKSA9IE5VTExf VFJFRTsKKyAgREVDTF9JTklUSUFMIChmdW5jX2RlY2wpID0gZXJyb3JfbWFy a19ub2RlOworICBERUNMX0FSVElGSUNJQUwgKGZ1bmNfZGVjbCkgPSAxOwor ICAvKiBNYXJrIHRoaXMgZnVuYyBhcyBleHRlcm5hbCwgdGhlIHJlc29sdmVy IHdpbGwgZmxpcCBpdCBhZ2FpbiBpZgorICAgICBpdCBnZXRzIGdlbmVyYXRl ZC4gICovCisgIERFQ0xfRVhURVJOQUwgKGZ1bmNfZGVjbCkgPSAxOworICAv KiBUaGlzIHdpbGwgYmUgb2YgdHlwZSBJRlVOQ3MgaGF2ZSB0byBiZSBleHRl cm5hbGx5IHZpc2libGUuICAqLworICBUUkVFX1BVQkxJQyAoZnVuY19kZWNs KSA9IDE7CisKKyAgcmV0dXJuIGZ1bmNfZGVjbDsgIAorfQorCisvKiBSZXR1 cm5zIHRydWUgaWYgZGVjbCBpcyBtdWx0aS12ZXJzaW9uZWQgYW5kIERFQ0wg aXMgdGhlIGRlZmF1bHQgZnVuY3Rpb24sCisgICB0aGF0IGlzIGl0IGlzIG5v dCB0YWdnZWQgd2l0aCB0YXJnZXQgc3BlY2lmaWMgb3B0aW1pemF0aW9uLiAg Ki8KKworc3RhdGljIGJvb2wKK2lzX2Z1bmN0aW9uX2RlZmF1bHRfdmVyc2lv biAoY29uc3QgdHJlZSBkZWNsKQoreworICByZXR1cm4gKFRSRUVfQ09ERSAo ZGVjbCkgPT0gRlVOQ1RJT05fREVDTAorCSAgJiYgREVDTF9GVU5DVElPTl9W RVJTSU9ORUQgKGRlY2wpCisJICAmJiBERUNMX0ZVTkNUSU9OX1NQRUNJRklD X1RBUkdFVCAoZGVjbCkgPT0gTlVMTF9UUkVFKTsKK30KKworLyogTWFrZSBh IGRpc3BhdGNoZXIgZGVjbGFyYXRpb24gZm9yIHRoZSBtdWx0aS12ZXJzaW9u ZWQgZnVuY3Rpb24gREVDTC4KKyAgIENhbGxzIHRvIERFQ0wgZnVuY3Rpb24g d2lsbCBiZSByZXBsYWNlZCB3aXRoIGNhbGxzIHRvIHRoZSBkaXNwYXRjaGVy CisgICBieSB0aGUgZnJvbnQtZW5kLiAgSXQgYWxzbyBjaGFpbnMgdGhlIGNn cmFwaCBub2RlcyBvZiBhbGwgdGhlCisgICBzZW1hbnRpY2FsbHkgaWRlbnRp Y2FsIHZlcnNpb25zIGluIHZlY3RvciBGTl9WRVJfVkVDX1AuICBSZXR1cm5z IHRoZQorICAgZGVjbCBvZiB0aGUgZGlzcGF0Y2hlciBmdW5jdGlvbi4gICov CisKK3N0YXRpYyB0cmVlCitpeDg2X2dldF9mdW5jdGlvbl92ZXJzaW9uc19k aXNwYXRjaGVyICh2b2lkICpmbl92ZXJfdmVjX3ApCit7CisgIHN0cnVjdCBj Z3JhcGhfbm9kZSAqbm9kZSA9IE5VTEw7CisgIHN0cnVjdCBjZ3JhcGhfbm9k ZSAqZGVmYXVsdF9ub2RlID0gTlVMTDsKKyAgc3RydWN0IGNncmFwaF9ub2Rl ICpjdXJyX25vZGUgPSBOVUxMOworICBpbnQgaXg7CisgIHRyZWUgZWxlOwor ICB0cmVlIGRpc3BhdGNoX2RlY2wgPSBOVUxMOworICBWRUMgKHRyZWUsIGhl YXApICpmbl92ZXJfdmVjID0gTlVMTDsKKworICBmbl92ZXJfdmVjID0gKFZF QyAodHJlZSxoZWFwKSAqKSBmbl92ZXJfdmVjX3A7CisgIGdjY19hc3NlcnQg KGZuX3Zlcl92ZWMgIT0gTlVMTCk7CisKKyAgLyogRmluZCB0aGUgZGVmYXVs dCB2ZXJzaW9uLiAgKi8KKyAgZm9yIChpeCA9IDA7IFZFQ19pdGVyYXRlICh0 cmVlLCBmbl92ZXJfdmVjLCBpeCwgZWxlKTsgKytpeCkKKyAgICB7CisgICAg ICBpZiAoaXNfZnVuY3Rpb25fZGVmYXVsdF92ZXJzaW9uIChlbGUpKQorCXsK KwkgIGRlZmF1bHRfbm9kZSA9IGNncmFwaF9nZXRfY3JlYXRlX25vZGUgKGVs ZSk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIElmIHRoZXJlIGlz IG5vIGRlZmF1bHQgbm9kZSwganVzdCByZXR1cm4gTlVMTC4gICovCisgIGlm ICghZGVmYXVsdF9ub2RlKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChk ZWZhdWx0X25vZGUtPnZlcnNpb25fZGlzcGF0Y2hlcl9kZWNsKQorICAgIHJl dHVybiBkZWZhdWx0X25vZGUtPnZlcnNpb25fZGlzcGF0Y2hlcl9kZWNsOwor CisjaWYgZGVmaW5lZCAoQVNNX09VVFBVVF9UWVBFX0RJUkVDVElWRSkgJiYg SEFWRV9HTlVfSU5ESVJFQ1RfRlVOQ1RJT04KKyAgLyogUmlnaHQgbm93LCB0 aGUgZGlzcGF0Y2hpbmcgaXMgZG9uZSB2aWEgaWZ1bmMuICAqLworICBkaXNw YXRjaF9kZWNsID0gbWFrZV9kaXNwYXRjaGVyX2RlY2wgKGRlZmF1bHRfbm9k ZS0+c3ltYm9sLmRlY2wpOyAKKyNlbHNlCisgIGVycm9yX2F0IChERUNMX1NP VVJDRV9MT0NBVElPTiAoZGVmYXVsdF9ub2RlLT5zeW1ib2wuZGVjbCksCisJ ICAgICJNdWx0aXZlcnNpb25pbmcgbmVlZHMgaWZ1bmMgd2hpY2ggaXMgbm90 IHN1cHBvcnRlZCAiCisJICAgICJpbiB0aGlzIGNvbmZpZ3VyYXRpb24iKTsK KyNlbmRpZgorICBkZWZhdWx0X25vZGUtPnZlcnNpb25fZGlzcGF0Y2hlcl9k ZWNsID0gZGlzcGF0Y2hfZGVjbDsKKyAgY3Vycl9ub2RlID0gY2dyYXBoX2dl dF9jcmVhdGVfbm9kZSAoZGlzcGF0Y2hfZGVjbCk7CisgIGdjY19hc3NlcnQg KGN1cnJfbm9kZSk7CisgIGN1cnJfbm9kZS0+ZGlzcGF0Y2hlcl9mdW5jdGlv biA9IDE7CisgIGNncmFwaF9tYXJrX2FkZHJlc3NfdGFrZW5fbm9kZSAoZGVm YXVsdF9ub2RlKTsKKworICBmb3IgKGl4ID0gMDsgVkVDX2l0ZXJhdGUgKHRy ZWUsIGZuX3Zlcl92ZWMsIGl4LCBlbGUpOyArK2l4KQorICAgIHsKKyAgICAg IG5vZGUgPSBjZ3JhcGhfZ2V0X2NyZWF0ZV9ub2RlIChlbGUpOworICAgICAg Z2NjX2Fzc2VydCAobm9kZSAhPSBOVUxMICYmIERFQ0xfRlVOQ1RJT05fVkVS U0lPTkVEIChlbGUpKTsKKyAgICAgIGlmIChub2RlID09IGRlZmF1bHRfbm9k ZSkKKwljb250aW51ZTsKKyAgICAgIGdjY19hc3NlcnQgKERFQ0xfRlVOQ1RJ T05fU1BFQ0lGSUNfVEFSR0VUIChlbGUpICE9IE5VTExfVFJFRSk7CisKKyAg ICAgIGlmIChjdXJyX25vZGUtPm5leHRfZnVuY3Rpb25fdmVyc2lvbikKKyAJ eworCSAgbm9kZS0+bmV4dF9mdW5jdGlvbl92ZXJzaW9uID0gY3Vycl9ub2Rl LT5uZXh0X2Z1bmN0aW9uX3ZlcnNpb247CisJICBjdXJyX25vZGUtPm5leHRf ZnVuY3Rpb25fdmVyc2lvbi0+cHJldl9mdW5jdGlvbl92ZXJzaW9uID0gbm9k ZTsKKwl9CisgICAgICBjdXJyX25vZGUtPm5leHRfZnVuY3Rpb25fdmVyc2lv biA9IG5vZGU7CisgICAgICBub2RlLT5wcmV2X2Z1bmN0aW9uX3ZlcnNpb24g PSBjdXJyX25vZGU7CisgICAgICBub2RlLT52ZXJzaW9uX2Rpc3BhdGNoZXJf ZGVjbCA9IGRpc3BhdGNoX2RlY2w7CisgICAgfQorCisgIC8qIFRoZSBkZWZh dWx0IHZlcnNpb24gc2hvdWxkIGJlIHRoZSBmaXJzdCBub2RlLiAgKi8KKyAg ZGVmYXVsdF9ub2RlLT5uZXh0X2Z1bmN0aW9uX3ZlcnNpb24gPSBjdXJyX25v ZGUtPm5leHRfZnVuY3Rpb25fdmVyc2lvbjsKKyAgY3Vycl9ub2RlLT5uZXh0 X2Z1bmN0aW9uX3ZlcnNpb24tPnByZXZfZnVuY3Rpb25fdmVyc2lvbiA9IGRl ZmF1bHRfbm9kZTsKKyAgY3Vycl9ub2RlLT5uZXh0X2Z1bmN0aW9uX3ZlcnNp b24gPSBkZWZhdWx0X25vZGU7CisgIAorICByZXR1cm4gZGlzcGF0Y2hfZGVj bDsKK30KKworLyogTWFrZXMgYSBmdW5jdGlvbiBhdHRyaWJ1dGUgb2YgdGhl IGZvcm0gTkFNRShBUkdfTkFNRSkgYW5kIGNoYWlucworICAgaXQgdG8gQ0hB SU4uICAqLworCitzdGF0aWMgdHJlZQorbWFrZV9hdHRyaWJ1dGUgKGNvbnN0 IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZ19uYW1lLCB0cmVlIGNoYWlu KQoreworICB0cmVlIGF0dHJfbmFtZTsKKyAgdHJlZSBhdHRyX2FyZ19uYW1l OworICB0cmVlIGF0dHJfYXJnczsKKyAgdHJlZSBhdHRyOworCisgIGF0dHJf bmFtZSA9IGdldF9pZGVudGlmaWVyIChuYW1lKTsKKyAgYXR0cl9hcmdfbmFt ZSA9IGJ1aWxkX3N0cmluZyAoc3RybGVuIChhcmdfbmFtZSksIGFyZ19uYW1l KTsKKyAgYXR0cl9hcmdzID0gdHJlZV9jb25zIChOVUxMX1RSRUUsIGF0dHJf YXJnX25hbWUsIE5VTExfVFJFRSk7CisgIGF0dHIgPSB0cmVlX2NvbnMgKGF0 dHJfbmFtZSwgYXR0cl9hcmdzLCBjaGFpbik7CisgIHJldHVybiBhdHRyOwor fQorCisvKiBNYWtlIHRoZSByZXNvbHZlciBmdW5jdGlvbiBkZWNsIHRvIGRp c3BhdGNoIHRoZSB2ZXJzaW9ucyBvZgorICAgYSBtdWx0aS12ZXJzaW9uZWQg ZnVuY3Rpb24sICBERUZBVUxUX0RFQ0wuICBDcmVhdGUgYW4KKyAgIGVtcHR5 IGJhc2ljIGJsb2NrIGluIHRoZSByZXNvbHZlciBhbmQgc3RvcmUgdGhlIHBv aW50ZXIgaW4KKyAgIEVNUFRZX0JCLiAgUmV0dXJuIHRoZSBkZWNsIG9mIHRo ZSByZXNvbHZlciBmdW5jdGlvbi4gICovCisKK3N0YXRpYyB0cmVlCittYWtl X3Jlc29sdmVyX2Z1bmMgKGNvbnN0IHRyZWUgZGVmYXVsdF9kZWNsLAorCQkg ICAgY29uc3QgdHJlZSBkaXNwYXRjaF9kZWNsLAorCQkgICAgYmFzaWNfYmxv Y2sgKmVtcHR5X2JiKQoreworICBjaGFyICpyZXNvbHZlcl9uYW1lOworICB0 cmVlIGRlY2wsIHR5cGUsIGRlY2xfbmFtZSwgdDsKKyAgYmFzaWNfYmxvY2sg bmV3X2JiOworICB0cmVlIG9sZF9jdXJyZW50X2Z1bmN0aW9uX2RlY2w7Cisg IGJvb2wgaXNfdW5pcSA9IGZhbHNlOworCisgIC8qIElGVU5DJ3MgaGF2ZSB0 byBiZSBnbG9iYWxseSB2aXNpYmxlLiAgU28sIGlmIHRoZSBkZWZhdWx0X2Rl Y2wgaXMKKyAgICAgbm90LCB0aGVuIHRoZSBuYW1lIG9mIHRoZSBJRlVOQyBz aG91bGQgYmUgbWFkZSB1bmlxdWUuICAqLworICBpZiAoVFJFRV9QVUJMSUMg KGRlZmF1bHRfZGVjbCkgPT0gMCkKKyAgICBpc191bmlxID0gdHJ1ZTsKKwor ICAvKiBBcHBlbmQgdGhlIGZpbGVuYW1lIHRvIHRoZSByZXNvbHZlciBmdW5j dGlvbiBpZiB0aGUgdmVyc2lvbnMgYXJlCisgICAgIG5vdCBleHRlcm5hbGx5 IHZpc2libGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHJlc29sdmVyIGZ1bmN0 aW9uIGhhcworICAgICB0byBiZSBleHRlcm5hbGx5IHZpc2libGUgZm9yIHRo ZSBsb2FkZXIgdG8gZmluZCBpdC4gIFNvLCBhcHBlbmRpbmcKKyAgICAgdGhl IGZpbGVuYW1lIHdpbGwgcHJldmVudCBjb25mbGljdHMgd2l0aCBhIHJlc29s dmVyIGZ1bmN0aW9uIGZyb20KKyAgICAgYW5vdGhlciBtb2R1bGUgd2hpY2gg aXMgYmFzZWQgb24gdGhlIHNhbWUgdmVyc2lvbiBuYW1lLiAgKi8KKyAgcmVz b2x2ZXJfbmFtZSA9IG1ha2VfbmFtZSAoZGVmYXVsdF9kZWNsLCAicmVzb2x2 ZXIiLCBpc191bmlxKTsKKworICAvKiBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24g c2hvdWxkIHJldHVybiBhICh2b2lkICopLiAqLworICB0eXBlID0gYnVpbGRf ZnVuY3Rpb25fdHlwZV9saXN0IChwdHJfdHlwZV9ub2RlLCBOVUxMX1RSRUUp OworCisgIGRlY2wgPSBidWlsZF9mbl9kZWNsIChyZXNvbHZlcl9uYW1lLCB0 eXBlKTsKKyAgZGVjbF9uYW1lID0gZ2V0X2lkZW50aWZpZXIgKHJlc29sdmVy X25hbWUpOworICBTRVRfREVDTF9BU1NFTUJMRVJfTkFNRSAoZGVjbCwgZGVj bF9uYW1lKTsKKworICBERUNMX05BTUUgKGRlY2wpID0gZGVjbF9uYW1lOwor ICBUUkVFX1VTRUQgKGRlY2wpID0gMTsKKyAgREVDTF9BUlRJRklDSUFMIChk ZWNsKSA9IDE7CisgIERFQ0xfSUdOT1JFRF9QIChkZWNsKSA9IDA7CisgIC8q IElGVU5DIHJlc29sdmVycyBoYXZlIHRvIGJlIGV4dGVybmFsbHkgdmlzaWJs ZS4gICovCisgIFRSRUVfUFVCTElDIChkZWNsKSA9IDE7CisgIERFQ0xfVU5J TkxJTkFCTEUgKGRlY2wpID0gMTsKKworICBERUNMX0VYVEVSTkFMIChkZWNs KSA9IDA7CisgIERFQ0xfRVhURVJOQUwgKGRpc3BhdGNoX2RlY2wpID0gMDsK KworICBERUNMX0NPTlRFWFQgKGRlY2wpID0gTlVMTF9UUkVFOworICBERUNM X0lOSVRJQUwgKGRlY2wpID0gbWFrZV9ub2RlIChCTE9DSyk7CisgIERFQ0xf U1RBVElDX0NPTlNUUlVDVE9SIChkZWNsKSA9IDA7CisgIFRSRUVfUkVBRE9O TFkgKGRlY2wpID0gMDsKKyAgREVDTF9QVVJFX1AgKGRlY2wpID0gMDsKKwor ICBpZiAoREVDTF9DT01EQVRfR1JPVVAgKGRlZmF1bHRfZGVjbCkpCisgICAg eworICAgICAgREVDTF9DT01EQVQgKGRlY2wpID0gREVDTF9DT01EQVQgKGRl ZmF1bHRfZGVjbCk7CisgICAgICBtYWtlX2RlY2xfb25lX29ubHkgKGRlY2ws IERFQ0xfQ09NREFUX0dST1VQIChkZWZhdWx0X2RlY2wpKTsKKyAgICB9Cisg IGVsc2UgaWYgKFRSRUVfUFVCTElDIChkZWZhdWx0X2RlY2wpKQorICAgIHsK KyAgICAgIC8qIEluIHRoaXMgY2FzZSwgZWFjaCB0cmFuc2xhdGlvbiB1bml0 IHdpdGggYSBjYWxsIHRvIHRoaXMKKwkgdmVyc2lvbmVkIGZ1bmN0aW9uIHdp bGwgcHV0IG91dCBhIHJlc29sdmVyLiAgRW5zdXJlIGl0CisJIGlzIGNvbWRh dCB0byBrZWVwIGp1c3Qgb25lIGNvcHkuICAqLworICAgICAgREVDTF9DT01E QVQgKGRlY2wpID0gMTsKKyAgICAgIG1ha2VfZGVjbF9vbmVfb25seSAoZGVj bCwgREVDTF9BU1NFTUJMRVJfTkFNRSAoZGVjbCkpOworICAgIH0KKyAgLyog QnVpbGQgcmVzdWx0IGRlY2wgYW5kIGFkZCB0byBmdW5jdGlvbl9kZWNsLiAq LworICB0ID0gYnVpbGRfZGVjbCAoVU5LTk9XTl9MT0NBVElPTiwgUkVTVUxU X0RFQ0wsIE5VTExfVFJFRSwgcHRyX3R5cGVfbm9kZSk7CisgIERFQ0xfQVJU SUZJQ0lBTCAodCkgPSAxOworICBERUNMX0lHTk9SRURfUCAodCkgPSAxOwor ICBERUNMX1JFU1VMVCAoZGVjbCkgPSB0OworCisgIGdpbXBsaWZ5X2Z1bmN0 aW9uX3RyZWUgKGRlY2wpOworICBvbGRfY3VycmVudF9mdW5jdGlvbl9kZWNs ID0gY3VycmVudF9mdW5jdGlvbl9kZWNsOworICBwdXNoX2NmdW4gKERFQ0xf U1RSVUNUX0ZVTkNUSU9OIChkZWNsKSk7CisgIGN1cnJlbnRfZnVuY3Rpb25f ZGVjbCA9IGRlY2w7CisgIGdpbXBsZV9yZWdpc3Rlcl9jZmdfaG9va3MgKCk7 CisgIGluaXRfZW1wdHlfdHJlZV9jZmdfZm9yX2Z1bmN0aW9uIChERUNMX1NU UlVDVF9GVU5DVElPTiAoZGVjbCkpOworICBjZnVuLT5jdXJyX3Byb3BlcnRp ZXMgfD0KKyAgICAoUFJPUF9naW1wbGVfbGNmIHwgUFJPUF9naW1wbGVfbGVo IHwgUFJPUF9jZmcgfCBQUk9QX3NzYQorICAgICB8IFBST1BfZ2ltcGxlX2Fu eSk7CisgIGNmdW4tPmN1cnJfcHJvcGVydGllcyA9IDE1OworICBuZXdfYmIg PSBjcmVhdGVfZW1wdHlfYmIgKEVOVFJZX0JMT0NLX1BUUik7CisgIG1ha2Vf ZWRnZSAoRU5UUllfQkxPQ0tfUFRSLCBuZXdfYmIsIEVER0VfRkFMTFRIUlUp OworICBtYWtlX2VkZ2UgKG5ld19iYiwgRVhJVF9CTE9DS19QVFIsIDApOwor ICAqZW1wdHlfYmIgPSBuZXdfYmI7CisKKyAgY2dyYXBoX2FkZF9uZXdfZnVu Y3Rpb24gKGRlY2wsIHRydWUpOworICBjZ3JhcGhfY2FsbF9mdW5jdGlvbl9p bnNlcnRpb25faG9va3MgKGNncmFwaF9nZXRfY3JlYXRlX25vZGUgKGRlY2wp KTsKKworICBpZiAoREVDTF9DT01EQVRfR1JPVVAgKGRlZmF1bHRfZGVjbCkp CisgICAgeworICAgICAgZ2NjX2Fzc2VydCAoY2dyYXBoX2dldF9ub2RlIChk ZWZhdWx0X2RlY2wpKTsKKyAgICAgIHN5bXRhYl9hZGRfdG9fc2FtZV9jb21k YXRfZ3JvdXAgKAorCShzeW10YWJfbm9kZSkgY2dyYXBoX2dldF9ub2RlIChk ZWNsKSwKKwkoc3ltdGFiX25vZGUpIGNncmFwaF9nZXRfbm9kZSAoZGVmYXVs dF9kZWNsKSk7CisgICAgfQorCisgIHBvcF9jZnVuICgpOworICBjdXJyZW50 X2Z1bmN0aW9uX2RlY2wgPSBvbGRfY3VycmVudF9mdW5jdGlvbl9kZWNsOwor CisgIGdjY19hc3NlcnQgKGRpc3BhdGNoX2RlY2wgIT0gTlVMTCk7CisgIC8q IE1hcmsgZGlzcGF0Y2hfZGVjbCBhcyAiaWZ1bmMiIHdpdGggcmVzb2x2ZXIg YXMgcmVzb2x2ZXJfbmFtZS4gICovCisgIERFQ0xfQVRUUklCVVRFUyAoZGlz cGF0Y2hfZGVjbCkgCisgICAgPSBtYWtlX2F0dHJpYnV0ZSAoImlmdW5jIiwg cmVzb2x2ZXJfbmFtZSwgREVDTF9BVFRSSUJVVEVTIChkaXNwYXRjaF9kZWNs KSk7CisKKyAgLyogQ3JlYXRlIHRoZSBhbGlhcyBmb3IgZGlzcGF0Y2ggdG8g cmVzb2x2ZXIgaGVyZS4gICovCisgIGNncmFwaF9jcmVhdGVfZnVuY3Rpb25f YWxpYXMgKGRpc3BhdGNoX2RlY2wsIGRlY2wpOworICByZXR1cm4gZGVjbDsK K30KKworLyogR2VuZXJhdGUgdGhlIGRpc3BhdGNoaW5nIGNvZGUgYm9keSB0 byBkaXNwYXRjaCBtdWx0aS12ZXJzaW9uZWQgZnVuY3Rpb24KKyAgIERFQ0wu ICBUaGUgdGFyZ2V0IGhvb2sgaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlICJ0 YXJnZXQiIGF0dHJpYnV0ZXMgYW5kCisgICBwcm92aWRlIHRoZSBjb2RlIHRv IGRpc3BhdGNoIHRoZSByaWdodCBmdW5jdGlvbiBhdCBydW4tdGltZS4gIE5P REUgcG9pbnRzCisgICB0byB0aGUgZGlzcGF0Y2hlciBkZWNsIHdob3NlIGJv ZHkgd2lsbCBiZSBjcmVhdGVkLiAgKi8KKworc3RhdGljIHRyZWUgCitpeDg2 X2dlbmVyYXRlX3ZlcnNpb25fZGlzcGF0Y2hlcl9ib2R5ICh2b2lkICpub2Rl X3ApCit7CisgIHRyZWUgcmVzb2x2ZXJfZGVjbDsKKyAgYmFzaWNfYmxvY2sg ZW1wdHlfYmI7CisgIFZFQyAodHJlZSwgaGVhcCkgKmZuX3Zlcl92ZWMgPSBO VUxMOworICB0cmVlIG9sZF9jdXJyZW50X2Z1bmN0aW9uX2RlY2w7CisgIHRy ZWUgZGVmYXVsdF92ZXJfZGVjbDsKKyAgc3RydWN0IGNncmFwaF9ub2RlICp2 ZXJzbjsKKyAgc3RydWN0IGNncmFwaF9ub2RlICpub2RlOworCisgIG5vZGUg PSAoY2dyYXBoX25vZGUgKilub2RlX3A7CisKKyAgZ2NjX2Fzc2VydCAobm9k ZS0+ZGlzcGF0Y2hlcl9mdW5jdGlvbik7CisKKyAgaWYgKG5vZGUtPnZlcnNp b25fZGlzcGF0Y2hlcl9kZWNsKQorICAgIHJldHVybiBub2RlLT52ZXJzaW9u X2Rpc3BhdGNoZXJfZGVjbDsKKworICBkZWZhdWx0X3Zlcl9kZWNsID0gbm9k ZS0+bmV4dF9mdW5jdGlvbl92ZXJzaW9uLT5zeW1ib2wuZGVjbDsKKyAgcmVz b2x2ZXJfZGVjbCA9IG1ha2VfcmVzb2x2ZXJfZnVuYyAoZGVmYXVsdF92ZXJf ZGVjbCwKKwkJCQkgICAgICBub2RlLT5zeW1ib2wuZGVjbCwgJmVtcHR5X2Ji KTsKKyAgbm9kZS0+dmVyc2lvbl9kaXNwYXRjaGVyX2RlY2wgPSByZXNvbHZl cl9kZWNsOworCisgIG9sZF9jdXJyZW50X2Z1bmN0aW9uX2RlY2wgPSBjdXJy ZW50X2Z1bmN0aW9uX2RlY2w7CisgIHB1c2hfY2Z1biAoREVDTF9TVFJVQ1Rf RlVOQ1RJT04gKHJlc29sdmVyX2RlY2wpKTsKKyAgY3VycmVudF9mdW5jdGlv bl9kZWNsID0gcmVzb2x2ZXJfZGVjbDsKKworICBmbl92ZXJfdmVjID0gVkVD X2FsbG9jICh0cmVlLCBoZWFwLCAyKTsKKworICBmb3IgKHZlcnNuID0gbm9k ZS0+bmV4dF9mdW5jdGlvbl92ZXJzaW9uOyB2ZXJzbjsKKyAgICAgICB2ZXJz biA9IHZlcnNuLT5uZXh0X2Z1bmN0aW9uX3ZlcnNpb24pCisgICAgeworICAg ICAgLyogQ2hlY2sgZm9yIHZpcnR1YWwgZnVuY3Rpb25zIGhlcmUgYWdhaW4s IGFzIGJ5IHRoaXMgdGltZSBpdCBzaG91bGQKKwkgaGF2ZSBiZWVuIGRldGVy bWluZWQgaWYgdGhpcyBmdW5jdGlvbiBuZWVkcyBhIHZ0YWJsZSBpbmRleCBv cgorCSBub3QuICBUaGlzIGhhcHBlbnMgZm9yIG1ldGhvZHMgaW4gZGVyaXZl ZCBjbGFzc2VzIHRoYXQgb3ZlcnJpZGUKKwkgdmlydHVhbCBtZXRob2RzIGlu IGJhc2UgY2xhc3NlcyBidXQgYXJlIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBh cworCSB2aXJ0dWFsLiAgKi8KKyAgICAgIGlmIChERUNMX1ZJTkRFWCAodmVy c24tPnN5bWJvbC5kZWNsKSkKKyAgICAgICAgZXJyb3JfYXQgKERFQ0xfU09V UkNFX0xPQ0FUSU9OICh2ZXJzbi0+c3ltYm9sLmRlY2wpLAorCQkgICJWaXJ0 dWFsIGZ1bmN0aW9uIG11bHRpdmVyc2lvbmluZyBub3Qgc3VwcG9ydGVkIik7 CisgICAgICBWRUNfc2FmZV9wdXNoICh0cmVlLCBoZWFwLCBmbl92ZXJfdmVj LCB2ZXJzbi0+c3ltYm9sLmRlY2wpOworICAgIH0KKworICBkaXNwYXRjaF9m dW5jdGlvbl92ZXJzaW9ucyhyZXNvbHZlcl9kZWNsLCBmbl92ZXJfdmVjLCAm ZW1wdHlfYmIpOworCisgIHJlYnVpbGRfY2dyYXBoX2VkZ2VzICgpOyAKKyAg cG9wX2NmdW4gKCk7CisgIGN1cnJlbnRfZnVuY3Rpb25fZGVjbCA9IG9sZF9j dXJyZW50X2Z1bmN0aW9uX2RlY2w7CisgIHJldHVybiByZXNvbHZlcl9kZWNs OworfQorCiAvKiBUaGlzIGJ1aWxkcyB0aGUgcHJvY2Vzc29yX21vZGVsIHN0 cnVjdCB0eXBlIGRlZmluZWQgaW4KICAgIGxpYmdjYy9jb25maWcvaTM4Ni9j cHVpbmZvLmMgICovCiAKQEAgLTQwNTU5LDYgKzQxNTM5LDkgQEAgaXg4Nl9t ZW1tb2RlbF9jaGVjayAodW5zaWduZWQgSE9TVF9XSURFX0lOVCB2YWwpCiAj dW5kZWYgVEFSR0VUX1BST0ZJTEVfQkVGT1JFX1BST0xPR1VFCiAjZGVmaW5l IFRBUkdFVF9QUk9GSUxFX0JFRk9SRV9QUk9MT0dVRSBpeDg2X3Byb2ZpbGVf YmVmb3JlX3Byb2xvZ3VlCiAKKyN1bmRlZiBUQVJHRVRfTUFOR0xFX0RFQ0xf QVNTRU1CTEVSX05BTUUKKyNkZWZpbmUgVEFSR0VUX01BTkdMRV9ERUNMX0FT U0VNQkxFUl9OQU1FIGl4ODZfbWFuZ2xlX2RlY2xfYXNzZW1ibGVyX25hbWUK KwogI3VuZGVmIFRBUkdFVF9BU01fVU5BTElHTkVEX0hJX09QCiAjZGVmaW5l IFRBUkdFVF9BU01fVU5BTElHTkVEX0hJX09QIFRBUkdFVF9BU01fQUxJR05F RF9ISV9PUAogI3VuZGVmIFRBUkdFVF9BU01fVU5BTElHTkVEX1NJX09QCkBA IC00MDY1Miw2ICs0MTYzNSwxNyBAQCBpeDg2X21lbW1vZGVsX2NoZWNrICh1 bnNpZ25lZCBIT1NUX1dJREVfSU5UIHZhbCkKICN1bmRlZiBUQVJHRVRfRk9M RF9CVUlMVElOCiAjZGVmaW5lIFRBUkdFVF9GT0xEX0JVSUxUSU4gaXg4Nl9m b2xkX2J1aWx0aW4KIAorI3VuZGVmIFRBUkdFVF9DT01QQVJFX1ZFUlNJT05f UFJJT1JJVFkKKyNkZWZpbmUgVEFSR0VUX0NPTVBBUkVfVkVSU0lPTl9QUklP UklUWSBpeDg2X2NvbXBhcmVfdmVyc2lvbl9wcmlvcml0eQorCisjdW5kZWYg VEFSR0VUX0dFTkVSQVRFX1ZFUlNJT05fRElTUEFUQ0hFUl9CT0RZCisjZGVm aW5lIFRBUkdFVF9HRU5FUkFURV9WRVJTSU9OX0RJU1BBVENIRVJfQk9EWSBc CisgIGl4ODZfZ2VuZXJhdGVfdmVyc2lvbl9kaXNwYXRjaGVyX2JvZHkKKwor I3VuZGVmIFRBUkdFVF9HRVRfRlVOQ1RJT05fVkVSU0lPTlNfRElTUEFUQ0hF UgorI2RlZmluZSBUQVJHRVRfR0VUX0ZVTkNUSU9OX1ZFUlNJT05TX0RJU1BB VENIRVIgXAorICBpeDg2X2dldF9mdW5jdGlvbl92ZXJzaW9uc19kaXNwYXRj aGVyCisKICN1bmRlZiBUQVJHRVRfRU5VTV9WQV9MSVNUX1AKICNkZWZpbmUg VEFSR0VUX0VOVU1fVkFfTElTVF9QIGl4ODZfZW51bV92YV9saXN0CiAKQEAg LTQwNzg5LDYgKzQxNzgzLDkgQEAgaXg4Nl9tZW1tb2RlbF9jaGVjayAodW5z aWduZWQgSE9TVF9XSURFX0lOVCB2YWwpCiAjdW5kZWYgVEFSR0VUX09QVElP Tl9QUklOVAogI2RlZmluZSBUQVJHRVRfT1BUSU9OX1BSSU5UIGl4ODZfZnVu Y3Rpb25fc3BlY2lmaWNfcHJpbnQKIAorI3VuZGVmIFRBUkdFVF9PUFRJT05f RlVOQ1RJT05fVkVSU0lPTlMKKyNkZWZpbmUgVEFSR0VUX09QVElPTl9GVU5D VElPTl9WRVJTSU9OUyBpeDg2X2Z1bmN0aW9uX3ZlcnNpb25zCisKICN1bmRl ZiBUQVJHRVRfQ0FOX0lOTElORV9QCiAjZGVmaW5lIFRBUkdFVF9DQU5fSU5M SU5FX1AgaXg4Nl9jYW5faW5saW5lX3AKIAo= --e89a8ff1c0d09e430104cbbd0dfd--