From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x62d.google.com (mail-pl1-x62d.google.com [IPv6:2607:f8b0:4864:20::62d]) by sourceware.org (Postfix) with ESMTPS id 8E2BD3858C83 for ; Mon, 21 Mar 2022 11:55:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8E2BD3858C83 Received: by mail-pl1-x62d.google.com with SMTP id n18so12504678plg.5 for ; Mon, 21 Mar 2022 04:55:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:from :subject:content-language:to; bh=r1F/Xolw/1LtZQQ+o/aVqm3aw4qVNK4ARc658vfwGsY=; b=jHC1iHF2lWVhljjYpz29YrEX/XcsQwtUy+zIlxm8sp7JxnqQgLqnOIwEorfJcE+FDh EBc1sLCB5Ppq5Ukz6X/+RUesCACiE+MrRhG9/yv6qJm+aKe8pwZIWLW94rSyU6jukxC0 LbsUwzuByft6/9kHWziGhQiSPJel0WLUwmPgMetVE3/MtbAaOU2eOolaTtTnuDIZQ0M0 sxJBhVxdGW6Jhpt1zeLlllZoXy9SJWvnGmlgP4yOI8Q5XFbo2mRwBAUMuW+BSu/zzXFd Cl37FxlAgFb38h84Hj5XLkUOeRtmi5LhwjadRhUsuq/bJ1Xmd7y6NQD9WZ1U/8JS14Kf 3EcQ== X-Gm-Message-State: AOAM530cqatJcR0gkxSNacSYKalV+mcOeSNc4z9jd2lWLxNf/AdGWVY+ u+vpbhjQlZp6LdBnxI8TBkuh6kwcOHT/3DaJ0ixbyPRzdZBtDTWFxOjbMPuJyjNawkxFEqi+w+e 5gkszxXz0kZERZXicAFySbiceerqty38CJNmH6CwZK83oImnyMsz7LiTr54sB0E7kxmqSj89PmE exiC7x0HkHlv0v+6WuPNQ= X-Google-Smtp-Source: ABdhPJx6N6RsdbZQz2gnz1sZa0CzIMGodyB4m/SDfdbo79vf2jV8cjJ5m7oNKdMnuVHp54OunaD60w== X-Received: by 2002:a17:902:d4c8:b0:154:2416:218b with SMTP id o8-20020a170902d4c800b001542416218bmr12604677plg.139.1647863755767; Mon, 21 Mar 2022 04:55:55 -0700 (PDT) Received: from [172.16.185.109] ([103.175.111.222]) by smtp.gmail.com with ESMTPSA id k11-20020a056a00168b00b004f7e1555538sm20119466pfc.190.2022.03.21.04.55.52 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 21 Mar 2022 04:55:55 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------eAUx0AewlUQuOIkJO7QBb0GY" Message-ID: Date: Mon, 21 Mar 2022 12:55:46 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.7.0 From: =?UTF-8?Q?J=c3=b8rgen_Kvalsvik?= Subject: [PATCH] Add condition coverage profiling Content-Language: en-US To: gcc-patches@gcc.gnu.org X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_ABUSEAT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Mar 2022 11:56:04 -0000 This is a multi-part message in MIME format. --------------eAUx0AewlUQuOIkJO7QBb0GY Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds support in gcc+gcov for modified condition/decision coverage (MC/DC) with the -fprofile-conditions flag. MC/DC is a type of test/code coverage, and it is particularly important in the avation and automotive industries for safety-critical applications. In particular, it is required or recommended by: * DO-178C for the most critical software (Level A) in avionics * IEC 61508 for SIL 4 * ISO 26262-6 for ASIL D >From the SQLite webpage: Two methods of measuring test coverage were described above: "statement" and "branch" coverage. There are many other test coverage metrics besides these two. Another popular metric is "Modified Condition/Decision Coverage" or MC/DC. Wikipedia defines MC/DC as follows: * Each decision tries every possible outcome. * Each condition in a decision takes on every possible outcome. * Each entry and exit point is invoked. * Each condition in a decision is shown to independently affect the outcome of the decision. In the C programming language where && and || are "short-circuit" operators, MC/DC and branch coverage are very nearly the same thing. The primary difference is in boolean vector tests. One can test for any of several bits in bit-vector and still obtain 100% branch test coverage even though the second element of MC/DC - the requirement that each condition in a decision take on every possible outcome - might not be satisfied. https://sqlite.org/testing.html#mcdc Wahlen, Heimdahl, and De Silva "Efficient Test Coverage Measurement for MC/DC" describes an algorithm for adding instrumentation by carrying over information from the AST, but my algorithm does analysis on the control flow graph. This should make it work for any language gcc supports, although I have only tested it on constructs in C and C++, see testsuite/gcc.misc-tests and testsuite/g++.dg. Like Wahlen et al this implementation uses bitsets to store conditions, which gcov later interprets. This is very fast, but introduces an max limit for the number of terms in a single boolean expression. This limit is the number of bits in a gcov_unsigned_type (which is typedef'd to uint64_t), so for most practical purposes this would be acceptable. limitation can be relaxed with a more sophisticated way of storing and updating bitsets (for example length-encoding). In action it looks pretty similar to the branch coverage. The -g short opt carries no significance, but was chosen because it was an available option with the upper-case free too. gcov --conditions: 3: 17:void fn (int a, int b, int c, int d) { 3: 18: if ((a && (b || c)) && d) conditions covered 5/8 condition 1 not covered (false) condition 2 not covered (true) condition 2 not covered (false) 1: 19: x = 1; -: 20: else 2: 21: x = 2; 3: 22:} gcov --conditions --json-format: "conditions": [ { "not_covered_false": [ 1, 2 ], "count": 8, "covered": 5, "not_covered_true": [ 2 ] } ], C++ destructors will add extra conditionals that are not explicitly present in source code. These are present in the CFG, which means the condition coverage will show them. gcov --conditions -: 5:struct A { 1: 6: explicit A (int x) : v (x) {} 1: 7: operator bool () const { return bool(v); } 1: 8: ~A() {} -: 9: -: 10: int v; -: 11:}; -: 12: 2: 13:void fn (int a, int b) { 2*: 14: x = a && A(b); conditions covered 2/4 condition 0 not covered (true) condition 1 not covered (true) conditions covered 2/2 They are also reported by the branch coverage. gcov -bc 2*: 14: x = a && A(b); branch 0 taken 1 (fallthrough) branch 1 taken 1 call 2 returned 1 call 3 returned 1 branch 4 taken 0 (fallthrough) branch 5 taken 1 branch 6 taken 1 (fallthrough) branch 7 taken 1 The algorithm struggles in a particular case where gcc would generate identical CFGs for different expressions: and.c: if (a && b && c) x = 1; ifs.c: if (a) if (b) if (c) x = 1; if (a && b && c) x = 1; and.c.gcov: #####: 2: if (a && b && c) conditions covered 2/2 conditions covered 2/2 conditions covered 2/2 #####: 3: x = 1; ifs.c.gcov: #####: 2: if (a) conditions covered 2/2 #####: 3: 2 if (b) conditions covered 2/2 #####: 4: 2 if (c) conditions covered 2/2 #####: 5: x = 1; These programs are semantically equivalent, and are interpreted as 3 separate conditional expressions. It does not matter w.r.t. coverage, but is not ideal. Adding an else to and.c fixes the issue: #####: 2: if (a && b && c) conditions covered 6/6 #####: 3: x = 1; #####: 4: else x = x; In the (a && b && c) case the else block must be shared between all three conditionals, and for if (a) if (b) if (c) there would be three *separate* else blocks. Since the algorithm works on CFGs, it cannot detect conditionals (from ternaries) that don't get an entry in the cfg. For example, int x = a ? 0 : 1 in gimple becomes _x = (_a == 0). From source you would expect coverage, but it gets neither branch nor condition coverage. For completeness, it could be achieved by scanning all gimple statements for comparisons, and insert an extra instruction for recording the outcome. The test suite consists of all different CFG kinds and control flow structures I could find, but there is certainly room for many more. Alternative email: Jørgen Kvalsvik -- Some final remarks (not a part of the commit message), this is written in a C++ style that I felt meshed well with what was already there, but if the maintainers would prefer a different approach then I'm happy to to make adjustments. I plan to write a more thorough description of the algorithm, as well as adding the same feature to clang as it is very useful for us at Woven Planet. I tried to pick flag names and options that were comfortable and descriptive, but if you have better names or different ideas for flags then I am happy to change them. The --coverage flag was not changed to imply -fprofile-conditions, but it is possibly something to consider. gcc/ChangeLog: * common.opt: Add new options -fprofile-conditions and -Wcoverage-too-many-conditions. * doc/gcov.texi: Add --conditions documentation. * doc/invoke.texi: Add -fprofile-conditions documentation. * gcov-counter.def (GCOV_COUNTER_CONDS): New. * gcov-io.h (GCOV_TAG_CONDS): New. (GCOV_TAG_CONDS_LENGTH): Likewise. (GCOV_TAG_CONDS_NUM): Likewise. * gcov.cc (class condition_info): New. (condition_info::condition_info): New. (condition_info::popcount): New. (struct coverage_info): New. (add_condition_counts): New. (output_conditions): New. (print_usage): Add -g, --conditions. (process_args): Likewise. (output_intermediate_json_line): Output conditions. (read_graph_file): Read conditions counters. (read_count_file): Read conditions counters. (file_summary): Print conditions. (accumulate_line_info): Accumulate conditions. (output_line_details): Print conditions. * profile.cc (find_conditions): New declaration. (instrument_decisions): New declaration. (branch_prob): Call find_conditions, instrument_decisions. (init_branch_prob): Add total_num_conds. (end_branch_prob): Likewise. * tree-profile.cc (INCLUDE_ALGORITHM): Define. (struct conds_ctx): New. (CONDITIONS_MAX_TERMS): New. (index_of): New. (index_lt): New. (single): New. (single_edge): New. (contract_edge): New. (contract_edge_up): New. (is_conditional_p): New. (collect_neighbors): New. (find_first_conditional): New. (emit_bitwise_op): New. (collect_conditions): New. (find_conditions): New. (instrument_decisions): New. gcc/testsuite/ChangeLog: * lib/gcov.exp: * g++.dg/gcov/gcov-18.C: New test. * gcc.misc-tests/gcov-19.c: New test. --- gcc/common.opt | 8 + gcc/doc/gcov.texi | 36 ++ gcc/doc/invoke.texi | 19 + gcc/gcov-counter.def | 3 + gcc/gcov-io.h | 3 + gcc/gcov.cc | 177 +++++- gcc/profile.cc | 51 +- gcc/testsuite/g++.dg/gcov/gcov-18.C | 209 ++++++ gcc/testsuite/gcc.misc-tests/gcov-19.c | 726 +++++++++++++++++++++ gcc/testsuite/lib/gcov.exp | 187 +++++- gcc/tree-profile.cc | 838 +++++++++++++++++++++++++ 11 files changed, 2248 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-18.C create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-19.c --------------eAUx0AewlUQuOIkJO7QBb0GY Content-Type: text/plain; charset=UTF-8; name="0001-Add-condition-coverage-profiling.patch" Content-Disposition: attachment; filename="0001-Add-condition-coverage-profiling.patch" Content-Transfer-Encoding: base64 RnJvbSA2ZDA2NTAzNDBlNTM4ZDhkZDBjY2M4MzY5YTg5YmE5Yjk5ZDc5MDRjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/Sj1DMz1COHJnZW49MjBLdmFsc3Zp az89CiA8am9yZ2VuLmt2YWxzdmlrQHdvdmVuLXBsYW5ldC5nbG9iYWw+CkRhdGU6IE1vbiwg MzEgSmFuIDIwMjIgMTI6NDk6MzcgKzAxMDAKU3ViamVjdDogW1BBVENIXSBBZGQgY29uZGl0 aW9uIGNvdmVyYWdlIHByb2ZpbGluZwpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6 IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog OGJpdAoKVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgaW4gZ2NjK2djb3YgZm9yIG1vZGlmaWVk IGNvbmRpdGlvbi9kZWNpc2lvbgpjb3ZlcmFnZSAoTUMvREMpIHdpdGggdGhlIC1mcHJvZmls ZS1jb25kaXRpb25zIGZsYWcuIE1DL0RDIGlzIGEgdHlwZSBvZgp0ZXN0L2NvZGUgY292ZXJh Z2UsIGFuZCBpdCBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGluIHRoZSBhdmF0aW9uIGFu ZAphdXRvbW90aXZlIGluZHVzdHJpZXMgZm9yIHNhZmV0eS1jcml0aWNhbCBhcHBsaWNhdGlv bnMuIEluIHBhcnRpY3VsYXIsCml0IGlzIHJlcXVpcmVkIG9yIHJlY29tbWVuZGVkIGJ5OgoK ICAgICogRE8tMTc4QyBmb3IgdGhlIG1vc3QgY3JpdGljYWwgc29mdHdhcmUgKExldmVsIEEp IGluIGF2aW9uaWNzCiAgICAqIElFQyA2MTUwOCBmb3IgU0lMIDQKICAgICogSVNPIDI2MjYy LTYgZm9yIEFTSUwgRAoKRnJvbSB0aGUgU1FMaXRlIHdlYnBhZ2U6CgogICAgVHdvIG1ldGhv ZHMgb2YgbWVhc3VyaW5nIHRlc3QgY292ZXJhZ2Ugd2VyZSBkZXNjcmliZWQgYWJvdmU6CiAg ICAic3RhdGVtZW50IiBhbmQgImJyYW5jaCIgY292ZXJhZ2UuIFRoZXJlIGFyZSBtYW55IG90 aGVyIHRlc3QKICAgIGNvdmVyYWdlIG1ldHJpY3MgYmVzaWRlcyB0aGVzZSB0d28uIEFub3Ro ZXIgcG9wdWxhciBtZXRyaWMgaXMKICAgICJNb2RpZmllZCBDb25kaXRpb24vRGVjaXNpb24g Q292ZXJhZ2UiIG9yIE1DL0RDLiBXaWtpcGVkaWEgZGVmaW5lcwogICAgTUMvREMgYXMgZm9s bG93czoKCiAgICAgICAgKiBFYWNoIGRlY2lzaW9uIHRyaWVzIGV2ZXJ5IHBvc3NpYmxlIG91 dGNvbWUuCiAgICAgICAgKiBFYWNoIGNvbmRpdGlvbiBpbiBhIGRlY2lzaW9uIHRha2VzIG9u IGV2ZXJ5IHBvc3NpYmxlIG91dGNvbWUuCiAgICAgICAgKiBFYWNoIGVudHJ5IGFuZCBleGl0 IHBvaW50IGlzIGludm9rZWQuCiAgICAgICAgKiBFYWNoIGNvbmRpdGlvbiBpbiBhIGRlY2lz aW9uIGlzIHNob3duIHRvIGluZGVwZW5kZW50bHkgYWZmZWN0CiAgICAgICAgICB0aGUgb3V0 Y29tZSBvZiB0aGUgZGVjaXNpb24uCgogICAgSW4gdGhlIEMgcHJvZ3JhbW1pbmcgbGFuZ3Vh Z2Ugd2hlcmUgJiYgYW5kIHx8IGFyZSAic2hvcnQtY2lyY3VpdCIKICAgIG9wZXJhdG9ycywg TUMvREMgYW5kIGJyYW5jaCBjb3ZlcmFnZSBhcmUgdmVyeSBuZWFybHkgdGhlIHNhbWUgdGhp bmcuCiAgICBUaGUgcHJpbWFyeSBkaWZmZXJlbmNlIGlzIGluIGJvb2xlYW4gdmVjdG9yIHRl c3RzLiBPbmUgY2FuIHRlc3QgZm9yCiAgICBhbnkgb2Ygc2V2ZXJhbCBiaXRzIGluIGJpdC12 ZWN0b3IgYW5kIHN0aWxsIG9idGFpbiAxMDAlIGJyYW5jaCB0ZXN0CiAgICBjb3ZlcmFnZSBl dmVuIHRob3VnaCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgTUMvREMgLSB0aGUgcmVxdWlyZW1l bnQKICAgIHRoYXQgZWFjaCBjb25kaXRpb24gaW4gYSBkZWNpc2lvbiB0YWtlIG9uIGV2ZXJ5 IHBvc3NpYmxlIG91dGNvbWUgLQogICAgbWlnaHQgbm90IGJlIHNhdGlzZmllZC4KCiAgICBo dHRwczovL3NxbGl0ZS5vcmcvdGVzdGluZy5odG1sI21jZGMKCldhaGxlbiwgSGVpbWRhaGws IGFuZCBEZSBTaWx2YSAiRWZmaWNpZW50IFRlc3QgQ292ZXJhZ2UgTWVhc3VyZW1lbnQgZm9y Ck1DL0RDIiBkZXNjcmliZXMgYW4gYWxnb3JpdGhtIGZvciBhZGRpbmcgaW5zdHJ1bWVudGF0 aW9uIGJ5IGNhcnJ5aW5nCm92ZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgQVNULCBidXQgbXkg YWxnb3JpdGhtIGRvZXMgYW5hbHlzaXMgb24gdGhlCmNvbnRyb2wgZmxvdyBncmFwaC4gVGhp cyBzaG91bGQgbWFrZSBpdCB3b3JrIGZvciBhbnkgbGFuZ3VhZ2UgZ2NjCnN1cHBvcnRzLCBh bHRob3VnaCBJIGhhdmUgb25seSB0ZXN0ZWQgaXQgb24gY29uc3RydWN0cyBpbiBDIGFuZCBD KyssIHNlZQp0ZXN0c3VpdGUvZ2NjLm1pc2MtdGVzdHMgYW5kIHRlc3RzdWl0ZS9nKysuZGcu CgpMaWtlIFdhaGxlbiBldCBhbCB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYml0c2V0cyB0 byBzdG9yZSBjb25kaXRpb25zLAp3aGljaCBnY292IGxhdGVyIGludGVycHJldHMuIFRoaXMg aXMgdmVyeSBmYXN0LCBidXQgaW50cm9kdWNlcyBhbiBtYXgKbGltaXQgZm9yIHRoZSBudW1i ZXIgb2YgdGVybXMgaW4gYSBzaW5nbGUgYm9vbGVhbiBleHByZXNzaW9uLiBUaGlzIGxpbWl0 CmlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGdjb3ZfdW5zaWduZWRfdHlwZSAod2hpY2gg aXMgdHlwZWRlZidkIHRvCnVpbnQ2NF90KSwgc28gZm9yIG1vc3QgcHJhY3RpY2FsIHB1cnBv c2VzIHRoaXMgd291bGQgYmUgYWNjZXB0YWJsZS4KbGltaXRhdGlvbiBjYW4gYmUgcmVsYXhl ZCB3aXRoIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHdheSBvZiBzdG9yaW5nIGFuZAp1cGRhdGlu ZyBiaXRzZXRzIChmb3IgZXhhbXBsZSBsZW5ndGgtZW5jb2RpbmcpLgoKSW4gYWN0aW9uIGl0 IGxvb2tzIHByZXR0eSBzaW1pbGFyIHRvIHRoZSBicmFuY2ggY292ZXJhZ2UuIFRoZSAtZyBz aG9ydApvcHQgY2FycmllcyBubyBzaWduaWZpY2FuY2UsIGJ1dCB3YXMgY2hvc2VuIGJlY2F1 c2UgaXQgd2FzIGFuIGF2YWlsYWJsZQpvcHRpb24gd2l0aCB0aGUgdXBwZXItY2FzZSBmcmVl IHRvby4KCmdjb3YgLS1jb25kaXRpb25zOgoKICAgICAgICAzOiAgIDE3OnZvaWQgZm4gKGlu dCBhLCBpbnQgYiwgaW50IGMsIGludCBkKSB7CiAgICAgICAgMzogICAxODogICAgaWYgKChh ICYmIChiIHx8IGMpKSAmJiBkKQpjb25kaXRpb25zIGNvdmVyZWQgNS84CmNvbmRpdGlvbiAg MSBub3QgY292ZXJlZCAoZmFsc2UpCmNvbmRpdGlvbiAgMiBub3QgY292ZXJlZCAodHJ1ZSkK Y29uZGl0aW9uICAyIG5vdCBjb3ZlcmVkIChmYWxzZSkKICAgICAgICAxOiAgIDE5OiAgICAg ICAgeCA9IDE7CiAgICAgICAgLTogICAyMDogICAgZWxzZQogICAgICAgIDI6ICAgMjE6ICAg ICAgICB4ID0gMjsKICAgICAgICAzOiAgIDIyOn0KCmdjb3YgLS1jb25kaXRpb25zIC0tanNv bi1mb3JtYXQ6CgogICAgImNvbmRpdGlvbnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAi bm90X2NvdmVyZWRfZmFsc2UiOiBbCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAg ICAgMgogICAgICAgICAgICBdLAogICAgICAgICAgICAiY291bnQiOiA4LAogICAgICAgICAg ICAiY292ZXJlZCI6IDUsCiAgICAgICAgICAgICJub3RfY292ZXJlZF90cnVlIjogWwogICAg ICAgICAgICAgICAgMgogICAgICAgICAgICBdCiAgICAgICAgfQogICAgXSwKCkMrKyBkZXN0 cnVjdG9ycyB3aWxsIGFkZCBleHRyYSBjb25kaXRpb25hbHMgdGhhdCBhcmUgbm90IGV4cGxp Y2l0bHkKcHJlc2VudCBpbiBzb3VyY2UgY29kZS4gVGhlc2UgYXJlIHByZXNlbnQgaW4gdGhl IENGRywgd2hpY2ggbWVhbnMgdGhlCmNvbmRpdGlvbiBjb3ZlcmFnZSB3aWxsIHNob3cgdGhl bS4KCmdjb3YgLS1jb25kaXRpb25zCgogICAgICAgIC06ICAgIDU6c3RydWN0IEEgewogICAg ICAgIDE6ICAgIDY6ICAgIGV4cGxpY2l0IEEgKGludCB4KSA6IHYgKHgpIHt9CiAgICAgICAg MTogICAgNzogICAgb3BlcmF0b3IgYm9vbCAoKSBjb25zdCB7IHJldHVybiBib29sKHYpOyB9 CiAgICAgICAgMTogICAgODogICAgfkEoKSB7fQogICAgICAgIC06ICAgIDk6CiAgICAgICAg LTogICAxMDogICAgaW50IHY7CiAgICAgICAgLTogICAxMTp9OwogICAgICAgIC06ICAgMTI6 CiAgICAgICAgMjogICAxMzp2b2lkIGZuIChpbnQgYSwgaW50IGIpIHsKICAgICAgIDIqOiAg IDE0OiAgICB4ID0gYSAmJiBBKGIpOwpjb25kaXRpb25zIGNvdmVyZWQgMi80CmNvbmRpdGlv biAgMCBub3QgY292ZXJlZCAodHJ1ZSkKY29uZGl0aW9uICAxIG5vdCBjb3ZlcmVkICh0cnVl KQpjb25kaXRpb25zIGNvdmVyZWQgMi8yCgpUaGV5IGFyZSBhbHNvIHJlcG9ydGVkIGJ5IHRo ZSBicmFuY2ggY292ZXJhZ2UuCgpnY292IC1iYwoKICAgICAgIDIqOiAgIDE0OiAgICB4ID0g YSAmJiBBKGIpOwpicmFuY2ggIDAgdGFrZW4gMSAoZmFsbHRocm91Z2gpCmJyYW5jaCAgMSB0 YWtlbiAxCmNhbGwgICAgMiByZXR1cm5lZCAxCmNhbGwgICAgMyByZXR1cm5lZCAxCmJyYW5j aCAgNCB0YWtlbiAwIChmYWxsdGhyb3VnaCkKYnJhbmNoICA1IHRha2VuIDEKYnJhbmNoICA2 IHRha2VuIDEgKGZhbGx0aHJvdWdoKQpicmFuY2ggIDcgdGFrZW4gMQoKVGhlIGFsZ29yaXRo bSBzdHJ1Z2dsZXMgaW4gYSBwYXJ0aWN1bGFyIGNhc2Ugd2hlcmUgZ2NjIHdvdWxkIGdlbmVy YXRlCmlkZW50aWNhbCBDRkdzIGZvciBkaWZmZXJlbnQgZXhwcmVzc2lvbnM6CgphbmQuYzoK CiAgICBpZiAoYSAmJiBiICYmIGMpCiAgICAgICAgeCA9IDE7CgppZnMuYzoKCiAgICBpZiAo YSkKICAgICAgICBpZiAoYikKICAgICAgICAgICAgaWYgKGMpCiAgICAgICAgICAgICAgICB4 ID0gMTsKCiAgICBpZiAoYSAmJiBiICYmIGMpCiAgICAgICAgeCA9IDE7CgphbmQuYy5nY292 OgoKICAgICAgICAgICAgIyMjIyM6ICAgIDI6ICAgIGlmIChhICYmIGIgJiYgYykKY29uZGl0 aW9ucyBjb3ZlcmVkIDIvMgpjb25kaXRpb25zIGNvdmVyZWQgMi8yCmNvbmRpdGlvbnMgY292 ZXJlZCAyLzIKICAgICMjIyMjOiAgICAzOiAgICAgICAgeCA9IDE7CgppZnMuYy5nY292Ogog ICAgIyMjIyM6ICAgIDI6ICAgIGlmIChhKQpjb25kaXRpb25zIGNvdmVyZWQgMi8yCiAgICAj IyMjIzogICAgMzogICAyICAgIGlmIChiKQpjb25kaXRpb25zIGNvdmVyZWQgMi8yCiAgICAj IyMjIzogICAgNDogICAyICAgICAgICBpZiAoYykKY29uZGl0aW9ucyBjb3ZlcmVkIDIvMgog ICAgIyMjIyM6ICAgIDU6ICAgICAgICAgICAgICAgIHggPSAxOwoKVGhlc2UgcHJvZ3JhbXMg YXJlIHNlbWFudGljYWxseSBlcXVpdmFsZW50LCBhbmQgYXJlIGludGVycHJldGVkIGFzIDMK c2VwYXJhdGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMuIEl0IGRvZXMgbm90IG1hdHRlciB3 LnIudC4gY292ZXJhZ2UsCmJ1dCBpcyBub3QgaWRlYWwuIEFkZGluZyBhbiBlbHNlIHRvIGFu ZC5jIGZpeGVzIHRoZSBpc3N1ZToKCiAgICAjIyMjIzogICAgMjogICAgaWYgKGEgJiYgYiAm JiBjKQpjb25kaXRpb25zIGNvdmVyZWQgNi82CiAgICAjIyMjIzogICAgMzogICAgICAgIHgg PSAxOwogICAgIyMjIyM6ICAgIDQ6ICAgIGVsc2UgeCA9IHg7CgpJbiB0aGUgKGEgJiYgYiAm JiBjKSBjYXNlIHRoZSBlbHNlIGJsb2NrIG11c3QgYmUgc2hhcmVkIGJldHdlZW4gYWxsCnRo cmVlIGNvbmRpdGlvbmFscywgYW5kIGZvciBpZiAoYSkgaWYgKGIpIGlmIChjKSB0aGVyZSB3 b3VsZCBiZSB0aHJlZQoqc2VwYXJhdGUqIGVsc2UgYmxvY2tzLgoKU2luY2UgdGhlIGFsZ29y aXRobSB3b3JrcyBvbiBDRkdzLCBpdCBjYW5ub3QgZGV0ZWN0IGNvbmRpdGlvbmFscyAoZnJv bQp0ZXJuYXJpZXMpIHRoYXQgZG9uJ3QgZ2V0IGFuIGVudHJ5IGluIHRoZSBjZmcuIEZvciBl eGFtcGxlLAppbnQgeCA9IGEgPyAwIDogMSBpbiBnaW1wbGUgYmVjb21lcyBfeCA9IChfYSA9 PSAwKS4gRnJvbSBzb3VyY2UgeW91CndvdWxkIGV4cGVjdCBjb3ZlcmFnZSwgYnV0IGl0IGdl dHMgbmVpdGhlciBicmFuY2ggbm9yIGNvbmRpdGlvbgpjb3ZlcmFnZS4gRm9yIGNvbXBsZXRl bmVzcywgaXQgY291bGQgYmUgYWNoaWV2ZWQgYnkgc2Nhbm5pbmcgYWxsIGdpbXBsZQpzdGF0 ZW1lbnRzIGZvciBjb21wYXJpc29ucywgYW5kIGluc2VydCBhbiBleHRyYSBpbnN0cnVjdGlv biBmb3IKcmVjb3JkaW5nIHRoZSBvdXRjb21lLgoKVGhlIHRlc3Qgc3VpdGUgY29uc2lzdHMg b2YgYWxsIGRpZmZlcmVudCBDRkcga2luZHMgYW5kIGNvbnRyb2wgZmxvdwpzdHJ1Y3R1cmVz IEkgY291bGQgZmluZCwgYnV0IHRoZXJlIGlzIGNlcnRhaW5seSByb29tIGZvciBtYW55IG1v cmUuCgpBbHRlcm5hdGl2ZSBlbWFpbDogSsO4cmdlbiBLdmFsc3ZpayA8akBsYW1iZGEuaXM+ CgpnY2MvQ2hhbmdlTG9nOgoKCSogY29tbW9uLm9wdDogQWRkIG5ldyBvcHRpb25zIC1mcHJv ZmlsZS1jb25kaXRpb25zIGFuZAoJLVdjb3ZlcmFnZS10b28tbWFueS1jb25kaXRpb25zLgoJ KiBkb2MvZ2Nvdi50ZXhpOiBBZGQgLS1jb25kaXRpb25zIGRvY3VtZW50YXRpb24uCgkqIGRv Yy9pbnZva2UudGV4aTogQWRkIC1mcHJvZmlsZS1jb25kaXRpb25zIGRvY3VtZW50YXRpb24u CgkqIGdjb3YtY291bnRlci5kZWYgKEdDT1ZfQ09VTlRFUl9DT05EUyk6IE5ldy4KCSogZ2Nv di1pby5oIChHQ09WX1RBR19DT05EUyk6IE5ldy4KCShHQ09WX1RBR19DT05EU19MRU5HVEgp OiBMaWtld2lzZS4KCShHQ09WX1RBR19DT05EU19OVU0pOiBMaWtld2lzZS4KCSogZ2Nvdi5j YyAoY2xhc3MgY29uZGl0aW9uX2luZm8pOiBOZXcuCgkoY29uZGl0aW9uX2luZm86OmNvbmRp dGlvbl9pbmZvKTogTmV3LgoJKGNvbmRpdGlvbl9pbmZvOjpwb3Bjb3VudCk6IE5ldy4KCShz dHJ1Y3QgY292ZXJhZ2VfaW5mbyk6IE5ldy4KCShhZGRfY29uZGl0aW9uX2NvdW50cyk6IE5l dy4KCShvdXRwdXRfY29uZGl0aW9ucyk6IE5ldy4KCShwcmludF91c2FnZSk6IEFkZCAtZywg LS1jb25kaXRpb25zLgoJKHByb2Nlc3NfYXJncyk6IExpa2V3aXNlLgoJKG91dHB1dF9pbnRl cm1lZGlhdGVfanNvbl9saW5lKTogT3V0cHV0IGNvbmRpdGlvbnMuCgkocmVhZF9ncmFwaF9m aWxlKTogUmVhZCBjb25kaXRpb25zIGNvdW50ZXJzLgoJKHJlYWRfY291bnRfZmlsZSk6IFJl YWQgY29uZGl0aW9ucyBjb3VudGVycy4KCShmaWxlX3N1bW1hcnkpOiBQcmludCBjb25kaXRp b25zLgoJKGFjY3VtdWxhdGVfbGluZV9pbmZvKTogQWNjdW11bGF0ZSBjb25kaXRpb25zLgoJ KG91dHB1dF9saW5lX2RldGFpbHMpOiBQcmludCBjb25kaXRpb25zLgoJKiBwcm9maWxlLmNj IChmaW5kX2NvbmRpdGlvbnMpOiBOZXcgZGVjbGFyYXRpb24uCgkoaW5zdHJ1bWVudF9kZWNp c2lvbnMpOiBOZXcgZGVjbGFyYXRpb24uCgkoYnJhbmNoX3Byb2IpOiBDYWxsIGZpbmRfY29u ZGl0aW9ucywgaW5zdHJ1bWVudF9kZWNpc2lvbnMuCgkoaW5pdF9icmFuY2hfcHJvYik6IEFk ZCB0b3RhbF9udW1fY29uZHMuCgkoZW5kX2JyYW5jaF9wcm9iKTogTGlrZXdpc2UuCgkqIHRy ZWUtcHJvZmlsZS5jYyAoSU5DTFVERV9BTEdPUklUSE0pOiBEZWZpbmUuCgkoc3RydWN0IGNv bmRzX2N0eCk6IE5ldy4KCShDT05ESVRJT05TX01BWF9URVJNUyk6IE5ldy4KCShpbmRleF9v Zik6IE5ldy4KCShpbmRleF9sdCk6IE5ldy4KCShzaW5nbGUpOiBOZXcuCgkoc2luZ2xlX2Vk Z2UpOiBOZXcuCgkoY29udHJhY3RfZWRnZSk6IE5ldy4KCShjb250cmFjdF9lZGdlX3VwKTog TmV3LgoJKGlzX2NvbmRpdGlvbmFsX3ApOiBOZXcuCgkoY29sbGVjdF9uZWlnaGJvcnMpOiBO ZXcuCgkoZmluZF9maXJzdF9jb25kaXRpb25hbCk6IE5ldy4KCShlbWl0X2JpdHdpc2Vfb3Ap OiBOZXcuCgkoY29sbGVjdF9jb25kaXRpb25zKTogTmV3LgoJKGZpbmRfY29uZGl0aW9ucyk6 IE5ldy4KCShpbnN0cnVtZW50X2RlY2lzaW9ucyk6IE5ldy4KCmdjYy90ZXN0c3VpdGUvQ2hh bmdlTG9nOgoKCSogbGliL2djb3YuZXhwOgoJKiBnKysuZGcvZ2Nvdi9nY292LTE4LkM6IE5l dyB0ZXN0LgoJKiBnY2MubWlzYy10ZXN0cy9nY292LTE5LmM6IE5ldyB0ZXN0LgotLS0KIGdj Yy9jb21tb24ub3B0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4ICsKIGdjYy9kb2Mv Z2Nvdi50ZXhpICAgICAgICAgICAgICAgICAgICAgIHwgIDM2ICsrCiBnY2MvZG9jL2ludm9r ZS50ZXhpICAgICAgICAgICAgICAgICAgICB8ICAxOSArCiBnY2MvZ2Nvdi1jb3VudGVyLmRl ZiAgICAgICAgICAgICAgICAgICB8ICAgMyArCiBnY2MvZ2Nvdi1pby5oICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgMyArCiBnY2MvZ2Nvdi5jYyAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDE3NyArKysrKy0KIGdjYy9wcm9maWxlLmNjICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDUxICstCiBnY2MvdGVzdHN1aXRlL2crKy5kZy9nY292L2djb3YtMTguQyAg ICB8IDIwOSArKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLm1pc2MtdGVzdHMvZ2Nvdi0xOS5j IHwgNzI2ICsrKysrKysrKysrKysrKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9saWIvZ2Nvdi5l eHAgICAgICAgICAgICAgfCAxODcgKysrKystCiBnY2MvdHJlZS1wcm9maWxlLmNjICAgICAg ICAgICAgICAgICAgICB8IDgzOCArKysrKysrKysrKysrKysrKysrKysrKysrCiAxMSBmaWxl cyBjaGFuZ2VkLCAyMjQ4IGluc2VydGlvbnMoKyksIDkgZGVsZXRpb25zKC0pCiBjcmVhdGUg bW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvZ2Nvdi9nY292LTE4LkMKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMTkuYwoK ZGlmZiAtLWdpdCBhL2djYy9jb21tb24ub3B0IGIvZ2NjL2NvbW1vbi5vcHQKaW5kZXggOGI2 NTEzZGU0N2MuLjJhZmU0Mzg0ZDlkIDEwMDY0NAotLS0gYS9nY2MvY29tbW9uLm9wdAorKysg Yi9nY2MvY29tbW9uLm9wdApAQCAtODYxLDYgKzg2MSwxMCBAQCBXY292ZXJhZ2UtaW52YWxp ZC1saW5lLW51bWJlcgogQ29tbW9uIFZhcih3YXJuX2NvdmVyYWdlX2ludmFsaWRfbGluZW51 bSkgSW5pdCgxKSBXYXJuaW5nCiBXYXJuIGluIGNhc2UgYSBmdW5jdGlvbiBlbmRzIGVhcmxp ZXIgdGhhbiBpdCBiZWdpbnMgZHVlIHRvIGFuIGludmFsaWQgbGluZW51bSBtYWNyb3MuCiAK K1djb3ZlcmFnZS10b28tbWFueS1jb25kaXRpb25zCitDb21tb24gVmFyKHdhcm5fdG9vX21h bnlfY29uZGl0aW9ucykgSW5pdCgxKSBXYXJuaW5nCitXYXJuIHdoZW4gYSBjb25kaXRpb25h bCBoYXMgdG9vIG1hbnkgdGVybXMgYW5kIGNvdmVyYWdlIGdpdmVzIHVwLgorCiBXbWlzc2lu Zy1wcm9maWxlCiBDb21tb24gVmFyKHdhcm5fbWlzc2luZ19wcm9maWxlKSBJbml0KDEpIFdh cm5pbmcKIFdhcm4gaW4gY2FzZSBwcm9maWxlcyBpbiAtZnByb2ZpbGUtdXNlIGRvIG5vdCBl eGlzdC4KQEAgLTIyOTAsNiArMjI5NCwxMCBAQCBmcHJvZmlsZS1hcmNzCiBDb21tb24gVmFy KHByb2ZpbGVfYXJjX2ZsYWcpCiBJbnNlcnQgYXJjLWJhc2VkIHByb2dyYW0gcHJvZmlsaW5n IGNvZGUuCiAKK2Zwcm9maWxlLWNvbmRpdGlvbnMKK0NvbW1vbiBWYXIocHJvZmlsZV9jb25k aXRpb25fZmxhZykKK0luc2VydCBjb25kaXRpb24gY292ZXJhZ2UgcHJvZmlsaW5nIGNvZGUu CisKIGZwcm9maWxlLWRpcj0KIENvbW1vbiBKb2luZWQgUmVqZWN0TmVnYXRpdmUgVmFyKHBy b2ZpbGVfZGF0YV9wcmVmaXgpCiBTZXQgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgZm9yIHN0 b3JpbmcgdGhlIHByb2ZpbGUgZGF0YS4KZGlmZiAtLWdpdCBhL2djYy9kb2MvZ2Nvdi50ZXhp IGIvZ2NjL2RvYy9nY292LnRleGkKaW5kZXggZmMzOWRhMGYwMmQuLmE4NWI3ZjA5NzY5IDEw MDY0NAotLS0gYS9nY2MvZG9jL2djb3YudGV4aQorKysgYi9nY2MvZG9jL2djb3YudGV4aQpA QCAtMTIyLDYgKzEyMiw3IEBAIGdjb3YgW0BvcHRpb257LXZ9fEBvcHRpb257LS12ZXJzaW9u fV0gW0BvcHRpb257LWh9fEBvcHRpb257LS1oZWxwfV0KICAgICAgW0BvcHRpb257LWF9fEBv cHRpb257LS1hbGwtYmxvY2tzfV0KICAgICAgW0BvcHRpb257LWJ9fEBvcHRpb257LS1icmFu Y2gtcHJvYmFiaWxpdGllc31dCiAgICAgIFtAb3B0aW9uey1jfXxAb3B0aW9uey0tYnJhbmNo LWNvdW50c31dCisgICAgIFtAb3B0aW9uey1nfXxAb3B0aW9uey0tY29uZGl0aW9uc31dCiAg ICAgIFtAb3B0aW9uey1kfXxAb3B0aW9uey0tZGlzcGxheS1wcm9ncmVzc31dCiAgICAgIFtA b3B0aW9uey1mfXxAb3B0aW9uey0tZnVuY3Rpb24tc3VtbWFyaWVzfV0KICAgICAgW0BvcHRp b257LWp9fEBvcHRpb257LS1qc29uLWZvcm1hdH1dCkBAIC0xNjcsNiArMTY4LDEzIEBAIGJl IHNob3duLCB1bmxlc3MgdGhlIEBvcHRpb257LXV9IG9wdGlvbiBpcyBnaXZlbi4KIFdyaXRl IGJyYW5jaCBmcmVxdWVuY2llcyBhcyB0aGUgbnVtYmVyIG9mIGJyYW5jaGVzIHRha2VuLCBy YXRoZXIgdGhhbgogdGhlIHBlcmNlbnRhZ2Ugb2YgYnJhbmNoZXMgdGFrZW4uCiAKK0BpdGVt IC1nCitAaXRlbXggLS1jb25kaXRpb25zCitXcml0ZSBjb25kaXRpb24gY292ZXJhZ2UgdG8g dGhlIG91dHB1dCBmaWxlLCBhbmQgd3JpdGUgY29uZGl0aW9uIHN1bW1hcnkgaW5mbwordG8g dGhlIHN0YW5kYXJkIG91dHB1dC4gIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gc2VlIGlm IHRoZSBjb25kaXRpb25zIGluCit5b3VyIHByb2dyYW0gYXQgbGVhc3Qgb25jZSBoYWQgYW4g aW5kZXBlbmRlbnQgZWZmZWN0IG9uIHRoZSBvdXRjb21lIG9mIHRoZQorYm9vbGVhbiBleHBy ZXNzaW9uIChtb2RpZmllZCBjb25kaXRpb24vZGVjaXNpb24gY292ZXJhZ2UpLgorCiBAaXRl bSAtZAogQGl0ZW14IC0tZGlzcGxheS1wcm9ncmVzcwogRGlzcGxheSB0aGUgcHJvZ3Jlc3Mg b24gdGhlIHN0YW5kYXJkIG91dHB1dC4KQEAgLTI5MSw2ICsyOTksNyBAQCBFYWNoIEB2YXJ7 bGluZX0gaGFzIHRoZSBmb2xsb3dpbmcgZm9ybToKIEB7CiAgICJicmFuY2hlcyI6IFsiJGJy YW5jaCJdLAogICAiY291bnQiOiAyLAorICAiY29uZGl0aW9ucyI6IFsiJGNvbmRpdGlvbiJd LAogICAibGluZV9udW1iZXIiOiAxNSwKICAgInVuZXhlY3V0ZWRfYmxvY2siOiBmYWxzZSwK ICAgImZ1bmN0aW9uX25hbWUiOiAiZm9vIiwKQEAgLTMzOSw2ICszNDgsMzMgQEAgRmllbGRz IG9mIHRoZSBAdmFye2JyYW5jaH0gZWxlbWVudCBoYXZlIGZvbGxvd2luZyBzZW1hbnRpY3M6 CiBAdmFye3Rocm93fTogdHJ1ZSB3aGVuIHRoZSBicmFuY2ggaXMgYW4gZXhjZXB0aW9uYWwg YnJhbmNoCiBAZW5kIGl0ZW1pemUKIAorRWFjaCBAdmFye2NvbmRpdGlvbn0gZWxlbWVudCBo YXZlIHRoZSBmb2xsb3dpbmcgc2VtYW50aWNzOgorCitAc21hbGxleGFtcGxlCitAeworICAi Y291bnQiOiA0LAorICAiY292ZXJlZCI6IDIsCisgICJub3RfY292ZXJlZF9mYWxzZSI6IFtd LAorICAibm90X2NvdmVyZWRfdHJ1ZSI6IFswLCAxXSwKK0B9CitAZW5kIHNtYWxsZXhhbXBs ZQorCitGaWVsZHMgb2YgdGhlIEB2YXJ7Y29uZGl0aW9ufSBlbGVtZW50IGhhdmUgZm9sbG93 aW5nIHNlbWFudGljczoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0B2YXJ7Y291bnR9 OiBudW1iZXIgb2YgY29uZGl0aW9ucyBpbiB0aGlzIGV4cHJlc3Npb24KKworQGl0ZW0KK0B2 YXJ7Y292ZXJlZH06IG51bWJlciBvZiBjb3ZlcmVkIGNvbmRpdGlvbnMgaW4gdGhpcyBleHBy ZXNzaW9uCisKK0BpdGVtCitAdmFye25vdF9jb3ZlcmVkX3RydWV9OiB0ZXJtcywgYnkgaW5k ZXgsIG5vdCBzZWVuIGFzIHRydWUgaW4gdGhpcyBleHByZXNzaW9uCisKK0BpdGVtCitAdmFy e25vdF9jb3ZlcmVkX2ZhbHNlfTogdGVybXMsIGJ5IGluZGV4LCBub3Qgc2VlbiBhcyBmYWxz ZSBpbiB0aGlzIGV4cHJlc3Npb24KK0BlbmQgaXRlbWl6ZQorCiBAaXRlbSAtSAogQGl0ZW14 IC0taHVtYW4tcmVhZGFibGUKIFdyaXRlIGNvdW50cyBpbiBodW1hbiByZWFkYWJsZSBmb3Jt YXQgKGxpa2UgMjQuNmspLgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy9pbnZva2UudGV4aSBiL2dj Yy9kb2MvaW52b2tlLnRleGkKaW5kZXggZTNmMmU4MmNkZTUuLjBlMjRlNDNjYTQyIDEwMDY0 NAotLS0gYS9nY2MvZG9jL2ludm9rZS50ZXhpCisrKyBiL2djYy9kb2MvaW52b2tlLnRleGkK QEAgLTU5NCw2ICs1OTQsNyBAQCBPYmplY3RpdmUtQyBhbmQgT2JqZWN0aXZlLUMrKyBEaWFs ZWN0c30uCiBAaXRlbSBQcm9ncmFtIEluc3RydW1lbnRhdGlvbiBPcHRpb25zCiBAeHJlZntJ bnN0cnVtZW50YXRpb24gT3B0aW9ucywsUHJvZ3JhbSBJbnN0cnVtZW50YXRpb24gT3B0aW9u c30uCiBAZ2Njb3B0bGlzdHstcCAgLXBnICAtZnByb2ZpbGUtYXJjcyAgLS1jb3ZlcmFnZSAg LWZ0ZXN0LWNvdmVyYWdlIEBnb2wKKy1mcHJvZmlsZS1jb25kaXRpb25zIEBnb2wKIC1mcHJv ZmlsZS1hYnMtcGF0aCBAZ29sCiAtZnByb2ZpbGUtZGlyPUB2YXJ7cGF0aH0gIC1mcHJvZmls ZS1nZW5lcmF0ZSAgLWZwcm9maWxlLWdlbmVyYXRlPUB2YXJ7cGF0aH0gQGdvbAogLWZwcm9m aWxlLWluZm8tc2VjdGlvbiAgLWZwcm9maWxlLWluZm8tc2VjdGlvbj1AdmFye25hbWV9IEBn b2wKQEAgLTYwMjAsNiArNjAyMSwxMyBAQCBlcnJvci4gIEBvcHRpb257LVduby1jb3ZlcmFn ZS1pbnZhbGlkLWxpbmUtbnVtYmVyfSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoZQogd2Fy bmluZyBvciBAb3B0aW9uey1Xbm8tZXJyb3I9Y292ZXJhZ2UtaW52YWxpZC1saW5lLW51bWJl cn0gY2FuIGJlIHVzZWQgdG8KIGRpc2FibGUgdGhlIGVycm9yLgogCitAaXRlbSAtV25vLWNv dmVyYWdlLXRvby1tYW55LWNvbmRpdGlvbnMKK0BvcGluZGV4IFduby1jb3ZlcmFnZS10b28t bWFueS1jb25kaXRpb25zCitAb3BpbmRleCBXY292ZXJhZ2UtdG9vLW1hbnktY29uZGl0aW9u cworV2FybiBpbiBjYXNlIGEgY29uZGl0aW9uIGhhdmUgdG9vIG1hbnkgdGVybXMgYW5kIEdD QyBnaXZlcyB1cCBjb3ZlcmFnZS4KK0NvdmVyYWdlIGlzIGdpdmVuIHVwIHdoZW4gdGhlcmUg YXJlIG1vcmUgdGVybXMgaW4gdGhlIGNvbmRpdGlvbmFsIHRoYW4gdGhlcmUKK2FyZSBiaXRz IGluIGEgQGNvZGV7Z2Nvdl90eXBlX3Vuc2lnbmVkfS4gIFRoaXMgd2FybmluZyBpcyBlbmFi bGVkIGJ5IGRlZmF1bHQuCisKIEBpdGVtIC1Xbm8tY3BwIEByeyhDLCBPYmplY3RpdmUtQywg QysrLCBPYmplY3RpdmUtQysrIGFuZCBGb3J0cmFuIG9ubHkpfQogQG9waW5kZXggV25vLWNw cAogQG9waW5kZXggV2NwcApAQCAtMTUyNzEsNiArMTUyNzksMTMgQEAgRS5nLiBAY29kZXtn Y2MgYS5jIGIuYyAtbyBiaW5hcnl9IHdvdWxkIGdlbmVyYXRlIEBmaWxle2JpbmFyeS1hLmdj ZGF9IGFuZAogCiBAeHJlZntDcm9zcy1wcm9maWxpbmd9LgogCitAaXRlbSAtZnByb2ZpbGUt Y29uZGl0aW9ucworQG9waW5kZXggZnByb2ZpbGUtY29uZGl0aW9ucworQWRkIGNvZGUgc28g dGhhdCBwcm9ncmFtIGNvbmRpdGlvbnMgYXJlIGluc3RydW1lbnRlZC4gIER1cmluZyBleGVj dXRpb24gdGhlCitwcm9ncmFtIHJlY29yZHMgd2hhdCB0ZXJtcyBpbiBhIGNvbmRpdGlvbmFs IGNvbnRyaWJ1dGVzIHRvIGEgZGVjaXNpb24uICBUaGUKK2RhdGEgbWF5IGJlIHVzZWQgdG8g dmVyaWZ5IHRoYXQgYWxsIHRlcm1zIGluIGEgYm9vbGVhbnMgYXJlIHRlc3RlZCBhbmQgaGF2 ZSBhbgorZWZmZWN0IG9uIHRoZSBvdXRjb21lIG9mIGEgY29uZGl0aW9uLgorCiBAY2luZGV4 IEBjb21tYW5ke2djb3Z9CiBAaXRlbSAtLWNvdmVyYWdlCiBAb3BpbmRleCBjb3ZlcmFnZQpA QCAtMTUzMzEsNiArMTUzNDYsMTAgQEAgZXhlY3V0ZWQuICBXaGVuIGFuIGFyYyBpcyB0aGUg b25seSBleGl0IG9yIG9ubHkgZW50cmFuY2UgdG8gYSBibG9jaywgdGhlCiBpbnN0cnVtZW50 YXRpb24gY29kZSBjYW4gYmUgYWRkZWQgdG8gdGhlIGJsb2NrOyBvdGhlcndpc2UsIGEgbmV3 IGJhc2ljCiBibG9jayBtdXN0IGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGUgaW5zdHJ1bWVudGF0 aW9uIGNvZGUuCiAKK1dpdGggQG9wdGlvbnstZnByb2ZpbGUtY29uZGl0aW9uc30sIGZvciBl YWNoIGNvbmRpdGlvbmFsIGluIHlvdXIgcHJvZ3JhbSBHQ0MKK2NyZWF0ZXMgYSBiaXRzZXQg YW5kIHJlY29yZHMgdGhlIGJvb2xlYW4gdmFsdWVzIHRoYXQgaGF2ZSBhbiBpbmRlcGVuZGVu dCBlZmZlY3QKK29uIHRoZSBvdXRjb21lIG9mIHRoYXQgZXhwcmVzc2lvbi4KKwogQG5lZWQg MjAwMAogQGl0ZW0gLWZ0ZXN0LWNvdmVyYWdlCiBAb3BpbmRleCBmdGVzdC1jb3ZlcmFnZQpk aWZmIC0tZ2l0IGEvZ2NjL2djb3YtY291bnRlci5kZWYgYi9nY2MvZ2Nvdi1jb3VudGVyLmRl ZgppbmRleCA2ZDIxODJiZDNkYi4uOTY1NjNhNTlhNDUgMTAwNjQ0Ci0tLSBhL2djYy9nY292 LWNvdW50ZXIuZGVmCisrKyBiL2djYy9nY292LWNvdW50ZXIuZGVmCkBAIC00OSwzICs0OSw2 IEBAIERFRl9HQ09WX0NPVU5URVIoR0NPVl9DT1VOVEVSX0lPUiwgImlvciIsIF9pb3IpCiAK IC8qIFRpbWUgcHJvZmlsZSBjb2xsZWN0aW5nIGZpcnN0IHJ1biBvZiBhIGZ1bmN0aW9uICov CiBERUZfR0NPVl9DT1VOVEVSKEdDT1ZfVElNRV9QUk9GSUxFUiwgInRpbWVfcHJvZmlsZXIi LCBfdGltZV9wcm9maWxlKQorCisvKiBDb25kaXRpb25zLiAgVGhlIGNvdW50ZXIgaXMgaW50 ZXJwcmV0ZWQgYXMgYSBiaXQtc2V0LiAgKi8KK0RFRl9HQ09WX0NPVU5URVIoR0NPVl9DT1VO VEVSX0NPTkRTLCAiY29uZGl0aW9ucyIsIF9pb3IpCmRpZmYgLS1naXQgYS9nY2MvZ2Nvdi1p by5oIGIvZ2NjL2djb3YtaW8uaAppbmRleCA5OWNlN2RiY2NjOC4uYzg0ZjU4Yjk5YWMgMTAw NjQ0Ci0tLSBhL2djYy9nY292LWlvLmgKKysrIGIvZ2NjL2djb3YtaW8uaApAQCAtMjUzLDYg KzI1Myw5IEBAIHR5cGVkZWYgdWludDY0X3QgZ2Nvdl90eXBlX3Vuc2lnbmVkOwogI2RlZmlu ZSBHQ09WX1RBR19BUkNTCQkgKChnY292X3Vuc2lnbmVkX3QpMHgwMTQzMDAwMCkKICNkZWZp bmUgR0NPVl9UQUdfQVJDU19MRU5HVEgoTlVNKSAgKDEgKyAoTlVNKSAqIDIgKiBHQ09WX1dP UkRfU0laRSkKICNkZWZpbmUgR0NPVl9UQUdfQVJDU19OVU0oTEVOR1RIKSAgKCgoTEVOR1RI IC8gR0NPVl9XT1JEX1NJWkUpIC0gMSkgLyAyKQorI2RlZmluZSBHQ09WX1RBR19DT05EUyAg ICAgICAgICAgICAoKGdjb3ZfdW5zaWduZWRfdCkweDAxNDcwMDAwKQorI2RlZmluZSBHQ09W X1RBR19DT05EU19MRU5HVEgoTlVNKSAoKE5VTSkgKiAyICogR0NPVl9XT1JEX1NJWkUpCisj ZGVmaW5lIEdDT1ZfVEFHX0NPTkRTX05VTShMRU5HVEgpICgoKExFTkdUSCkgLyBHQ09WX1dP UkRfU0laRSkgLyAyKQogI2RlZmluZSBHQ09WX1RBR19MSU5FUwkJICgoZ2Nvdl91bnNpZ25l ZF90KTB4MDE0NTAwMDApCiAjZGVmaW5lIEdDT1ZfVEFHX0NPVU5URVJfQkFTRSAJICgoZ2Nv dl91bnNpZ25lZF90KTB4MDFhMTAwMDApCiAjZGVmaW5lIEdDT1ZfVEFHX0NPVU5URVJfTEVO R1RIKE5VTSkgKChOVU0pICogMiAqIEdDT1ZfV09SRF9TSVpFKQpkaWZmIC0tZ2l0IGEvZ2Nj L2djb3YuY2MgYi9nY2MvZ2Nvdi5jYwppbmRleCAyN2JlNWZmMDkxMS4uYmE0N2U3MjZkMGQg MTAwNjQ0Ci0tLSBhL2djYy9nY292LmNjCisrKyBiL2djYy9nY292LmNjCkBAIC03OSw2ICs3 OSw3IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiBjbGFzcyBmdW5jdGlvbl9pbmZvOwogY2xh c3MgYmxvY2tfaW5mbzsKIGNsYXNzIHNvdXJjZV9pbmZvOworY2xhc3MgY29uZGl0aW9uX2lu Zm87CiAKIC8qIERlc2NyaWJlcyBhbiBhcmMgYmV0d2VlbiB0d28gYmFzaWMgYmxvY2tzLiAg Ki8KIApAQCAtMTMyLDYgKzEzMywyNyBAQCBwdWJsaWM6CiAgIHZlY3Rvcjx1bnNpZ25lZD4g bGluZXM7CiB9OwogCitjbGFzcyBjb25kaXRpb25faW5mbworeworcHVibGljOgorICBjb25k aXRpb25faW5mbyAoKTsKKworICBpbnQgcG9wY291bnQgKCkgY29uc3Q7CisKKyAgZ2Nvdl90 eXBlX3Vuc2lnbmVkIHRydWV2OworICBnY292X3R5cGVfdW5zaWduZWQgZmFsc2V2OworCisg IHVuc2lnbmVkIG5fdGVybXM7Cit9OworCitjb25kaXRpb25faW5mbzo6Y29uZGl0aW9uX2lu Zm8gKCk6IHRydWV2ICgwKSwgZmFsc2V2ICgwKSwgbl90ZXJtcyAoMCkKK3sKK30KKworaW50 IGNvbmRpdGlvbl9pbmZvOjpwb3Bjb3VudCAoKSBjb25zdCB7CisgICAgcmV0dXJuIF9fYnVp bHRpbl9wb3Bjb3VudGxsICh0cnVldikgKyBfX2J1aWx0aW5fcG9wY291bnRsbCAoZmFsc2V2 KTsKK30KKwogLyogRGVzY3JpYmVzIGEgYmFzaWMgYmxvY2suIENvbnRhaW5zIGxpc3RzIG9m IGFyY3MgdG8gc3VjY2Vzc29yIGFuZAogICAgcHJlZGVjZXNzb3IgYmxvY2tzLiAgKi8KIApA QCAtMTY1LDYgKzE4Nyw4IEBAIHB1YmxpYzoKICAgLyogQmxvY2sgaXMgYSBsYW5kaW5nIHBh ZCBmb3IgbG9uZ2ptcCBvciB0aHJvdy4gICovCiAgIHVuc2lnbmVkIGlzX25vbmxvY2FsX3Jl dHVybiA6IDE7CiAKKyAgY29uZGl0aW9uX2luZm8gY29uZGl0aW9uczsKKwogICB2ZWN0b3I8 YmxvY2tfbG9jYXRpb25faW5mbz4gbG9jYXRpb25zOwogCiAgIHN0cnVjdApAQCAtMjc1LDYg KzI5OSw4IEBAIHB1YmxpYzoKICAgdmVjdG9yPGJsb2NrX2luZm8+IGJsb2NrczsKICAgdW5z aWduZWQgYmxvY2tzX2V4ZWN1dGVkOwogCisgIHZlY3Rvcjxjb25kaXRpb25faW5mbyo+IGNv bmRpdGlvbnM7CisKICAgLyogUmF3IGFyYyBjb3ZlcmFnZSBjb3VudHMuICAqLwogICB2ZWN0 b3I8Z2Nvdl90eXBlPiBjb3VudHM7CiAKQEAgLTM1MSw2ICszNzcsOSBAQCBzdHJ1Y3QgY292 ZXJhZ2VfaW5mbwogICBpbnQgYnJhbmNoZXNfZXhlY3V0ZWQ7CiAgIGludCBicmFuY2hlc190 YWtlbjsKIAorICBpbnQgY29uZGl0aW9uczsKKyAgaW50IGNvbmRpdGlvbnNfY292ZXJlZDsK KwogICBpbnQgY2FsbHM7CiAgIGludCBjYWxsc19leGVjdXRlZDsKIApAQCAtNTUwLDYgKzU3 OSwxMCBAQCBzdGF0aWMgaW50IG11bHRpcGxlX2ZpbGVzID0gMDsKIAogc3RhdGljIGludCBm bGFnX2JyYW5jaGVzID0gMDsKIAorLyogT3V0cHV0IGNvbmRpdGlvbnMgKG1vZGlmaWVkIGNv bmRpdGlvbi9kZWNpc2lvbiBjb3ZlcmFnZSkgKi8KKworc3RhdGljIGludCBmbGFnX2NvbmRp dGlvbnMgPSAwOworCiAvKiBTaG93IHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgdG9vLiAgKi8K IHN0YXRpYyBpbnQgZmxhZ191bmNvbmRpdGlvbmFsID0gMDsKIApAQCAtNjU2LDYgKzY4OSw3 IEBAIHN0YXRpYyBpbnQgcmVhZF9jb3VudF9maWxlICh2b2lkKTsKIHN0YXRpYyB2b2lkIHNv bHZlX2Zsb3dfZ3JhcGggKGZ1bmN0aW9uX2luZm8gKik7CiBzdGF0aWMgdm9pZCBmaW5kX2V4 Y2VwdGlvbl9ibG9ja3MgKGZ1bmN0aW9uX2luZm8gKik7CiBzdGF0aWMgdm9pZCBhZGRfYnJh bmNoX2NvdW50cyAoY292ZXJhZ2VfaW5mbyAqLCBjb25zdCBhcmNfaW5mbyAqKTsKK3N0YXRp YyB2b2lkIGFkZF9jb25kaXRpb25fY291bnRzIChjb3ZlcmFnZV9pbmZvICosIGNvbnN0IGJs b2NrX2luZm8gKik7CiBzdGF0aWMgdm9pZCBhZGRfbGluZV9jb3VudHMgKGNvdmVyYWdlX2lu Zm8gKiwgZnVuY3Rpb25faW5mbyAqKTsKIHN0YXRpYyB2b2lkIGV4ZWN1dGVkX3N1bW1hcnkg KHVuc2lnbmVkLCB1bnNpZ25lZCk7CiBzdGF0aWMgdm9pZCBmdW5jdGlvbl9zdW1tYXJ5IChj b25zdCBjb3ZlcmFnZV9pbmZvICopOwpAQCAtNjY0LDYgKzY5OCw3IEBAIHN0YXRpYyBjb25z dCBjaGFyICpmb3JtYXRfZ2NvdiAoZ2Nvdl90eXBlLCBnY292X3R5cGUsIGludCk7CiBzdGF0 aWMgdm9pZCBhY2N1bXVsYXRlX2xpbmVfY291bnRzIChzb3VyY2VfaW5mbyAqKTsKIHN0YXRp YyB2b2lkIG91dHB1dF9nY292X2ZpbGUgKGNvbnN0IGNoYXIgKiwgc291cmNlX2luZm8gKik7 CiBzdGF0aWMgaW50IG91dHB1dF9icmFuY2hfY291bnQgKEZJTEUgKiwgaW50LCBjb25zdCBh cmNfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIG91dHB1dF9jb25kaXRpb25zIChGSUxFICosIGNv bnN0IGJsb2NrX2luZm8gKik7CiBzdGF0aWMgdm9pZCBvdXRwdXRfbGluZXMgKEZJTEUgKiwg Y29uc3Qgc291cmNlX2luZm8gKik7CiBzdGF0aWMgc3RyaW5nIG1ha2VfZ2Nvdl9maWxlX25h bWUgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKIHN0YXRpYyBjaGFyICptYW5nbGVf bmFtZSAoY29uc3QgY2hhciAqKTsKQEAgLTkyOCw2ICs5NjMsNyBAQCBwcmludF91c2FnZSAo aW50IGVycm9yX3ApCiAgIGZub3RpY2UgKGZpbGUsICIgIC1iLCAtLWJyYW5jaC1wcm9iYWJp bGl0aWVzICAgICAgSW5jbHVkZSBicmFuY2ggcHJvYmFiaWxpdGllcyBpbiBvdXRwdXRcbiIp OwogICBmbm90aWNlIChmaWxlLCAiICAtYywgLS1icmFuY2gtY291bnRzICAgICAgICAgICAg IE91dHB1dCBjb3VudHMgb2YgYnJhbmNoZXMgdGFrZW5cblwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIHBlcmNlbnRhZ2VzXG4iKTsKKyAgZm5v dGljZSAoZmlsZSwgIiAgLWcsIC0tY29uZGl0aW9ucyAgICAgICAgICAgICAgICBJbmNsdWRl IGNvbmRpdGlvbiBjb3ZlcmFnZSBpbiBvdXRwdXQgKE1DL0RDKVxuIik7CiAgIGZub3RpY2Ug KGZpbGUsICIgIC1kLCAtLWRpc3BsYXktcHJvZ3Jlc3MgICAgICAgICAgRGlzcGxheSBwcm9n cmVzcyBpbmZvcm1hdGlvblxuIik7CiAgIGZub3RpY2UgKGZpbGUsICIgIC1ELCAtLWRlYnVn CQkJICAgIERpc3BsYXkgZGVidWdnaW5nIGR1bXBzXG4iKTsKICAgZm5vdGljZSAoZmlsZSwg IiAgLWYsIC0tZnVuY3Rpb24tc3VtbWFyaWVzICAgICAgICBPdXRwdXQgc3VtbWFyaWVzIGZv ciBlYWNoIGZ1bmN0aW9uXG4iKTsKQEAgLTk4MCw2ICsxMDE2LDcgQEAgc3RhdGljIGNvbnN0 IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0KICAgeyAiYWxsLWJsb2NrcyIsICAgICAgICAg ICBub19hcmd1bWVudCwgICAgICAgTlVMTCwgJ2EnIH0sCiAgIHsgImJyYW5jaC1wcm9iYWJp bGl0aWVzIiwgbm9fYXJndW1lbnQsICAgICAgIE5VTEwsICdiJyB9LAogICB7ICJicmFuY2gt Y291bnRzIiwgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCAnYycgfSwKKyAgeyAi Y29uZGl0aW9ucyIsICAgICAgICAgICBub19hcmd1bWVudCwgICAgICAgTlVMTCwgJ2cnIH0s CiAgIHsgImpzb24tZm9ybWF0IiwJICAgIG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCAnaicg fSwKICAgeyAiaHVtYW4tcmVhZGFibGUiLAkgICAgbm9fYXJndW1lbnQsICAgICAgIE5VTEws ICdIJyB9LAogICB7ICJuby1vdXRwdXQiLCAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAg ICBOVUxMLCAnbicgfSwKQEAgLTEwMDgsNyArMTA0NSw3IEBAIHByb2Nlc3NfYXJncyAoaW50 IGFyZ2MsIGNoYXIgKiphcmd2KQogewogICBpbnQgb3B0OwogCi0gIGNvbnN0IGNoYXIgKm9w dHMgPSAiYWJjZERmaEhpamtsbW5vOnBxcnM6dHV2d3giOworICBjb25zdCBjaGFyICpvcHRz ID0gImFiY2REZmdoSGlqa2xtbm86cHFyczp0dXZ3eCI7CiAgIHdoaWxlICgob3B0ID0gZ2V0 b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsIG9wdHMsIG9wdGlvbnMsIE5VTEwpKSAhPSAtMSkKICAg ICB7CiAgICAgICBzd2l0Y2ggKG9wdCkKQEAgLTEwMjUsNiArMTA2Miw5IEBAIHByb2Nlc3Nf YXJncyAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWNhc2UgJ2YnOgogCSAgZmxhZ19mdW5j dGlvbl9zdW1tYXJ5ID0gMTsKIAkgIGJyZWFrOworCWNhc2UgJ2cnOgorCSAgZmxhZ19jb25k aXRpb25zID0gMTsKKwkgIGJyZWFrOwogCWNhc2UgJ2gnOgogCSAgcHJpbnRfdXNhZ2UgKGZh bHNlKTsKIAkgIC8qIHByaW50X3VzYWdlIHdpbGwgZXhpdC4gICovCkBAIC0xMTMyLDYgKzEx NzIsNDYgQEAgb3V0cHV0X2ludGVybWVkaWF0ZV9qc29uX2xpbmUgKGpzb246OmFycmF5ICpv YmplY3QsCiAJICB9CiAgICAgICB9CiAKKyAganNvbjo6YXJyYXkgKmNvbmRpdGlvbnMgPSBu ZXcganNvbjo6YXJyYXkgKCk7CisgIGxpbmVvLT5zZXQgKCJjb25kaXRpb25zIiwgY29uZGl0 aW9ucyk7CisgIGlmIChmbGFnX2NvbmRpdGlvbnMpCisgIHsKKyAgICB2ZWN0b3I8YmxvY2tf aW5mbyAqPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IGxpbmUtPmJsb2Nr cy5iZWdpbiAoKTsgaXQgIT0gbGluZS0+YmxvY2tzLmVuZCAoKTsgaXQrKykKKyAgICB7Cisg ICAgICBjb25zdCBjb25kaXRpb25faW5mbyYgaW5mbyA9ICgqaXQpLT5jb25kaXRpb25zOwor ICAgICAgaWYgKGluZm8ubl90ZXJtcyA9PSAwKQorICAgICAgICBjb250aW51ZTsKKworICAg ICAgY29uc3QgaW50IGNvdW50ID0gMiAqIGluZm8ubl90ZXJtczsKKyAgICAgIGNvbnN0IGlu dCBjb3ZlcmVkID0gaW5mby5wb3Bjb3VudCAoKTsKKworICAgICAganNvbjo6b2JqZWN0ICpj b25kID0gbmV3IGpzb246Om9iamVjdCAoKTsKKyAgICAgIGNvbmQtPnNldCAoImNvdW50Iiwg ICBuZXcganNvbjo6aW50ZWdlcl9udW1iZXIgKGNvdW50KSk7CisgICAgICBjb25kLT5zZXQg KCJjb3ZlcmVkIiwgbmV3IGpzb246OmludGVnZXJfbnVtYmVyIChjb3ZlcmVkKSk7CisKKyAg ICAgIGpzb246OmFycmF5ICptdHJ1ZSA9IG5ldyBqc29uOjphcnJheSAoKTsKKyAgICAgIGpz b246OmFycmF5ICptZmFsc2UgPSBuZXcganNvbjo6YXJyYXkgKCk7CisgICAgICBjb25kLT5z ZXQoIm5vdF9jb3ZlcmVkX3RydWUiLCAgbXRydWUpOworICAgICAgY29uZC0+c2V0KCJub3Rf Y292ZXJlZF9mYWxzZSIsIG1mYWxzZSk7CisKKyAgICAgIGlmIChjb3VudCAhPSBjb3ZlcmVk KQorICAgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5mby5uX3Rl cm1zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBnY292X3R5cGVfdW5zaWduZWQgaW5k ZXggPSAxOworICAgICAgICAgIGluZGV4IDw8PSBpOworICAgICAgICAgIGlmICghKGluZGV4 ICYgaW5mby50cnVldikpCisgICAgICAgICAgICBtdHJ1ZS0+YXBwZW5kIChuZXcganNvbjo6 aW50ZWdlcl9udW1iZXIgKGkpKTsKKyAgICAgICAgICBpZiAoIShpbmRleCAmIGluZm8uZmFs c2V2KSkKKyAgICAgICAgICAgIG1mYWxzZS0+YXBwZW5kIChuZXcganNvbjo6aW50ZWdlcl9u dW1iZXIgKGkpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb25kaXRpb25zLT5h cHBlbmQgKGNvbmQpOworICAgIH0KKyAgfQorCiAgIG9iamVjdC0+YXBwZW5kIChsaW5lbyk7 CiB9CiAKQEAgLTE5NTYsNiArMjAzNiwyOCBAQCByZWFkX2dyYXBoX2ZpbGUgKHZvaWQpCiAJ CSAgfQogCSAgICB9CiAJfQorICAgICAgZWxzZSBpZiAoZm4gJiYgdGFnID09IEdDT1ZfVEFH X0NPTkRTKQorCXsKKyAgICAgICAgdW5zaWduZWQgbnVtX2Rlc3RzID0gR0NPVl9UQUdfQ09O RFNfTlVNIChsZW5ndGgpOworCisgICAgICAgIGlmICghZm4tPmNvbmRpdGlvbnMuZW1wdHkg KCkpCisgICAgICAgICAgICBmbm90aWNlIChzdGRlcnIsICIlczphbHJlYWR5IHNlZW4gY29u ZGl0aW9ucyBmb3IgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgYmJnX2ZpbGVfbmFt ZSwgZm4tPmdldF9uYW1lICgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm4tPmNv bmRpdGlvbnMucmVzaXplIChudW1fZGVzdHMpOworCisgICAgICAgIGZvciAodW5zaWduZWQg aSA9IDA7IGkgPCBudW1fZGVzdHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgdW5z aWduZWQgaWR4ID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworCisgICAgICAgICAgICBpZiAo aWR4ID49IGZuLT5ibG9ja3Muc2l6ZSAoKSkKKyAgICAgICAgICAgICAgICBnb3RvIGNvcnJ1 cHQ7CisKKyAgICAgICAgICAgIGNvbmRpdGlvbl9pbmZvICppbmZvID0gJmZuLT5ibG9ja3Nb aWR4XS5jb25kaXRpb25zOworICAgICAgICAgICAgaW5mby0+bl90ZXJtcyA9IGdjb3ZfcmVh ZF91bnNpZ25lZCAoKTsKKyAgICAgICAgICAgIGZuLT5jb25kaXRpb25zW2ldID0gaW5mbzsK KyAgICAgICAgfQorCX0KICAgICAgIGVsc2UgaWYgKGZuICYmIHRhZyA9PSBHQ09WX1RBR19M SU5FUykKIAl7CiAJICB1bnNpZ25lZCBibG9ja25vID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgp OwpAQCAtMjA4Niw2ICsyMTg4LDIxIEBAIHJlYWRfY291bnRfZmlsZSAodm9pZCkKIAkgICAg ICBnb3RvIGNsZWFudXA7CiAJICAgIH0KIAl9CisgICAgICBlbHNlIGlmICh0YWcgPT0gR0NP Vl9UQUdfRk9SX0NPVU5URVIgKEdDT1ZfQ09VTlRFUl9DT05EUykgJiYgZm4pCisgICAgewor ICAgICAgICBsZW5ndGggPSBhYnMgKHJlYWRfbGVuZ3RoKTsKKyAgICAgICAgaWYgKGxlbmd0 aCAhPSBHQ09WX1RBR19DT1VOVEVSX0xFTkdUSCAoMiAqIGZuLT5jb25kaXRpb25zLnNpemUg KCkpKQorICAgICAgICAgICAgZ290byBtaXNtYXRjaDsKKworICAgICAgICBpZiAocmVhZF9s ZW5ndGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGl4ID0gMDsgaXggIT0g Zm4tPmNvbmRpdGlvbnMuc2l6ZSAoKTsgaXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAg ICAgICAgICBmbi0+Y29uZGl0aW9uc1tpeF0tPnRydWV2ICB8PSBnY292X3JlYWRfY291bnRl ciAoKTsKKyAgICAgICAgICAgICAgICBmbi0+Y29uZGl0aW9uc1tpeF0tPmZhbHNldiB8PSBn Y292X3JlYWRfY291bnRlciAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0K ICAgICAgIGVsc2UgaWYgKHRhZyA9PSBHQ09WX1RBR19GT1JfQ09VTlRFUiAoR0NPVl9DT1VO VEVSX0FSQ1MpICYmIGZuKQogCXsKIAkgIGxlbmd0aCA9IGFicyAocmVhZF9sZW5ndGgpOwpA QCAtMjQzMCw2ICsyNTQ3LDEzIEBAIGFkZF9icmFuY2hfY291bnRzIChjb3ZlcmFnZV9pbmZv ICpjb3ZlcmFnZSwgY29uc3QgYXJjX2luZm8gKmFyYykKICAgICB9CiB9CiAKK3N0YXRpYyB2 b2lkCithZGRfY29uZGl0aW9uX2NvdW50cyAoY292ZXJhZ2VfaW5mbyAqY292ZXJhZ2UsIGNv bnN0IGJsb2NrX2luZm8gKmJsb2NrKQoreworICBjb3ZlcmFnZS0+Y29uZGl0aW9ucyArPSAy ICogYmxvY2stPmNvbmRpdGlvbnMubl90ZXJtczsKKyAgY292ZXJhZ2UtPmNvbmRpdGlvbnNf Y292ZXJlZCArPSBibG9jay0+Y29uZGl0aW9ucy5wb3Bjb3VudCAoKTsKK30KKwogLyogRm9y bWF0IENPVU5ULCBpZiBmbGFnX2h1bWFuX3JlYWRhYmxlX251bWJlcnMgaXMgc2V0LCByZXR1 cm4gaXQgaHVtYW4KICAgIHJlYWRhYmxlIGZvcm1hdC4gICovCiAKQEAgLTI1MzMsNyArMjY1 NywxMyBAQCBmaWxlX3N1bW1hcnkgKGNvbnN0IGNvdmVyYWdlX2luZm8gKmNvdmVyYWdlKQog CQkgY292ZXJhZ2UtPmNhbGxzKTsKICAgICAgIGVsc2UKIAlmbm90aWNlIChzdGRvdXQsICJO byBjYWxsc1xuIik7CisKICAgICB9CisKKyAgaWYgKGZsYWdfY29uZGl0aW9ucykKKyAgICAg IGZub3RpY2UgKHN0ZG91dCwgIkNvbmRpdGlvbnMgY292ZXJlZDolcyBvZiAlZFxuIiwKKyAg ICAgICAgZm9ybWF0X2djb3YgKGNvdmVyYWdlLT5jb25kaXRpb25zX2NvdmVyZWQsIGNvdmVy YWdlLT5jb25kaXRpb25zLCAyKSwKKyAgICAgICAgY292ZXJhZ2UtPmNvbmRpdGlvbnMpOwog fQogCiAvKiBDYW5vbmljYWxpemUgdGhlIGZpbGVuYW1lIE5BTUUgYnkgY2Fub25pY2FsaXpp bmcgZGlyZWN0b3J5CkBAIC0yNzYwLDYgKzI4OTAsMTIgQEAgc3RhdGljIHZvaWQgYWNjdW11 bGF0ZV9saW5lX2luZm8gKGxpbmVfaW5mbyAqbGluZSwgc291cmNlX2luZm8gKnNyYywKIAkg aXQgIT0gbGluZS0+YnJhbmNoZXMuZW5kICgpOyBpdCsrKQogICAgICAgYWRkX2JyYW5jaF9j b3VudHMgKCZzcmMtPmNvdmVyYWdlLCAqaXQpOwogCisgIGlmIChhZGRfY292ZXJhZ2UpCisg ICAgZm9yICh2ZWN0b3I8YmxvY2tfaW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBsaW5lLT5ibG9j a3MuYmVnaW4gKCk7CisJIGl0ICE9IGxpbmUtPmJsb2Nrcy5lbmQgKCk7IGl0KyspCisgICAg ICBhZGRfY29uZGl0aW9uX2NvdW50cyAoJnNyYy0+Y292ZXJhZ2UsICppdCk7CisKKwogICBp ZiAoIWxpbmUtPmJsb2Nrcy5lbXB0eSAoKSkKICAgICB7CiAgICAgICAvKiBUaGUgdXNlciBl eHBlY3RzIHRoZSBsaW5lIGNvdW50IHRvIGJlIHRoZSBudW1iZXIgb2YgdGltZXMKQEAgLTI4 NjEsNiArMjk5NywzMCBAQCBhY2N1bXVsYXRlX2xpbmVfY291bnRzIChzb3VyY2VfaW5mbyAq c3JjKQogICAgICAgfQogfQogCitzdGF0aWMgdm9pZAorb3V0cHV0X2NvbmRpdGlvbnMgKEZJ TEUgKmdjb3ZfZmlsZSwgY29uc3QgYmxvY2tfaW5mbyAqYmluZm8pCit7CisgICAgY29uc3Qg Y29uZGl0aW9uX2luZm8mIGluZm8gPSBiaW5mby0+Y29uZGl0aW9uczsKKyAgICBpZiAoaW5m by5uX3Rlcm1zID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IGludCBleHBl Y3RlZCA9IDIgKiBpbmZvLm5fdGVybXM7CisgICAgY29uc3QgaW50IGdvdCA9IGluZm8ucG9w Y291bnQgKCk7CisKKyAgICBmbm90aWNlIChnY292X2ZpbGUsICJjb25kaXRpb25zIGNvdmVy ZWQgJWQvJWRcbiIsIGdvdCwgZXhwZWN0ZWQpOworICAgIGlmIChleHBlY3RlZCA9PSBnb3Qp CisgICAgICAgIHJldHVybjsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpbmZv Lm5fdGVybXM7IGkrKykgeworICAgICAgICBnY292X3R5cGVfdW5zaWduZWQgaW5kZXggPSAx OworICAgICAgICBpbmRleCA8PD0gaTsKKyAgICAgICAgaWYgKCEoaW5kZXggJiBpbmZvLnRy dWV2KSkKKyAgICAgICAgICAgIGZub3RpY2UgKGdjb3ZfZmlsZSwgImNvbmRpdGlvbiAlMnUg bm90IGNvdmVyZWQgKHRydWUpXG4iLCBpKTsKKyAgICAgICAgaWYgKCEoaW5kZXggJiBpbmZv LmZhbHNldikpCisgICAgICAgICAgICBmbm90aWNlIChnY292X2ZpbGUsICJjb25kaXRpb24g JTJ1IG5vdCBjb3ZlcmVkIChmYWxzZSlcbiIsIGkpOworICAgIH0KK30KKwogLyogT3V0cHV0 IGluZm9ybWF0aW9uIGFib3V0IEFSQyBudW1iZXIgSVguICBSZXR1cm5zIG5vbnplcm8gaWYK ICAgIGFueXRoaW5nIGlzIG91dHB1dC4gICovCiAKQEAgLTMwNzEsMTYgKzMyMzEsMjkgQEAg b3V0cHV0X2xpbmVfZGV0YWlscyAoRklMRSAqZiwgY29uc3QgbGluZV9pbmZvICpsaW5lLCB1 bnNpZ25lZCBsaW5lX251bSkKIAkgIGlmIChmbGFnX2JyYW5jaGVzKQogCSAgICBmb3IgKGFy YyA9ICgqaXQpLT5zdWNjOyBhcmM7IGFyYyA9IGFyYy0+c3VjY19uZXh0KQogCSAgICAgIGp4 ICs9IG91dHB1dF9icmFuY2hfY291bnQgKGYsIGp4LCBhcmMpOworCisgICAgICBpZiAoZmxh Z19jb25kaXRpb25zKQorICAgICAgICBvdXRwdXRfY29uZGl0aW9ucyAoZiwgKml0KTsKIAl9 CiAgICAgfQotICBlbHNlIGlmIChmbGFnX2JyYW5jaGVzKQorICBlbHNlCiAgICAgeworICAg ICAgaWYgKGZsYWdfYnJhbmNoZXMpCisgICAgICB7CiAgICAgICBpbnQgaXg7CiAKICAgICAg IGl4ID0gMDsKICAgICAgIGZvciAodmVjdG9yPGFyY19pbmZvICo+Ojpjb25zdF9pdGVyYXRv ciBpdCA9IGxpbmUtPmJyYW5jaGVzLmJlZ2luICgpOwogCSAgIGl0ICE9IGxpbmUtPmJyYW5j aGVzLmVuZCAoKTsgaXQrKykKIAlpeCArPSBvdXRwdXRfYnJhbmNoX2NvdW50IChmLCBpeCwg KCppdCkpOworICAgICAgfQorCisgICAgICBpZiAoZmxhZ19jb25kaXRpb25zKQorICAgICAg ICAgeworICAgICAgICAgICBmb3IgKHZlY3RvcjxibG9ja19pbmZvICo+Ojpjb25zdF9pdGVy YXRvciBpdCA9IGxpbmUtPmJsb2Nrcy5iZWdpbiAoKTsKKwkgICAgICAgICAgICBpdCAhPSBs aW5lLT5ibG9ja3MuZW5kICgpOyBpdCsrKQorICAgICAgICAgICAgICBvdXRwdXRfY29uZGl0 aW9ucyAoZiwgKml0KTsKKyAgICAgICAgICB9CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9n Y2MvcHJvZmlsZS5jYyBiL2djYy9wcm9maWxlLmNjCmluZGV4IGE2N2NjZTViMTk5Li44MmFl MWY5YThkNiAxMDA2NDQKLS0tIGEvZ2NjL3Byb2ZpbGUuY2MKKysrIGIvZ2NjL3Byb2ZpbGUu Y2MKQEAgLTY5LDYgKzY5LDkgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZ SU5HMy4gIElmIG5vdCBzZWUKIAogI2luY2x1ZGUgInByb2ZpbGUuaCIKIAoraW50IGZpbmRf Y29uZGl0aW9ucyAoYmFzaWNfYmxvY2ssIGJhc2ljX2Jsb2NrLCBiYXNpY19ibG9jayosIGlu dCosIGludCk7CitpbnQgaW5zdHJ1bWVudF9kZWNpc2lvbnMgKGJhc2ljX2Jsb2NrKiwgaW50 LCBpbnQpOworCiAvKiBNYXAgZnJvbSBCQnMvZWRnZXMgdG8gZ2NvdiBjb3VudGVycy4gICov CiB2ZWM8Z2Nvdl90eXBlPiBiYl9nY292X2NvdW50czsKIGhhc2hfbWFwPGVkZ2UsZ2Nvdl90 eXBlPiAqZWRnZV9nY292X2NvdW50czsKQEAgLTEwMCw2ICsxMDMsNyBAQCBzdGF0aWMgaW50 IHRvdGFsX251bV9wYXNzZXM7CiBzdGF0aWMgaW50IHRvdGFsX251bV90aW1lc19jYWxsZWQ7 CiBzdGF0aWMgaW50IHRvdGFsX2hpc3RfYnJfcHJvYlsyMF07CiBzdGF0aWMgaW50IHRvdGFs X251bV9icmFuY2hlczsKK3N0YXRpYyBpbnQgdG90YWxfbnVtX2NvbmRzOwogCiAvKiBGb3J3 YXJkIGRlY2xhcmF0aW9ucy4gICovCiBzdGF0aWMgdm9pZCBmaW5kX3NwYW5uaW5nX3RyZWUg KHN0cnVjdCBlZGdlX2xpc3QgKik7CkBAIC0xNTEyLDI5ICsxNTE2LDYzIEBAIGJyYW5jaF9w cm9iIChib29sIHRodW5rKQogCiAgIHJlbW92ZV9mYWtlX2VkZ2VzICgpOwogCisgIGlmIChw cm9maWxlX2NvbmRpdGlvbl9mbGFnIHx8IHByb2ZpbGVfYXJjX2ZsYWcpCisgICAgICBnaW1w bGVfaW5pdF9nY292X3Byb2ZpbGVyICgpOworCisgIGlmIChwcm9maWxlX2NvbmRpdGlvbl9m bGFnKQorICB7CisgICAgYmFzaWNfYmxvY2sgZW50cnkgPSBFTlRSWV9CTE9DS19QVFJfRk9S X0ZOIChjZnVuKS0+bmV4dF9iYjsKKyAgICBiYXNpY19ibG9jayBleGl0ICA9IEVYSVRfQkxP Q0tfUFRSX0ZPUl9GTiAoY2Z1bik7CisKKyAgICAvLyBmaW5kX2NvbmRpdGlvbnMgKCkgZXhw ZWN0IG1lbW9yeSB1cCBmcm9udCwgc2VlIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMKKyAg ICBjb25zdCBpbnQgbWF4X2Jsb2NrcyA9IDUgKiBuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKGNm dW4pOworICAgIGF1dG9fdmVjPGJhc2ljX2Jsb2NrPiBibG9ja3MgKG1heF9ibG9ja3MpOwor ICAgIGJsb2Nrcy5xdWlja19ncm93IChtYXhfYmxvY2tzKTsKKworICAgIGNvbnN0IGludCBt YXhfc2l6ZXMgPSBuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKGNmdW4pICsgMTsKKyAgICBhdXRv X3ZlYzxpbnQ+IHNpemVzIChtYXhfc2l6ZXMpOworICAgIHNpemVzLnF1aWNrX2dyb3cgKG1h eF9zaXplcyk7CisKKyAgICBpbnQgbmNvbmRzID0gZmluZF9jb25kaXRpb25zCisgICAgICAg IChlbnRyeSwgZXhpdCwgYmxvY2tzLmFkZHJlc3MgKCksIHNpemVzLmFkZHJlc3MgKCksIG1h eF9ibG9ja3MpOworICAgIHRvdGFsX251bV9jb25kcyArPSBuY29uZHM7CisKKyAgICBpZiAo bmNvbmRzID4gMCAmJiBjb3ZlcmFnZV9jb3VudGVyX2FsbG9jIChHQ09WX0NPVU5URVJfQ09O RFMsIDIgKiBuY29uZHMpKQorICAgIHsKKyAgICAgIGdjb3ZfcG9zaXRpb25fdCBvZmZzZXQg PSBnY292X3dyaXRlX3RhZyAoR0NPVl9UQUdfQ09ORFMpOworICAgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCBuY29uZHM7ICsraSkKKyAgICAgIHsKKyAgICAgICAgaW50IGlkeCA9IHNpemVz W2ldOworICAgICAgICBpbnQgbGVuID0gc2l6ZXNbaSArIDFdIC0gaWR4OworICAgICAgICBp bnQgdGVybXMgPSBpbnN0cnVtZW50X2RlY2lzaW9ucyAoYmxvY2tzLmFkZHJlc3MgKCkgKyBp ZHgsIGxlbiwgaSk7CisgICAgICAgIGdjb3Zfd3JpdGVfdW5zaWduZWQgKGJsb2Nrc1tpZHhd LT5pbmRleCk7CisgICAgICAgIGdjb3Zfd3JpdGVfdW5zaWduZWQgKHRlcm1zKTsKKyAgICAg IH0KKyAgICAgIGdjb3Zfd3JpdGVfbGVuZ3RoIChvZmZzZXQpOworICAgIH0KKyAgfQorCiAg IC8qIEZvciBlYWNoIGVkZ2Ugbm90IG9uIHRoZSBzcGFubmluZyB0cmVlLCBhZGQgY291bnRp bmcgY29kZS4gICovCiAgIGlmIChwcm9maWxlX2FyY19mbGFnCiAgICAgICAmJiBjb3ZlcmFn ZV9jb3VudGVyX2FsbG9jIChHQ09WX0NPVU5URVJfQVJDUywgbnVtX2luc3RydW1lbnRlZCkp CiAgICAgewogICAgICAgdW5zaWduZWQgbl9pbnN0cnVtZW50ZWQ7CiAKLSAgICAgIGdpbXBs ZV9pbml0X2djb3ZfcHJvZmlsZXIgKCk7Ci0KICAgICAgIG5faW5zdHJ1bWVudGVkID0gaW5z dHJ1bWVudF9lZGdlcyAoZWwpOwogCiAgICAgICBnY2NfYXNzZXJ0IChuX2luc3RydW1lbnRl ZCA9PSBudW1faW5zdHJ1bWVudGVkKTsKIAogICAgICAgaWYgKGZsYWdfcHJvZmlsZV92YWx1 ZXMpCiAJaW5zdHJ1bWVudF92YWx1ZXMgKHZhbHVlcyk7Ci0KLSAgICAgIC8qIENvbW1pdCBj aGFuZ2VzIGRvbmUgYnkgaW5zdHJ1bWVudGF0aW9uLiAgKi8KLSAgICAgIGdzaV9jb21taXRf ZWRnZV9pbnNlcnRzICgpOwogICAgIH0KIAogICBmcmVlX2F1eF9mb3JfZWRnZXMgKCk7CiAK ICAgdmFsdWVzLnJlbGVhc2UgKCk7CiAgIGZyZWVfZWRnZV9saXN0IChlbCk7CisgIC8qIENv bW1pdCBjaGFuZ2VzIGRvbmUgYnkgaW5zdHJ1bWVudGF0aW9uLiAgKi8KKyAgZ3NpX2NvbW1p dF9lZGdlX2luc2VydHMgKCk7CisKICAgY292ZXJhZ2VfZW5kX2Z1bmN0aW9uIChsaW5lbm9f Y2hlY2tzdW0sIGNmZ19jaGVja3N1bSk7CiAgIGlmIChmbGFnX2JyYW5jaF9wcm9iYWJpbGl0 aWVzCiAgICAgICAmJiAocHJvZmlsZV9zdGF0dXNfZm9yX2ZuIChjZnVuKSA9PSBQUk9GSUxF X1JFQUQpKQpAQCAtMTY2NCw2ICsxNzAyLDcgQEAgaW5pdF9icmFuY2hfcHJvYiAodm9pZCkK ICAgdG90YWxfbnVtX3Bhc3NlcyA9IDA7CiAgIHRvdGFsX251bV90aW1lc19jYWxsZWQgPSAw OwogICB0b3RhbF9udW1fYnJhbmNoZXMgPSAwOworICB0b3RhbF9udW1fY29uZHMgPSAwOwog ICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKICAgICB0b3RhbF9oaXN0X2JyX3Byb2JbaV0g PSAwOwogfQpAQCAtMTcwMyw1ICsxNzQyLDcgQEAgZW5kX2JyYW5jaF9wcm9iICh2b2lkKQog CQkgICAgICh0b3RhbF9oaXN0X2JyX3Byb2JbaV0gKyB0b3RhbF9oaXN0X2JyX3Byb2JbMTkt aV0pICogMTAwCiAJCSAgICAgLyB0b3RhbF9udW1fYnJhbmNoZXMsIDUqaSwgNSppKzUpOwog CX0KKyAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlRvdGFsIG51bWJlciBvZiBjb25kaXRp b25zOiAlZFxuIiwKKwkgICAgICAgdG90YWxfbnVtX2NvbmRzKTsKICAgICB9CiB9CmRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy5kZy9nY292L2djb3YtMTguQyBiL2djYy90ZXN0 c3VpdGUvZysrLmRnL2djb3YvZ2Nvdi0xOC5DCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi43ZjA5NTY5MzkyZgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0 c3VpdGUvZysrLmRnL2djb3YvZ2Nvdi0xOC5DCkBAIC0wLDAgKzEsMjA5IEBACisvKiB7IGRn LW9wdGlvbnMgIi0tY292ZXJhZ2UgLWZwcm9maWxlLWNvbmRpdGlvbnMgLXN0ZD1jKysxMSIg fSAqLworLyogeyBkZy1kbyBydW4geyB0YXJnZXQgbmF0aXZlIH0gfSAqLworCisjaW5jbHVk ZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworY2xhc3Mgbm9udHJpdmlhbF9k ZXN0cnVjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBub250cml2aWFsX2Rlc3RydWN0 b3IgKGludCB2KSA6IHZhbCAodikge30KKyAgICB+bm9udHJpdmlhbF9kZXN0cnVjdG9yICgp IHt9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYm9v bCh2YWwpOyB9CisKKyAgICBpbnQgdmFsOworfTsKKworaW50IGlkZW50aXR5IChpbnQgeCkg eyByZXR1cm4geDsgfQoraW50IHRocm93cyAoaW50KSB7IHRocm93IHN0ZDo6cnVudGltZV9l cnJvcigiZXhjZXB0aW9uIik7IH0KKworaW50IHRocm93X2lmIChpbnQgeCkKK3sKKyAgICBp ZiAoeCkgLyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKyAgICAgICAgdGhyb3cgc3Rk OjpydW50aW1lX2Vycm9yKCJleGNlcHRpb24iKTsKKyAgICByZXR1cm4geDsKK30KKworLyog dXNlZCBmb3Igc2lkZSBlZmZlY3RzIHRvIGluc2VydCBub2RlcyBpbiBjb25kaXRpb25hbCBi b2RpZXMgZXRjLiAqLworaW50IHggPSAwOworCisvKiBjb25kaXRpb25hbHMgd29yayBpbiB0 aGUgcHJlc2VuY2Ugb2Ygbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvcnMgKi8KK3ZvaWQgbWNkYzAw MWEgKGludCBhKQoreworICAgIG5vbnRyaXZpYWxfZGVzdHJ1Y3RvciB2IChhKTsKKworICAg IGlmICh2LnZhbCA+IDApIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgICB4ID0gdi52 YWw7CisgICAgZWxzZQorICAgICAgICB4ID0gLXYudmFsOworfQorCisvKiBub24tdHJpdmlh bCBkZXN0cnVjdG9yIGluLWxvb3AgdGVtcG9yYXJ5ICovCitub250cml2aWFsX2Rlc3RydWN0 b3IKK21jZGMwMDJhIChpbnQgYSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8 IGE7IGkrKykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworICAgICAgICBub250cml2 aWFsX2Rlc3RydWN0b3IgdG1wIChhKTsKKyAgICAgICAgaWYgKHRtcC52YWwgJSBiKSAvKiBj b25kaXRpb25zKDIvMikgKi8KKyAgICAgICAgICAgIHJldHVybiBub250cml2aWFsX2Rlc3Ry dWN0b3IgKDApOworICAgICAgICB4ICs9IGk7CisgICAgfSAvKiBjb25kaXRpb25zKHN1cHBy ZXNzKSAqLworICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisKKyAgICByZXR1cm4gbm9u dHJpdmlhbF9kZXN0cnVjdG9yIChhICogYik7Cit9CisKKy8qIGNvbmRpdGlvbmFsIGluIGNv bnN0cnVjdG9yICovCit2b2lkIG1jZGMwMDNhIChpbnQgYSkKK3sKKyAgICBjbGFzcyBDCisg ICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQyAoaW50IGUpIDogdiAoZSkg eworICAgICAgICAgICAgaWYgKGUpIC8qIGNvbmRpdGlvbnMoMS8yKSBmYWxzZSgwKSAqLwor ICAgICAgICAgICAgICAgIHYgPSB4IC0gZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdjsK KyAgICB9OworCisgICAgQyBjIChhKTsKKyAgICBpZiAoYy52ID4gMikgLyogY29uZGl0aW9u cygxLzIpIHRydWUoMCkgKi8KKyAgICAgICAgeCA9IGMudiArIGE7Cit9CisKKy8qIGNvbmRp dGlvbmFsIGluIGRlc3RydWN0b3IgKi8KK3ZvaWQgbWNkYzAwNGEgKGludCBhKQoreworICAg IGNsYXNzIEMKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDIChpbnQg ZSkgOiB2IChlKSB7fQorICAgICAgICB+QyAoKSB7CisgICAgICAgICAgICBpZiAodikgLyog Y29uZGl0aW9ucygyLzIpICovCisgICAgICAgICAgICAgICAgeCA9IDIgKiB2OworICAgICAg ICB9CisgICAgICAgIGludCB2OworICAgIH07CisKKyAgICBDIGMgKGEpOworICAgIHggPSAx OyAvLyBhcmJpdHJhcnkgYWN0aW9uIGJldHdlZW4gY3RvcitkdG9yCit9CisKKy8qIGNvbmRp dGlvbmFsIGluIHRyeSAqLwordm9pZCBtY2RjMDA1YSAoaW50IGEpIHsKKyAgICB0cnkgewor ICAgICAgICBpZiAoYSkgLyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKyAgICAgICAg ICAgIHggPSAyICogaWRlbnRpdHkgKGEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB4 ID0gMTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgeCA9IDA7CisgICAgfQorfQor CisvKiBjb25kaXRpb25hbCBpbiBjYXRjaCAqLwordm9pZCBtY2RjMDA2YSAoaW50IGEpIHsK KyAgICB0cnkgeworICAgICAgICB0aHJvd3MgKGEpOworICAgIH0gY2F0Y2ggKHN0ZDo6ZXhj ZXB0aW9uJikgeworICAgICAgICBpZiAoYSkgLyogY29uZGl0aW9ucygxLzIpIGZhbHNlKDAp ICovCisgICAgICAgICAgICB4ID0gaWRlbnRpdHkgKGEpOworICAgICAgICBlbHNlCisgICAg ICAgICAgICB4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgbWNkYzAwNmIgKGludCBhKSB7Cisg ICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMoMS8yKSB0cnVlKDApICovCisgICAgICAgIHRocm93 cyAoYSk7CisgICAgZWxzZQorICAgICAgICB4ID0gMTsKK30KKwordm9pZCBtY2RjMDA2YyAo aW50IGEpIHRyeSB7CisgICAgdGhyb3dzIChhKTsKK30gY2F0Y2ggKC4uLikgeworICAgIGlm IChhKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICAgICAgeCA9IDU7Cit9CisKKy8qIHRl bXBvcmFyeSB3aXRoIGRlc3RydWN0b3IgYXMgdGVybSAqLwordm9pZCBtY2RjMDA3YSAoaW50 IGEsIGludCBiKSB7CisgICAgeCA9IGEgJiYgbm9udHJpdmlhbF9kZXN0cnVjdG9yIChiKTsg LyogY29uZGl0aW9ucygzLzQpIGZhbHNlKDEpIGRlc3RydWN0b3IoKSAqLworfQorCit2b2lk IG1jZGMwMDdiIChpbnQgYSwgaW50IGIpIHsKKyAgICBpZiAoYSB8fCB0aHJvd19pZiAoYikp IC8qIGNvbmRpdGlvbnMoMy80KSB0cnVlKDEpIGRlc3RydWN0b3IoKSAqLworICAgICAgICB4 ID0gLTE7CisgICAgZWxzZQorICAgICAgICB4ID0gMTsKK30KKwordm9pZCBtY2RjMDA3YyAo aW50IGEsIGludCBiKSB7CisgICAgaWYgKHRocm93X2lmIChhKSB8fCB0aHJvd19pZiAoYikp IC8qIGNvbmRpdGlvbnMoMi80KSB0cnVlKDAgMSkgZGVzdHJ1Y3RvcigpICovCisgICAgICAg IHggPSAtMTsKKyAgICBlbHNlCisgICAgICAgIHggPSAxOworfQorCisvKiBkZXN0cnVjdG9y IHdpdGggZGVsZXRlICovCit2b2lkIG1jZGMwMDhhIChpbnQgYSkgeworICAgIGNsYXNzIEMg eworICAgIHB1YmxpYzoKKyAgICAgICAgaW50IHNpemUgPSA1OworICAgICAgICBpbnQqIHB0 ciA9IG51bGxwdHI7CisKKyAgICAgICAgZXhwbGljaXQgQyAoaW50IHYpIDogc2l6ZSh2ICsg NSksIHB0ciAobmV3IGludFtzaXplXSkgLyogY29uZGl0aW9ucyhzdXBwcmVzcykgKi8KKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZv ciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAg ICAgICAgICAgICAgICBwdHJbaV0gPSBpICsgMTsKKyAgICAgICAgfQorICAgICAgICB+Qygp IHsKKyAgICAgICAgICAgIGlmIChwdHIpIC8qIGNvbmRpdGlvbnMoMS8yKSBmYWxzZSgwKSAq LworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7IC8qIGNvbmRpdGlvbnMoc3VwcHJlc3Mp ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uZGl0aW9ucyhlbmQpICov CisgICAgICAgIH0KKyAgICB9OworCisgICAgQyBjIChhKTsKKyAgICBpZiAoYy5wdHJbYSAr IDFdKSAvKiBjb25kaXRpb25zKDEvMikgZmFsc2UoMCkgKi8KKyAgICAgICAgeCA9IGE7Cit9 CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgICBtY2RjMDAxYSAoMCk7CisgICAgbWNkYzAw MWEgKDEpOworCisgICAgbWNkYzAwMmEgKDEsIDEpOworICAgIG1jZGMwMDJhICgxLCAyKTsK KworICAgIG1jZGMwMDNhICgxKTsKKworICAgIG1jZGMwMDRhICgwKTsKKyAgICBtY2RjMDA0 YSAoMSk7CisKKyAgICBtY2RjMDA1YSAoMCk7CisKKyAgICBtY2RjMDA2YSAoMSk7CisKKyAg ICBtY2RjMDA2YiAoMCk7CisKKyAgICBtY2RjMDA2YyAoMCk7CisgICAgbWNkYzAwNmMgKDEp OworCisgICAgbWNkYzAwN2EgKDAsIDApOworICAgIG1jZGMwMDdhICgxLCAxKTsKKworICAg IG1jZGMwMDdiICgwLCAwKTsKKyAgICBtY2RjMDA3YiAoMSwgMCk7CisKKyAgICBtY2RjMDA3 YyAoMCwgMCk7CisKKyAgICBtY2RjMDA4YSAoMSk7CisKK30KKworLyogeyBkZy1maW5hbCB7 IHJ1bi1nY292IGNvbmRpdGlvbnMgeyAtLWNvbmRpdGlvbnMgZ2Nvdi0xOC5DIH0gfSB9ICov CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMTkuYyBi L2djYy90ZXN0c3VpdGUvZ2NjLm1pc2MtdGVzdHMvZ2Nvdi0xOS5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi40YzRkMTNlMGYwYgotLS0gL2Rldi9udWxsCisr KyBiL2djYy90ZXN0c3VpdGUvZ2NjLm1pc2MtdGVzdHMvZ2Nvdi0xOS5jCkBAIC0wLDAgKzEs NzI2IEBACisvKiB7IGRnLW9wdGlvbnMgIi1mcHJvZmlsZS1hcmNzIC1mcHJvZmlsZS1jb25k aXRpb25zIC1mdGVzdC1jb3ZlcmFnZSIgfSAqLworLyogeyBkZy1kbyBydW4geyB0YXJnZXQg bmF0aXZlIH0gfSAqLworCisvKiBzb21lIHNpZGUgZWZmZWN0IHRvIHN0b3AgYnJhbmNoZXMg ZnJvbSBiZWluZyBwcnVuZWQgKi8KK2ludCB4ID0gMDsKKworLyogfHwgd29ya3MgKi8KK3Zv aWQgbWNkYzAwMWEgKGludCBhLCBpbnQgYikKK3sKKyAgICBpZiAoYSB8fCBiKSAvKiBjb25k aXRpb25zKDEvNCkgdHJ1ZSgwKSBmYWxzZSgwIDEpICovCisgICAgICAgICAgICAgICAgLyog Y29uZGl0aW9ucyhlbmQpICovCisgICAgICAgIHggPSAxOworICAgIGVsc2UKKyAgICAgICAg eCA9IDI7Cit9CisKK3ZvaWQgbWNkYzAwMWIgKGludCBhLCBpbnQgYikKK3sKKyAgICBpZiAo YSB8fCBiKSAvKiBjb25kaXRpb25zKDMvNCkgdHJ1ZSgwKSBmYWxzZSgpICovCisgICAgICAg ICAgICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisgICAgICAgIHggPSAxOworICAgIGVs c2UKKyAgICAgICAgeCA9IDI7Cit9CisKK3ZvaWQgbWNkYzAwMWMgKGludCBhLCBpbnQgYikK K3sKKyAgICBpZiAoYSB8fCBiKSAvKiBjb25kaXRpb25zKDQvNCkgKi8KKyAgICAgICAgeCA9 IDE7CisgICAgZWxzZQorICAgICAgICB4ID0gMjsKK30KKwordm9pZCBtY2RjMDAxZCAoaW50 IGEsIGludCBiLCBpbnQgYykKK3sKKyAgICBpZiAoYSB8fCBiIHx8IGMpIC8qIGNvbmRpdGlv bnMoMy82KSBmYWxzZSgxIDIpIHRydWUoMikgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8q IGNvbmRpdGlvbnMoZW5kKSAqLworICAgICAgICB4ID0gMTsKK30KKworLyogJiYgd29ya3Mg Ki8KK3ZvaWQgbWNkYzAwMmEgKGludCBhLCBpbnQgYikKK3sKKyAgICBpZiAoYSAmJiBiKSAv KiBjb25kaXRpb25zKDEvNCkgdHJ1ZSgwIDEpIGZhbHNlKDApICovCisgICAgICAgICAgICAg ICAgLyogY29uZGl0aW9ucyhlbmQpICovCisgICAgICAgIHggPSAxOworICAgIGVsc2UKKyAg ICAgICAgeCA9IDI7Cit9CisKK3ZvaWQgbWNkYzAwMmIgKGludCBhLCBpbnQgYikKK3sKKyAg ICBpZiAoYSAmJiBiKSAvKiBjb25kaXRpb25zKDMvNCkgZmFsc2UoMCkgKi8KKyAgICAgICAg ICAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKyAgICAgIHggPSAxOworICAgIGVsc2UK KyAgICAgIHggPSAyOworfQorCit2b2lkIG1jZGMwMDJjIChpbnQgYSwgaW50IGIpCit7Cisg ICAgaWYgKGEgJiYgYikgLyogY29uZGl0aW9ucyg0LzQpICovCisgICAgICB4ID0gMTsKKyAg ICBlbHNlCisgICAgICB4ID0gMjsKK30KKwordm9pZCBtY2RjMDAyZCAoaW50IGEsIGludCBi LCBpbnQgYykKK3sKKyAgICAvKgorICAgICAqIFRoaXMgaXMgYW4gb2RkIGNhc2UsIGFuZCBm YWxscyB2aWN0aW0gdG8gdHJ5aW5nIHRvIGRldGVjdCBuZXN0ZWQgaWZzLgorICAgICAqCisg ICAgICogaWYgKGEpIGlmIChiKSBpZiAoYykgd2l0aCBubyBlbHNlIGlzIGVxdWl2YWxlbnQg dG8gaWYgKGEgJiYgYiAmJiBjKSBhbmQKKyAgICAgKiB0aGUgQ0ZHcyBhcmUgaWRlbnRpY2Fs ICp1bmxlc3MqIHRoZSBlbHNlIG5vZGVzIGFyZSBnZW5lcmF0ZWQgdG9vLiBJbiB0aGUKKyAg ICAgKiAmJiBleHByZXNzaW9uLCBhbGwgZmFsc2UgZWRnZXMgc2hvdWxkIGdvIHRvIHRoZSBz YW1lIGVsc2UsIGJ1dCBpbiB0aGUKKyAgICAgKiBuZXN0ZWQtaWYgY2FzZSB0aGV5IGdvIHRv IGRpZmZlcmVudCBlbHNlcy4KKyAgICAgKgorICAgICAqIFRoaXMgY2FuIGJlIHN1cnByaXNp bmcsIGFuZCBiYWQgZm9yIE1DL0RDIGJlY2F1c2Ugbm9uLWluZGVwZW5kZW50CisgICAgICog Y29uZGl0aW9uYWxzIG1hc2tlZCBieSB0ZXJtcyBmdXJ0aGVyLXJpZ2h0IGNhbiBub3QgYmUg ZGV0ZWN0ZWQuIElmIGFuCisgICAgICogZWxzZSBub2RlIGlzIGdlbmVyYXRlZCwgdGhpcyBl eHByZXNzaW9uIGJlY29tZXMgYSAzLXRlcm0gZGVjaXNpb24gYWdhaW4uCisgICAgICovCisg ICAgaWYgKGEgJiYgYiAmJiBjKSAvKiBjb25kaXRpb25zKHN1cHByZXNzKSBjb25kaXRpb25z KDQvNikgZmFsc2UoMCAyKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogY29uZGl0aW9u cyhlbmQpICovCisgICAgICAgIHggPSAxOworfQorCisvKiBuZWdhdGlvbiB3b3JrcyAqLwor dm9pZCBtY2RjMDAzYSAoaW50IGEsIGludCBiKQoreworICAgIGlmICghYSB8fCAhYikgLyog Y29uZGl0aW9ucygyLzQpIGZhbHNlKDAgMSkgKi8KKyAgICAgICAgICAgICAgICAgIC8qIGNv bmRpdGlvbnMoZW5kKSAqLworICAgICAgeCA9IDE7CisgICAgZWxzZQorICAgICAgeCA9IDI7 Cit9CisKKy8qIHNpbmdsZSBjb25kaXRpb25hbHMgd2l0aCBhbmQgd2l0aG91dCBlbHNlICov Cit2b2lkIG1jZGMwMDRhIChpbnQgYSkKK3sKKyAgICBpZiAoYSkgLyogY29uZGl0aW9ucygx LzIpIHRydWUoMCkgKi8KKyAgICAgICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisgICAg ICB4ID0gMTsKKyAgICBlbHNlCisgICAgICB4ID0gMjsKK30KKwordm9pZCBtY2RjMDA0YiAo aW50IGEpCit7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgeCA9 IDE7CisgICAgZWxzZQorICAgICAgeCA9IDI7Cit9CisKK3ZvaWQgbWNkYzAwNGMgKGludCBh KQoreworICAgIGlmIChhKSAvKiBjb25kaXRpb25zKDEvMikgZmFsc2UoMCkgKi8KKyAgICAg ICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisgICAgICAgIHggPSAxOworfQorCit2b2lk IG1jZGMwMDRkIChpbnQgYSwgaW50IGIsIGludCBjKSB7CisgICAgaWYgKGEpICAvKiBjb25k aXRpb25zKDIvMikgKi8KKyAgICB7CisgICAgICAgIGlmIChiIHx8IGMpIC8qIGNvbmRpdGlv bnMoMS80KSB0cnVlKDEpIGZhbHNlKDAgMSkgKi8KKyAgICAgICAgICAgIHggPSBhICsgYiAr IGM7CisgICAgfQorfQorCisvKiBtaXhpbmcgJiYgYW5kIHx8IHdvcmtzICovCit2b2lkIG1j ZGMwMDVhIChpbnQgYSwgaW50IGIsIGludCBjKQoreworICAgIGlmICgoYSAmJiBiKSB8fCBj KSAvKiBjb25kaXRpb25zKDEvNikgdHJ1ZSgwIDEpIGZhbHNlKDAgMSAyKSAqLworICAgICAg ICAgICAgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKyAgICAgICAgeCA9IDE7 CisgICAgZWxzZQorICAgICAgICB4ID0gMjsKK30KKwordm9pZCBtY2RjMDA1YiAoaW50IGEs IGludCBiLCBpbnQgYywgaW50IGQpCit7CisgICAgaWYgKChhICYmIChiIHx8IGMpKSAmJiBk KSAvKiBjb25kaXRpb25zKDQvOCkgdHJ1ZSgxIDIgMykgZmFsc2UoMCkgKi8KKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworICAgICAgICB4 ID0gMTsKKyAgICBlbHNlCisgICAgICAgIHggPSAyOworfQorCisvKiBuZXN0ZWQgY29uZGl0 aW9uYWxzICovCit2b2lkIG1jZGMwMDZhIChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwg aW50IGUpCit7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKyAg ICAgICAgaWYgKGIgJiYgYykgLyogY29uZGl0aW9ucygzLzQpIGZhbHNlKDEpICovCisgICAg ICAgICAgICAgICAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworICAgICAgICAgICAgeCA9 IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggPSAyOworICAgIH0KKyAgICBlbHNl CisgICAgeworICAgICAgICBpZiAoYyB8fCBkKSAvKiBjb25kaXRpb25zKDIvNCkgdHJ1ZSgw IDEpICovCisgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKyAgICAgICAgICAg IHggPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgICB4ID0gNDsKKyAgICB9Cit9CisK K3ZvaWQgbWNkYzAwNmIgKGludCBhLCBpbnQgYiwgaW50IGMpCit7CisgICAgaWYgKGEpIC8q IGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKyAgICAgICAgaWYgKGIpIC8qY29uZGl0aW9u cygyLzIpICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjKSAvKiBjb25kaXRpb25z KDIvMikgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4ID0gYSArIGIgKyBj OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiBlbHNlL2lmICov Cit2b2lkIG1jZGMwMDdhIChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkKK3sKKyAgICBp ZiAoYSkgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworICAgICAgICBpZiAoYikgLyog Y29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKyAgICAgICAgICAgICAgIC8qIGNvbmRpdGlv bnMoZW5kKSAqLworICAgICAgICAgICAgeCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAg ICAgIHggPSAyOworICAgIH0KKyAgICBlbHNlIGlmIChjKSAvKiBjb25kaXRpb25zKDIvMikg Ki8KKyAgICB7CisgICAgICAgIGlmIChkKSAvKiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAq LworICAgICAgICAgICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisgICAgICAgICAgICB4 ID0gMzsKKyAgICB9Cit9CisKK3ZvaWQgbWNkYzAwN2IgKGludCBhLCBpbnQgYiwgaW50IGMp Cit7CisgICAgLyogc2ltaWxhciB0byBpZiAoYSB8fCBiIHx8IGMpIHggPSAxICovCisgICAg aWYgKGEpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgICBnb3RvIHRoZW47CisgICAg ZWxzZSBpZiAoYikgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgICAgIGdvdG8gdGhlbjsK KyAgICBlbHNlIGlmIChjKSAvKiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAqLworICAgICAg ICAgICAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworICAgICAgICBnb3RvIHRoZW47CisK KyAgICByZXR1cm47CisKK3RoZW46CisgICAgICAgIHggPSAxOworfQorCisvKiB3aGlsZSBs b29wICovCit2b2lkIG1jZGMwMDhhIChpbnQgYSkKK3sKKyAgICB3aGlsZSAoYSA8IDEwKSAv KiBjb25kaXRpb25zKDIvMikgKi8KKyAgICAgICAgeCA9IGErKzsKK30KKwordm9pZCBtY2Rj MDA4YiAoaW50IGEpCit7CisgICAgd2hpbGUgKGEgPiAxMCkgLyogY29uZGl0aW9ucygxLzIp IHRydWUoMCkgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8K KyAgICAgICAgeCA9IGEtLTsKK30KKwordm9pZCBtY2RjMDA4YyAoaW50IGEpCit7CisgICAg Ly8gc2hvdWxkIHdvcmssIGV2ZW4gd2l0aCBubyBib2R5CisgICAgd2hpbGUgKGEpIC8qIGNv bmRpdGlvbnMoMi8yKcKgKi8KKyAgICAgICAgYnJlYWs7Cit9CisKK3ZvaWQgbWNkYzAwOGQg KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKQoreworICAgIC8qIG11bHRpLXRlcm0gbG9v cCBjb25kaXRpb25hbCAqLworICAgIHdoaWxlICgoYSAmJiAoYiB8fCBjKSkgJiYgZCkgLyog Y29uZGl0aW9ucyg4LzgpICovCisgICAgICAgIGEgPSBiID0gYyA9IGQgPSAwOworfQorCit2 b2lkIG1jZGMwMDlhIChpbnQgYSwgaW50IGIpCit7CisgICAgd2hpbGUgKGEgPiAwICYmIGIg PiAwKSAvKiBjb25kaXRpb25zKDMvNCkgZmFsc2UoMSkgKi8KKyAgICAgICAgICAgICAgICAg ICAgICAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworICAgICAgICB4ID0gYS0tOworfQor CisvKiBmb3IgbG9vcCAqLwordm9pZCBtY2RjMDEwYShpbnQgYSwgaW50IGIpCit7CisgICAg Zm9yIChpbnQgaSA9IDA7IGkgPCBiOyBpKyspIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAg ICAgeworICAgICAgICBpZiAoYSA8IGIpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAg ICAgICAgeCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggPSBhICs9IDI7Cisg ICAgICB9Cit9CisKK2ludCBhbHdheXMgKGludCkgeyByZXR1cm4gMTsgfQorCisvKiBuby1j b25kaXRpb24gaW5maW5pdGUgbG9vcHMgKi8KK3ZvaWQgbWNkYzAxMGIgKGludCBhKQorewor ICAgIGZvciAoOzspCisgICAgeworICAgICAgICBpZiAoYWx3YXlzKGEpKSAvKiBjb25kaXRp b25zKDEvMikgZmFsc2UoMCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogY29uZGl0 aW9ucyhlbmQpICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHggPSBhOworICAgICAgICAg ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgeCArPSBhICsgMTsKKyAgICB9Cit9CisK Ky8qIGNvbmRpdGlvbmFscyB3aXRob3V0IGNvbnRyb2wgZmxvdyBjb25zdHJ1Y3RzIHdvcmsg Ki8KK3ZvaWQgbWNkYzAxMWEgKGludCBhLCBpbnQgYiwgaW50IGMpCit7CisgICAgeCA9IChh ICYmIGIpIHx8IGM7IC8qIGNvbmRpdGlvbnMoNS82KSBmYWxzZSgxKSAqLworICAgICAgICAg ICAgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KK30KKworLyogc2VxdWVudGlh bCBleHByZXNzaW9ucyBhcmUgaGFuZGxlZCBpbmRlcGVuZGVudGx5ICovCit2b2lkIG1jZGMw MTJhIChpbnQgYSwgaW50IGIsIGludCBjKSB7CisgICAgaWYgKGEgfHwgYikgLyogY29uZGl0 aW9ucygzLzQpIHRydWUoMCkgKi8KKyAgICAgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVu ZCkgKi8KKyAgICAgIHggPSAxOworICAgIGVsc2UKKyAgICAgIHggPSAyOworCisgICAgaWYg KGMpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgeCA9IDE7Cit9CisKKy8qCisgKiBj YW5ub3QgZXZlciBzYXRpc2Z5IE1DL0RDLCBldmVuIHdpdGggYWxsIGlucHV0IGNvbWJpbmF0 aW9ucywgYmVjYXVzZSBub3QgYWxsCisgKiB2YXJpYWJsZXMgaW5kZXBlbmRlbnRseSBhZmZl Y3QgdGhlIGRlY2lzaW9uCisgKi8KK3ZvaWQgbWNkYzAxM2EgKGludCBhLCBpbnQgLyogYiAq LywgaW50IGMpCit7CisgICAgLyoKKyAgICAgKiBTcGVjaWZpY2F0aW9uOiAoYSAmJiBiKSB8 fCBjCisgICAgICoKKyAgICAgKiBCdXQgdGhlIGV4cHJlc3Npb24gd2FzIGltcGxlbWVudGVk IHdyb25nLiBUaGlzIGhhcyBicmFuY2ggY292ZXJhZ2UsIGJ1dAorICAgICAqIG5vdCBNQy9E QworICAgICAqLworICAgIGlmICgoYSAmJiAhYykgfHwgYykgLyogY29uZGl0aW9ucyg1LzYp IGZhbHNlKDEpICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVu ZCkgKi8KKyAgICAgICAgeCA9IDE7CisgICAgZWxzZQorICAgICAgICB4ID0gMjsKK30KKwor dm9pZCBtY2RjMDE0YSAoKQoreworICAgIGludCBjb25kc1s2NF0gPSB7IDAgfTsKKyAgICAv KiBjb25kaXRpb25zKDY0LzEyOCkgdHJ1ZSgwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEy IDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMw IDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4 IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzKSAqLworICAg IHggPSBjb25kc1sgMF0gfHwgY29uZHNbIDFdIHx8IGNvbmRzWyAyXSB8fCBjb25kc1sgM10g fHwgY29uZHNbIDRdIHx8CisgICAgICAgIGNvbmRzWyA1XSB8fCBjb25kc1sgNl0gfHwgY29u ZHNbIDddIHx8IGNvbmRzWyA4XSB8fCBjb25kc1sgOV0gfHwKKyAgICAgICAgY29uZHNbMTBd IHx8IGNvbmRzWzExXSB8fCBjb25kc1sxMl0gfHwgY29uZHNbMTNdIHx8IGNvbmRzWzE0XSB8 fAorICAgICAgICBjb25kc1sxNV0gfHwgY29uZHNbMTZdIHx8IGNvbmRzWzE3XSB8fCBjb25k c1sxOF0gfHwgY29uZHNbMTldIHx8CisgICAgICAgIGNvbmRzWzIwXSB8fCBjb25kc1syMV0g fHwgY29uZHNbMjJdIHx8IGNvbmRzWzIzXSB8fCBjb25kc1syNF0gfHwKKyAgICAgICAgY29u ZHNbMjVdIHx8IGNvbmRzWzI2XSB8fCBjb25kc1syN10gfHwgY29uZHNbMjhdIHx8IGNvbmRz WzI5XSB8fAorICAgICAgICBjb25kc1szMF0gfHwgY29uZHNbMzFdIHx8IGNvbmRzWzMyXSB8 fCBjb25kc1szM10gfHwgY29uZHNbMzRdIHx8CisgICAgICAgIGNvbmRzWzM1XSB8fCBjb25k c1szNl0gfHwgY29uZHNbMzddIHx8IGNvbmRzWzM4XSB8fCBjb25kc1szOV0gfHwKKyAgICAg ICAgY29uZHNbNDBdIHx8IGNvbmRzWzQxXSB8fCBjb25kc1s0Ml0gfHwgY29uZHNbNDNdIHx8 IGNvbmRzWzQ0XSB8fAorICAgICAgICBjb25kc1s0NV0gfHwgY29uZHNbNDZdIHx8IGNvbmRz WzQ3XSB8fCBjb25kc1s0OF0gfHwgY29uZHNbNDldIHx8CisgICAgICAgIGNvbmRzWzUwXSB8 fCBjb25kc1s1MV0gfHwgY29uZHNbNTJdIHx8IGNvbmRzWzUzXSB8fCBjb25kc1s1NF0gfHwK KyAgICAgICAgY29uZHNbNTVdIHx8IGNvbmRzWzU2XSB8fCBjb25kc1s1N10gfHwgY29uZHNb NThdIHx8IGNvbmRzWzU5XSB8fAorICAgICAgICBjb25kc1s2MF0gfHwgY29uZHNbNjFdIHx8 IGNvbmRzWzYyXSB8fCBjb25kc1s2M10KKyAgICAgOyAgLyogY29uZGl0aW9ucyhlbmQpICov Cit9CisKKy8qIGVhcmx5IHJldHVybnMgKi8KK3ZvaWQgbWNkYzAxNWEgKGludCBhLCBpbnQg YikKK3sKKyAgICBpZiAoYSkgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgICAgIHJldHVy bjsKKworICAgIGlmIChiKSAvKiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAqLworICAgICAg ICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKyAgICAgICAgeCA9IDE7Cit9CisKK3ZvaWQg bWNkYzAxNWIgKGludCBhLCBpbnQgYikKK3sKKyAgICBmb3IgKGludCBpID0gNTsgaSA+IGE7 IGktLSkgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworICAgICAgICBpZiAoaSA9PSBi KSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg eCA9IGk7CisgICAgfQorfQorCit2b2lkIG1jZGMwMTVjIChpbnQgYSwgaW50IGIpCit7Cisg ICAgZm9yIChpbnQgaSA9IDU7IGkgPiBhOyBpLS0pIC8qIGNvbmRpdGlvbnMoMi8yKSAqLwor ICAgIHsKKyAgICAgICAgaWYgKGkgPT0gYikgLyogY29uZGl0aW9ucygyLzIpICovCisgICAg ICAgIHsKKyAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg ICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgeCA9IDE7CisgICAg ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB4ID0gaTsKKyAgICB9Cit9 CisKKworLyogY2hlY2sgbmVzdGVkIGxvb3BzICovCit2b2lkIG1jZGMwMTZhIChpbnQgYSwg aW50IGIpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhOyBpKyspIC8qIGNvbmRpdGlv bnMoMi8yKSAqLworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGI7IGsrKykgLyogY29u ZGl0aW9ucygyLzIpICovCisgICAgICAgICAgICB4ID0gaSArIGs7Cit9CisKK3ZvaWQgbWNk YzAxNmIgKGludCBhLCBpbnQgYikKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGE7IGkr KykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworICAgICAgICBpZiAoYSA+IDUpIC8q IGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZm9y IChpbnQgayA9IDA7IGsgPCBiOyBrKyspIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAg ICAgICAgeCA9IGkgKyBrOworICAgIH0KK30KKwordm9pZCBtY2RjMDE2YyAoaW50IGEsIGlu dCBiKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTsgaSsrKSAvKiBjb25kaXRpb25z KDIvMikgKi8KKyAgICB7CisgICAgICAgIGlmIChhID4gNSkgLyogY29uZGl0aW9ucygxLzIp IHRydWUoMCkgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8K KyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGI7 IGsrKykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgICAgICAgICB4ID0gaSArIGs7Cisg ICAgfQorfQorCit2b2lkIG1jZGMwMTZkIChpbnQgYSwgaW50IGIpCit7CisgICAgZm9yIChp bnQgaSA9IDA7IGkgPCBhOyBpKyspIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKyAg ICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyBrKyspIC8qIGNvbmRpdGlvbnMoMi8yKSAq LworICAgICAgICB7CisgICAgICAgICAgICBpZiAoYiA+IDUpIC8qIGNvbmRpdGlvbnMoMS8y KSB0cnVlKDApICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbmRpdGlvbnMoZW5k KSAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHggPSBpICsgazsK KyAgICAgICAgfQorCisgICAgfQorfQorCisvKiBkby13aGlsZSBsb29wcyAqLwordm9pZCBt Y2RjMDE3YSAoaW50IGEpCit7CisgICAgZG8geworICAgICAgICBhLS07CisgICAgfSB3aGls ZSAoYSA+IDApOyAvKiBjb25kaXRpb25zKDIvMikgKi8KK30KKwordm9pZCBub29wICgpIHt9 CisKK3ZvaWQgbWNkYzAxN2IgKGludCBhLCBpbnQgYikKK3sKKyAgICBkbyB7CisgICAgICAg IC8qCisgICAgICAgICAqIFRoaXMgY2FsbCBpcyBpbXBvcnRhbnQ7IGl0IGNhbiBhZGQgbW9y ZSBub2RlcyB0byB0aGUgYm9keSBpbiB0aGUKKyAgICAgICAgICogQ0ZHLCB3aGljaCBoYXMg Y2hhbmdlcyBob3cgY2xvc2UgZXhpdHMgYW5kIGJyZWFrcyBhcmUgdG8gdGhlIGxvb3AKKyAg ICAgICAgICogY29uZGl0aW9uYWwuCisgICAgICAgICAqLworICAgICAgICBub29wICgpOwor ICAgICAgICBhLS07CisgICAgICAgIGlmIChiKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAg ICAgICAgICAgIGJyZWFrOworCisgICAgfSB3aGlsZSAoYSA+IDApOyAvKiBjb25kaXRpb25z KDIvMikgKi8KK30KKwordm9pZCBtY2RjMDE3YyAoaW50IGEsIGludCBiKQoreworICAgIGlu dCBsZWZ0ID0gMDsKKyAgICBpbnQgcmlnaHQgPSAwOworICAgIGludCBuID0gYSArIGI7Cisg ICAgZG8geworICAgICAgICBpZiAoYSkgLyogY29uZGl0aW9ucygxLzIpIGZhbHNlKDApICov CisgICAgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKyAgICAgICAgeworICAg ICAgICAgICAgbGVmdCA9IGEgPiBsZWZ0ID8gYiA6IGxlZnQ7IC8qIGNvbmRpdGlvbnMoMi8y KSAqLworICAgICAgICB9CisgICAgICAgIGlmIChiKSAvKiBjb25kaXRpb25zKDEvMikgZmFs c2UoMCkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmlnaHQgPSBiID4gcmlnaHQgPyBh IDogcmlnaHQ7IC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgICB9CisgICAgfSB3aGls ZSAobi0tID4gMCk7IC8qIGNvbmRpdGlvbnMoMi8yKSAqLworfQorCitpbnQgaWQgIChpbnQg eCkgeyByZXR1cm4gIHg7IH0KK2ludCBpbnYgKGludCB4KSB7IHJldHVybiAheDsgfQorCisv KiBjb2xsZWN0aW9uIG9mIG9kZCBjYXNlcyBsaWZ0ZWQtYW5kLWFkYXB0ZWQgZnJvbSByZWFs LXdvcmxkIGNvZGUgKi8KK2ludCBtY2RjMDE4YSAoaW50IGEsIGludCBiLCBpbnQgYywgaW50 IGQsIGludCBlLCBpbnQgZiwgaW50IGcsIGludCBsZW4pCit7CisgICAgaW50IG47CisgICAg LyogYWRhcHRlZCBmcm9tIHpsaWIvZ3pfcmVhZCAqLworICAgIGRvCisgICAgeworICAgICAg ICBuID0gLTE7CisgICAgICAgIGlmIChuID4gbGVuKSAvKiBjb25kaXRpb25zKDIvMikgKi8K KyAgICAgICAgICAgIG4gPSBsZW47CisKKyAgICAgICAgaWYgKGIpIC8qIGNvbmRpdGlvbnMo Mi8yKSAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoYiA8IDUpIC8qIGNvbmRpdGlv bnMoMi8yKSAqLworICAgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgbm9vcCgp OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgJiYgZCkgLyogY29uZGl0aW9ucygz LzQpIGZhbHNlKDEpICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHggPSAyOworICAgICAg ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZSB8fCBmKSAvKiBj b25kaXRpb25zKDIvNCkgZmFsc2UoMCAxKSAqLworICAgICAgICAgICAgICAgICAgICAgICAg IC8qIGNvbmRpdGlvbnMoZW5kKSAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoaWQo ZykpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgICAgICAgICAgIHJldHVybiAwOwor ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChhLS0gPiAw KTsgLyogY29uZGl0aW9ucygyLzIpICovCisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBt Y2RjMDE4YiAoaW50IGEsIGludCBiLCBpbnQgYykgeworICAgIGludCBuOworICAgIHdoaWxl IChhKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICB7CisgICAgICAgIC8qCisgICAgICAg ICAqIGVsc2UgYmxvY2sgZG9lcyBub3QgbWFrZSBhIGRpZmZlcmVuY2UgZm9yIHRoZSBwcm9i bGVtLCBidXQgZW5zdXJlcworICAgICAgICAgKiBsb29wIHRlcm1pbmF0aW9uCisgICAgICAg ICAqLworICAgICAgICBpZiAoYikgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgICAgICAg ICBuID0gYyA/IDAgOiAwOyAvLyBkb2VzIG5vdCBzaG93IHVwIGluIENGRyAoZW1iZWRkZWQg aW4gdGhlIGJsb2NrKQorICAgICAgICBlbHNlCisgICAgICAgICAgICBuID0gMDsKKyAgICAg ICAgYSA9IG47CisgICAgfQorfQorCisvKiB0b28gbWFueSBjb25kaXRpb25zLCBjb3ZlcmFn ZSBnaXZlcyB1cCAqLwordm9pZCBtY2RjMDE5YSAoKSB7CisgICAgaW50IGNvbmRzWzY1XSA9 IHsgMCB9OworICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorICAgICNwcmFnbWEg R0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjb3ZlcmFnZS10b28tbWFueS1jb25kaXRpb25z IgorICAgIHggPSBjb25kc1sgMF0gfHwgY29uZHNbIDFdIHx8IGNvbmRzWyAyXSB8fCBjb25k c1sgM10gfHwgY29uZHNbIDRdIHx8CisgICAgICAgIGNvbmRzWyA1XSB8fCBjb25kc1sgNl0g fHwgY29uZHNbIDddIHx8IGNvbmRzWyA4XSB8fCBjb25kc1sgOV0gfHwKKyAgICAgICAgY29u ZHNbMTBdIHx8IGNvbmRzWzExXSB8fCBjb25kc1sxMl0gfHwgY29uZHNbMTNdIHx8IGNvbmRz WzE0XSB8fAorICAgICAgICBjb25kc1sxNV0gfHwgY29uZHNbMTZdIHx8IGNvbmRzWzE3XSB8 fCBjb25kc1sxOF0gfHwgY29uZHNbMTldIHx8CisgICAgICAgIGNvbmRzWzIwXSB8fCBjb25k c1syMV0gfHwgY29uZHNbMjJdIHx8IGNvbmRzWzIzXSB8fCBjb25kc1syNF0gfHwKKyAgICAg ICAgY29uZHNbMjVdIHx8IGNvbmRzWzI2XSB8fCBjb25kc1syN10gfHwgY29uZHNbMjhdIHx8 IGNvbmRzWzI5XSB8fAorICAgICAgICBjb25kc1szMF0gfHwgY29uZHNbMzFdIHx8IGNvbmRz WzMyXSB8fCBjb25kc1szM10gfHwgY29uZHNbMzRdIHx8CisgICAgICAgIGNvbmRzWzM1XSB8 fCBjb25kc1szNl0gfHwgY29uZHNbMzddIHx8IGNvbmRzWzM4XSB8fCBjb25kc1szOV0gfHwK KyAgICAgICAgY29uZHNbNDBdIHx8IGNvbmRzWzQxXSB8fCBjb25kc1s0Ml0gfHwgY29uZHNb NDNdIHx8IGNvbmRzWzQ0XSB8fAorICAgICAgICBjb25kc1s0NV0gfHwgY29uZHNbNDZdIHx8 IGNvbmRzWzQ3XSB8fCBjb25kc1s0OF0gfHwgY29uZHNbNDldIHx8CisgICAgICAgIGNvbmRz WzUwXSB8fCBjb25kc1s1MV0gfHwgY29uZHNbNTJdIHx8IGNvbmRzWzUzXSB8fCBjb25kc1s1 NF0gfHwKKyAgICAgICAgY29uZHNbNTVdIHx8IGNvbmRzWzU2XSB8fCBjb25kc1s1N10gfHwg Y29uZHNbNThdIHx8IGNvbmRzWzU5XSB8fAorICAgICAgICBjb25kc1s2MF0gfHwgY29uZHNb NjFdIHx8IGNvbmRzWzYyXSB8fCBjb25kc1s2M10gfHwgY29uZHNbNjRdCisgICAgOworICAg ICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCit9CisKKy8qIHRlcm5hcnkgKi8KK3ZvaWQg bWNkYzAyMGEgKGludCBhKQoreworICAgIC8vIHNwZWNpYWwgY2FzZSwgdGhpcyBjYW4gYmUg cmVkdWNlZCB0bzoKKyAgICAvLyBfMSA9IGFyZ2MgIT0gMDsKKyAgICAvLyBlID0gKGludCkg XzE7CisgICAgeCA9IGEgPyAxIDogMDsKKworICAgIC8vIGNoYW5naW5nIHRvIGRpZmZlcmVu dCBpbnQgbWFrZXMgYnJhbmNoCisgICAgeCA9IGEgPyAyIDogMTsgLyogY29uZGl0aW9ucygy LzIpICovCit9CisKK3ZvaWQgbWNkYzAyMGIgKGludCBhLCBpbnQgYikKK3sKKyAgICB4ID0g KGEgfHwgYikgPyAxIDogMDsgLyogY29uZGl0aW9ucygzLzQpIHRydWUoMSkgKi8KK30KKwor dm9pZCBtY2RjMDIwYyAoaW50IGEsIGludCBiKQoreworICAgIHggPSBhID8gMAorICAgICAg OiBiID8gMSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICAgIDogMjsgICAgLyogY29uZGl0 aW9ucygxLzIpIGZhbHNlKDApICovCisgICAgICAgICAgICAgIC8qIGNvbmRpdGlvbnMoZW5k KSAqLworfQorCisvKiB0ZXN0IHdpdGggZnVuY3Rpb25zIGFzIGNvbmRpdGlvbmFscyAqLwor CitpbnQgbWFpbiAoKQoreworICBtY2RjMDAxYSAoMCwgMSk7CisKKyAgbWNkYzAwMWIgKDAs IDEpOworICBtY2RjMDAxYiAoMCwgMCk7CisKKyAgbWNkYzAwMWMgKDAsIDEpOworICBtY2Rj MDAxYyAoMCwgMCk7CisgIG1jZGMwMDFjICgxLCAxKTsKKworICBtY2RjMDAxZCAoMSwgMSwg MSk7CisgIG1jZGMwMDFkICgwLCAxLCAwKTsKKworICBtY2RjMDAyYSAoMSwgMCk7CisKKyAg bWNkYzAwMmIgKDEsIDApOworICBtY2RjMDAyYiAoMSwgMSk7CisKKyAgbWNkYzAwMmMgKDAs IDApOworICBtY2RjMDAyYyAoMSwgMSk7CisgIG1jZGMwMDJjICgxLCAwKTsKKworICBtY2Rj MDAyZCAoMSwgMSwgMSk7CisgIG1jZGMwMDJkICgxLCAwLCAwKTsKKworICBtY2RjMDAzYSAo MCwgMCk7CisgIG1jZGMwMDNhICgxLCAwKTsKKworICBtY2RjMDA0YSAoMCk7CisgIG1jZGMw MDRiICgwKTsKKyAgbWNkYzAwNGIgKDEpOworICBtY2RjMDA0YyAoMSk7CisKKyAgbWNkYzAw NGQgKDAsIDAsIDApOworICBtY2RjMDA0ZCAoMSwgMSwgMSk7CisKKyAgbWNkYzAwNWEgKDEs IDAsIDEpOworCisgIG1jZGMwMDViICgxLCAxLCAwLCAwKTsKKyAgbWNkYzAwNWIgKDEsIDAs IDAsIDApOworCisgIG1jZGMwMDZhICgwLCAwLCAwLCAwLCAwKTsKKyAgbWNkYzAwNmEgKDEs IDAsIDAsIDAsIDApOworICBtY2RjMDA2YSAoMSwgMSwgMSwgMCwgMCk7CisKKyAgbWNkYzAw NmIgKDAsIDAsIDApOworICBtY2RjMDA2YiAoMSwgMCwgMCk7CisgIG1jZGMwMDZiICgxLCAx LCAwKTsKKyAgbWNkYzAwNmIgKDEsIDEsIDEpOworCisgIG1jZGMwMDdhICgwLCAwLCAwLCAw KTsKKyAgbWNkYzAwN2EgKDEsIDAsIDAsIDApOworICBtY2RjMDA3YSAoMCwgMCwgMSwgMCk7 CisKKyAgbWNkYzAwN2IgKDAsIDAsIDApOworICBtY2RjMDA3YiAoMCwgMSwgMSk7CisgIG1j ZGMwMDdiICgxLCAwLCAxKTsKKworICBtY2RjMDA4YSAoMCk7CisKKyAgbWNkYzAwOGIgKDAp OworCisgIG1jZGMwMDhjICgwKTsKKyAgbWNkYzAwOGMgKDEpOworCisgIG1jZGMwMDhkICgw LCAwLCAwLCAwKTsKKyAgbWNkYzAwOGQgKDEsIDAsIDAsIDApOworICBtY2RjMDA4ZCAoMSwg MCwgMSwgMCk7CisgIG1jZGMwMDhkICgxLCAwLCAxLCAxKTsKKyAgbWNkYzAwOGQgKDEsIDEs IDEsIDEpOworCisgIG1jZGMwMDlhICgwLCAwKTsKKyAgbWNkYzAwOWEgKDEsIDEpOworCisg IG1jZGMwMTBhICgwLCAwKTsKKyAgbWNkYzAxMGEgKDAsIDkpOworICBtY2RjMDEwYSAoMiwg MSk7CisKKyAgbWNkYzAxMGIgKDEpOworCisgIG1jZGMwMTFhICgwLCAwLCAwKTsKKyAgbWNk YzAxMWEgKDEsIDEsIDApOworICBtY2RjMDExYSAoMSwgMCwgMSk7CisKKyAgbWNkYzAxMmEg KDAsIDAsIDApOworICBtY2RjMDEyYSAoMCwgMSwgMSk7CisKKyAgbWNkYzAxM2EgKDAsIDAs IDApOworICBtY2RjMDEzYSAoMCwgMCwgMSk7CisgIG1jZGMwMTNhICgwLCAxLCAwKTsKKyAg bWNkYzAxM2EgKDAsIDEsIDEpOworICBtY2RjMDEzYSAoMSwgMCwgMCk7CisgIG1jZGMwMTNh ICgxLCAwLCAxKTsKKyAgbWNkYzAxM2EgKDEsIDEsIDApOworICBtY2RjMDEzYSAoMSwgMSwg MSk7CisKKyAgbWNkYzAxNGEgKCk7CisKKyAgbWNkYzAxNWEgKDAsIDApOworICBtY2RjMDE1 YSAoMSwgMCk7CisKKyAgbWNkYzAxNWIgKDAsIDApOworICBtY2RjMDE1YiAoMCwgMSk7Cisg IG1jZGMwMTViICg2LCAxKTsKKworICBtY2RjMDE1YyAoMCwgMCk7CisgIG1jZGMwMTVjICgw LCA1KTsKKyAgbWNkYzAxNWMgKDYsIDEpOworCisgIG1jZGMwMTZhICg1LCA1KTsKKworICBt Y2RjMDE2YiAoNSwgNSk7CisgIG1jZGMwMTZiICg2LCA1KTsKKworICBtY2RjMDE2YyAoNSwg NSk7CisKKyAgbWNkYzAxNmQgKDEsIDApOworCisgIG1jZGMwMTdhICgwKTsKKyAgbWNkYzAx N2EgKDIpOworCisgIG1jZGMwMTdiICgyLCAwKTsKKyAgbWNkYzAxN2IgKDAsIDEpOworCisg IG1jZGMwMTdjICgxLCAxKTsKKworICBtY2RjMDE4YSAoMCwgMCwgMSwgMSwgMCwgMCwgMCwg MCk7CisgIG1jZGMwMThhICgwLCAxLCAwLCAwLCAwLCAwLCAxLCAtMik7CisgIG1jZGMwMThh ICgwLCA2LCAwLCAwLCAwLCAwLCAxLCAtMik7CisgIG1jZGMwMThhICgwLCA2LCAwLCAwLCAw LCAwLCAxLCAtMik7CisgIG1jZGMwMThhICgwLCAwLCAwLCAxLCAwLCAxLCAxLCAwKTsKKyAg bWNkYzAxOGEgKDEsIDAsIDAsIDAsIDEsIDEsIDAsIDApOworCisgIG1jZGMwMThiICgxLCAw LCAwKTsKKyAgbWNkYzAxOGIgKDEsIDEsIDApOworCisgIG1jZGMwMTlhICgpOworCisgIG1j ZGMwMjBhICgwKTsKKyAgbWNkYzAyMGEgKDEpOworCisgIG1jZGMwMjBiICgwLCAwKTsKKyAg bWNkYzAyMGIgKDEsIDApOworCisgIG1jZGMwMjBjICgwLCAxKTsKKyAgbWNkYzAyMGMgKDEs IDEpOworfQorCisvKiB7IGRnLWZpbmFsIHsgcnVuLWdjb3YgY29uZGl0aW9ucyB7IC0tY29u ZGl0aW9ucyBnY292LTE5LmMgfSB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUv bGliL2djb3YuZXhwIGIvZ2NjL3Rlc3RzdWl0ZS9saWIvZ2Nvdi5leHAKaW5kZXggOWQ1YjJj ZGI4NmIuLjg4ZjI4ZDI2YmI2IDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2xpYi9nY292 LmV4cAorKysgYi9nY2MvdGVzdHN1aXRlL2xpYi9nY292LmV4cApAQCAtMTc0LDYgKzE3NCwx ODAgQEAgcHJvYyB2ZXJpZnktYnJhbmNoZXMgeyB0ZXN0bmFtZSB0ZXN0Y2FzZSBmaWxlIH0g ewogICAgIHJldHVybiAkZmFpbGVkCiB9CiAKKyMKKyMgdmVyaWZ5LWNvbmRpdGlvbnMgLS0g Y2hlY2sgdGhhdCBjb25kaXRpb25zIGFyZSBjaGVja2VkIGFzIGV4cGVjdGVkCisjCisjIFRF U1ROQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0LCBpbmNsdWRpbmcgdW5pcXVlIGZsYWdz LgorIyBURVNUQ0FTRSBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaWxlLgorIyBGSUxFIGlz IHRoZSBuYW1lIG9mIHRoZSBnY292IG91dHB1dCBmaWxlLgorIworIyBDaGVja3MgYXJlIGJh c2VkIG9uIGNvbW1lbnRzIGluIHRoZSBzb3VyY2UgZmlsZS4gQ29uZGl0aW9uIGNvdmVyYWdl IGNvbWVzCisjIHdpdGggd2l0aCB0d28gdHlwZXMgb2Ygb3V0cHV0LCBhIHN1bW1hcnkgYW5k IGEgbGlzdCBvZiB0aGUgdW5jb3ZlcmVkCisjIGNvbmRpdGlvbnMuIEJvdGggbXVzdCBiZSBj aGVja2VkIHRvIHBhc3MgdGhlIHRlc3QKKyMKKyMgVG8gY2hlY2sgZm9yIGNvbmRpdGlvbnMs IGFkZCBhIGNvbW1lbnQgdGhlIGxpbmUgb2YgYSBjb25kaXRpb25hbDoKKyMgLyogY29uZGl0 aW9ucyhuL20pIHRydWUoMCAxKSBmYWxzZSgxKSAqLworIworIyB3aGVyZSBuL20gYXJlIHRo ZSBjb3ZlcmVkIGFuZCB0b3RhbCBjb25kaXRpb25zIGluIHRoZSBleHByZXNzaW9uLiBUaGUg dHJ1ZSgpCisjIGFuZCBmYWxzZSgpIHRha2UgdGhlIGluZGljZXMgZXhwZWN0ZWQgKm5vdCog Y292ZXJlZC4KKyMKKyMgVGhpcyBtZWFucyB0aGF0IGFsbCBjb3ZlcmFnZSBzdGF0ZW1lbnRz IHNob3VsZCBoYXZlIGJlZW4gc2VlbjoKKyMgLyogY29uZGl0aW9ucyhlbmQpICovCisjCisj IElmIGFsbCBjb25kaXRpb25zIGFyZSBjb3ZlcmVkIGkuZS4gbiA9PSBtLCB0aGVuIGNvbmRp dGlvbnMoZW5kKSBjYW4gYmUKKyMgb21pdHRlZC4gSWYgZWl0aGVyIHRydWUoKSBvciBmYWxz ZSgpIGFyZSBlbXB0eSB0aGV5IGNhbiBiZSBvbWl0dGVkIHRvby4KKyMKKyMgQysrIGNhbiBp bnNlcnQgY29uZGl0aW9uYWxzIGluIHRoZSBDRkcgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4g c291cmNlIGNvZGUuCisjIFRoZXNlIG11c3QgYmUgbWFudWFsbHkgc3VwcHJlc3NlZCBzaW5j ZSB1bmV4cGVjdGVkIGFuZCB1bmhhbmRsZWQgY29uZGl0aW9ucworIyBhcmUgYW4gZXJyb3Ig KHRvIGhlbHAgY29tYmF0IHJlZ3Jlc3Npb25zKS4gT3V0cHV0IGNhbiBiZSBzdXBwcmVzc2Vk IHdpdGgKKyMgY29uZGl0aW9ucyhzdXBwcmVzcykgYW5kIGNvbmRpdGlvbnMoZW5kKS4gc3Vw cHJlc3Mgc2hvdWxkIHVzdWFsbHkgYmUgb24gYQorIyBjbG9zaW5nIGJyYWNlLgorIworIyBT b21lIGV4cHJlc3Npb25zLCB3aGVuIHVzaW5nIHVubmFtZWQgdGVtcG9yYXJpZXMgYXMgb3Bl cmFuZHMsIHdpbGwgaGF2ZQorIyBkZXN0cnVjdG9ycyBpbiBleHByZXNzaW9ucy4gVGhlIGNv dmVyYWdlIG9mIHRoZSBkZXN0cnVjdG9yIHdpbGwgYmUgcmVwb3J0ZWQKKyMgb24gdGhlIHNh bWUgbGluZSBhcyB0aGUgZXhwcmVzc2lvbiBpdHNlbGYsIGJ1dCBzdXBwcmVzcygpIHdvdWxk IGFsc28gc3dhbGxvdworIyB0aGUgZXhwZWN0ZWQgdGVzdGVkLWZvciBtZXNzYWdlcy4gVG8g aGFuZGxlIHRoZXNlLCB1c2UgdGhlIGRlc3RydWN0b3IoKSBbMV0KKyMgd2hpY2ggd2lsbCBz dXBwcmVzcyBldmVyeXRoaW5nIGZyb20gYW5kIGluY2x1ZGluZyB0aGUgc2Vjb25kICJjb25k aXRpb25zCisjIGNvdmVyZWQiLgorIworIyBbMV0gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhl IGRlc3RydWN0b3IoKSBpcyAqb24gdGhlIHNhbWUgbGluZSogYXMgdGhlCisjICAgICBjb25k aXRpb25zKG0vbikKK3Byb2MgdmVyaWZ5LWNvbmRpdGlvbnMgeyB0ZXN0bmFtZSB0ZXN0Y2Fz ZSBmaWxlIH0geworICAgIHNldCBmYWlsZWQgMAorICAgIHNldCBzdXBwcmVzcyAwCisgICAg c2V0IGRlc3RydWN0b3IgMAorICAgIHNldCBzaG91bGR0ICIiCisgICAgc2V0IHNob3VsZGYg IiIKKyAgICBzZXQgc2hvdWxkYWxsICIiCisgICAgc2V0IGZkIFtvcGVuICRmaWxlIHJdCisg ICAgc2V0IG4gMAorICAgIHNldCBrZXl3b3JkcyB7ImVuZCIgInN1cHByZXNzIn0KKyAgICB3 aGlsZSB7W2dldHMgJGZkIGxpbmVdID49IDB9IHsKKyAgICAgICAgcmVnZXhwICJeXFteOlxd KzogKihcWzAtOVxdKyk6IiAiJGxpbmUiIGFsbCBuCisgICAgICAgIHNldCBwcmVmaXggIiR0 ZXN0bmFtZSBsaW5lICRuIgorCisgICAgICAgIGlmIHshW3JlZ2V4cCAiY29uZGl0aW9uIiAk bGluZV19IHsKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIH0KKworICAgICAgICAj IE1pc3NpbmcgY292ZXJhZ2UgZm9yIGJvdGggdHJ1ZSBhbmQgZmFsc2Ugd2lsbCBjYXVzZSBh IGZhaWx1cmUsIGJ1dAorICAgICAgICAjIG9ubHkgY291bnQgaXQgb25jZSBmb3IgdGhlIHJl cG9ydC4KKyAgICAgICAgc2V0IG9rIDEKKyAgICAgICAgaWYgW3JlZ2V4cCB7Y29uZGl0aW9u cyAqXCgoWzAtOWEtei9dKylcKX0gIiRsaW5lIiBhbGwgZV0geworICAgICAgICAgICAgIyAq VmVyeSogY29hcnNlIHNhbml0eSBjaGVjazogY29uZGl0aW9ucygpIHNob3VsZCBlaXRoZXIg YmUgYQorICAgICAgICAgICAgIyBrZXl3b3JkIG9yIG4vbSwgYW55dGhpbmcgZWxzZSBtZWFu cyBhIGJ1Z2d5IHRlc3QgY2FzZS4gZW5kIGlzCisgICAgICAgICAgICAjIG9wdGlvbmFsIGZv ciBjYXNlcyB3aGVyZSBhbGwgY29uZGl0aW9ucyBhcmUgY292ZXJlZCwgc2luY2UgaXQKKyAg ICAgICAgICAgICMgb25seSBleHBlY3RzIGEgc2luZ2xlIGxpbmUgb2Ygb3V0cHV0LgorICAg ICAgICAgICAgaWYgeyhbbHNlYXJjaCAtZXhhY3QgJGtleXdvcmRzICRlXSA+PSAwIHx8IFty ZWdleHAge1xkKy9cZCt9ICIkZSJdKSA9PSAwfSB7CisgICAgICAgICAgICAgICAgZmFpbCAi JHByZWZpeDogZXhwZWN0ZWQgY29uZGl0aW9ucyAobi9tKSwgKHN1cHByZXNzKSBvciAoZW5k KTsgd2FzICgkZSkiCisgICAgICAgICAgICAgICAgaW5jciBmYWlsZWQKKyAgICAgICAgICAg ICAgICBjb250aW51ZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjIEFueSBrZXl3 b3JkIG1lYW5zIGEgbmV3IGNvbnRleHQuIFNldCB0aGUgZXJyb3IgZmxhZyBpZiBub3QgYWxs CisgICAgICAgICAgICAjIGV4cGVjdGVkIG91dHB1dCBoYXMgYmVlbiBzZWVuLCBhbmQgcmVz ZXQgdGhlIHN0YXRlLgorCisgICAgICAgICAgICBpZiB7W2xsZW5ndGggJHNob3VsZHRdICE9 IDB9IHsKKyAgICAgICAgICAgICAgICBmYWlsICIkcHJlZml4OiBleHBlY3RlZCB1bmNvdmVy ZWQgKHRydWUpIGZvciB0ZXJtcyAkc2hvdWxkdCIKKyAgICAgICAgICAgICAgICBzZXQgb2sg MAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiB7W2xsZW5ndGggJHNob3VsZGZd ICE9IDB9IHsKKyAgICAgICAgICAgICAgICBmYWlsICIkcHJlZml4OiBleHBlY3RlZCB1bmNv dmVyZWQgKGZhbHNlKSBmb3IgdGVybXMgJHNob3VsZGYiCisgICAgICAgICAgICAgICAgc2V0 IG9rIDAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgeyRzaG91bGRhbGwgbmUg IiJ9IHsKKyAgICAgICAgICAgICAgICBmYWlsICIkcHJlZml4OiBjb3ZlcmFnZSBzdW1tYXJ5 IG5vdCBmb3VuZDsgZXhwZWN0ZWQgJHNob3VsZGFsbCIKKyAgICAgICAgICAgICAgICBzZXQg b2sgMAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQgc3VwcHJlc3MgMAorICAg ICAgICAgICAgc2V0IGRlc3RydWN0b3IgMAorICAgICAgICAgICAgc2V0IHNob3VsZHQgIiIK KyAgICAgICAgICAgIHNldCBzaG91bGRmICIiCisgICAgICAgICAgICBzZXQgc2hvdWxkYWxs ICIiCisgICAgICAgICAgICBzZXQgbmV3dCAiIgorICAgICAgICAgICAgc2V0IG5ld2YgIiIK KworICAgICAgICAgICAgaWYgW3JlZ2V4cCB7ZGVzdHJ1Y3RvclwoXCl9ICIkbGluZSJdIHsK KyAgICAgICAgICAgICAgICBzZXQgZGVzdHJ1Y3RvciAxCisgICAgICAgICAgICB9CisKKyAg ICAgICAgICAgIGlmIFtyZWdleHAgeyhcZCspLyhcZCspfSAiJGUiIGFsbCBpIGtdIHsKKyAg ICAgICAgICAgICAgICByZWdleHAge3RydWVcKChbMC05IF0rKVwpfSAgIiRsaW5lIiBhbGwg bmV3dAorICAgICAgICAgICAgICAgIHJlZ2V4cCB7ZmFsc2VcKChbMC05IF0rKVwpfSAiJGxp bmUiIGFsbCBuZXdmCisKKyAgICAgICAgICAgICAgICAjIFNhbml0eSBjaGVjayAtIGlmIHRo ZSB0cnVlKCkgYW5kIGZhbHNlKCkgdmVjdG9ycyBzaG91bGQgaGF2ZQorICAgICAgICAgICAg ICAgICMgbS1uIGVsZW1lbnRzIHRvIGNvdmVyIGFsbCB1bmNvdmVyZWQgY29uZGl0aW9ucy4g QmVjYXVzZSBvZgorICAgICAgICAgICAgICAgICMgbWFza2luZyBpdCBjYW4gc29tZXRpbWVz IGJlIHN1cnByaXNpbmcgd2hhdCB0ZXJtcyBhcmUKKyAgICAgICAgICAgICAgICAjIGluZGVw ZW5kZW50LCBzbyB0aGlzIG1ha2VzIGZvciBtb3JlIHJvYnVzdCB0ZXN0IGF0IHRoZSBjb3N0 CisgICAgICAgICAgICAgICAgIyBvZiBiZWluZyBzbGlnaHRseSBtb3JlIGFubm95aW5nIHRv IHdyaXRlLgorICAgICAgICAgICAgICAgIHNldCBudGVybXMgW2V4cHIgW2xsZW5ndGggJG5l d3RdICsgW2xsZW5ndGggJG5ld2ZdXQorICAgICAgICAgICAgICAgIHNldCBuZXhwZWN0ZWQg W2V4cHIgeyRrIC0gJGl9XQorICAgICAgICAgICAgICAgIGlmIHskbnRlcm1zICE9ICRuZXhw ZWN0ZWR9IHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCAiJHByZWZpeDogZXhwZWN0ZWQg JG5leHBlY3RlZCB1bmNvdmVyZWQgdGVybXM7IGdvdCAkbnRlcm1zIgorICAgICAgICAgICAg ICAgICAgICBzZXQgb2sgMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBz ZXQgc2hvdWxkYWxsICRlCisgICAgICAgICAgICAgICAgc2V0IHNob3VsZHQgJG5ld3QKKyAg ICAgICAgICAgICAgICBzZXQgc2hvdWxkZiAkbmV3ZgorICAgICAgICAgICAgfSBlbHNlaWYg eyRlID09ICJlbmQifSB7CisgICAgICAgICAgICAgICAgIyBuby1vcCAtIHN0YXRlIGhhcyBh bHJlYWR5IGJlZW4gcmVzZXQsIGFuZCBlcnJvcnMgZmxhZ2dlZAorICAgICAgICAgICAgfSBl bHNlaWYgeyRlID09ICJzdXBwcmVzcyJ9IHsKKyAgICAgICAgICAgICAgICBzZXQgc3VwcHJl c3MgMQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIHRoaXMgc2hv dWxkIGJlIHVucmVhY2hhYmxlLCAKKyAgICAgICAgICAgICAgICBmYWlsICIkcHJlZml4OiB1 bmhhbmRsZWQgY29udHJvbCAoJGUpLCBzaG91bGQgYmUgdW5yZWFjaGFibGUiCisgICAgICAg ICAgICAgICAgc2V0IG9rIDAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlaWYgeyRz dXBwcmVzcyA9PSAxfSB7CisgICAgICAgICAgICAjIGlnbm9yZSBldmVyeXRoaW5nIGluIGEg c3VwcHJlc3MgYmxvY2suIEMrKyBlc3BlY2lhbGx5IGNhbiBpbnNlcnQKKyAgICAgICAgICAg ICMgY29uZGl0aW9uYWxzIGluIGV4Y2VwdGlvbnMgYW5kIGRlc3RydWN0b3JzIHdoaWNoIHdv dWxkIG90aGVyd2lzZQorICAgICAgICAgICAgIyBiZSBjb25zaWRlcmVkIHVuaGFuZGxlZC4K KyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIH0gZWxzZWlmIFtyZWdleHAge2NvbmRp dGlvbiArKFxkKykgbm90IGNvdmVyZWQgXCh0cnVlXCl9ICIkbGluZSIgYWxsIGNvbmRdIHsK KyAgICAgICAgICAgIHNldCBpIFtsc2VhcmNoICRzaG91bGR0ICRjb25kXQorICAgICAgICAg ICAgaWYgeyRpICE9IC0xfSB7CisgICAgICAgICAgICAgICAgc2V0IHNob3VsZHQgW2xyZXBs YWNlICRzaG91bGR0ICRpICRpXQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg ICAgICBmYWlsICIkdGVzdG5hbWUgbGluZSAkbjogdW5leHBlY3RlZCB1bmNvdmVyZWQgdGVy bSAkY29uZCAodHJ1ZSkiCisgICAgICAgICAgICAgICAgc2V0IG9rIDAKKyAgICAgICAgICAg IH0KKyAgICAgICAgfSBlbHNlaWYgW3JlZ2V4cCB7Y29uZGl0aW9uICsoXGQrKSBub3QgY292 ZXJlZCBcKGZhbHNlXCl9ICIkbGluZSIgYWxsIGNvbmRdIHsKKyAgICAgICAgICAgIHNldCBp IFtsc2VhcmNoICRzaG91bGRmICRjb25kXQorICAgICAgICAgICAgaWYgeyRpICE9IC0xfSB7 CisgICAgICAgICAgICAgICAgc2V0IHNob3VsZGYgW2xyZXBsYWNlICRzaG91bGRmICRpICRp XQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsICIkdGVzdG5h bWUgbGluZSAkbjogdW5leHBlY3RlZCB1bmNvdmVyZWQgdGVybSAkY29uZCAoZmFsc2UpIgor ICAgICAgICAgICAgICAgIHNldCBvayAwCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz ZWlmIFtyZWdleHAge2NvbmRpdGlvbnMgY292ZXJlZCAoXGQrL1xkKyl9ICIkbGluZSIgYWxs IGNvbmRdIHsKKyAgICAgICAgICAgICMgdGhlIGRlc3RydWN0b3ItZ2VuZXJhdGVkICJjb25k aXRpb25zIGNvdmVyZWQiIGxpbmVzIHdpbGwgYmUKKyAgICAgICAgICAgICMgd3JpdHRlbiBh ZnRlciBhbGwgZXhwcmVzc2lvbi1yZWxhdGVkIG91dHB1dC4gSGFuZGxlIHRoZXNlIGJ5Cisg ICAgICAgICAgICAjIHR1cm5pbmcgb24gc3VwcHJlc3Npb24gaWYgdGhlIGRlc3RydWN0b3It c3VwcHJlc3Npb24gaXMKKyAgICAgICAgICAgICMgcmVxdWVzdGVkLgorICAgICAgICAgICAg aWYgeyRzaG91bGRhbGwgPT0gIiIgJiYgJGRlc3RydWN0b3IgPT0gMX0geworICAgICAgICAg ICAgICAgIHNldCBzdXBwcmVzcyAxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAg ICAgICAgIH0KKworICAgICAgICAgICAgaWYgeyRjb25kID09ICRzaG91bGRhbGx9IHsKKyAg ICAgICAgICAgICAgICBzZXQgc2hvdWxkYWxsICIiCisgICAgICAgICAgICB9IGVsc2Ugewor ICAgICAgICAgICAgICAgIGZhaWwgIiR0ZXN0bmFtZSBsaW5lICRuOiB1bmV4cGVjdGVkIHN1 bW1hcnkgJGNvbmQiCisgICAgICAgICAgICAgICAgc2V0IG9rIDAKKyAgICAgICAgICAgIH0K KyAgICAgICAgfQorCisgICAgICAgIGlmIHskb2sgIT0gMX0geworICAgICAgICAgICAgaW5j ciBmYWlsZWQKKyAgICAgICAgfQorICAgIH0KKyAgICBjbG9zZSAkZmQKKyAgICByZXR1cm4g JGZhaWxlZAorfQorCiAjCiAjIHZlcmlmeS1jYWxscyAtLSBjaGVjayB0aGF0IGNhbGwgcmV0 dXJuIHBlcmNlbnRhZ2VzIGFyZSBhcyBleHBlY3RlZAogIwpAQCAtMzIxLDYgKzQ5NSw3IEBA IHByb2MgcnVuLWdjb3YgeyBhcmdzIH0gewogICAgIHNldCBnY292X2FyZ3MgIiIKICAgICBz ZXQgZ2Nvdl92ZXJpZnlfY2FsbHMgMAogICAgIHNldCBnY292X3ZlcmlmeV9icmFuY2hlcyAw CisgICAgc2V0IGdjb3ZfdmVyaWZ5X2NvbmRpdGlvbnMgMAogICAgIHNldCBnY292X3Zlcmlm eV9saW5lcyAxCiAgICAgc2V0IGdjb3ZfdmVyaWZ5X2ludGVybWVkaWF0ZSAwCiAgICAgc2V0 IGdjb3ZfcmVtb3ZlX2djZGEgMApAQCAtMzMxLDEwICs1MDYsMTMgQEAgcHJvYyBydW4tZ2Nv diB7IGFyZ3MgfSB7CiAJICBzZXQgZ2Nvdl92ZXJpZnlfY2FsbHMgMQogCX0gZWxzZWlmIHsg JGEgPT0gImJyYW5jaGVzIiB9IHsKIAkgIHNldCBnY292X3ZlcmlmeV9icmFuY2hlcyAxCisJ fSBlbHNlaWYgeyAkYSA9PSAiY29uZGl0aW9ucyIgfSB7CisJICBzZXQgZ2Nvdl92ZXJpZnlf Y29uZGl0aW9ucyAxCiAJfSBlbHNlaWYgeyAkYSA9PSAiaW50ZXJtZWRpYXRlIiB9IHsKIAkg IHNldCBnY292X3ZlcmlmeV9pbnRlcm1lZGlhdGUgMQogCSAgc2V0IGdjb3ZfdmVyaWZ5X2Nh bGxzIDAKIAkgIHNldCBnY292X3ZlcmlmeV9icmFuY2hlcyAwCisJICBzZXQgZ2Nvdl92ZXJp ZnlfY29uZGl0aW9ucyAwCiAJICBzZXQgZ2Nvdl92ZXJpZnlfbGluZXMgMAogCX0gZWxzZWlm IHsgJGEgPT0gInJlbW92ZS1nY2RhIiB9IHsKIAkgIHNldCBnY292X3JlbW92ZV9nY2RhIDEK QEAgLTQwNCw2ICs1ODIsMTEgQEAgcHJvYyBydW4tZ2NvdiB7IGFyZ3MgfSB7CiAgICAgfSBl bHNlIHsKIAlzZXQgYmZhaWxlZCAwCiAgICAgfQorICAgIGlmIHsgJGdjb3ZfdmVyaWZ5X2Nv bmRpdGlvbnMgfSB7CisJc2V0IGNkZmFpbGVkIFt2ZXJpZnktY29uZGl0aW9ucyAkdGVzdG5h bWUgJHRlc3RjYXNlICR0ZXN0Y2FzZS5nY292XQorICAgIH0gZWxzZSB7CisJc2V0IGNkZmFp bGVkIDAKKyAgICB9CiAgICAgaWYgeyAkZ2Nvdl92ZXJpZnlfY2FsbHMgfSB7CiAJc2V0IGNm YWlsZWQgW3ZlcmlmeS1jYWxscyAkdGVzdG5hbWUgJHRlc3RjYXNlICR0ZXN0Y2FzZS5nY292 XQogICAgIH0gZWxzZSB7CkBAIC00MTgsMTIgKzYwMSwxMiBAQCBwcm9jIHJ1bi1nY292IHsg YXJncyB9IHsKIAogICAgICMgUmVwb3J0IHdoZXRoZXIgdGhlIGdjb3YgdGVzdCBwYXNzZWQg b3IgZmFpbGVkLiAgSWYgdGhlcmUgd2VyZQogICAgICMgbXVsdGlwbGUgZmFpbHVyZXMgdGhl biB0aGUgbWVzc2FnZSBpcyBhIHN1bW1hcnkuCi0gICAgc2V0IHRmYWlsZWQgW2V4cHIgJGxm YWlsZWQgKyAkYmZhaWxlZCArICRjZmFpbGVkICsgJGlmYWlsZWRdCisgICAgc2V0IHRmYWls ZWQgW2V4cHIgJGxmYWlsZWQgKyAkYmZhaWxlZCArICRjZGZhaWxlZCArICRjZmFpbGVkICsg JGlmYWlsZWRdCiAgICAgaWYgeyAkeGZhaWxlZCB9IHsKIAlzZXR1cF94ZmFpbCAiKi0qLSoi CiAgICAgfQogICAgIGlmIHsgJHRmYWlsZWQgPiAwIH0gewotCWZhaWwgIiR0ZXN0bmFtZSBn Y292OiAkbGZhaWxlZCBmYWlsdXJlcyBpbiBsaW5lIGNvdW50cywgJGJmYWlsZWQgaW4gYnJh bmNoIHBlcmNlbnRhZ2VzLCAkY2ZhaWxlZCBpbiByZXR1cm4gcGVyY2VudGFnZXMsICRpZmFp bGVkIGluIGludGVybWVkaWF0ZSBmb3JtYXQiCisJZmFpbCAiJHRlc3RuYW1lIGdjb3Y6ICRs ZmFpbGVkIGZhaWx1cmVzIGluIGxpbmUgY291bnRzLCAkYmZhaWxlZCBpbiBicmFuY2ggcGVy Y2VudGFnZXMsICRjZGZhaWxlZCBpbiBjb25kaXRpb24vZGVjaXNpb24sICRjZmFpbGVkIGlu IHJldHVybiBwZXJjZW50YWdlcywgJGlmYWlsZWQgaW4gaW50ZXJtZWRpYXRlIGZvcm1hdCIK IAlpZiB7ICR4ZmFpbGVkIH0gewogCSAgICBjbGVhbi1nY292ICR0ZXN0Y2FzZQogCX0KZGlm ZiAtLWdpdCBhL2djYy90cmVlLXByb2ZpbGUuY2MgYi9nY2MvdHJlZS1wcm9maWxlLmNjCmlu ZGV4IDZkNDA0MDFmODZmLi5lOWE1OWZkNDg0OCAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtcHJv ZmlsZS5jYworKysgYi9nY2MvdHJlZS1wcm9maWxlLmNjCkBAIC0yNCw2ICsyNCw3IEBAIGFs b25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAvKiBH ZW5lcmF0ZSBiYXNpYyBibG9jayBwcm9maWxlIGluc3RydW1lbnRhdGlvbiBhbmQgYXV4aWxp YXJ5IGZpbGVzLgogICAgVHJlZS1iYXNlZCB2ZXJzaW9uLiAgU2VlIHByb2ZpbGUuY2MgZm9y IG92ZXJ2aWV3LiAgKi8KIAorI2RlZmluZSBJTkNMVURFX0FMR09SSVRITQogI2luY2x1ZGUg ImNvbmZpZy5oIgogI2luY2x1ZGUgInN5c3RlbS5oIgogI2luY2x1ZGUgImNvcmV0eXBlcy5o IgpAQCAtNTgsNiArNTksOCBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJ TkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgImFsbG9jLXBvb2wuaCIKICNpbmNsdWRlICJz eW1ib2wtc3VtbWFyeS5oIgogI2luY2x1ZGUgInN5bXRhYi10aHVua3MuaCIKKyNpbmNsdWRl ICJjZmdhbmFsLmgiCisjaW5jbHVkZSAiY2ZnbG9vcC5oIgogCiBzdGF0aWMgR1RZKCgpKSB0 cmVlIGdjb3ZfdHlwZV9ub2RlOwogc3RhdGljIEdUWSgoKSkgdHJlZSB0cmVlX2ludGVydmFs X3Byb2ZpbGVyX2ZuOwpAQCAtNzMsNiArNzYsODQxIEBAIHN0YXRpYyBHVFkoKCkpIHRyZWUg aWNfdHVwbGVfdmFyOwogc3RhdGljIEdUWSgoKSkgdHJlZSBpY190dXBsZV9jb3VudGVyc19m aWVsZDsKIHN0YXRpYyBHVFkoKCkpIHRyZWUgaWNfdHVwbGVfY2FsbGVlX2ZpZWxkOwogCitu YW1lc3BhY2UgeworCitzdHJ1Y3QgY29uZHNfY3R4IHsKKyAgICAvKiBPdXRwdXQgYXJyYXlz IGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLiAgKi8KKyAgICBiYXNpY19ibG9jayAqYmxvY2tz OworICAgIGludCAqc2l6ZXM7CisKKyAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgYmxvY2tzIGJ1 ZmZlci4gIFRoaXMgaXMganVzdCBidWcgcHJvdGVjdGlvbiwKKyAgICAgICB0aGUgY2FsbGVy IHNob3VsZCBoYXZlIGFsbG9jYXRlZCBlbm91Z2ggbWVtb3J5IGZvciBibG9ja3MgdG8gbmV2 ZXIgZ2V0CisgICAgICAgdGhpcyBtYW55IGVsZW1lbnRzLgorICAgICAqLworICAgIGludCBt YXhzaXplOworCisgICAgLyogTnVtYmVyIG9mIGV4cHJlc3Npb25zIGZvdW5kIC0gdGhpcyB2 YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlCisgICAgICAgZ2NvdiBvdXRw dXQgYW5kIHRoZSBwYXJhbWV0ZXIgdG8gZ2Nvdl9jb3VudGVyX2FsbG9jICgpLgorICAgICAq LworICAgIGludCBleHByczsKKworICAgIC8qIEJpdG1hcCBvZiB0aGUgcHJvY2Vzc2VkIGJs b2NrcyAtIGJpdCBuIHNldCBtZWFucyBiYXNpY19ibG9jay0+aW5kZXggaGFzCisgICAgICAg YmVlbiBwcm9jZXNzZWQgYXMgYSBmaXJzdC1pbi1leHByZXNzaW9uIGJsb2NrLiAgVGhpcyBl ZmZlY3RpdmVseSBzdG9wcworICAgICAgIGxvb3AgZWRnZXMgZnJvbSBiZWluZyB0YWtlbiBh bmQgc3ViZ3JhcGhzIHJlLXByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBhdXRvX3NiaXRtYXAg c2VlbjsKKworICAgIC8qIFByZS1hbGxvY2F0ZSBiaXRtYXBzIGZvciBwZXItZnVuY3Rpb24g Ym9vayBrZWVwaW5nLiAgVGhpcyBpcyBwdXJlCisgICAgICAgaW5zdGFuY2UgcmV1c2UgYW5k IHRoZSBiaXRtYXBzIGNhcnJpZXMgbm8gZGF0YSBiZXR3ZWVuIGZ1bmN0aW9uIGNhbGxzLgor ICAgICAqLworICAgIGF1dG9fc2JpdG1hcCBleHByOworICAgIGF1dG9fc2JpdG1hcCByZWFj aGFibGU7CisKKyAgICBleHBsaWNpdCBjb25kc19jdHggKHVuc2lnbmVkIHNpemUpIG5vZXhj ZXB0ICh0cnVlKSA6IG1heHNpemUgKDApLCBleHBycyAoMCksCisgICAgICAgIHNlZW4gKHNp emUpLCBleHByIChzaXplKSwgcmVhY2hhYmxlIChzaXplKQorICAgIHsKKyAgICAgICAgYml0 bWFwX2NsZWFyIChzZWVuKTsKKyAgICB9CisKKyAgICB2b2lkIGNvbW1pdCAoYmFzaWNfYmxv Y2sgdG9wLCBpbnQgbmJsb2Nrcykgbm9leGNlcHQgKHRydWUpCisgICAgeworICAgICAgICBi bG9ja3MgICs9IG5ibG9ja3M7CisgICAgICAgICpzaXplcyAgKz0gbmJsb2NrczsKKyAgICAg ICAgbWF4c2l6ZSAtPSBuYmxvY2tzOworCisgICAgICAgIGV4cHJzKys7CisgICAgICAgIHNp emVzKys7CisgICAgICAgICpzaXplcyA9IDA7CisKKyAgICAgICAgYml0bWFwX3NldF9iaXQg KHNlZW4sIHRvcC0+aW5kZXgpOworICAgIH0KK307CisKKy8qIE9ubHkgaW5zdHJ1bWVudCB0 ZXJtcyB3aXRoIGZld2VyIHRoYW4gbnVtYmVyIG9mIGJpdHMgaW4gYSAod2lkZSkgZ2Nvdgor ICAgaW50ZWdlciwgd2hpY2ggaXMgcHJvYmFibHkgNjQuICBUaGUgYWxnb3JpdGhtIGl0c2Vs ZiBkb2VzIG5vdCBpbXBvc2UgdGhpcworICAgbGltaXRhdGlvbiwgYnV0IGl0IG1ha2VzIGZv ciBhIHNpbXBsZXIgaW1wbGVtZW50YXRpb24uCisKKyAgICogQWxsb2NhdGluZyB0aGUgb3V0 cHV0IGRhdGEgc3RydWN0dXJlIChjb3ZlcmFnZV9jb3VudGVyX2FsbG9jICgpKSBjYW4KKyAg ICAgYXNzdW1lIHBhaXJzIG9mIGdjb3ZfdHlwZV91bnNpZ25lZCBhbmQgbm90IHVzZSBhIHNl cGFyYXRlIGxlbmd0aCBmaWVsZC4KKyAgICogQSBwYWlyIGdjb3ZfdHlwZV91bnNpZ25lZCBj YW4gYmUgdXNlZCBhcyBhY2N1bXVsYXRvcnMuCisgICAqIFVwZGF0aW5nIGFjY3VtdWxhdG9y cyBpcyBjYW4gdXNlIHRoZSBiaXR3aXNlIG9wZXJhdGlvbnMgfD0sICY9IGFuZCBub3QKKyAg ICAgY3VzdG9tIG9wZXJhdG9ycyB0aGF0IHdvcmsgZm9yIGFyYml0cmFyeS1zaXplZCBiaXQt c2V0cy4KKworICAgTW9zdCByZWFsLXdvcmxkIGNvZGUgc2hvdWxkIGJlIHVuYWZmZWN0ZWQg YnkgdGhpcywgYnV0IGl0IGlzIHBvc3NpYmxlCisgICAoZXNwZWNpYWxseSBmb3IgZ2VuZXJh dGVkIGNvZGUpIHRvIGV4Y2VlZCB0aGlzIGxpbWl0LgorICovCisjZGVmaW5lIENPTkRJVElP TlNfTUFYX1RFUk1TIChzaXplb2YgKGdjb3ZfdHlwZV91bnNpZ25lZCkgKiBCSVRTX1BFUl9V TklUKQorCitpbnQKK2luZGV4X29mIChjb25zdF9iYXNpY19ibG9jayBuZWVkbGUsIGNvbnN0 IGNvbnN0X2Jhc2ljX2Jsb2NrICpibG9ja3MsIGludCBzaXplKQorbm9leGNlcHQgKHRydWUp Cit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgeworICAgICAg ICBpZiAoYmxvY2tzW2ldID09IG5lZWRsZSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAg IH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2Jvb2wKK2luZGV4X2x0IChjb25zdCBiYXNpY19i bG9jayB4LCBjb25zdCBiYXNpY19ibG9jayB5KQorbm9leGNlcHQgKHRydWUpCit7CisgICAg cmV0dXJuIHgtPmluZGV4IDwgeS0+aW5kZXg7Cit9CisKKy8qIFNwZWNpYWwgY2FzZXMgb2Yg dGhlIHNpbmdsZV8qX3AgYW5kIHNpbmdsZV8qX2VkZ2UgZnVuY3Rpb25zIGluIGJhc2ljLWJs b2NrLmgKKyAgIHRoYXQgZG9uJ3QgY29uc2lkZXIgZXhjZXB0aW9uIGhhbmRsaW5nIG9yIG90 aGVyIGNvbXBsZXggZWRnZXMuICBUaGlzIGhlbHBzCisgICBjcmVhdGUgYSB2aWV3IG9mIHRo ZSBDRkcgd2l0aCBvbmx5IG5vcm1hbCBlZGdlcyAtIGlmIGEgYmFzaWMgYmxvY2sgaGFzIGJv dGgKKyAgIGFuIG91dGdvaW5nIGZhbGx0aHJvdWdoIGFuZCBleGNlcHRpb25hbCBlZGdlIFsx XSwgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYQorICAgc2luZ2xlLXN1Y2Nlc3Nvci4KKwor ICAgWzFdIGlmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB0aGVzZSBmdW5jdGlvbnMgY2FuIGJl IHJlbW92ZWQgYW5kIHJlcGxhY2VkIGJ5CisgICAgICAgdGhlaXIgYmFzaWMtYmxvY2suaCBj b3VzaW5zLgorICovCitib29sCitzaW5nbGUgKGNvbnN0IHZlYzxlZGdlLCB2YV9nYz4gKmVk Z2VzKQorbm9leGNlcHQgKHRydWUpCit7CisgICAgaW50IG4gPSBFREdFX0NPVU5UIChlZGdl cyk7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9y IChlZGdlIGUgOiBlZGdlcykKKyAgICAgICAgaWYgKGUtPmZsYWdzICYgRURHRV9DT01QTEVY KQorICAgICAgICAgICAgbiAtPSAxOworCisgICAgcmV0dXJuIG4gPT0gMTsKK30KKworZWRn ZQorc2luZ2xlX2VkZ2UgKGNvbnN0IHZlYzxlZGdlLCB2YV9nYz4gKmVkZ2VzKQorbm9leGNl cHQgKHRydWUpCit7CisgICAgZm9yIChlZGdlIGUgOiBlZGdlcykKKyAgICB7CisgICAgICAg IGlmIChlLT5mbGFncyAmIEVER0VfQ09NUExFWCkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor ICAgICAgICByZXR1cm4gZTsKKyAgICB9CisgICAgZ2NjX3VucmVhY2hhYmxlICgpOworfQor CisvKiBTb21ldGltZXMsIGZvciBleGFtcGxlIHdpdGggZnVuY3Rpb24gY2FsbHMgYW5kIEMr KyBkZXN0cnVjdG9ycyB0aGUgQ0ZHIGdldHMKKyAgIGV4dHJhIG5vZGVzIHRoYXQgYXJlIGVz c2VudGlhbGx5IHNpbmdsZS1lbnRyeS1zaW5nbGUtZXhpdCBpbiB0aGUgbWlkZGxlIG9mCisg ICBib29sZWFuIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgIHggfHwgY2Fu X3Rocm93ICh5KQorCisgICAgICAgICAgICAgICBBCisgICAgICAgICAgICAgIC98CisgICAg ICAgICAgICAgLyB8CisgICAgICAgICAgICBCICB8CisgICAgICAgICAgICB8ICB8CisgICAg ICAgICAgICBDICB8CisgICAgICAgICAgIC8gXCB8CisgICAgICAgICAgLyAgIFx8CisgICAg ICAgICBGICAgICBUCisKKyAgIFdpdGhvdXQgdGhlIGV4dHJhIG5vZGUgaW5zZXJ0ZWQgYnkg dGhlIGZ1bmN0aW9uICsgZXhjZXB0aW9uIGl0IGJlY29tZXMgYQorICAgcHJvcGVyIDItdGVy bSBncmFwaCwgbm90IDIgc2luZ2xlLXRlcm0gZ3JhcGhzLgorCisgICAgICAgICAgICAgICBB CisgICAgICAgICAgICAgIC98CisgICAgICAgICAgICAgQyB8CisgICAgICAgICAgICAvIFx8 CisgICAgICAgICAgIEYgICBUCisKKyAgIGNvbnRyYWN0X2VkZ2UgaWdub3JlcyB0aGUgc2Vy aWVzIG9mIGludGVybWVkaWF0ZSBub2RlcyBhbmQgbWFrZXMgYSB2aXJ0dWFsCisgICBlZGdl IEEgLT4gQywgd2l0aG91dCBoYXZpbmcgdG8gY29uc3RydWN0IGEgbmV3IHNpbXBsaWZpZWQg Q0ZHIGV4cGxpY2l0bHkuCisKKyAgIFN1Y2ggYW4gZXhwcmVzc2lvbiBjYW5ub3QgY29ycmVj dGx5IGJlIHJlcHJldGVkIGFzIHR3byAxLXRlcm0gZXhwcmVzc2lvbnMsCisgICBhcyBpdCB3 b3VsZCBicmVhayB0aGUgY29uZGl0aW9uIG1hc2tpbmcuCisgKi8KK2VkZ2UKK2NvbnRyYWN0 X2VkZ2UgKGVkZ2UgZSwgc2JpdG1hcCBleHByKQorbm9leGNlcHQgKHRydWUpCit7CisgICAg d2hpbGUgKHRydWUpCisgICAgeworICAgICAgICBiYXNpY19ibG9jayBzcmMgID0gZS0+c3Jj OworICAgICAgICBiYXNpY19ibG9jayBkZXN0ID0gZS0+ZGVzdDsKKworICAgICAgICBpZiAo IXNpbmdsZSAoZGVzdC0+c3VjY3MpKQorICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAg IGlmICghc2luZ2xlIChkZXN0LT5wcmVkcykpCisgICAgICAgICAgICByZXR1cm4gZTsKKyAg ICAgICAgaWYgKCFzaW5nbGUgKHNyYy0+cHJlZHMpKQorICAgICAgICAgICAgcmV0dXJuIGU7 CisKKyAgICAgICAgZWRnZSBzdWNjZSA9IHNpbmdsZV9lZGdlIChkZXN0LT5zdWNjcyk7Cisg ICAgICAgIGlmICghc2luZ2xlIChzdWNjZS0+ZGVzdC0+cHJlZHMpKQorICAgICAgICAgICAg cmV0dXJuIGU7CisKKyAgICAgICAgYml0bWFwX3NldF9iaXQgKGV4cHIsIGRlc3QtPmluZGV4 KTsKKyAgICAgICAgZSA9IHN1Y2NlOworICAgIH0KK30KKworZWRnZQorY29udHJhY3RfZWRn ZV91cCAoZWRnZSBlLCBzYml0bWFwIGV4cHIpCitub2V4Y2VwdCAodHJ1ZSkKK3sKKyAgICB3 aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICAgIGJhc2ljX2Jsb2NrIHNyYyAgPSBlLT5zcmM7 CisgICAgICAgIGJhc2ljX2Jsb2NrIGRlc3QgPSBlLT5kZXN0OworCisgICAgICAgIGlmICgh c2luZ2xlIChkZXN0LT5zdWNjcykpCisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAg aWYgKCFzaW5nbGUgKGRlc3QtPnByZWRzKSkKKyAgICAgICAgICAgIHJldHVybiBlOworICAg ICAgICBpZiAoIXNpbmdsZSAoc3JjLT5wcmVkcykpCisgICAgICAgICAgICByZXR1cm4gZTsK KworICAgICAgICBpZiAoZXhwcikgYml0bWFwX3NldF9iaXQgKGV4cHIsIHNyYy0+aW5kZXgp OworICAgICAgICBlID0gc2luZ2xlX3ByZWRfZWRnZSAoc3JjKTsKKyAgICB9Cit9CisKK2Jv b2wKK2lzX2NvbmRpdGlvbmFsX3AgKGNvbnN0IGJhc2ljX2Jsb2NrIGIpCitub2V4Y2VwdCAo dHJ1ZSkKK3sKKyAgICBpZiAoc2luZ2xlX3N1Y2NfcCAoYikpCisgICAgICAgIHJldHVybiBm YWxzZTsKKworICAgIHVuc2lnbmVkIHQgPSAwOworICAgIHVuc2lnbmVkIGYgPSAwOworICAg IGZvciAoZWRnZSBlIDogYi0+c3VjY3MpCisgICAgeworICAgICAgICB0IHw9IChlLT5mbGFn cyAmIEVER0VfVFJVRV9WQUxVRSk7CisgICAgICAgIGYgfD0gKGUtPmZsYWdzICYgRURHRV9G QUxTRV9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiB0ICYmIGY7Cit9CisKKy8qIFRoZSBm aXJzdCBibG9jayBpbiB0aGUgb3V0cHV0IHdpbGwgYWx3YXlzIGJlIHRoZSBzb3VyY2UgYmxv Y2sgb2YgdGhlIGVkZ2UKKyAgIHRoYXQgd2lsbCBhcHBseSB0aGUgbWFza2luZyBvcGVyYXRp b24sIHdpdGggdGhlIHJlbWFpbmluZyBibG9ja3MgZWZmZWN0aXZlbHkKKyAgIHVub3JkZXJl ZC4KKyAqLworaW50CitmaW5kX2NvbmRpdGlvbnNfbWFza2VkX2J5ICgKKyAgICBiYXNpY19i bG9jayBibG9jaywKKyAgICBjb25zdCBzYml0bWFwIGV4cHIsCisgICAgY29uc3QgdW5zaWdu ZWQgKmZsYWcsCisgICAgYmFzaWNfYmxvY2sgKm91dCwKKyAgICBpbnQgbWF4c2l6ZSkKK25v ZXhjZXB0ICh0cnVlKQoreworICAgIGludCBuID0gMDsKKyAgICBmb3IgKGVkZ2UgZSA6IGJs b2NrLT5wcmVkcykKKyAgICB7CisgICAgICAgIC8qIFNraXAgYW55IHByZWRlY2Vzc29yIG5v dCBpbiB0aGUgZXhwcmVzc2lvbiAtIHRoZXJlIG1pZ2h0IGJlIHN1Y2ggYW4KKyAgICAgICAg ICAgZWRnZSB0byB0aGUgZW5jbG9zaW5nIGV4cHJlc3Npb24gb3IgaW4gdGhlIHByZXNlbmNl IG9mIGxvb3BzLCBidXQKKyAgICAgICAgICAgbWFza2luZyBjYW5ub3QgaGFwcGVuIG91dHNp ZGUgdGhlIGV4cHJlc3Npb24gaXRzZWxmLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFi aXRtYXBfYml0X3AgKGV4cHIsIGUtPnNyYy0+aW5kZXgpKQorICAgICAgICAgICAgY29udGlu dWU7CisKKyAgICAgICAgZSA9IGNvbnRyYWN0X2VkZ2VfdXAgKGUsIE5VTEwpOworICAgICAg ICBpZiAoZS0+ZmxhZ3MgJiBmbGFnWzBdKQorICAgICAgICAgICAgb3V0W24rK10gPSBlLT5z cmM7CisgICAgfQorCisgICAgaWYgKG4gPiAxKQorICAgIHsKKyAgICAgICAgYmFzaWNfYmxv Y2sgKnRvcCA9IHN0ZDo6bWF4X2VsZW1lbnQgKG91dCwgb3V0ICsgbiwgaW5kZXhfbHQpOwor ICAgICAgICBzdGQ6Oml0ZXJfc3dhcCAodG9wLCBvdXQpOworICAgIH0KKworICAgIGZvciAo aW50IHBvcyA9IDA7IHBvcyA8IG47IHBvcysrKQorICAgIHsKKyAgICAgICAgZm9yIChlZGdl IGUgOiBvdXRbcG9zXS0+cHJlZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghYml0 bWFwX2JpdF9wIChleHByLCBlLT5zcmMtPmluZGV4KSkKKyAgICAgICAgICAgICAgICBjb250 aW51ZTsKKyAgICAgICAgICAgIGlmIChpbmRleF9vZiAoZS0+c3JjLCBvdXQsIG4pICE9IC0x KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBlID0gY29udHJh Y3RfZWRnZV91cCAoZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZS0+ZmxhZ3MgJiBmbGFn WzFdKQorICAgICAgICAgICAgICAgIG91dFtuKytdID0gZS0+c3JjOworCisgICAgICAgICAg ICBnY2NfYXNzZXJ0IChuIDwgbWF4c2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy ZXR1cm4gbjsKK30KKworLyogU2NhbiB0aGUgYmxvY2tzIHRoYXQgbWFrZSB1cCBhbiBleHBy ZXNzaW9uIGFuZCBsb29rIGZvciBjb25kaXRpb25zIHRoYXQKKyAgIHdvdWxkIG1hc2sgb3Ro ZXIgY29uZGl0aW9ucy4gIEZvciBhIGRlZXBlciBkaXNjdXNzaW9uIG9uIG1hc2tpbmcsIHNl ZQorICAgV2hhbGVuLCBIZWltZGFobCwgRGUgU2lsdmEgIkVmZmljaWVudCBUZXN0IENvdmVy YWdlIE1lYXN1cmVtZW50IGZvciBNQy9EQyIuCisgICBNYXNraW5nIGlzIGJlc3QgaWxsdXN0 cmF0ZWQgd2l0aCBhbiBleGFtcGxlOgorCisgICBBIHx8IEIuICBJZiBCIGlzIHRydWUgdGhl biBBIHdpbGwgZG9lcyBub3QgaW5kZXBlbmRlbnRseSBhZmZlY3QgdGhlIGRlY2lzaW9uLgor ICAgSW4gYSB3YXksIHRoaXMgaXMgInJldmVyc2UiIHNob3J0IGNpcmN1aXRpbmcsIGFuZCBh bHdheXMgd29yayBvbiB0aGUKKyAgIHJpZ2h0LWhhbmQgc2lkZSBvZiBleHByZXNzaW9ucy4g ICogfHwgdHJ1ZSBpcyBhbHdheXMgdHJ1ZSBhbmQgKiAmJiBmYWxzZSBpcworICAgYWx3YXlz IGZhbHNlIC0gdGhlIGxlZnQtaGFuZC1zaWRlIGRvZXMgbm90IGFmZmVjdCB0aGUgb3V0Y29t ZSwgYW5kIHRoZWlyCisgICB2YWx1ZXMgc2hvdWxkIG5vdCBjb250cmlidXRlIHRvIG1vZGlm aWRpZWQgY29uZGl0aW9uL2RlY2lzaW9uIGNvdmVyYWdlLgorCisgICBBIHx8IEIgaW50ZXJw cmV0ZWQgYXMgYSBkZWNpc2lvbiBkaWFncmFtIGJlY29tZXM6CisKKyAgIEEKKyAgdHxcZgor ICAgfCBcCisgICB8ICBCCisgICB8dC8gXGYKKyAgIHwvICAgXAorICAgVCAgICAgRgorCisg ICBUaGUgYWxnb3JpdGhtIGxvb2tzIGZvciB0cmlhbmdsZXMgbGlrZSBBVEIuICBNYXNraW5n IHJpZ2h0LWhhbmQgc2lkZXMgaGFwcGVuCisgICB3aGVuIGEgYmxvY2sgaGFzIGEgcGFpciBv ZiBpbmNvbWluZyBlZGdlcyBvZiB0aGUgc2FtZSBib29sZWFuIHZhbHVlLCBhbmQKKyAgIHRo ZXJlIGlzIGFuIGVkZ2UgY29ubmVjdGluZyB0aGUgdHdvIHByZWRlY2Vzc29ycyB3aXRoIHRo ZSAqb3Bwb3NpdGUqIGJvb2xlYW4KKyAgIHZhbHVlLiAgVGhlIG1hc2tpbmcgYmxvY2sgaXMg QiwgYW5kIHRoZSBtYXNrZWQgYmxvY2sgaXMgQS4gIEluIHRoaXMKKyAgIHBhcnRpY3VsYXIg ZXhhbXBsZToKKworICAgTWFza2luZyBjYW4gYWZmZWN0ICJvdXRzaWRlIiBpdHMgb3duIHN1 YmV4cHJlc3Npb247IGluIEEgfHwgKEIgJiYgQykgaWYgQyBpcworICAgZmFsc2UsIEIgaXMg bWFza2VkLiAgSG93ZXZlciwgaWYgKEIgJiYgQykgaXMgdHJ1ZSwgQSBnZXRzIG1hc2tlZC4g IEIgJiYgQworICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSBldmFsdWF0aW5nIEMgc2luY2Ug IUIgd291bGQgc2hvcnQtY2lyY3VpdCwgc28gYSB0cnVlCisgICBDIHdvdWxkIG1hc2sgQS4K KworICAgQQorICB0fFxmCisgICB8IFwKKyAgIHwgIFwKKyAgIHwgICBcCisgICB8ICAgIEIK KyAgIHwgIHQvIFxmCisgICB8ICBDICAgfAorICAgfHQvIFxmIHwKKyAgIHwvICAgXCB8Cisg ICBUICAgICBGCisKKyAgIE5vdGljZSBob3cgQkZDIGZvcm1zIGEgdHJpYW5nbGUuICBFeHBy ZXNzaW9ucyBtYXNrZWQgYnkgYW4gZWRnZSBhcmUKKyAgIGRldGVybWluZWQgYnk6CisgICAq IEdvIHRvIHRoZSBwcmVkZWNlc3NvciB3aXRoIHRydXRoIHZhbHVlIGIgKGlmIGl0IGV4aXN0 cykuCisgICAqIEZvbGxvdyB0aGUgcGF0aCBvZiBhbmNlc3RvcnMgd2l0aCB0YWtpbmcgb25s eSAhYiBlZGdlcywgcmVjb3JkaW5nIGV2ZXJ5CisgICAgIG5vZGUgZnJvbSBoZXJlIG9uLgor CisgICBGb3IgdGhlIGNhc2Ugd2hlcmUgQyBjYW4gbWFzayBBLCB0aGUgcGF0aCBnb2VzIEMg W3RydWVdLT4gQiAtPiBbZmFsc2VdIEEsIHNvCisgICBDIFt0cnVlXSBtYXNrcyBBLgorCisg ICBUaGUgbWFzayBpcyBvdXRwdXQgYXMgYSBiaXQtc2V0IHN0b3JlZCBpbiBhIGdjb3ZfdHlw ZV91bnNpZ25lZC4gIFRoZQorICAgYml0LXNldHMgYXJlIG91dHB1dCBpbiBwYWlycywgb25l IGZvciBlYWNoIGRlY2lzaW9uICh0aGUgb3V0Y29tZSBvZiB0aGUKKyAgIGJvb2xlYW4gZXhw cmVzc2lvbiwgb3Igd2hpY2ggYXJjIHRvIHRha2UgaW4gdGhlIENGRykuCisgKi8KK3ZvaWQK K2ZpbmRfc3ViZXhwcl9tYXNrcyAoCisgICAgY29uc3QgYmFzaWNfYmxvY2sgKmJsb2NrcywK KyAgICBpbnQgbmJsb2NrcywKKyAgICBnY292X3R5cGVfdW5zaWduZWQgKm1hc2tzKQorbm9l eGNlcHQgKHRydWUpCit7CisgICAgY29uc3QgdW5zaWduZWQgZmxhZ3NbXSA9IHsKKyAgICAg ICAgRURHRV9UUlVFX1ZBTFVFLAorICAgICAgICBFREdFX0ZBTFNFX1ZBTFVFLAorICAgICAg ICBFREdFX1RSVUVfVkFMVUUsCisgICAgfTsKKworICAgIGJhc2ljX2Jsb2NrIHBhdGhbQ09O RElUSU9OU19NQVhfVEVSTVNdOworICAgIGF1dG9fc2JpdG1hcCBleHByIChuX2Jhc2ljX2Js b2Nrc19mb3JfZm4gKGNmdW4pKTsKKyAgICBiaXRtYXBfY2xlYXIgKGV4cHIpOworICAgIGZv ciAoaW50IGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKQorICAgICAgICBiaXRtYXBfc2V0X2Jp dCAoZXhwciwgYmxvY2tzW2ldLT5pbmRleCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8 IG5ibG9ja3M7IGkrKykKKyAgICB7CisgICAgICAgIGJhc2ljX2Jsb2NrIGJsb2NrID0gYmxv Y2tzW2ldOworICAgICAgICBpZiAoc2luZ2xlX3ByZWRfcCAoYmxvY2spKQorICAgICAgICAg ICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyBrKyspCisg ICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBuID0gZmluZF9jb25kaXRpb25zX21h c2tlZF9ieQorICAgICAgICAgICAgICAgIChibG9jaywgZXhwciwgZmxhZ3MgKyBrLCBwYXRo LCBDT05ESVRJT05TX01BWF9URVJNUyk7CisKKyAgICAgICAgICAgIGlmIChuIDwgMikKKyAg ICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY29uc3QgaW50IG0gPSAy KmluZGV4X29mIChwYXRoWzBdLCBibG9ja3MsIG5ibG9ja3MpICsgazsKKyAgICAgICAgICAg IGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAg ICAgICAgIGNvbnN0IGludCBpbmRleCA9IGluZGV4X29mIChwYXRoW2ldLCBibG9ja3MsIG5i bG9ja3MpOworICAgICAgICAgICAgICAgIG1hc2tzW21dIHw9IGdjb3ZfdHlwZV91bnNpZ25l ZCAoMSkgPDwgaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisK K2ludAorY29sbGVjdF9yZWFjaGFibGVfY29uZGl0aW9uYWxzICgKKyAgICBiYXNpY19ibG9j ayBwcmUsCisgICAgYmFzaWNfYmxvY2sgcG9zdCwKKyAgICBiYXNpY19ibG9jayAqb3V0LAor ICAgIGludCBtYXhzaXplLAorICAgIHNiaXRtYXAgZXhwcikKK25vZXhjZXB0ICh0cnVlKQor eworICAgIGdjY19hc3NlcnQgKG1heHNpemUgPiAwKTsKKworICAgIGJhc2ljX2Jsb2NrIGxv b3AgPSBwcmUtPmxvb3BfZmF0aGVyLT5oZWFkZXI7CisgICAgaW50IG4gPSAwOworICAgIG91 dFtuKytdID0gcHJlOworICAgIGJpdG1hcF9zZXRfYml0IChleHByLCBwcmUtPmluZGV4KTsK KworICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyA8IG47IHBvcysrKQorICAgIHsKKyAgICAg ICAgYmFzaWNfYmxvY2sgYmxvY2sgPSBvdXRbcG9zXTsKKworICAgICAgICBmb3IgKGVkZ2Ug ZSA6IGJsb2NrLT5zdWNjcykKKyAgICAgICAgeworICAgICAgICAgICAgYmFzaWNfYmxvY2sg ZGVzdCA9IGNvbnRyYWN0X2VkZ2UgKGUsIGV4cHIpLT5kZXN0OworCisgICAgICAgICAgICAv KiBTa2lwIGxvb3AgZWRnZXMsIGFzIHRoZXkgZ28gb3V0c2lkZSB0aGUgZXhwcmVzc2lvbi4g ICovCisgICAgICAgICAgICBpZiAoZGVzdCA9PSBsb29wKQorICAgICAgICAgICAgICAgIGNv bnRpbnVlOworICAgICAgICAgICAgaWYgKGRlc3QgPT0gcG9zdCkKKyAgICAgICAgICAgICAg ICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghaXNfY29uZGl0aW9uYWxfcCAoZGVzdCkp CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAvKiBBbHJlYWR5LXNl ZW4sIGRvbid0IHJlLWFkZC4gICovCisgICAgICAgICAgICBpZiAoYml0bWFwX2JpdF9wIChl eHByLCBkZXN0LT5pbmRleCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg ICAgICAgIGJpdG1hcF9zZXRfYml0IChleHByLCBkZXN0LT5pbmRleCk7CisgICAgICAgICAg ICBvdXRbbisrXSA9IGRlc3Q7CisgICAgICAgICAgICBpZiAobiA9PSBtYXhzaXplKQorICAg ICAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu IG47Cit9CisKK2ludAorY29sbGVjdF9uZWlnaGJvcnMgKGJhc2ljX2Jsb2NrICpibG9ja3Ms IGludCBuYmxvY2tzLCBzYml0bWFwIHJlYWNoYWJsZSkKK25vZXhjZXB0ICh0cnVlKQorewor ICAgIGludCBuID0gMDsKKyAgICBiYXNpY19ibG9jayAqZXhpdHMgPSBibG9ja3MgKyBuYmxv Y2tzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKQorICAgIHsKKyAg ICAgICAgZm9yIChlZGdlIGUgOiBibG9ja3NbaV0tPnN1Y2NzKQorICAgICAgICB7CisgICAg ICAgICAgICBpZiAoYml0bWFwX2JpdF9wIChyZWFjaGFibGUsIGUtPmRlc3QtPmluZGV4KSkK KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgYml0bWFwX3NldF9i aXQgKHJlYWNoYWJsZSwgZS0+ZGVzdC0+aW5kZXgpOworICAgICAgICAgICAgZXhpdHNbbisr XSA9IGUtPmRlc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKwor LyogRmluZCBhbmQgaXNvbGF0ZSB0aGUgZmlyc3QgZXhwcmVzc2lvbiBiZXR3ZWVuIHR3byBk b21pbmF0b3JzLgorCisgICBFaXRoZXIgYmxvY2sgb2YgYSBjb25kaXRpb25hbCBjb3VsZCBo YXZlIG1vcmUgZGVjaXNpb25zIGFuZCBsb29wcywgc28KKyAgIGlzb2xhdGUgdGhlIGZpcnN0 IGRlY2lzaW9uIGJ5IHNldC1pbnRlcnNlY3RpbmcgYWxsIHBhdGhzIGZyb20gdGhlCisgICBw b3N0LWRvbWluYXRvciB0byB0aGUgZW50cnkgYmxvY2suCisKKyAgIFRoZSBmdW5jdGlvbiBy ZXR1cm5zIHRoZSBudW1iZXIgb2YgYmxvY2tzIGZyb20gbiB0aGF0IG1ha2UgdXAgdGhlIGxl YWRpbmcKKyAgIGV4cHJlc3Npb24gaW4gcHJlZml4IG9yZGVyIChpLmUuIHRoZSBvcmRlciBl eHBlY3RlZCBieSB0aGUgaW5zdHJ1bWVudGluZworICAgY29kZSkuICBXaGVuIHRoaXMgZnVu Y3Rpb24gcmV0dXJucyAwIHRoZXJlIGFyZSBubyBkZWNpc2lvbnMgYmV0d2VlbiBwcmUgYW5k CisgICBwb3N0LCBhbmQgdGhpcyBzZWdtZW50IG9mIHRoZSBDRkcgY2FuIHNhZmVseSBiZSBz a2lwcGVkLgorCisgICBUaGUgcG9zdCBub2RlcyBjYW4gaGF2ZSBwcmVkZWNlc3NvcnMgdGhh dCBkbyBub3QgYmVsb25nIHRvIHRoaXMgc3ViZ3JhcGgsCisgICB3aGljaCBhcmUgc2tpcHBl ZC4gIFRoaXMgaXMgZXhwZWN0ZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUgaXMgYQorICAg Y29uZGl0aW9uYWwgaW4gdGhlIGVsc2UtYmxvY2sgb2YgYSBsYXJnZXIgZXhwcmVzc2lvbjoK KworICAgaWYgKEEpCit7CisgICAgICBpZiAoQikge30KKyAgIH0gZWxzZSB7CisgICAgICBp ZiAoQykge30gZWxzZSB7fQorICAgfQorCisgICAgICAgICAgICAgQQorICAgICAgICAgIHQg LyBcIGYKKyAgICAgICAgICAgLyAgIFwKKyAgICAgICAgICBCICAgICBDCisgICAgICAgICAv XCAgICAvIFwKKyAgICAgICAgLyAgXCAgVCAgIEYKKyAgICAgICBUICAgIFwgIFwgLworICAg ICAgICBcICAgfCAgIG8KKyAgICAgICAgIFwgIHwgIC8KKyAgICAgICAgICBcIHwgLworICAg ICAgICAgICBcfC8KKyAgICAgICAgICAgIEUKKworICAgUHJvY2Vzc2luZyBbQiwgRSkgd2hp Y2ggbG9va3MgbGlrZToKKworICAgICAgQgorICAgICAvfAorICAgIC8gfAorICAgVCAgfAor ICAgIFwgLworICAgICBFIC0tLS0+IG8gLy8gcHJlZGVjZXNzb3Igb3V0c2lkZSBbQiwgZSkK KyAqLworCisvKiBEbyBhICh1cHdhcmRzKSBzZWFyY2ggZm9yIHJlYWNoYWJsZSBub2RlcyBh bmQgbWFyayB0aGVtIGluIHRoZSByZWFjaGFibGUKKyAgIHNldCwgbWFraW5nIHN1cmUgbm90 IHRvIHRha2UgbG9vcCBlZGdlcy4gIGRmc19lbnVtZXJhdGVfZnJvbSAoKSB3b24ndCB3b3Jr IGFzCisgICB0aGUgZmlsdGVyIGZ1bmN0aW9uIG5lZWRzIGluZm9ybWF0aW9uIGZyb20gdGhl IGVkZ2UuCisgKi8KK3ZvaWQKK2ZpbmRfcmVhY2hhYmxlICgKKyAgICBzYml0bWFwIHJlYWNo YWJsZSwKKyAgICBiYXNpY19ibG9jayBwcmUsCisgICAgYmFzaWNfYmxvY2sgcG9zdCwKKyAg ICBiYXNpY19ibG9jayAqc3RhY2spCitub2V4Y2VwdCAodHJ1ZSkKK3sKKyAgICBzdGFja1sw XSA9IHByZTsKKyAgICBiaXRtYXBfc2V0X2JpdCAocmVhY2hhYmxlLCBwcmUtPmluZGV4KTsK KyAgICBiaXRtYXBfc2V0X2JpdCAocmVhY2hhYmxlLCBwb3N0LT5pbmRleCk7CisgICAgZm9y IChpbnQgbiA9IDA7IG4gPj0gMDsgbi0tKQorICAgIHsKKyAgICAgICAgZm9yIChlZGdlIGUg OiBzdGFja1tuXS0+cHJlZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiaXRtYXBf Yml0X3AgKHJlYWNoYWJsZSwgZS0+c3JjLT5pbmRleCkpCisgICAgICAgICAgICAgICAgY29u dGludWU7CisKKyAgICAgICAgICAgIC8qIElnbm9yZSBhbnkgbG9vcCBlZGdlcy4gICovCisg ICAgICAgICAgICBpZiAoZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFUT1JTLCBlLT5zcmMs IGUtPmRlc3QpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBi YXNpY19ibG9jayBzcmMgPSBjb250cmFjdF9lZGdlX3VwIChlLCByZWFjaGFibGUpLT5zcmM7 CisgICAgICAgICAgICBiaXRtYXBfc2V0X2JpdCAocmVhY2hhYmxlLCBzcmMtPmluZGV4KTsK KyAgICAgICAgICAgIHN0YWNrW24rK10gPSBzcmM7CisgICAgICAgIH0KKyAgICB9Cit9CisK K2ludAorZmluZF9maXJzdF9jb25kaXRpb25hbCAoY29uZHNfY3R4ICZjdHgsIGJhc2ljX2Js b2NrIHByZSwgYmFzaWNfYmxvY2sgcG9zdCkKK25vZXhjZXB0ICh0cnVlKQoreworICAgIGJh c2ljX2Jsb2NrICpibG9ja3MgPSBjdHguYmxvY2tzOworICAgIHNiaXRtYXAgZXhwciA9IGN0 eC5leHByOworICAgIHNiaXRtYXAgcmVhY2hhYmxlID0gY3R4LnJlYWNoYWJsZTsKKyAgICBi aXRtYXBfY2xlYXIgKGV4cHIpOworICAgIGJpdG1hcF9jbGVhciAocmVhY2hhYmxlKTsKKyAg ICBibG9ja3NbMF0gPSBwcmU7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBhIGRpcmVjdCBlZGdl IHRvIHRoZSBwb3N0IGRvbWluYXRvciB0aGVuIHRoaXMgY2Fubm90IG9ubHkgYmUKKyAgICAg ICBhIHNpbmdsZS10ZXJtIGNvbmRpdGlvbmFsICp1bmxlc3MqIGl0IGlzIGEgbG9vcCAoaW4g d2hpY2ggY2FzZSB0aGUKKyAgICAgICB0by1wb3N0IGVkZ2UgaXMgdGhlIGxvb3AgZXhpdCBl ZGdlKS4KKyAgICAgKi8KKyAgICBjb25zdCBib29sIGRvd2hpbGUgPSAhbG9vcF9leGl0c19m cm9tX2JiX3AgKHByZS0+bG9vcF9mYXRoZXIsIHByZSk7CisgICAgY29uc3QgYm9vbCBpc2xv b3AgPSBiYl9sb29wX2hlYWRlcl9wIChwcmUpICYmICFkb3doaWxlOworICAgIGlmIChmaW5k X2VkZ2UgKHByZSwgcG9zdCkgJiYgIWlzbG9vcCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAg ICBjb25zdCBpbnQgbmJsb2NrcyA9IGNvbGxlY3RfcmVhY2hhYmxlX2NvbmRpdGlvbmFscwor ICAgICAgICAocHJlLCBwb3N0LCBibG9ja3MsIGN0eC5tYXhzaXplLCBleHByKTsKKyAgICBp ZiAobmJsb2NrcyA9PSAxKQorICAgICAgICByZXR1cm4gbmJsb2NrczsKKworICAgIGJpdG1h cF9jb3B5IChyZWFjaGFibGUsIGV4cHIpOworICAgIGNvbnN0IGludCBuZXhpdHMgPSBjb2xs ZWN0X25laWdoYm9ycyAoYmxvY2tzLCBuYmxvY2tzLCByZWFjaGFibGUpOworICAgIGlmIChu ZXhpdHMgPT0gMikKKyAgICAgICAgcmV0dXJuIG5ibG9ja3M7CisKKyAgICAvKiBGaW5kIHJl YWNoYWJsZSBub2RlcyBmcm9tIHRoZSBuZWlnaGJvcnMuICAqLworICAgIGJhc2ljX2Jsb2Nr ICpleGl0cyA9IGJsb2NrcyArIG5ibG9ja3M7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBu ZXhpdHM7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoZWRnZSBlIDogZXhpdHNbaV0tPnBy ZWRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWRvbWluYXRlZF9ieV9wIChDRElf RE9NSU5BVE9SUywgZS0+c3JjLCBwcmUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor CisgICAgICAgICAgICBiaXRtYXBfY2xlYXIgKHJlYWNoYWJsZSk7CisgICAgICAgICAgICBm aW5kX3JlYWNoYWJsZSAocmVhY2hhYmxlLCBlLT5zcmMsIHByZSwgZXhpdHMgKyBuZXhpdHMp OworICAgICAgICAgICAgZm9yIChlZGdlIGYgOiBleGl0c1tpXS0+cHJlZHMpCisgICAgICAg ICAgICAgICAgYml0bWFwX3NldF9iaXQgKHJlYWNoYWJsZSwgZi0+c3JjLT5pbmRleCk7Cisg ICAgICAgICAgICBiaXRtYXBfYW5kIChleHByLCBleHByLCByZWFjaGFibGUpOworICAgICAg ICB9CisgICAgfQorCisgICAgaW50IGsgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg bmJsb2NrczsgaSsrKQorICAgICAgICBpZiAoYml0bWFwX2JpdF9wIChleHByLCBibG9ja3Nb aV0tPmluZGV4KSkKKyAgICAgICAgICAgIGJsb2Nrc1trKytdID0gYmxvY2tzW2ldOworICAg IHJldHVybiBrOworfQorCit2b2lkCitlbWl0X2JpdHdpc2Vfb3AgKGVkZ2UgZSwgdHJlZSBs aHMsIHRyZWUgb3AxLCB0cmVlX2NvZGUgb3AsIHRyZWUgb3AyKQorbm9leGNlcHQgKHRydWUp Cit7CisgICAgdHJlZSB0bXA7CisgICAgZ2Fzc2lnbiAqcmVhZDsKKyAgICBnYXNzaWduICpi aXR3OworICAgIGdhc3NpZ24gKndyaXRlOworICAgIC8qIEluc2VydCBsaHMgPSBvcDEgPGJp dC1vcD4gb3AyLiAgKi8KKyAgICB0bXAgICA9IG1ha2VfdGVtcF9zc2FfbmFtZSAgKGdjb3Zf dHlwZV9ub2RlLCBOVUxMLCAiX19jb25kaXRpb25zX3RtcCIpOworICAgIHJlYWQgID0gZ2lt cGxlX2J1aWxkX2Fzc2lnbiAodG1wLCBvcDEpOworICAgIHRtcCAgID0gbWFrZV90ZW1wX3Nz YV9uYW1lICAoZ2Nvdl90eXBlX25vZGUsIE5VTEwsICJfX2NvbmRpdGlvbnNfdG1wIik7Cisg ICAgYml0dyAgPSBnaW1wbGVfYnVpbGRfYXNzaWduICh0bXAsIG9wLCBnaW1wbGVfYXNzaWdu X2xocyAocmVhZCksIG9wMik7CisgICAgd3JpdGUgPSBnaW1wbGVfYnVpbGRfYXNzaWduIChs aHMsIGdpbXBsZV9hc3NpZ25fbGhzIChiaXR3KSk7CisKKyAgICBnc2lfaW5zZXJ0X29uX2Vk Z2UgKGUsIHJlYWQpOworICAgIGdzaV9pbnNlcnRfb25fZWRnZSAoZSwgYml0dyk7CisgICAg Z3NpX2luc2VydF9vbl9lZGdlIChlLCB3cml0ZSk7Cit9CisKKy8qIFdhbGsgdGhlIENGRyBh bmQgY29sbGVjdCBjb25kaXRpb25hbHMuCisKKyAgIDEuIENvbGxlY3QgYWxsIG5vZGVzIHJl YWNoYWJsZSBmcm9tIHRoZSByb290IG5vZGUgdGhyb3VnaCAoY29udHJhY3RlZCkgcGF0aHMK KyAgICAgIG9mIHRydWUvZmFsc2UgZWRnZXMuCisgICAyLiBDb2xsZWN0IHRoZSBuZWlnaGJv cnMgb2YgdGhlIHJlYWNoYWJsZSBub2RlIChzZXQpLgorICAgMy4gRnJvbSBldmVyeSBub2Rl IGluIHRoZSBuZWlnaGJvcmhvb2QsIHdhbGsgdGhlIHVwIHRoZSBDRkcgYW5kIG1hcmsgZXZl cnkKKyAgICAgIHJlYWNoYWJsZSBub2RlLiBPbmx5IHRoZSBub2RlcyByZWFjaGFibGUgZnJv bSAqZXZlcnkqIG5vZGUgaW4gdGhlCisgICAgICBuZWlnaGJvcmhvb2QgYXJlIGEgcGFydCBv ZiB0aGUgZmlyc3QgZXhwcmVzc2lvbi4KKyAgIDQuIFJlY29yZCB0aGUgZXhwcmVzc2lvbiBw bHVzIHRoZSB0d28gc3VjY2Vzc29ycyBvZiB0aGUgbGFzdCAoaGlnaGVzdC1pbmRleCkKKyAg ICAgIG5vZGUgaW4gdGhlIGV4cHJlc3Npb24sIGkuZS4gdGhlIGxhc3QgdGVybS4KKyAgIDUu IFJlcGVhdCB1c2luZyB0aGUgdHdvIHN1Y2Nlc3NvcnMgYXMgbmV3IHJvb3Qgbm9kZXMuCisK KyAgIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGZpbmQgbm9kZXMgaW4gdGhlIG9yZGVyIG9m IHRoZSBleHByZXNzaW9uLCBpLmUuIGl0CisgICBtaWdodCBmaW5kIChhIHx8IGIpICYmIGMg YXMgW2EgYyBiXSwgc28gdGhlIG91dHB1dCBpcyBzb3J0ZWQgYnkKKyAgIGJhc2ljX2Jsb2Nr LT5pbmRleC4KKworICAgU3RlcHMgMiBhbmQgMyBhcmUgbmVjZXNzYXJ5IHRvIGRpc3Rpbmd1 aXNoIGNoYWluZWQgY29uZGl0aW9uYWxzIGZyb20KKyAgIG11bHRpLXRlcm0gY29uZGl0aW9u YWxzLCBlLmcuIHRvIHNlcGFyYXRlCisKKyAgICAgICBpZiAoYSkKKyAgICAgICB7CisgICAg ICAgICAgIGlmIChiKQorICAgICAgICAgICAgICAgd29yayAoKTsKKyAgICAgICB9CisgICAg ICAgaWYgKGEgJiYgYikKKyAgICAgICAgICAgd29yayAoKTsKKyAqLwordm9pZAorY29sbGVj dF9jb25kaXRpb25zIChjb25kc19jdHgmIGN0eCwgYmFzaWNfYmxvY2sgZW50cnksIGJhc2lj X2Jsb2NrIGV4aXQpCitub2V4Y2VwdCAodHJ1ZSkKK3sKKyAgICBiYXNpY19ibG9jayBwcmU7 CisgICAgYmFzaWNfYmxvY2sgcG9zdDsKKyAgICBmb3IgKHByZSA9IGVudHJ5IDs7IHByZSA9 IHBvc3QpCisgICAgeworICAgICAgICBpZiAocHJlID09IGV4aXQpCisgICAgICAgICAgICBi cmVhazsKKyAgICAgICAgaWYgKGJpdG1hcF9iaXRfcCAoY3R4LnNlZW4sIHByZS0+aW5kZXgp KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcG9zdCA9IGdldF9pbW1lZGlhdGVf ZG9taW5hdG9yIChDRElfUE9TVF9ET01JTkFUT1JTLCBwcmUpOworICAgICAgICBpZiAoIWlz X2NvbmRpdGlvbmFsX3AgKHByZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoZWRn ZSBlIDogcHJlLT5zdWNjcykKKyAgICAgICAgICAgICAgICBjb2xsZWN0X2NvbmRpdGlvbnMg KGN0eCwgZS0+ZGVzdCwgcG9zdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg fQorCisgICAgICAgIGludCBudGVybXMgPSBmaW5kX2ZpcnN0X2NvbmRpdGlvbmFsIChjdHgs IHByZSwgcG9zdCk7CisgICAgICAgIHN0ZDo6c29ydCAoY3R4LmJsb2NrcywgY3R4LmJsb2Nr cyArIG50ZXJtcywgaW5kZXhfbHQpOworICAgICAgICBiYXNpY19ibG9jayBsYXN0ID0gY3R4 LmJsb2Nrc1tudGVybXMgLSAxXTsKKyAgICAgICAgaWYgKHNpemVfdCAobnRlcm1zKSA8PSBD T05ESVRJT05TX01BWF9URVJNUykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChlZGdl IGUgOiBsYXN0LT5zdWNjcykKKyAgICAgICAgICAgICAgICBpZiAoZS0+ZmxhZ3MgJiAoRURH RV9UUlVFX1ZBTFVFIHwgRURHRV9GQUxTRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgICAg IGN0eC5ibG9ja3NbbnRlcm1zKytdID0gZS0+ZGVzdDsKKyAgICAgICAgICAgIGN0eC5jb21t aXQgKHByZSwgbnRlcm1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvY2F0 aW9uX3QgbG9jID0gZ2ltcGxlX2xvY2F0aW9uIChnc2lfc3RtdCAoZ3NpX2xhc3RfYmIgKHBy ZSkpKTsKKyAgICAgICAgICAgIHdhcm5pbmdfYXQKKyAgICAgICAgICAgICAgICAobG9jLCBP UFRfV2NvdmVyYWdlX3Rvb19tYW55X2NvbmRpdGlvbnMsCisgICAgICAgICAgICAgICAgICJU b28gbWFueSBjb25kaXRpb25zIChmb3VuZCAlZCk7IGdpdmluZyB1cCBjb3ZlcmFnZSIsIG50 ZXJtcyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGVkZ2UgZSA6IGxhc3QtPnN1Y2Nz KQorICAgICAgICAgICAgY29sbGVjdF9jb25kaXRpb25zIChjdHgsIGUtPmRlc3QsIHBvc3Qp OworICAgIH0KK30KKworfQorCisvKiBDb25kaXRpb24gY292ZXJhZ2UgKE1DL0RDKQorCisg ICBBbGdvcml0aG0KKyAgIC0tLS0tLS0tLQorICAgVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNp b24gb2YgdGhlIGFsZ29yaXRobSBpbiBXaGFsZW4sIEhlaW1kYWhsLCBEZSBTaWx2YQorICAg IkVmZmljaWVudCBUZXN0IENvdmVyYWdlIE1lYXN1cmVtZW50IGZvciBNQy9EQyIuICBUaGVp ciBhbGdvcml0aG0gd29yayBvbgorICAgQVNUcywgYnV0IHRoaXMgYWxnb3JpdGhtIHdvcmsg b24gY29udHJvbCBmbG93IGdyYXBocy4gIFRoZSBpbmRpdmlkdWFsIHBoYXNlcworICAgYXJl IGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBjbG9zZXIgdG8gdGhlIGltcGxlbWVudGF0aW9u LgorCisgICBUaGUgQ0ZHIGlzIGJyb2tlbiB1cCBpbnRvIHNlZ21lbnRzIGJldHdlZW4gZG9t aW5hdG9ycy4gIFRoaXMgaXNuJ3Qgc3RyaWN0bHkKKyAgIG5lY2Vzc2FyeSwgYnV0IHNpbmNl IGJvb2xlYW4gZXhwcmVzc2lvbnMgY2Fubm90IGNyb3NzIGRvbWluYXRvcnMgaXQgbWFrZXMK KyAgIGZvciBhIG5pY2Ugd2F5IHRvIHJlZHVjZSB3b3JrLgorCisgICBUaGUgY292ZXJhZ2Ug b25seSBjb25zaWRlcnMgdGhlIHBvc2l0aW9ucywgbm90IHRoZSBzeW1ib2xzLCBpbiBhCisg ICBjb25kaXRpb25hbCwgZS5nLiAhQSB8fCAoIUIgJiYgQSkgaXMgYSAzLXRlcm0gY29uZGl0 aW9uYWwgZXZlbiB0aG91Z2ggQQorICAgYXBwZWFycyB0d2ljZS4gIFN1YmV4cHJlc3Npb25z IGhhdmUgbm8gZWZmZWN0IG9uIHRlcm0gb3JkZXJpbmc6CisgICAoYSAmJiAoYiB8fCAoYyAm JiBkKSkgfHwgZSkgY29tZXMgb3V0IGFzIFthIGIgYyBkIGVdLgorCisgICBUaGUgb3V0cHV0 IGZvciBnY292IGlzIGEgdmVjdG9yIG9mIHBhaXJzIG9mIHVuc2lnbmVkIGludGVnZXJzLCBp bnRlcnByZXRlZAorICAgYXMgYml0LXNldHMsIHdoZXJlIHRoZSBiaXQgaW5kZXggY29ycmVz cG9uZHMgdG8gdGhlIGluZGV4IG9mIHRoZSBjb25kaXRpb24KKyAgIGluIHRoZSBleHByZXNz aW9uLgorCisgICBJbXBsZW1lbnRhdGlvbiBhbmQgaW50ZXJmYWNlCisgICAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgICBUd28gcHVibGljIGZ1bmN0aW9ucyAtIGZpbmRfY29u ZGl0aW9ucyBhbmQgaW5zdHJ1bWVudF9kZWNpc2lvbnMuCisKKyAgIGZpbmRfY29uZGl0aW9u cyBvdXRwdXRzIHR3byBhcnJheXMsIGJsb2NrcyBhbmQgc2l6ZXMuICBUaGUgc2l6ZXMgZGVz Y3JpYmVzCisgICB0aGUgcmFuZ2VzIG9mIGJsb2NrcyB0aGF0IG1ha2UgdXAgZXZlcnkgY29u ZGl0aW9uYWwsIGluIGEgW2ZpcnN0LCBsYXN0KQorICAgZmFzaGlvbiwgaS5lLiBiZWdpbiA9 IGJsb2Nrc1tzaXplc1tuXV0sIGVuZCA9IGJsb2Nrc1tzaXplc1tuKzFdXSBmb3IKKyAgIGV4 cHJlc3Npb24gbi4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZXhwcmVz c2lvbnMuCisKKyAgIFRoZSBjb3ZlcmFnZSBpcyBkZXNpZ25lZCB0byBnZXQgbW9zdCBvZiBp dHMgbWVtb3J5IG5lZWRzIG1ldCBieSB0aGUgY2FsbGVyLAorICAgYW5kIGhlYXZpbHkgdXNl cyB0aGUgZW5kIG9mIHRoZSBibG9ja3MgYXJyYXkgZm9yIGJ1ZmZlci4gIFRoaXMgaXMgYm90 aCBmb3IKKyAgIHBlcmZvcm1hbmNlIChubyByZXNpemVzLCBhbW9ydGl6ZWQgY29zdCBvZiBh bGxvY2F0aW9uKSBhbmQKKyAgIGVhc2Utb2YtaW1wbGVtZW50YXRpb24uICBUaGlzIG1ha2Vz IHRoZSBjYWxsZXIgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcKKyAgIGxhcmdlIGVub3Vn aCBhcnJheXMuCisKKyAgIGJsb2NrczoKKyAgICBFdmVyeSBwZXJtYW5lbnQgY29uZGl0aW9u cyBhZGQgMiBibG9ja3MgKHRoZSB0cnVlICYgZmFsc2UgZGVzdCBibG9ja3MpLCBhbmQKKyAg ICBhc3N1bWluZyBhIHdvcnN0IGNhc2Ugb2Ygb25lLWJsb2NrLXBlci1leHByIGp1c3Qgc3Rv cmluZyB0aGUgb3V0cHV0IG5lZWRzCisgICAgMypuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKCku ICBBZGRpdGlvbmFsbHksIHRoZSBzZWFyY2hlcyBtaWdodCBuZWVkIHRvIGJ1ZmZlcgorICAg IHRoZSBmdWxsIGdyYXBoIGJldHdlZW4gZW50cnkgYW5kIGV4aXQgWzFdLiBJbiB0b3RhbCB0 aGF0IG1lYW5zCisgICAgNSpuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKCkgc2hvdWxkIHNob3Vs ZCBiZSBwbGVudHksIGFuZCB0aGUgc2F2aW5ncyBmb3IKKyAgICByZWR1Y2luZyB0aGlzIG51 bWJlciBpcyBwcm9iYWJseSBub3Qgd29ydGggdGhlIHJpc2suCisgICBzaXplczoKKyAgICBz aXplcyBnZXRzIG9uZSBlbnRyeSBwZXIgZXhwcmVzc2lvbiBwbHVzIGluaXRpYWwsIHNvCisg ICAgMStuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKCkgaXMgc3VmZmljaWVudC4KKworICAgaW5z dHJ1bWVudF9kZWNpc2lvbnMgdXNlcyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgZmlu ZF9jb25kaXRpb25zIHRvCisgICBpbmplY3QgY29kZSBvbnRvIGVkZ2VzIGluIHRoZSBDRkcu ICBFdmVyeSBpbnN0cnVtZW50ZWQgZnVuY3Rpb24gZ2V0cyBsb2NhbAorICAgYWNjdW11bGF0 b3JzIHplcm8nZCBvbiBmdW5jdGlvbiBlbnRyeSwgd2hpY2ggb24gZnVuY3Rpb24gZXhpdCBh cmUgZmx1c2hlZCB0bworICAgdGhlIGdsb2JhbCBhY2N1bXVsYXRvcnMgKGNyZWF0ZWQgYnkg Y292ZXJhZ2VfY291bnRlcl9hbGxvYyAoKSkuCisKKyAgIFsxXSBJbiB0cnV0aCwgdGhlIHNl dCBvZiBub2RlcyB0aGF0IGNvdWxkIGJlIGJ1ZmZlcmVkIGdldHMgc21hbGxlciBhcyB0aGUK KyAgICAgICBhbGdvcml0aG0gd2Fsa3MgdGhlIENGRywgYnV0IGFzc3VtaW5nIGp1c3QgdXNp bmcgbm9kZS1jb3VudCBjb21lcyBhdAorICAgICAgIGxpdHRsZSBydW4tdGltZSBjb3N0IGFu ZCBpcyBndWFyYW50ZWVkIHRvIGJlIHN1ZmZpY2llbnQuCisgKi8KK2ludAorZmluZF9jb25k aXRpb25zICgKKyAgICBiYXNpY19ibG9jayBlbnRyeSwKKyAgICBiYXNpY19ibG9jayBleGl0 LAorICAgIGJhc2ljX2Jsb2NrICpibG9ja3MsCisgICAgaW50ICpzaXplcywKKyAgICBpbnQg bWF4c2l6ZSkKK3sKKyAgICByZWNvcmRfbG9vcF9leGl0cyAoKTsKKyAgICBib29sIGZyZWVf ZG9tID0gZmFsc2U7CisgICAgYm9vbCBmcmVlX3Bvc3RfZG9tID0gZmFsc2U7CisgICAgaWYg KCFkb21faW5mb19hdmFpbGFibGVfcCAoQ0RJX1BPU1RfRE9NSU5BVE9SUykpCisgICAgewor ICAgICAgICBjYWxjdWxhdGVfZG9taW5hbmNlX2luZm8gKENESV9QT1NUX0RPTUlOQVRPUlMp OworICAgICAgICBmcmVlX3Bvc3RfZG9tID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWRv bV9pbmZvX2F2YWlsYWJsZV9wIChDRElfRE9NSU5BVE9SUykpCisgICAgeworICAgICAgICBj YWxjdWxhdGVfZG9taW5hbmNlX2luZm8gKENESV9ET01JTkFUT1JTKTsKKyAgICAgICAgZnJl ZV9kb20gPSB0cnVlOworICAgIH0KKworICAgIGNvbmRzX2N0eCBjdHggKG1heHNpemUpOwor ICAgIGN0eC5ibG9ja3MgPSBibG9ja3M7CisgICAgY3R4LnNpemVzID0gc2l6ZXMgKyAxOwor ICAgIGN0eC5tYXhzaXplID0gbWF4c2l6ZTsKKyAgICBzaXplc1swXSA9IHNpemVzWzFdID0g MDsKKyAgICBjb2xsZWN0X2NvbmRpdGlvbnMgKGN0eCwgZW50cnksIGV4aXQpOworCisgICAg LyogUGFydGlhbCBzdW0uICAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3R4LmV4cHJz OyArK2kpCisgICAgICAgIHNpemVzW2kgKyAxXSArPSBzaXplc1tpXTsKKworICAgIGlmIChm cmVlX3Bvc3RfZG9tKQorICAgICAgICBmcmVlX2RvbWluYW5jZV9pbmZvIChDRElfUE9TVF9E T01JTkFUT1JTKTsKKyAgICBpZiAoZnJlZV9kb20pCisgICAgICAgIGZyZWVfZG9taW5hbmNl X2luZm8gKENESV9ET01JTkFUT1JTKTsKKworICAgIHJldHVybiBjdHguZXhwcnM7Cit9CisK K2ludCBpbnN0cnVtZW50X2RlY2lzaW9ucyAoYmFzaWNfYmxvY2sgKmJsb2NrcywgaW50IG5i bG9ja3MsIGludCBjb25kbm8pCit7CisgICAgLyogSW5zZXJ0IGZ1bmN0aW9uLWxvY2FsIGFj Y3VtdWxhdG9ycyBwZXIgZGVjaXNpb24uICAqLworICAgIHRyZWUgYWNjdVsyXSA9IHsKKyAg ICAgICAgYnVpbGRfZGVjbCAoCisgICAgICAgICAgICBVTktOT1dOX0xPQ0FUSU9OLAorICAg ICAgICAgICAgVkFSX0RFQ0wsCisgICAgICAgICAgICBnZXRfaWRlbnRpZmllciAoIl9fY29u ZGl0aW9uc19hY2N1X3RydWUiKSwKKyAgICAgICAgICAgIGdjb3ZfdHlwZV9ub2RlKSwKKyAg ICAgICAgYnVpbGRfZGVjbCAoCisgICAgICAgICAgICBVTktOT1dOX0xPQ0FUSU9OLAorICAg ICAgICAgICAgVkFSX0RFQ0wsCisgICAgICAgICAgICBnZXRfaWRlbnRpZmllciAoIl9fY29u ZGl0aW9uc19hY2N1X2ZhbHNlIiksCisgICAgICAgICAgICBnY292X3R5cGVfbm9kZSksCisg ICAgfTsKKyAgICBmb3IgKHRyZWUgYWNjIDogYWNjdSkKKyAgICB7CisgICAgICAgIHRyZWUg emVybyA9IGJ1aWxkX2ludF9jc3QgKGdjb3ZfdHlwZV9ub2RlLCAwKTsKKyAgICAgICAgZm9y IChlZGdlIGUgOiBFTlRSWV9CTE9DS19QVFJfRk9SX0ZOIChjZnVuKS0+c3VjY3MpCisgICAg ICAgICAgICBnc2lfaW5zZXJ0X29uX2VkZ2UgKGUsIGdpbXBsZV9idWlsZF9hc3NpZ24gKGFj YywgemVybykpOworICAgIH0KKworICAgIGF1dG9fdmVjPGdjb3ZfdHlwZV91bnNpZ25lZCwg MzI+IG1hc2tzIChuYmxvY2tzICogMik7CisgICAgbWFza3MucXVpY2tfZ3Jvd19jbGVhcmVk IChuYmxvY2tzICogMik7CisgICAgZmluZF9zdWJleHByX21hc2tzIChibG9ja3MsIG5ibG9j a3MsIG1hc2tzLmFkZHJlc3MgKCkpOworCisgICAgLyogVGhlIHRydWUvZmFsc2UgdGFyZ2V0 IGJsb2NrcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG5ibG9ja3Mgc2V0LCBidXQKKyAgICAgICB0 aGVpciBvdXRnb2luZyBlZGdlcyBzaG91bGQgbm90IGJlIGluc3RydW1lbnRlZC4KKyAgICAg Ki8KKyAgICBnY2NfYXNzZXJ0IChuYmxvY2tzID4gMik7CisKKyAgICAvKiBBZGQgaW5zdHJ1 Y3Rpb25zIGZvciB1cGRhdGluZyB0aGUgZnVuY3Rpb24tbG9jYWwgYWNjdW11bGF0b3JzLiAg Ki8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ibG9ja3MgLSAyOyBpKyspCisgICAgewor ICAgICAgICBmb3IgKGVkZ2UgZSA6IGJsb2Nrc1tpXS0+c3VjY3MpCisgICAgICAgIHsKKyAg ICAgICAgICAgIGlmICghKGUtPmZsYWdzICYgKEVER0VfVFJVRV9WQUxVRSB8IEVER0VfRkFM U0VfVkFMVUUpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAg LyogYWNjdSB8PSBleHByW2ldICovCisgICAgICAgICAgICBjb25zdCBpbnQgdCA9ICEhKGUt PmZsYWdzICYgRURHRV9GQUxTRV9WQUxVRSk7CisgICAgICAgICAgICB0cmVlIHJocyA9IGJ1 aWxkX2ludF9jc3QgKGdjb3ZfdHlwZV9ub2RlLCAxVUxMIDw8IGkpOworICAgICAgICAgICAg ZW1pdF9iaXR3aXNlX29wIChlLCBhY2N1W3RdLCBhY2N1W3RdLCBCSVRfSU9SX0VYUFIsIHJo cyk7CisKKyAgICAgICAgICAgIGlmIChtYXNrc1syKmkgKyB0XSA9PSAwKQorICAgICAgICAg ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBhY2N1ICY9IG1hc2tbaV0gKi8K KyAgICAgICAgICAgIHRyZWUgbWFzayA9IGJ1aWxkX2ludF9jc3QgKGdjb3ZfdHlwZV9ub2Rl LCB+bWFza3NbMippICsgdF0pOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAy OyBqKyspCisgICAgICAgICAgICAgICAgZW1pdF9iaXR3aXNlX29wIChlLCBhY2N1W2pdLCBh Y2N1W2pdLCBCSVRfQU5EX0VYUFIsIG1hc2spOworICAgICAgICB9CisgICAgfQorCisgICAg LyogQWRkIGluc3RydWN0aW9ucyBmb3IgdXBkYXRpbmcgdGhlIGdsb2JhbCBhY2N1bXVsYXRv cnMuICAqLworICAgIGJhc2ljX2Jsb2NrIGV4aXQgPSBFWElUX0JMT0NLX1BUUl9GT1JfRk4g KGNmdW4pOworICAgIGZvciAoZWRnZSBlIDogZXhpdC0+cHJlZHMpCisgICAgeworICAgICAg ICBmb3IgKGludCBrID0gMDsgayA8IDI7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAg dHJlZSByZWYgPSB0cmVlX2NvdmVyYWdlX2NvdW50ZXJfcmVmCisgICAgICAgICAgICAgICAg KEdDT1ZfQ09VTlRFUl9DT05EUywgMipjb25kbm8gKyBrKTsKKworICAgICAgICAgICAgdHJl ZSB0bXAgPSBtYWtlX3RlbXBfc3NhX25hbWUKKyAgICAgICAgICAgICAgICAoZ2Nvdl90eXBl X25vZGUsIE5VTEwsICJfX2NvbmRpdGlvbnNfdG1wIik7CisgICAgICAgICAgICBnYXNzaWdu ICpyZWFkID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAodG1wLCByZWYpOworICAgICAgICAgICAg Z3NpX2luc2VydF9vbl9lZGdlIChlLCByZWFkKTsKKworICAgICAgICAgICAgdHJlZSByb3Ag PSBnaW1wbGVfYXNzaWduX2xocyAocmVhZCk7CisgICAgICAgICAgICBlbWl0X2JpdHdpc2Vf b3AgKGUsIHVuc2hhcmVfZXhwciAocmVmKSwgYWNjdVtrXSwgQklUX0lPUl9FWFBSLCByb3Ap OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ibG9ja3MgLSAyOworfQorCisj dW5kZWYgQ09ORElUSU9OU19NQVhfVEVSTVMKKwogLyogRG8gaW5pdGlhbGl6YXRpb24gd29y ayBmb3IgdGhlIGVkZ2UgcHJvZmlsZXIuICAqLwogCiAvKiBBZGQgY29kZToKLS0gCjIuMjAu MQoK --------------eAUx0AewlUQuOIkJO7QBb0GY--