From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by sourceware.org (Postfix) with ESMTPS id 6AF38385782D for ; Mon, 28 Mar 2022 13:52:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6AF38385782D Received: by mail-pj1-x102e.google.com with SMTP id p4-20020a17090ad30400b001c7ca87c05bso9996904pju.1 for ; Mon, 28 Mar 2022 06:52:26 -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:to:cc:references:content-language:in-reply-to; bh=NxlSon7CChsdSfqGTRJ9G7nKraz9O9sufCq4agvCrFM=; b=icntnm0SrLXyqUCzytGRTQ5ispOOCQ5AzT8yFKPNSgKXqPjncZmQp8hwbMyoIqZaIL CpqSz9+9LR+r4U1JOSsK0PBVWmuqNJikJFifeP6MNlgHOVNsnF4gg4DxuUeWo3hp64c1 wndu0plwa5kS8ptiSOeUSDeIE5AvNG9IQirENPAmRo9NBWo4AJN/LSTI/+o2wkZNk3AA /zD6oPMHsBympVXhf0nfRVq3c5hLqA0Vj4j0oF8CcDhl4pkXaFUM6RNKubqMkp2gDFrN 1w1w6BfMpvlasYEsRGmfboNe8KAMburi0TvrzLtfML3dBBznZ4Dw0PEZFb2Ue3vBnRbU XCYA== X-Gm-Message-State: AOAM531HYFBZSt7s5WuuXAO3RTqcYKnQGXCzMaOzE2VZ0AhWlL2Kmcyc 5qxSyPz/F+Mhv0uxmcH9WFCWxBles94g1FdbxJsiqaUKFyY80sY6PRxdHOV49Hoel8r1w9d+a4a Kkk8vGDu26/RTrdjWbFlDWPivi2G4jojDugia/EkMM0Yd55crpcoqWm4KC2up+sz0vQtiQ7PO6H dEP8ikcz3bRBvpLf4tWBc= X-Google-Smtp-Source: ABdhPJyTINtqFJMvvA7CB8eQTqJIDsrnPmoeqQTLMBoa3f9EIUt7GjzOxQh0CUcTrtk3QjfOjXeAcg== X-Received: by 2002:a17:90b:3ec9:b0:1c7:74f6:ae6e with SMTP id rm9-20020a17090b3ec900b001c774f6ae6emr36710518pjb.212.1648475544464; Mon, 28 Mar 2022 06:52:24 -0700 (PDT) Received: from [172.16.185.109] ([103.175.111.222]) by smtp.gmail.com with ESMTPSA id i128-20020a639d86000000b00381f29d87aasm12909452pgd.92.2022.03.28.06.52.21 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 28 Mar 2022 06:52:23 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------DX2gGx7OWgaoz6YgdSKBs14e" Message-ID: <8041d06d-219d-c83a-ff8f-9c75227cb072@woven-planet.global> Date: Mon, 28 Mar 2022 15:52:15 +0200 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 To: gcc-patches@gcc.gnu.org References: Content-Language: en-US In-Reply-To: X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, WEIRD_PORT 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, 28 Mar 2022 13:52:35 -0000 This is a multi-part message in MIME format. --------------DX2gGx7OWgaoz6YgdSKBs14e Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hello, I have made some changes based on the review feedback, please have a look. In summary: * Support for -profile=atomic * gcc -fprofile-conditions does not ICE without -fprofile-arcs * Indentation and formatting complies with contrib/GNU_style_check * Some small adjustment to documentation, phrasing As mentioned in the previous message, I think it should only be necessary to do atomic fetch/store on the global accumulators, not the locals (as they are specific to the activation record). If is wrong then I have no problems extending the atomics to the function-local accumulators too, please let me know. I added a simple test case for -profile=update, gcov-20.c. I've added checks for profile_condition_flag everywhere the profile_arc_flag is checked, as they share the same code paths and infrastructure. I also made it so that -fprofile-conditions is sufficient for linking gcov. gcc will no longer crash on -fprofile-conditions -fprofile-generate by explicitly checking coverage_begin_*. I'm not too happy with how it turned out, but the condition coverage needs a lot more analysis before it can write out its gcov structure, which doesn't fit with the flow of branch_prob (). Thanks, Jørgen On 25/03/2022 20:44, Jørgen Kvalsvik wrote: > Hello, and thanks for the review! > >> 1) Do I correctly understand that __conditions_accu_true/false track >> every short-circuit sub-expression of a condition and record >> if a given sub-expr is seen to be true or false? > > Sort-of. It is not really aware of sub-expressions at all, but tracks every > boolean condition/term in the full expression, mapped to a bitvector. I usually > find it easier to understand visually: > > if (a || (b && c) || d) > > terms | a b c d > ------|-------- > true | 0 0 0 0 > false | 0 0 0 0 > > Whenever a = true, true becomes 1000 and false remains 0000. a = true would > short-circuit, (implemented as a normal edge to the "exit" node of the > expression) leaving bcd unevaluated. Coverage is then determined as the number > of unset bits in this vector. The accumulators are zero'd on every function > entry, and |= into the global "counter" on function exit. > >> 2) As mentioned these are bit sets, can you please explain why you (& >> -value) from these sets? > > Yes, excellent question. This should answer 3) too, and is the most surprsing > thing when unfamiliar with MC/DC. > > For modified condition/decision coverage we need to prove that a condition's > value independently affects the outcome/decision. In other words, would > flipping a condition change the outcome? > > Let's take your if (a || b) check, which says that 1/4 conditions are covered > on (0, 1). If a = 1, the expression is always true, and b is never evaluated. > In fact, the value of b does not change the outcome at all, so intuitively only > 1/4 of the conditions are covered. > > On (0, 1) b gets evaluated, so in a way we know that a = 0. However, the value > of a will no longer affect the outcome because (* || 1) is always true. In a > way, you can think of it as reverse short-circuiting, the same thing would > happen on (* && 0). This is what Wahlen, Heimdahl, and De Silva calls masking. > What I do is figure out when masking must happen by analyzing the CFG and zero > out the bits that are masked (i.e. no longer affect the outcome). This is in > practice what happens to the bits when regular short circuiting happen. > > So while (0, 1) "sees" the condition a = false, it cannot prove that it > mattered based on your inputs. In general, you need N+1 test cases to cover N > conditionals with MC/DC. As a consequence, the only way of covering a = false > is (0, 0), which alone would be 2/4 cases covered. > > I hope this made it clearer, if not I can write a more elaborate explanation > with more examples. > >> 4) I noticed various CFG patterns in tree-profile.cc which are handled. Can >> you please explain how the algorithm works even without knowing the original >> paper? > > My paper is not written yet, but I will describe the high-level algorithm (+ > extracts from source comments) at the end of this email, as it is a bit long. > >> 5) I noticed the following ICE: > Yes, this is an unfortunate flaw - I piggyback on the setup done by branch > coverage, which means I silently assume --coverage is used. I was unsure what > to do (and meant to ask, sorry!) as it is a larger decision - should > condition-coverage also imply branch coverage? Should condition coverage work > on its own? Other options? > > I'm happy to implement either strategy - please advise on what you would > prefer. > > >> 6) Please follow the GNU coding style, most notable we replace 8 spaces with >> a tab. And we break line before {, (, ... Remove noexcept specifiers for >> functions and I think most of the newly added functions can be static. And >> each newly added function should have a comment. > > Sure thing, I'll add some tabs. All the helper functions are already static (in > an unnamed namespace), but I can remove the namespace and/or add static. > >> 7) Please consider supporting of -profile-update=atomic where you'll need to >> utilize an atomic builts (see how other instrumentation looks like with >> it). > Will do! I always intended to support the atomics, not having them there is an > oversight. To confirm, I will only need to use atomics for the global counters, > right? The per-call accumulators are local to each activation record and should > not need the atomics, or am I missing something? > > ALGORITHM > > Phase 1: expression isolation from CFG analysis > > Break the CFG into smaller pieces ("sections") by splitting it on dominators. > No expression can cross a dominator, so becomes a natural way of terminating > expression searches. > > For each section, do a BFS from the root node and collect all reachable nodes > following edges that point to "conditional" nodes, i.e. nodes with outgoing > true&false edges. Series of single-parent single-exit nodes are contracted. > This gives a good estimate for an expression, but might include conditions in > the if/else blocks. > > The algorithm then collects the immediate neighborhood, i.e. all nodes adjacent > to the collected set, dropping everything in the set itself. Then, a new BFS is > performed, but now "upwards" (i.e. following predecessors), skipping any > neighbor not dominated by the root (this eliminates loops and other expressions > with the same "exit" block, see BFS-up). The intersection of all the paths > found with this BFS is the isolated expression. > > If the root is not a conditional, it is skipped and it's successor > becomes the new root. If an expression is found it has a pair of "expression > sucessors", and the algorithm recurses into both, evaluating this sub-section > in isolation, i.e. > > if (a || b) { > root: > if (c && d) { > ... > } > ... > sink: > } > > The sections between the root and sink labels are evaulated as if the outer > expression did not exist. > > From the comments: > > 1. Collect all nodes reachable from the root node through (contracted) paths > of true/false edges. > 2. Collect the neighbors of the reachable node (set). > 3. From every node in the neighborhood, walk the up the CFG and mark every > reachable node. Only the nodes reachable from *every* node in the > neighborhood are a part of the first expression. > 4. Record the expression plus the two successors of the last (highest-index) > node in the expression, i.e. the last term. > 5. Repeat using the two successors as new root nodes. > > It is not guaranteed to find nodes in the order of the expression, i.e. it > might find (a || b) && c as [a c b], so the output is sorted by > basic_block->index. > > Steps 2 and 3 are necessary to distinguish chained conditionals from > multi-term conditionals, e.g. to separate > > if (a) > { > if (b) > work (); > } > if (a && b) > work (); > > > On BFS-up: > > Either block of a conditional could have more decisions and loops, so > isolate the first decision by set-intersecting all paths from the > post-dominator to the entry block. > > The function returns the number of blocks from n that make up the leading > expression in prefix order (i.e. the order expected by the instrumenting > code). When this function returns 0 there are no decisions between pre and > post, and this segment of the CFG can safely be skipped. > > The post nodes can have predecessors that do not belong to this subgraph, > which are skipped. This is expected, for example when there is a > conditional in the else-block of a larger expression: > > if (A) > { > if (B) {} > } else { > if (C) {} else {} > } > > A > t / \ f > / \ > B C > /\ / \ > / \ T F > T \ \ / > \ | o > \ | / > \ | / > \|/ > E > > Processing [B, E) which looks like: > > B > /| > / | > T | > \ / > E ----> o // predecessor outside [B, e) > > > Phase 2: Masking vector and instrumentation > > The input to this phase is the basic blocks that make up every expression, plus > its two exit nodes, i.e. the 3-term expression (a || b || c) yields the input > [a b c T F] to phase 2. > > For every expression, allocate two local accumulators (bit-vectors), one for > the true-vector, one for the false-vector. These are zero'd on function entry > and flushed on function exit. > > For each "conditional" block (a b c), unconditionally set the corresponding bit > when an edge in the CFG is taken. Rough pseudo-gimple illustration: > > if (a) { > accu_true |= 1 << 0 > goto done; > } else { > accu_false |= 1 << 0 > if (b) { > accu_true |= 1 << 1; > goto done; > } else { > accu_false |= 1 << 1; > ... > } > } > > global_true[expr_n] |= accu_true > global_false[expr_n] |= accu_false > > This alone would more-or-less be branch coverage, but would not prove that > terms would independently decide the outcome. To find masking, the expression > is walked in search of triangles. A || B as a decision diagram becomes > > A > t|\f > | \ > | B > |t/ \f > |/ \ > T F > > and we search for triangles like ATB, that is nodes with 2 predecessors with > the same boolean value, where the two predecessors are connected with the > opposite value. This marks a candidate for masking, and the terms masked are > determined by chasing predecessors starting at the top of the triangle for as > long as the chain of predecessors have the same truth value as the "exit" > edges. This set is often empty. > > The edge that triggers masking is then instrumented with a accu &= mask which > wipes out anything that does not independently affect the outcome. Note that > nothing is ever wiped from the global accumulator, only the local. The (a || b) > example had a false vector of [1, 0] at some point, but it was wiped by the > masking operation (b = 1 is the only masking value for a || b). > > From the comments: > > Scan the blocks that make up an expression and look for conditions that > would mask other conditions. For a deeper discussion on masking, see > Whalen, Heimdahl, De Silva "Efficient Test Coverage Measurement for MC/DC". > Masking is best illustrated with an example: > > A || B. If B is true then A will does not independently affect the > decision. In a way, this is "reverse" short circuiting, and always work on > the right-hand side of expressions. * || true is always true and * && > false is always false - the left-hand-side does not affect the outcome, and > their values should not contribute to modified condition/decision coverage. > > A || B interpreted as a decision diagram becomes: > > A > t|\f > | \ > | B > |t/ \f > |/ \ > T F > > The algorithm looks for triangles like ATB. Masking right-hand sides happen > when a block has a pair of incoming edges of the same boolean value, and > there is an edge connecting the two predecessors with the *opposite* boolean > value. The masking block is B, and the masked block is A. In this > particular example: > > Masking can affect "outside" its own subexpression; in A || (B && C) if C is > false, B is masked. However, if (B && C) is true, A gets masked. B && C > can be determined from evaluating C since !B would short-circuit, so a true > C would mask A. > > A > t|\f > | \ > | \ > | \ > | B > | t/ \f > | C | > |t/ \f | > |/ \ | > T F > > Notice how BFC forms a triangle. Expressions masked by an edge are > determined by: > * Go to the predecessor with truth value b (if it exists). > * Follow the path of ancestors with taking only !b edges, recording every > node from here on. > > For the case where C can mask A, the path goes C [true]-> B -> [false] A, so > C [true] masks A. > > The mask is output as a bit-set stored in a gcov_type_unsigned. The > bit-sets are output in pairs, one for each decision (the outcome of the > boolean expression, or which arc to take in the CFG). > > Phase 3: reading the report > > This is pretty standard gcov stuff, except the "counters" are interpreted as > bitsets, and the number of terms in the expressions is stored. Coverage then > becomes popcount / expected. > > Final remarks: > > Granted, this is a bit dense, but I think the overall approach is easy to grasp > when supported by a lot of example graphs and stepping. I will try to type up a > bunch with the paper and publish, but for now all I have is the code (which I > hope for the most part is easy to follow). I'll update this with style updates > and atomics support, but I would prefer a maintainer to make the call if this > condition coverage should imply branch coverage, or if it should work without it. > > Thanks, > Jørgen > > On 24/03/2022 17:08, Martin Liška via Gcc-patches wrote: >> On 3/21/22 12:55, Jørgen Kvalsvik via Gcc-patches wrote: >> >> Hello. >> >> Thanks for very interesting extension of the existing GCOV profiling. >> >> I briefly read the patch and investigated what happens and I've got various >> questions/comments about it: >> >> 1) Do I correctly understand that __conditions_accu_true/false track >> every short-circuit sub-expression of a condition and record >> if a given sub-expr is seen to be true or false? >> >> 2) As mentioned these are bit sets, can you please explain why you (& -value) >> from these sets? >> >> 3) I noticed a false report for a simple test-case: >> >> $ cat cond.c >> int x; >> >> void foo (int a, int b) >> { >> if (a || b) >> x = 1; >> else >> x = 2; >> } >> >> int main() >> { >> foo (0, 1); >> return 0; >> } >> >> $ rm *gcda ; gcc --coverage cond.c -fprofile-conditions && ./a.out && gcov -g -t a-cond.c >> -: 0:Source:cond.c >> -: 0:Graph:a-cond.gcno >> -: 0:Data:a-cond.gcda >> -: 0:Runs:1 >> -: 1:int x; >> -: 2: >> 1: 3:void foo (int a, int b) >> -: 4:{ >> 1: 5: if (a || b) >> conditions covered 1/4 >> condition 0 not covered (true) >> condition 0 not covered (false) <-- this was executed if I'm correct >> condition 1 not covered (false) >> 1: 6: x = 1; >> -: 7: else >> #####: 8: x = 2; >> 1: 9:} >> -: 10: >> 1: 11:int main() >> -: 12:{ >> 1: 13: foo (0, 1); >> 1: 14: return 0; >> -: 15:} >> >> 4) I noticed various CFG patterns in tree-profile.cc which are handled. Can you please >> explain how the algorithm works even without knowing the original paper? >> >> 5) I noticed the following ICE: >> >> $ gcc cond.c -fprofile-conditions -fprofile-generate >> during IPA pass: profile >> cond.c: In function ?foo?: >> cond.c:15:1: internal compiler error: Segmentation fault >> 15 | } >> | ^ >> 0xf4d64a crash_signal >> /home/marxin/Programming/gcc/gcc/toplev.cc:322 >> 0x7ffff78b93cf ??? >> /usr/src/debug/glibc-2.35-2.1.x86_64/signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0 >> 0x7ffff78f29ed __GI__IO_ftell >> /usr/src/debug/glibc-2.35-2.1.x86_64/libio/ioftell.c:37 >> 0xa9dfda gcov_position >> /home/marxin/Programming/gcc/gcc/gcov-io.cc:48 >> 0xa9dfda gcov_write_tag(unsigned int) >> /home/marxin/Programming/gcc/gcc/gcov-io.cc:321 >> 0xe9734a branch_prob(bool) >> /home/marxin/Programming/gcc/gcc/profile.cc:1542 >> 0x1032e08 tree_profiling >> /home/marxin/Programming/gcc/gcc/tree-profile.cc:1620 >> 0x1032e08 execute >> /home/marxin/Programming/gcc/gcc/tree-profile.cc:1726 >> Please submit a full bug report, with preprocessed source (by using -freport-bug). >> Please include the complete backtrace with any bug report. >> See for instructions. >> >> 6) Please follow the GNU coding style, most notable we replace 8 spaces with a tab. >> And we break line before {, (, ... Remove noexcept specifiers for functions and I think >> most of the newly added functions can be static. And each newly added function should >> have a comment. >> >> 7) Please consider supporting of -profile-update=atomic where you'll need to utilize >> an atomic builts (see how other instrumentation looks like with it). >> >> That's the very first round of the review. Hope it's helpful. >> >> Cheers, >> Martin >> >>> 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 > --------------DX2gGx7OWgaoz6YgdSKBs14e 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 RnJvbSA1M2Q0MDRhNmU4MzY4NzVkODI0M2VhNzFjMmFlYjkyMTE1MjI0Zjk4IE1vbiBTZXAg 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+ CgpnY2MvQ2hhbmdlTG9nOgoKCSogYnVpbHRpbnMuY2MgKGV4cGFuZF9idWlsdGluX2Zvcmtf b3JfZXhlYyk6IENoZWNrCglwcm9maWxlX2NvbmRpdGlvbl9mbGFnLgoJKiBjb21tb24ub3B0 OiBBZGQgbmV3IG9wdGlvbnMgLWZwcm9maWxlLWNvbmRpdGlvbnMgYW5kCgktV2NvdmVyYWdl LXRvby1tYW55LWNvbmRpdGlvbnMuCgkqIGRvYy9nY292LnRleGk6IEFkZCAtLWNvbmRpdGlv bnMgZG9jdW1lbnRhdGlvbi4KCSogZG9jL2ludm9rZS50ZXhpOiBBZGQgLWZwcm9maWxlLWNv bmRpdGlvbnMgZG9jdW1lbnRhdGlvbi4KCSogZ2NjLmNjOiBMaW5rIGdjb3Ygb24gLWZwcm9m aWxlLWNvbmRpdGlvbnMuCgkqIGdjb3YtY291bnRlci5kZWYgKEdDT1ZfQ09VTlRFUl9DT05E Uyk6IE5ldy4KCSogZ2Nvdi1pby5oIChHQ09WX1RBR19DT05EUyk6IE5ldy4KCShHQ09WX1RB R19DT05EU19MRU5HVEgpOiBMaWtld2lzZS4KCShHQ09WX1RBR19DT05EU19OVU0pOiBMaWtl d2lzZS4KCSogZ2Nvdi5jYyAoY2xhc3MgY29uZGl0aW9uX2luZm8pOiBOZXcuCgkoY29uZGl0 aW9uX2luZm86OmNvbmRpdGlvbl9pbmZvKTogTmV3LgoJKGNvbmRpdGlvbl9pbmZvOjpwb3Bj b3VudCk6IE5ldy4KCShzdHJ1Y3QgY292ZXJhZ2VfaW5mbyk6IE5ldy4KCShhZGRfY29uZGl0 aW9uX2NvdW50cyk6IE5ldy4KCShvdXRwdXRfY29uZGl0aW9ucyk6IE5ldy4KCShwcmludF91 c2FnZSk6IEFkZCAtZywgLS1jb25kaXRpb25zLgoJKHByb2Nlc3NfYXJncyk6IExpa2V3aXNl LgoJKG91dHB1dF9pbnRlcm1lZGlhdGVfanNvbl9saW5lKTogT3V0cHV0IGNvbmRpdGlvbnMu CgkocmVhZF9ncmFwaF9maWxlKTogUmVhZCBjb25kaXRpb25zIGNvdW50ZXJzLgoJKHJlYWRf Y291bnRfZmlsZSk6IFJlYWQgY29uZGl0aW9ucyBjb3VudGVycy4KCShmaWxlX3N1bW1hcnkp OiBQcmludCBjb25kaXRpb25zLgoJKGFjY3VtdWxhdGVfbGluZV9pbmZvKTogQWNjdW11bGF0 ZSBjb25kaXRpb25zLgoJKG91dHB1dF9saW5lX2RldGFpbHMpOiBQcmludCBjb25kaXRpb25z LgoJKiBpcGEtaW5saW5lLmNjIChjYW5fZWFybHlfaW5saW5lX2VkZ2VfcCk6IENoZWNrCglw cm9maWxlX2NvbmRpdGlvbl9mbGFnLgoJKiBpcGEtc3BsaXQuY2MgKHBhc3Nfc3BsaXRfZnVu Y3Rpb25zOjpnYXRlKTogTGlrZXdpc2UuCgkqIHBhc3Nlcy5jYyAoZmluaXNoX29wdGltaXph dGlvbl9wYXNzZXMpOiBMaWtld2lzZS4KCSogcHJvZmlsZS5jYyAoZmluZF9jb25kaXRpb25z KTogTmV3IGRlY2xhcmF0aW9uLgoJKGluc3RydW1lbnRfZGVjaXNpb25zKTogTmV3IGRlY2xh cmF0aW9uLgoJKGJyYW5jaF9wcm9iKTogQ2FsbCBmaW5kX2NvbmRpdGlvbnMsIGluc3RydW1l bnRfZGVjaXNpb25zLgoJKGluaXRfYnJhbmNoX3Byb2IpOiBBZGQgdG90YWxfbnVtX2NvbmRz LgoJKGVuZF9icmFuY2hfcHJvYik6IExpa2V3aXNlLgoJKiB0cmVlLXByb2ZpbGUuY2MgKElO Q0xVREVfQUxHT1JJVEhNKTogRGVmaW5lLgoJKHN0cnVjdCBjb25kc19jdHgpOiBOZXcuCgko Q09ORElUSU9OU19NQVhfVEVSTVMpOiBOZXcuCgkoaW5kZXhfb2YpOiBOZXcuCgkoaW5kZXhf bHQpOiBOZXcuCgkoc2luZ2xlKTogTmV3LgoJKHNpbmdsZV9lZGdlKTogTmV3LgoJKGNvbnRy YWN0X2VkZ2UpOiBOZXcuCgkoY29udHJhY3RfZWRnZV91cCk6IE5ldy4KCShpc19jb25kaXRp b25hbF9wKTogTmV3LgoJKGNvbGxlY3RfbmVpZ2hib3JzKTogTmV3LgoJKGZpbmRfZmlyc3Rf Y29uZGl0aW9uYWwpOiBOZXcuCgkoZW1pdF9iaXR3aXNlX29wKTogTmV3LgoJKGNvbGxlY3Rf Y29uZGl0aW9ucyk6IE5ldy4KCShmaW5kX2NvbmRpdGlvbnMpOiBOZXcuCgkoaW5zdHJ1bWVu dF9kZWNpc2lvbnMpOiBOZXcuCgkocGFzc19pcGFfdHJlZV9wcm9maWxlOjpnYXRlKTogQ2hl Y2sgcHJvZmlsZV9jb25kaXRpb25fZmxhZy4KCmdjYy90ZXN0c3VpdGUvQ2hhbmdlTG9nOgoK CSogbGliL2djb3YuZXhwOiBBZGQgY29uZGl0aW9uIGNvdmVyYWdlIHRlc3QgZnVuY3Rpb24u CgkqIGcrKy5kZy9nY292L2djb3YtMTguQzogTmV3IHRlc3QuCgkqIGdjYy5taXNjLXRlc3Rz L2djb3YtMTkuYzogTmV3IHRlc3QuCgkqIGdjYy5taXNjLXRlc3RzL2djb3YtMjAuYzogTmV3 IHRlc3QuCi0tLQogZ2NjL2J1aWx0aW5zLmNjICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDIgKy0KIGdjYy9jb21tb24ub3B0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4ICsK IGdjYy9kb2MvZ2Nvdi50ZXhpICAgICAgICAgICAgICAgICAgICAgIHwgIDM2ICsKIGdjYy9k b2MvaW52b2tlLnRleGkgICAgICAgICAgICAgICAgICAgIHwgIDE5ICsKIGdjYy9nY2MuY2Mg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyICstCiBnY2MvZ2Nvdi1jb3VudGVy LmRlZiAgICAgICAgICAgICAgICAgICB8ICAgMyArCiBnY2MvZ2Nvdi1pby5oICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgMyArCiBnY2MvZ2Nvdi5jYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDE5MyArKysrKy0KIGdjYy9pcGEtaW5saW5lLmNjICAgICAgICAgICAg ICAgICAgICAgIHwgICAyICstCiBnY2MvaXBhLXNwbGl0LmNjICAgICAgICAgICAgICAgICAg ICAgICB8ICAgMyArLQogZ2NjL3Bhc3Nlcy5jYyAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDMgKy0KIGdjYy9wcm9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcy ICstCiBnY2MvdGVzdHN1aXRlL2crKy5kZy9nY292L2djb3YtMTguQyAgICB8IDIyNyArKysr KysrCiBnY2MvdGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMTkuYyB8IDcyNyArKysr KysrKysrKysrKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MubWlzYy10ZXN0cy9nY292LTIw LmMgfCAgMjEgKwogZ2NjL3Rlc3RzdWl0ZS9saWIvZ2Nvdi5leHAgICAgICAgICAgICAgfCAx ODcgKysrKystCiBnY2MvdHJlZS1wcm9maWxlLmNjICAgICAgICAgICAgICAgICAgICB8IDg4 MyArKysrKysrKysrKysrKysrKysrKysrKystCiAxNyBmaWxlcyBjaGFuZ2VkLCAyMzY2IGlu c2VydGlvbnMoKyksIDI1IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90 ZXN0c3VpdGUvZysrLmRnL2djb3YvZ2Nvdi0xOC5DCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2Nj L3Rlc3RzdWl0ZS9nY2MubWlzYy10ZXN0cy9nY292LTE5LmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBnY2MvdGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMjAuYwoKZGlmZiAtLWdpdCBh L2djYy9idWlsdGlucy5jYyBiL2djYy9idWlsdGlucy5jYwppbmRleCA0YzZjMjkzOTA1My4u NjY5OTM2ZWY3YjYgMTAwNjQ0Ci0tLSBhL2djYy9idWlsdGlucy5jYworKysgYi9nY2MvYnVp bHRpbnMuY2MKQEAgLTU1NjksNyArNTU2OSw3IEBAIGV4cGFuZF9idWlsdGluX2Zvcmtfb3Jf ZXhlYyAodHJlZSBmbiwgdHJlZSBleHAsIHJ0eCB0YXJnZXQsIGludCBpZ25vcmUpCiAgIHRy ZWUgY2FsbDsKIAogICAvKiBJZiB3ZSBhcmUgbm90IHByb2ZpbGluZywganVzdCBjYWxsIHRo ZSBmdW5jdGlvbi4gICovCi0gIGlmICghcHJvZmlsZV9hcmNfZmxhZykKKyAgaWYgKCFwcm9m aWxlX2FyY19mbGFnICYmICFwcm9maWxlX2NvbmRpdGlvbl9mbGFnKQogICAgIHJldHVybiBO VUxMX1JUWDsKIAogICAvKiBPdGhlcndpc2UgY2FsbCB0aGUgd3JhcHBlci4gIFRoaXMgc2hv dWxkIGJlIGVxdWl2YWxlbnQgZm9yIHRoZSByZXN0IG9mCmRpZmYgLS1naXQgYS9nY2MvY29t bW9uLm9wdCBiL2djYy9jb21tb24ub3B0CmluZGV4IDhiNjUxM2RlNDdjLi4yYWZlNDM4NGQ5 ZCAxMDA2NDQKLS0tIGEvZ2NjL2NvbW1vbi5vcHQKKysrIGIvZ2NjL2NvbW1vbi5vcHQKQEAg LTg2MSw2ICs4NjEsMTAgQEAgV2NvdmVyYWdlLWludmFsaWQtbGluZS1udW1iZXIKIENvbW1v biBWYXIod2Fybl9jb3ZlcmFnZV9pbnZhbGlkX2xpbmVudW0pIEluaXQoMSkgV2FybmluZwog V2FybiBpbiBjYXNlIGEgZnVuY3Rpb24gZW5kcyBlYXJsaWVyIHRoYW4gaXQgYmVnaW5zIGR1 ZSB0byBhbiBpbnZhbGlkIGxpbmVudW0gbWFjcm9zLgogCitXY292ZXJhZ2UtdG9vLW1hbnkt Y29uZGl0aW9ucworQ29tbW9uIFZhcih3YXJuX3Rvb19tYW55X2NvbmRpdGlvbnMpIEluaXQo MSkgV2FybmluZworV2FybiB3aGVuIGEgY29uZGl0aW9uYWwgaGFzIHRvbyBtYW55IHRlcm1z IGFuZCBjb3ZlcmFnZSBnaXZlcyB1cC4KKwogV21pc3NpbmctcHJvZmlsZQogQ29tbW9uIFZh cih3YXJuX21pc3NpbmdfcHJvZmlsZSkgSW5pdCgxKSBXYXJuaW5nCiBXYXJuIGluIGNhc2Ug cHJvZmlsZXMgaW4gLWZwcm9maWxlLXVzZSBkbyBub3QgZXhpc3QuCkBAIC0yMjkwLDYgKzIy OTQsMTAgQEAgZnByb2ZpbGUtYXJjcwogQ29tbW9uIFZhcihwcm9maWxlX2FyY19mbGFnKQog SW5zZXJ0IGFyYy1iYXNlZCBwcm9ncmFtIHByb2ZpbGluZyBjb2RlLgogCitmcHJvZmlsZS1j b25kaXRpb25zCitDb21tb24gVmFyKHByb2ZpbGVfY29uZGl0aW9uX2ZsYWcpCitJbnNlcnQg Y29uZGl0aW9uIGNvdmVyYWdlIHByb2ZpbGluZyBjb2RlLgorCiBmcHJvZmlsZS1kaXI9CiBD b21tb24gSm9pbmVkIFJlamVjdE5lZ2F0aXZlIFZhcihwcm9maWxlX2RhdGFfcHJlZml4KQog U2V0IHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGZvciBzdG9yaW5nIHRoZSBwcm9maWxlIGRh dGEuCmRpZmYgLS1naXQgYS9nY2MvZG9jL2djb3YudGV4aSBiL2djYy9kb2MvZ2Nvdi50ZXhp CmluZGV4IGZjMzlkYTBmMDJkLi5hODViN2YwOTc2OSAxMDA2NDQKLS0tIGEvZ2NjL2RvYy9n Y292LnRleGkKKysrIGIvZ2NjL2RvYy9nY292LnRleGkKQEAgLTEyMiw2ICsxMjIsNyBAQCBn Y292IFtAb3B0aW9uey12fXxAb3B0aW9uey0tdmVyc2lvbn1dIFtAb3B0aW9uey1ofXxAb3B0 aW9uey0taGVscH1dCiAgICAgIFtAb3B0aW9uey1hfXxAb3B0aW9uey0tYWxsLWJsb2Nrc31d CiAgICAgIFtAb3B0aW9uey1ifXxAb3B0aW9uey0tYnJhbmNoLXByb2JhYmlsaXRpZXN9XQog ICAgICBbQG9wdGlvbnstY318QG9wdGlvbnstLWJyYW5jaC1jb3VudHN9XQorICAgICBbQG9w dGlvbnstZ318QG9wdGlvbnstLWNvbmRpdGlvbnN9XQogICAgICBbQG9wdGlvbnstZH18QG9w dGlvbnstLWRpc3BsYXktcHJvZ3Jlc3N9XQogICAgICBbQG9wdGlvbnstZn18QG9wdGlvbnst LWZ1bmN0aW9uLXN1bW1hcmllc31dCiAgICAgIFtAb3B0aW9uey1qfXxAb3B0aW9uey0tanNv bi1mb3JtYXR9XQpAQCAtMTY3LDYgKzE2OCwxMyBAQCBiZSBzaG93biwgdW5sZXNzIHRoZSBA b3B0aW9uey11fSBvcHRpb24gaXMgZ2l2ZW4uCiBXcml0ZSBicmFuY2ggZnJlcXVlbmNpZXMg YXMgdGhlIG51bWJlciBvZiBicmFuY2hlcyB0YWtlbiwgcmF0aGVyIHRoYW4KIHRoZSBwZXJj ZW50YWdlIG9mIGJyYW5jaGVzIHRha2VuLgogCitAaXRlbSAtZworQGl0ZW14IC0tY29uZGl0 aW9ucworV3JpdGUgY29uZGl0aW9uIGNvdmVyYWdlIHRvIHRoZSBvdXRwdXQgZmlsZSwgYW5k IHdyaXRlIGNvbmRpdGlvbiBzdW1tYXJ5IGluZm8KK3RvIHRoZSBzdGFuZGFyZCBvdXRwdXQu ICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNlZSBpZiB0aGUgY29uZGl0aW9ucyBpbgor eW91ciBwcm9ncmFtIGF0IGxlYXN0IG9uY2UgaGFkIGFuIGluZGVwZW5kZW50IGVmZmVjdCBv biB0aGUgb3V0Y29tZSBvZiB0aGUKK2Jvb2xlYW4gZXhwcmVzc2lvbiAobW9kaWZpZWQgY29u ZGl0aW9uL2RlY2lzaW9uIGNvdmVyYWdlKS4KKwogQGl0ZW0gLWQKIEBpdGVteCAtLWRpc3Bs YXktcHJvZ3Jlc3MKIERpc3BsYXkgdGhlIHByb2dyZXNzIG9uIHRoZSBzdGFuZGFyZCBvdXRw dXQuCkBAIC0yOTEsNiArMjk5LDcgQEAgRWFjaCBAdmFye2xpbmV9IGhhcyB0aGUgZm9sbG93 aW5nIGZvcm06CiBAewogICAiYnJhbmNoZXMiOiBbIiRicmFuY2giXSwKICAgImNvdW50Ijog MiwKKyAgImNvbmRpdGlvbnMiOiBbIiRjb25kaXRpb24iXSwKICAgImxpbmVfbnVtYmVyIjog MTUsCiAgICJ1bmV4ZWN1dGVkX2Jsb2NrIjogZmFsc2UsCiAgICJmdW5jdGlvbl9uYW1lIjog ImZvbyIsCkBAIC0zMzksNiArMzQ4LDMzIEBAIEZpZWxkcyBvZiB0aGUgQHZhcnticmFuY2h9 IGVsZW1lbnQgaGF2ZSBmb2xsb3dpbmcgc2VtYW50aWNzOgogQHZhcnt0aHJvd306IHRydWUg d2hlbiB0aGUgYnJhbmNoIGlzIGFuIGV4Y2VwdGlvbmFsIGJyYW5jaAogQGVuZCBpdGVtaXpl CiAKK0VhY2ggQHZhcntjb25kaXRpb259IGVsZW1lbnQgaGF2ZSB0aGUgZm9sbG93aW5nIHNl bWFudGljczoKKworQHNtYWxsZXhhbXBsZQorQHsKKyAgImNvdW50IjogNCwKKyAgImNvdmVy ZWQiOiAyLAorICAibm90X2NvdmVyZWRfZmFsc2UiOiBbXSwKKyAgIm5vdF9jb3ZlcmVkX3Ry dWUiOiBbMCwgMV0sCitAfQorQGVuZCBzbWFsbGV4YW1wbGUKKworRmllbGRzIG9mIHRoZSBA dmFye2NvbmRpdGlvbn0gZWxlbWVudCBoYXZlIGZvbGxvd2luZyBzZW1hbnRpY3M6CisKK0Bp dGVtaXplIEBidWxsZXQKK0BpdGVtCitAdmFye2NvdW50fTogbnVtYmVyIG9mIGNvbmRpdGlv bnMgaW4gdGhpcyBleHByZXNzaW9uCisKK0BpdGVtCitAdmFye2NvdmVyZWR9OiBudW1iZXIg b2YgY292ZXJlZCBjb25kaXRpb25zIGluIHRoaXMgZXhwcmVzc2lvbgorCitAaXRlbQorQHZh cntub3RfY292ZXJlZF90cnVlfTogdGVybXMsIGJ5IGluZGV4LCBub3Qgc2VlbiBhcyB0cnVl IGluIHRoaXMgZXhwcmVzc2lvbgorCitAaXRlbQorQHZhcntub3RfY292ZXJlZF9mYWxzZX06 IHRlcm1zLCBieSBpbmRleCwgbm90IHNlZW4gYXMgZmFsc2UgaW4gdGhpcyBleHByZXNzaW9u CitAZW5kIGl0ZW1pemUKKwogQGl0ZW0gLUgKIEBpdGVteCAtLWh1bWFuLXJlYWRhYmxlCiBX cml0ZSBjb3VudHMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0IChsaWtlIDI0LjZrKS4KZGlm ZiAtLWdpdCBhL2djYy9kb2MvaW52b2tlLnRleGkgYi9nY2MvZG9jL2ludm9rZS50ZXhpCmlu ZGV4IGUzZjJlODJjZGU1Li4wZTI0ZTQzY2E0MiAxMDA2NDQKLS0tIGEvZ2NjL2RvYy9pbnZv a2UudGV4aQorKysgYi9nY2MvZG9jL2ludm9rZS50ZXhpCkBAIC01OTQsNiArNTk0LDcgQEAg T2JqZWN0aXZlLUMgYW5kIE9iamVjdGl2ZS1DKysgRGlhbGVjdHN9LgogQGl0ZW0gUHJvZ3Jh bSBJbnN0cnVtZW50YXRpb24gT3B0aW9ucwogQHhyZWZ7SW5zdHJ1bWVudGF0aW9uIE9wdGlv bnMsLFByb2dyYW0gSW5zdHJ1bWVudGF0aW9uIE9wdGlvbnN9LgogQGdjY29wdGxpc3R7LXAg IC1wZyAgLWZwcm9maWxlLWFyY3MgIC0tY292ZXJhZ2UgIC1mdGVzdC1jb3ZlcmFnZSBAZ29s CistZnByb2ZpbGUtY29uZGl0aW9ucyBAZ29sCiAtZnByb2ZpbGUtYWJzLXBhdGggQGdvbAog LWZwcm9maWxlLWRpcj1AdmFye3BhdGh9ICAtZnByb2ZpbGUtZ2VuZXJhdGUgIC1mcHJvZmls ZS1nZW5lcmF0ZT1AdmFye3BhdGh9IEBnb2wKIC1mcHJvZmlsZS1pbmZvLXNlY3Rpb24gIC1m cHJvZmlsZS1pbmZvLXNlY3Rpb249QHZhcntuYW1lfSBAZ29sCkBAIC02MDIwLDYgKzYwMjEs MTMgQEAgZXJyb3IuICBAb3B0aW9uey1Xbm8tY292ZXJhZ2UtaW52YWxpZC1saW5lLW51bWJl cn0gY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGUKIHdhcm5pbmcgb3IgQG9wdGlvbnstV25v LWVycm9yPWNvdmVyYWdlLWludmFsaWQtbGluZS1udW1iZXJ9IGNhbiBiZSB1c2VkIHRvCiBk aXNhYmxlIHRoZSBlcnJvci4KIAorQGl0ZW0gLVduby1jb3ZlcmFnZS10b28tbWFueS1jb25k aXRpb25zCitAb3BpbmRleCBXbm8tY292ZXJhZ2UtdG9vLW1hbnktY29uZGl0aW9ucworQG9w aW5kZXggV2NvdmVyYWdlLXRvby1tYW55LWNvbmRpdGlvbnMKK1dhcm4gaW4gY2FzZSBhIGNv bmRpdGlvbiBoYXZlIHRvbyBtYW55IHRlcm1zIGFuZCBHQ0MgZ2l2ZXMgdXAgY292ZXJhZ2Uu CitDb3ZlcmFnZSBpcyBnaXZlbiB1cCB3aGVuIHRoZXJlIGFyZSBtb3JlIHRlcm1zIGluIHRo ZSBjb25kaXRpb25hbCB0aGFuIHRoZXJlCithcmUgYml0cyBpbiBhIEBjb2Rle2djb3ZfdHlw ZV91bnNpZ25lZH0uICBUaGlzIHdhcm5pbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorCiBA aXRlbSAtV25vLWNwcCBAcnsoQywgT2JqZWN0aXZlLUMsIEMrKywgT2JqZWN0aXZlLUMrKyBh bmQgRm9ydHJhbiBvbmx5KX0KIEBvcGluZGV4IFduby1jcHAKIEBvcGluZGV4IFdjcHAKQEAg LTE1MjcxLDYgKzE1Mjc5LDEzIEBAIEUuZy4gQGNvZGV7Z2NjIGEuYyBiLmMgLW8gYmluYXJ5 fSB3b3VsZCBnZW5lcmF0ZSBAZmlsZXtiaW5hcnktYS5nY2RhfSBhbmQKIAogQHhyZWZ7Q3Jv c3MtcHJvZmlsaW5nfS4KIAorQGl0ZW0gLWZwcm9maWxlLWNvbmRpdGlvbnMKK0BvcGluZGV4 IGZwcm9maWxlLWNvbmRpdGlvbnMKK0FkZCBjb2RlIHNvIHRoYXQgcHJvZ3JhbSBjb25kaXRp b25zIGFyZSBpbnN0cnVtZW50ZWQuICBEdXJpbmcgZXhlY3V0aW9uIHRoZQorcHJvZ3JhbSBy ZWNvcmRzIHdoYXQgdGVybXMgaW4gYSBjb25kaXRpb25hbCBjb250cmlidXRlcyB0byBhIGRl Y2lzaW9uLiAgVGhlCitkYXRhIG1heSBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGFsbCB0ZXJt cyBpbiBhIGJvb2xlYW5zIGFyZSB0ZXN0ZWQgYW5kIGhhdmUgYW4KK2VmZmVjdCBvbiB0aGUg b3V0Y29tZSBvZiBhIGNvbmRpdGlvbi4KKwogQGNpbmRleCBAY29tbWFuZHtnY292fQogQGl0 ZW0gLS1jb3ZlcmFnZQogQG9waW5kZXggY292ZXJhZ2UKQEAgLTE1MzMxLDYgKzE1MzQ2LDEw IEBAIGV4ZWN1dGVkLiAgV2hlbiBhbiBhcmMgaXMgdGhlIG9ubHkgZXhpdCBvciBvbmx5IGVu dHJhbmNlIHRvIGEgYmxvY2ssIHRoZQogaW5zdHJ1bWVudGF0aW9uIGNvZGUgY2FuIGJlIGFk ZGVkIHRvIHRoZSBibG9jazsgb3RoZXJ3aXNlLCBhIG5ldyBiYXNpYwogYmxvY2sgbXVzdCBi ZSBjcmVhdGVkIHRvIGhvbGQgdGhlIGluc3RydW1lbnRhdGlvbiBjb2RlLgogCitXaXRoIEBv cHRpb257LWZwcm9maWxlLWNvbmRpdGlvbnN9LCBmb3IgZWFjaCBjb25kaXRpb25hbCBpbiB5 b3VyIHByb2dyYW0gR0NDCitjcmVhdGVzIGEgYml0c2V0IGFuZCByZWNvcmRzIHRoZSBib29s ZWFuIHZhbHVlcyB0aGF0IGhhdmUgYW4gaW5kZXBlbmRlbnQgZWZmZWN0CitvbiB0aGUgb3V0 Y29tZSBvZiB0aGF0IGV4cHJlc3Npb24uCisKIEBuZWVkIDIwMDAKIEBpdGVtIC1mdGVzdC1j b3ZlcmFnZQogQG9waW5kZXggZnRlc3QtY292ZXJhZ2UKZGlmZiAtLWdpdCBhL2djYy9nY2Mu Y2MgYi9nY2MvZ2NjLmNjCmluZGV4IGE0ZDg2M2NhNDU3Li41YTI1YTQ3YjdkMCAxMDA2NDQK LS0tIGEvZ2NjL2djYy5jYworKysgYi9nY2MvZ2NjLmNjCkBAIC0xMTY1LDcgKzExNjUsNyBA QCBwcm9wZXIgcG9zaXRpb24gYW1vbmcgdGhlIG90aGVyIG91dHB1dCBmaWxlcy4gICovCiAJ JTppbmNsdWRlKGxpYmdvbXAuc3BlYyklKGxpbmtfZ29tcCl9XAogICAgICV7ZmdudS10bTol OmluY2x1ZGUobGliaXRtLnNwZWMpJShsaW5rX2l0bSl9XAogICAgICUobWZsaWIpICIgU1RB Q0tfU1BMSVRfU1BFQyAiXAotICAgICV7ZnByb2ZpbGUtYXJjc3xmcHJvZmlsZS1nZW5lcmF0 ZSp8Y292ZXJhZ2U6LWxnY292fSAiIFNBTklUSVpFUl9TUEVDICIgXAorICAgICV7ZnByb2Zp bGUtYXJjc3xmcHJvZmlsZS1jb25kaXRpb25zfGZwcm9maWxlLWdlbmVyYXRlKnxjb3ZlcmFn ZTotbGdjb3Z9ICIgU0FOSVRJWkVSX1NQRUMgIiBcCiAgICAgJXshbm9zdGRsaWI6JXshcjol eyFub2RlZmF1bHRsaWJzOiUobGlua19zc3ApICUobGlua19nY2NfY19zZXF1ZW5jZSl9fX1c CiAgICAgJXshbm9zdGRsaWI6JXshcjoleyFub3N0YXJ0ZmlsZXM6JUV9fX0gJXtUKn0gIFxu JShwb3N0X2xpbmspIH19fX19fSIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2NjL2djb3YtY291 bnRlci5kZWYgYi9nY2MvZ2Nvdi1jb3VudGVyLmRlZgppbmRleCA2ZDIxODJiZDNkYi4uOTY1 NjNhNTlhNDUgMTAwNjQ0Ci0tLSBhL2djYy9nY292LWNvdW50ZXIuZGVmCisrKyBiL2djYy9n Y292LWNvdW50ZXIuZGVmCkBAIC00OSwzICs0OSw2IEBAIERFRl9HQ09WX0NPVU5URVIoR0NP Vl9DT1VOVEVSX0lPUiwgImlvciIsIF9pb3IpCiAKIC8qIFRpbWUgcHJvZmlsZSBjb2xsZWN0 aW5nIGZpcnN0IHJ1biBvZiBhIGZ1bmN0aW9uICovCiBERUZfR0NPVl9DT1VOVEVSKEdDT1Zf VElNRV9QUk9GSUxFUiwgInRpbWVfcHJvZmlsZXIiLCBfdGltZV9wcm9maWxlKQorCisvKiBD b25kaXRpb25zLiAgVGhlIGNvdW50ZXIgaXMgaW50ZXJwcmV0ZWQgYXMgYSBiaXQtc2V0LiAg Ki8KK0RFRl9HQ09WX0NPVU5URVIoR0NPVl9DT1VOVEVSX0NPTkRTLCAiY29uZGl0aW9ucyIs IF9pb3IpCmRpZmYgLS1naXQgYS9nY2MvZ2Nvdi1pby5oIGIvZ2NjL2djb3YtaW8uaAppbmRl eCA5OWNlN2RiY2NjOC4uYzg0ZjU4Yjk5YWMgMTAwNjQ0Ci0tLSBhL2djYy9nY292LWlvLmgK KysrIGIvZ2NjL2djb3YtaW8uaApAQCAtMjUzLDYgKzI1Myw5IEBAIHR5cGVkZWYgdWludDY0 X3QgZ2Nvdl90eXBlX3Vuc2lnbmVkOwogI2RlZmluZSBHQ09WX1RBR19BUkNTCQkgKChnY292 X3Vuc2lnbmVkX3QpMHgwMTQzMDAwMCkKICNkZWZpbmUgR0NPVl9UQUdfQVJDU19MRU5HVEgo TlVNKSAgKDEgKyAoTlVNKSAqIDIgKiBHQ09WX1dPUkRfU0laRSkKICNkZWZpbmUgR0NPVl9U QUdfQVJDU19OVU0oTEVOR1RIKSAgKCgoTEVOR1RIIC8gR0NPVl9XT1JEX1NJWkUpIC0gMSkg LyAyKQorI2RlZmluZSBHQ09WX1RBR19DT05EUyAgICAgICAgICAgICAoKGdjb3ZfdW5zaWdu ZWRfdCkweDAxNDcwMDAwKQorI2RlZmluZSBHQ09WX1RBR19DT05EU19MRU5HVEgoTlVNKSAo KE5VTSkgKiAyICogR0NPVl9XT1JEX1NJWkUpCisjZGVmaW5lIEdDT1ZfVEFHX0NPTkRTX05V TShMRU5HVEgpICgoKExFTkdUSCkgLyBHQ09WX1dPUkRfU0laRSkgLyAyKQogI2RlZmluZSBH Q09WX1RBR19MSU5FUwkJICgoZ2Nvdl91bnNpZ25lZF90KTB4MDE0NTAwMDApCiAjZGVmaW5l IEdDT1ZfVEFHX0NPVU5URVJfQkFTRSAJICgoZ2Nvdl91bnNpZ25lZF90KTB4MDFhMTAwMDAp CiAjZGVmaW5lIEdDT1ZfVEFHX0NPVU5URVJfTEVOR1RIKE5VTSkgKChOVU0pICogMiAqIEdD T1ZfV09SRF9TSVpFKQpkaWZmIC0tZ2l0IGEvZ2NjL2djb3YuY2MgYi9nY2MvZ2Nvdi5jYwpp bmRleCAyN2JlNWZmMDkxMS4uNGRiNDBjMThhZTcgMTAwNjQ0Ci0tLSBhL2djYy9nY292LmNj CisrKyBiL2djYy9nY292LmNjCkBAIC03OSw2ICs3OSw3IEBAIHVzaW5nIG5hbWVzcGFjZSBz dGQ7CiBjbGFzcyBmdW5jdGlvbl9pbmZvOwogY2xhc3MgYmxvY2tfaW5mbzsKIGNsYXNzIHNv dXJjZV9pbmZvOworY2xhc3MgY29uZGl0aW9uX2luZm87CiAKIC8qIERlc2NyaWJlcyBhbiBh cmMgYmV0d2VlbiB0d28gYmFzaWMgYmxvY2tzLiAgKi8KIApAQCAtMTMyLDYgKzEzMywyOCBA QCBwdWJsaWM6CiAgIHZlY3Rvcjx1bnNpZ25lZD4gbGluZXM7CiB9OwogCitjbGFzcyBjb25k aXRpb25faW5mbworeworcHVibGljOgorICBjb25kaXRpb25faW5mbyAoKTsKKworICBpbnQg cG9wY291bnQgKCkgY29uc3Q7CisKKyAgZ2Nvdl90eXBlX3Vuc2lnbmVkIHRydWV2OworICBn Y292X3R5cGVfdW5zaWduZWQgZmFsc2V2OworCisgIHVuc2lnbmVkIG5fdGVybXM7Cit9Owor Citjb25kaXRpb25faW5mbzo6Y29uZGl0aW9uX2luZm8gKCk6IHRydWV2ICgwKSwgZmFsc2V2 ICgwKSwgbl90ZXJtcyAoMCkKK3sKK30KKworaW50IGNvbmRpdGlvbl9pbmZvOjpwb3Bjb3Vu dCAoKSBjb25zdAoreworICAgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbCAodHJ1ZXYp ICsgX19idWlsdGluX3BvcGNvdW50bGwgKGZhbHNldik7Cit9CisKIC8qIERlc2NyaWJlcyBh IGJhc2ljIGJsb2NrLiBDb250YWlucyBsaXN0cyBvZiBhcmNzIHRvIHN1Y2Nlc3NvciBhbmQK ICAgIHByZWRlY2Vzc29yIGJsb2Nrcy4gICovCiAKQEAgLTE2NSw2ICsxODgsOCBAQCBwdWJs aWM6CiAgIC8qIEJsb2NrIGlzIGEgbGFuZGluZyBwYWQgZm9yIGxvbmdqbXAgb3IgdGhyb3cu ICAqLwogICB1bnNpZ25lZCBpc19ub25sb2NhbF9yZXR1cm4gOiAxOwogCisgIGNvbmRpdGlv bl9pbmZvIGNvbmRpdGlvbnM7CisKICAgdmVjdG9yPGJsb2NrX2xvY2F0aW9uX2luZm8+IGxv Y2F0aW9uczsKIAogICBzdHJ1Y3QKQEAgLTI3NSw2ICszMDAsOCBAQCBwdWJsaWM6CiAgIHZl Y3RvcjxibG9ja19pbmZvPiBibG9ja3M7CiAgIHVuc2lnbmVkIGJsb2Nrc19leGVjdXRlZDsK IAorICB2ZWN0b3I8Y29uZGl0aW9uX2luZm8qPiBjb25kaXRpb25zOworCiAgIC8qIFJhdyBh cmMgY292ZXJhZ2UgY291bnRzLiAgKi8KICAgdmVjdG9yPGdjb3ZfdHlwZT4gY291bnRzOwog CkBAIC0zNTEsNiArMzc4LDkgQEAgc3RydWN0IGNvdmVyYWdlX2luZm8KICAgaW50IGJyYW5j aGVzX2V4ZWN1dGVkOwogICBpbnQgYnJhbmNoZXNfdGFrZW47CiAKKyAgaW50IGNvbmRpdGlv bnM7CisgIGludCBjb25kaXRpb25zX2NvdmVyZWQ7CisKICAgaW50IGNhbGxzOwogICBpbnQg Y2FsbHNfZXhlY3V0ZWQ7CiAKQEAgLTU1MCw2ICs1ODAsMTAgQEAgc3RhdGljIGludCBtdWx0 aXBsZV9maWxlcyA9IDA7CiAKIHN0YXRpYyBpbnQgZmxhZ19icmFuY2hlcyA9IDA7CiAKKy8q IE91dHB1dCBjb25kaXRpb25zIChtb2RpZmllZCBjb25kaXRpb24vZGVjaXNpb24gY292ZXJh Z2UpICovCisKK3N0YXRpYyBpbnQgZmxhZ19jb25kaXRpb25zID0gMDsKKwogLyogU2hvdyB1 bmNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvby4gICovCiBzdGF0aWMgaW50IGZsYWdfdW5jb25k aXRpb25hbCA9IDA7CiAKQEAgLTY1Niw2ICs2OTAsNyBAQCBzdGF0aWMgaW50IHJlYWRfY291 bnRfZmlsZSAodm9pZCk7CiBzdGF0aWMgdm9pZCBzb2x2ZV9mbG93X2dyYXBoIChmdW5jdGlv bl9pbmZvICopOwogc3RhdGljIHZvaWQgZmluZF9leGNlcHRpb25fYmxvY2tzIChmdW5jdGlv bl9pbmZvICopOwogc3RhdGljIHZvaWQgYWRkX2JyYW5jaF9jb3VudHMgKGNvdmVyYWdlX2lu Zm8gKiwgY29uc3QgYXJjX2luZm8gKik7CitzdGF0aWMgdm9pZCBhZGRfY29uZGl0aW9uX2Nv dW50cyAoY292ZXJhZ2VfaW5mbyAqLCBjb25zdCBibG9ja19pbmZvICopOwogc3RhdGljIHZv aWQgYWRkX2xpbmVfY291bnRzIChjb3ZlcmFnZV9pbmZvICosIGZ1bmN0aW9uX2luZm8gKik7 CiBzdGF0aWMgdm9pZCBleGVjdXRlZF9zdW1tYXJ5ICh1bnNpZ25lZCwgdW5zaWduZWQpOwog c3RhdGljIHZvaWQgZnVuY3Rpb25fc3VtbWFyeSAoY29uc3QgY292ZXJhZ2VfaW5mbyAqKTsK QEAgLTY2NCw2ICs2OTksNyBAQCBzdGF0aWMgY29uc3QgY2hhciAqZm9ybWF0X2djb3YgKGdj b3ZfdHlwZSwgZ2Nvdl90eXBlLCBpbnQpOwogc3RhdGljIHZvaWQgYWNjdW11bGF0ZV9saW5l X2NvdW50cyAoc291cmNlX2luZm8gKik7CiBzdGF0aWMgdm9pZCBvdXRwdXRfZ2Nvdl9maWxl IChjb25zdCBjaGFyICosIHNvdXJjZV9pbmZvICopOwogc3RhdGljIGludCBvdXRwdXRfYnJh bmNoX2NvdW50IChGSUxFICosIGludCwgY29uc3QgYXJjX2luZm8gKik7CitzdGF0aWMgdm9p ZCBvdXRwdXRfY29uZGl0aW9ucyAoRklMRSAqLCBjb25zdCBibG9ja19pbmZvICopOwogc3Rh dGljIHZvaWQgb3V0cHV0X2xpbmVzIChGSUxFICosIGNvbnN0IHNvdXJjZV9pbmZvICopOwog c3RhdGljIHN0cmluZyBtYWtlX2djb3ZfZmlsZV9uYW1lIChjb25zdCBjaGFyICosIGNvbnN0 IGNoYXIgKik7CiBzdGF0aWMgY2hhciAqbWFuZ2xlX25hbWUgKGNvbnN0IGNoYXIgKik7CkBA IC05MjgsNiArOTY0LDcgQEAgcHJpbnRfdXNhZ2UgKGludCBlcnJvcl9wKQogICBmbm90aWNl IChmaWxlLCAiICAtYiwgLS1icmFuY2gtcHJvYmFiaWxpdGllcyAgICAgIEluY2x1ZGUgYnJh bmNoIHByb2JhYmlsaXRpZXMgaW4gb3V0cHV0XG4iKTsKICAgZm5vdGljZSAoZmlsZSwgIiAg LWMsIC0tYnJhbmNoLWNvdW50cyAgICAgICAgICAgICBPdXRwdXQgY291bnRzIG9mIGJyYW5j aGVzIHRha2VuXG5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRo ZXIgdGhhbiBwZXJjZW50YWdlc1xuIik7CisgIGZub3RpY2UgKGZpbGUsICIgIC1nLCAtLWNv bmRpdGlvbnMgICAgICAgICAgICAgICAgSW5jbHVkZSBjb25kaXRpb24gY292ZXJhZ2UgaW4g b3V0cHV0IChNQy9EQylcbiIpOwogICBmbm90aWNlIChmaWxlLCAiICAtZCwgLS1kaXNwbGF5 LXByb2dyZXNzICAgICAgICAgIERpc3BsYXkgcHJvZ3Jlc3MgaW5mb3JtYXRpb25cbiIpOwog ICBmbm90aWNlIChmaWxlLCAiICAtRCwgLS1kZWJ1ZwkJCSAgICBEaXNwbGF5IGRlYnVnZ2lu ZyBkdW1wc1xuIik7CiAgIGZub3RpY2UgKGZpbGUsICIgIC1mLCAtLWZ1bmN0aW9uLXN1bW1h cmllcyAgICAgICAgT3V0cHV0IHN1bW1hcmllcyBmb3IgZWFjaCBmdW5jdGlvblxuIik7CkBA IC05ODAsNiArMTAxNyw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNb XSA9CiAgIHsgImFsbC1ibG9ja3MiLCAgICAgICAgICAgbm9fYXJndW1lbnQsICAgICAgIE5V TEwsICdhJyB9LAogICB7ICJicmFuY2gtcHJvYmFiaWxpdGllcyIsIG5vX2FyZ3VtZW50LCAg ICAgICBOVUxMLCAnYicgfSwKICAgeyAiYnJhbmNoLWNvdW50cyIsICAgICAgICBub19hcmd1 bWVudCwgICAgICAgTlVMTCwgJ2MnIH0sCisgIHsgImNvbmRpdGlvbnMiLCAgICAgICAgICAg bm9fYXJndW1lbnQsICAgICAgIE5VTEwsICdnJyB9LAogICB7ICJqc29uLWZvcm1hdCIsCSAg ICBub19hcmd1bWVudCwgICAgICAgTlVMTCwgJ2onIH0sCiAgIHsgImh1bWFuLXJlYWRhYmxl IiwJICAgIG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCAnSCcgfSwKICAgeyAibm8tb3V0cHV0 IiwgICAgICAgICAgICBub19hcmd1bWVudCwgICAgICAgTlVMTCwgJ24nIH0sCkBAIC0xMDA4 LDcgKzEwNDYsNyBAQCBwcm9jZXNzX2FyZ3MgKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsK ICAgaW50IG9wdDsKIAotICBjb25zdCBjaGFyICpvcHRzID0gImFiY2REZmhIaWprbG1ubzpw cXJzOnR1dnd4IjsKKyAgY29uc3QgY2hhciAqb3B0cyA9ICJhYmNkRGZnaEhpamtsbW5vOnBx cnM6dHV2d3giOwogICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCBv cHRzLCBvcHRpb25zLCBOVUxMKSkgIT0gLTEpCiAgICAgewogICAgICAgc3dpdGNoIChvcHQp CkBAIC0xMDI1LDYgKzEwNjMsOSBAQCBwcm9jZXNzX2FyZ3MgKGludCBhcmdjLCBjaGFyICoq YXJndikKIAljYXNlICdmJzoKIAkgIGZsYWdfZnVuY3Rpb25fc3VtbWFyeSA9IDE7CiAJICBi cmVhazsKKwljYXNlICdnJzoKKwkgIGZsYWdfY29uZGl0aW9ucyA9IDE7CisJICBicmVhazsK IAljYXNlICdoJzoKIAkgIHByaW50X3VzYWdlIChmYWxzZSk7CiAJICAvKiBwcmludF91c2Fn ZSB3aWxsIGV4aXQuICAqLwpAQCAtMTEzMiw2ICsxMTczLDQ1IEBAIG91dHB1dF9pbnRlcm1l ZGlhdGVfanNvbl9saW5lIChqc29uOjphcnJheSAqb2JqZWN0LAogCSAgfQogICAgICAgfQog CisgIGpzb246OmFycmF5ICpjb25kaXRpb25zID0gbmV3IGpzb246OmFycmF5ICgpOworICBs aW5lby0+c2V0ICgiY29uZGl0aW9ucyIsIGNvbmRpdGlvbnMpOworICBpZiAoZmxhZ19jb25k aXRpb25zKQorICB7CisgICAgdmVjdG9yPGJsb2NrX2luZm8gKj46OmNvbnN0X2l0ZXJhdG9y IGl0OworICAgIGZvciAoaXQgPSBsaW5lLT5ibG9ja3MuYmVnaW4gKCk7IGl0ICE9IGxpbmUt PmJsb2Nrcy5lbmQgKCk7IGl0KyspCisgICAgICB7CisJY29uc3QgY29uZGl0aW9uX2luZm8m IGluZm8gPSAoKml0KS0+Y29uZGl0aW9uczsKKwlpZiAoaW5mby5uX3Rlcm1zID09IDApCisJ ICAgIGNvbnRpbnVlOworCisJY29uc3QgaW50IGNvdW50ID0gMiAqIGluZm8ubl90ZXJtczsK Kwljb25zdCBpbnQgY292ZXJlZCA9IGluZm8ucG9wY291bnQgKCk7CisKKwlqc29uOjpvYmpl Y3QgKmNvbmQgPSBuZXcganNvbjo6b2JqZWN0ICgpOworCWNvbmQtPnNldCAoImNvdW50Iiwg ICBuZXcganNvbjo6aW50ZWdlcl9udW1iZXIgKGNvdW50KSk7CisJY29uZC0+c2V0ICgiY292 ZXJlZCIsIG5ldyBqc29uOjppbnRlZ2VyX251bWJlciAoY292ZXJlZCkpOworCisJanNvbjo6 YXJyYXkgKm10cnVlID0gbmV3IGpzb246OmFycmF5ICgpOworCWpzb246OmFycmF5ICptZmFs c2UgPSBuZXcganNvbjo6YXJyYXkgKCk7CisJY29uZC0+c2V0ICgibm90X2NvdmVyZWRfdHJ1 ZSIsICBtdHJ1ZSk7CisJY29uZC0+c2V0ICgibm90X2NvdmVyZWRfZmFsc2UiLCBtZmFsc2Up OworCisJaWYgKGNvdW50ICE9IGNvdmVyZWQpCisJICB7CisJICAgIGZvciAodW5zaWduZWQg aSA9IDA7IGkgPCBpbmZvLm5fdGVybXM7IGkrKykKKwkgICAgICB7CisJCWdjb3ZfdHlwZV91 bnNpZ25lZCBpbmRleCA9IDE7CisJCWluZGV4IDw8PSBpOworCQlpZiAoIShpbmRleCAmIGlu Zm8udHJ1ZXYpKQorCQkgICAgbXRydWUtPmFwcGVuZCAobmV3IGpzb246OmludGVnZXJfbnVt YmVyIChpKSk7CisJCWlmICghKGluZGV4ICYgaW5mby5mYWxzZXYpKQorCQkgICAgbWZhbHNl LT5hcHBlbmQgKG5ldyBqc29uOjppbnRlZ2VyX251bWJlciAoaSkpOworCSAgICAgIH0KKwkg IH0KKwljb25kaXRpb25zLT5hcHBlbmQgKGNvbmQpOworICAgICAgfQorICB9CisKICAgb2Jq ZWN0LT5hcHBlbmQgKGxpbmVvKTsKIH0KIApAQCAtMTk1Niw2ICsyMDM2LDI4IEBAIHJlYWRf Z3JhcGhfZmlsZSAodm9pZCkKIAkJICB9CiAJICAgIH0KIAl9CisgICAgICBlbHNlIGlmIChm biAmJiB0YWcgPT0gR0NPVl9UQUdfQ09ORFMpCisJeworCSAgdW5zaWduZWQgbnVtX2Rlc3Rz ID0gR0NPVl9UQUdfQ09ORFNfTlVNIChsZW5ndGgpOworCisJICBpZiAoIWZuLT5jb25kaXRp b25zLmVtcHR5ICgpKQorCSAgICBmbm90aWNlIChzdGRlcnIsICIlczphbHJlYWR5IHNlZW4g Y29uZGl0aW9ucyBmb3IgJyVzJ1xuIiwKKwkJICAgICBiYmdfZmlsZV9uYW1lLCBmbi0+Z2V0 X25hbWUgKCkpOworCSAgZWxzZQorCSAgICBmbi0+Y29uZGl0aW9ucy5yZXNpemUgKG51bV9k ZXN0cyk7CisKKwkgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fZGVzdHM7ICsraSkK KwkgICAgeworCSAgICAgIHVuc2lnbmVkIGlkeCA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsK KworCSAgICAgIGlmIChpZHggPj0gZm4tPmJsb2Nrcy5zaXplICgpKQorCQlnb3RvIGNvcnJ1 cHQ7CisKKwkgICAgICBjb25kaXRpb25faW5mbyAqaW5mbyA9ICZmbi0+YmxvY2tzW2lkeF0u Y29uZGl0aW9uczsKKwkgICAgICBpbmZvLT5uX3Rlcm1zID0gZ2Nvdl9yZWFkX3Vuc2lnbmVk ICgpOworCSAgICAgIGZuLT5jb25kaXRpb25zW2ldID0gaW5mbzsKKwkgICAgfQorCX0KICAg ICAgIGVsc2UgaWYgKGZuICYmIHRhZyA9PSBHQ09WX1RBR19MSU5FUykKIAl7CiAJICB1bnNp Z25lZCBibG9ja25vID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOwpAQCAtMjA4NiwxMSArMjE4 OCwyNiBAQCByZWFkX2NvdW50X2ZpbGUgKHZvaWQpCiAJICAgICAgZ290byBjbGVhbnVwOwog CSAgICB9CiAJfQotICAgICAgZWxzZSBpZiAodGFnID09IEdDT1ZfVEFHX0ZPUl9DT1VOVEVS IChHQ09WX0NPVU5URVJfQVJDUykgJiYgZm4pCisgICAgICBlbHNlIGlmICh0YWcgPT0gR0NP Vl9UQUdfRk9SX0NPVU5URVIgKEdDT1ZfQ09VTlRFUl9DT05EUykgJiYgZm4pCiAJeworCSAg bGVuZ3RoID0gYWJzIChyZWFkX2xlbmd0aCk7CisJICAgIGlmIChsZW5ndGggIT0gR0NPVl9U QUdfQ09VTlRFUl9MRU5HVEggKDIgKiBmbi0+Y29uZGl0aW9ucy5zaXplICgpKSkKKwkJZ290 byBtaXNtYXRjaDsKKworCSAgICBpZiAocmVhZF9sZW5ndGggPiAwKQorCSAgICAgIHsKKwkJ Zm9yIChpeCA9IDA7IGl4ICE9IGZuLT5jb25kaXRpb25zLnNpemUgKCk7IGl4KyspCisJCXsK KwkJICAgIGZuLT5jb25kaXRpb25zW2l4XS0+dHJ1ZXYgIHw9IGdjb3ZfcmVhZF9jb3VudGVy ICgpOworCQkgICAgZm4tPmNvbmRpdGlvbnNbaXhdLT5mYWxzZXYgfD0gZ2Nvdl9yZWFkX2Nv dW50ZXIgKCk7CisJCX0KKwkgICAgICB9CisJfQorICAgICAgZWxzZSBpZiAodGFnID09IEdD T1ZfVEFHX0ZPUl9DT1VOVEVSIChHQ09WX0NPVU5URVJfQVJDUykgJiYgZm4pCisgICAgICB7 CiAJICBsZW5ndGggPSBhYnMgKHJlYWRfbGVuZ3RoKTsKIAkgIGlmIChsZW5ndGggIT0gR0NP Vl9UQUdfQ09VTlRFUl9MRU5HVEggKGZuLT5jb3VudHMuc2l6ZSAoKSkpCi0JICAgIGdvdG8g bWlzbWF0Y2g7CisJICAgICAgZ290byBtaXNtYXRjaDsKIAogCSAgaWYgKHJlYWRfbGVuZ3Ro ID4gMCkKIAkgICAgZm9yIChpeCA9IDA7IGl4ICE9IGZuLT5jb3VudHMuc2l6ZSAoKTsgaXgr KykKQEAgLTI0MzAsNiArMjU0NywxMyBAQCBhZGRfYnJhbmNoX2NvdW50cyAoY292ZXJhZ2Vf aW5mbyAqY292ZXJhZ2UsIGNvbnN0IGFyY19pbmZvICphcmMpCiAgICAgfQogfQogCitzdGF0 aWMgdm9pZAorYWRkX2NvbmRpdGlvbl9jb3VudHMgKGNvdmVyYWdlX2luZm8gKmNvdmVyYWdl LCBjb25zdCBibG9ja19pbmZvICpibG9jaykKK3sKKyAgY292ZXJhZ2UtPmNvbmRpdGlvbnMg Kz0gMiAqIGJsb2NrLT5jb25kaXRpb25zLm5fdGVybXM7CisgIGNvdmVyYWdlLT5jb25kaXRp b25zX2NvdmVyZWQgKz0gYmxvY2stPmNvbmRpdGlvbnMucG9wY291bnQgKCk7Cit9CisKIC8q IEZvcm1hdCBDT1VOVCwgaWYgZmxhZ19odW1hbl9yZWFkYWJsZV9udW1iZXJzIGlzIHNldCwg cmV0dXJuIGl0IGh1bWFuCiAgICByZWFkYWJsZSBmb3JtYXQuICAqLwogCkBAIC0yNTMzLDcg KzI2NTcsMTQgQEAgZmlsZV9zdW1tYXJ5IChjb25zdCBjb3ZlcmFnZV9pbmZvICpjb3ZlcmFn ZSkKIAkJIGNvdmVyYWdlLT5jYWxscyk7CiAgICAgICBlbHNlCiAJZm5vdGljZSAoc3Rkb3V0 LCAiTm8gY2FsbHNcbiIpOworCiAgICAgfQorCisgIGlmIChmbGFnX2NvbmRpdGlvbnMpCisg ICAgICBmbm90aWNlIChzdGRvdXQsICJDb25kaXRpb25zIGNvdmVyZWQ6JXMgb2YgJWRcbiIs CisJICAgICAgIGZvcm1hdF9nY292IChjb3ZlcmFnZS0+Y29uZGl0aW9uc19jb3ZlcmVkLAor CQkJICAgIGNvdmVyYWdlLT5jb25kaXRpb25zLCAyKSwKKwkgICAgICAgY292ZXJhZ2UtPmNv bmRpdGlvbnMpOwogfQogCiAvKiBDYW5vbmljYWxpemUgdGhlIGZpbGVuYW1lIE5BTUUgYnkg Y2Fub25pY2FsaXppbmcgZGlyZWN0b3J5CkBAIC0yNzYwLDYgKzI4OTEsMTIgQEAgc3RhdGlj IHZvaWQgYWNjdW11bGF0ZV9saW5lX2luZm8gKGxpbmVfaW5mbyAqbGluZSwgc291cmNlX2lu Zm8gKnNyYywKIAkgaXQgIT0gbGluZS0+YnJhbmNoZXMuZW5kICgpOyBpdCsrKQogICAgICAg YWRkX2JyYW5jaF9jb3VudHMgKCZzcmMtPmNvdmVyYWdlLCAqaXQpOwogCisgIGlmIChhZGRf Y292ZXJhZ2UpCisgICAgZm9yICh2ZWN0b3I8YmxvY2tfaW5mbyAqPjo6aXRlcmF0b3IgaXQg PSBsaW5lLT5ibG9ja3MuYmVnaW4gKCk7CisJIGl0ICE9IGxpbmUtPmJsb2Nrcy5lbmQgKCk7 IGl0KyspCisgICAgICBhZGRfY29uZGl0aW9uX2NvdW50cyAoJnNyYy0+Y292ZXJhZ2UsICpp dCk7CisKKwogICBpZiAoIWxpbmUtPmJsb2Nrcy5lbXB0eSAoKSkKICAgICB7CiAgICAgICAv KiBUaGUgdXNlciBleHBlY3RzIHRoZSBsaW5lIGNvdW50IHRvIGJlIHRoZSBudW1iZXIgb2Yg dGltZXMKQEAgLTI4NjEsNiArMjk5OCwzMSBAQCBhY2N1bXVsYXRlX2xpbmVfY291bnRzIChz b3VyY2VfaW5mbyAqc3JjKQogICAgICAgfQogfQogCitzdGF0aWMgdm9pZAorb3V0cHV0X2Nv bmRpdGlvbnMgKEZJTEUgKmdjb3ZfZmlsZSwgY29uc3QgYmxvY2tfaW5mbyAqYmluZm8pCit7 CisgICAgY29uc3QgY29uZGl0aW9uX2luZm8mIGluZm8gPSBiaW5mby0+Y29uZGl0aW9uczsK KyAgICBpZiAoaW5mby5uX3Rlcm1zID09IDApCisJcmV0dXJuOworCisgICAgY29uc3QgaW50 IGV4cGVjdGVkID0gMiAqIGluZm8ubl90ZXJtczsKKyAgICBjb25zdCBpbnQgZ290ID0gaW5m by5wb3Bjb3VudCAoKTsKKworICAgIGZub3RpY2UgKGdjb3ZfZmlsZSwgImNvbmRpdGlvbnMg Y292ZXJlZCAlZC8lZFxuIiwgZ290LCBleHBlY3RlZCk7CisgICAgaWYgKGV4cGVjdGVkID09 IGdvdCkKKwlyZXR1cm47CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5mby5u X3Rlcm1zOyBpKyspCisgICAgeworCWdjb3ZfdHlwZV91bnNpZ25lZCBpbmRleCA9IDE7CisJ aW5kZXggPDw9IGk7CisJaWYgKCEoaW5kZXggJiBpbmZvLnRydWV2KSkKKwkgICAgZm5vdGlj ZSAoZ2Nvdl9maWxlLCAiY29uZGl0aW9uICUydSBub3QgY292ZXJlZCAodHJ1ZSlcbiIsIGkp OworCWlmICghKGluZGV4ICYgaW5mby5mYWxzZXYpKQorCSAgICBmbm90aWNlIChnY292X2Zp bGUsICJjb25kaXRpb24gJTJ1IG5vdCBjb3ZlcmVkIChmYWxzZSlcbiIsIGkpOworICAgIH0K K30KKwogLyogT3V0cHV0IGluZm9ybWF0aW9uIGFib3V0IEFSQyBudW1iZXIgSVguICBSZXR1 cm5zIG5vbnplcm8gaWYKICAgIGFueXRoaW5nIGlzIG91dHB1dC4gICovCiAKQEAgLTMwNzEs MTYgKzMyMzMsMjkgQEAgb3V0cHV0X2xpbmVfZGV0YWlscyAoRklMRSAqZiwgY29uc3QgbGlu ZV9pbmZvICpsaW5lLCB1bnNpZ25lZCBsaW5lX251bSkKIAkgIGlmIChmbGFnX2JyYW5jaGVz KQogCSAgICBmb3IgKGFyYyA9ICgqaXQpLT5zdWNjOyBhcmM7IGFyYyA9IGFyYy0+c3VjY19u ZXh0KQogCSAgICAgIGp4ICs9IG91dHB1dF9icmFuY2hfY291bnQgKGYsIGp4LCBhcmMpOwor CisJICBpZiAoZmxhZ19jb25kaXRpb25zKQorCSAgICAgIG91dHB1dF9jb25kaXRpb25zIChm LCAqaXQpOwogCX0KICAgICB9Ci0gIGVsc2UgaWYgKGZsYWdfYnJhbmNoZXMpCisgIGVsc2UK ICAgICB7Ci0gICAgICBpbnQgaXg7CisgICAgICBpZiAoZmxhZ19icmFuY2hlcykKKwl7CisJ ICBpbnQgaXg7CisKKwkgIGl4ID0gMDsKKwkgIGZvciAodmVjdG9yPGFyY19pbmZvICo+Ojpj b25zdF9pdGVyYXRvciBpdCA9IGxpbmUtPmJyYW5jaGVzLmJlZ2luICgpOworCQkgIGl0ICE9 IGxpbmUtPmJyYW5jaGVzLmVuZCAoKTsgaXQrKykKKwkgICAgICBpeCArPSBvdXRwdXRfYnJh bmNoX2NvdW50IChmLCBpeCwgKCppdCkpOworCX0KIAotICAgICAgaXggPSAwOwotICAgICAg Zm9yICh2ZWN0b3I8YXJjX2luZm8gKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGluZS0+YnJh bmNoZXMuYmVnaW4gKCk7Ci0JICAgaXQgIT0gbGluZS0+YnJhbmNoZXMuZW5kICgpOyBpdCsr KQotCWl4ICs9IG91dHB1dF9icmFuY2hfY291bnQgKGYsIGl4LCAoKml0KSk7CisgICAgICBp ZiAoZmxhZ19jb25kaXRpb25zKQorCXsKKwkgIGZvciAodmVjdG9yPGJsb2NrX2luZm8gKj46 OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGluZS0+YmxvY2tzLmJlZ2luICgpOworCSAgICAgICBp dCAhPSBsaW5lLT5ibG9ja3MuZW5kICgpOyBpdCsrKQorCSAgICAgIG91dHB1dF9jb25kaXRp b25zIChmLCAqaXQpOworCX0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2djYy9pcGEtaW5s aW5lLmNjIGIvZ2NjL2lwYS1pbmxpbmUuY2MKaW5kZXggZjhiYjA3MmM0MjIuLmI4MjZkY2Q1 ODBjIDEwMDY0NAotLS0gYS9nY2MvaXBhLWlubGluZS5jYworKysgYi9nY2MvaXBhLWlubGlu ZS5jYwpAQCAtNjQ2LDcgKzY0Niw3IEBAIGNhbl9lYXJseV9pbmxpbmVfZWRnZV9wIChzdHJ1 Y3QgY2dyYXBoX2VkZ2UgKmUpCiAJCQkgIiAgZWRnZSBub3QgaW5saW5hYmxlOiBub3QgaW4g U1NBIGZvcm1cbiIpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgZWxzZSBpZiAo cHJvZmlsZV9hcmNfZmxhZworICBlbHNlIGlmICgocHJvZmlsZV9hcmNfZmxhZyB8fCBwcm9m aWxlX2NvbmRpdGlvbl9mbGFnKQogCSAgICYmICgobG9va3VwX2F0dHJpYnV0ZSAoIm5vX3By b2ZpbGVfaW5zdHJ1bWVudF9mdW5jdGlvbiIsCiAJCQkJIERFQ0xfQVRUUklCVVRFUyAoY2Fs bGVyLT5kZWNsKSkgPT0gTlVMTF9UUkVFKQogCSAgICAgICAhPSAobG9va3VwX2F0dHJpYnV0 ZSAoIm5vX3Byb2ZpbGVfaW5zdHJ1bWVudF9mdW5jdGlvbiIsCmRpZmYgLS1naXQgYS9nY2Mv aXBhLXNwbGl0LmNjIGIvZ2NjL2lwYS1zcGxpdC5jYwppbmRleCA2MDAyMWJhZDEzYy4uOTg5 MDUxOGUxMWYgMTAwNjQ0Ci0tLSBhL2djYy9pcGEtc3BsaXQuY2MKKysrIGIvZ2NjL2lwYS1z cGxpdC5jYwpAQCAtMTkyOSw3ICsxOTI5LDggQEAgcGFzc19zcGxpdF9mdW5jdGlvbnM6Omdh dGUgKGZ1bmN0aW9uICopCiAgIC8qIFdoZW4gZG9pbmcgcHJvZmlsZSBmZWVkYmFjaywgd2Ug d2FudCB0byBleGVjdXRlIHRoZSBwYXNzIGFmdGVyIHByb2ZpbGluZwogICAgICBpcyByZWFk LiAgU28gZGlzYWJsZSBvbmUgaW4gZWFybHkgb3B0aW1pemF0aW9uLiAgKi8KICAgcmV0dXJu IChmbGFnX3BhcnRpYWxfaW5saW5pbmcKLQkgICYmICFwcm9maWxlX2FyY19mbGFnICYmICFm bGFnX2JyYW5jaF9wcm9iYWJpbGl0aWVzKTsKKyAgICAgICYmICFwcm9maWxlX2FyY19mbGFn ICYmICFmbGFnX2JyYW5jaF9wcm9iYWJpbGl0aWVzCisgICAgICAmJiAhcHJvZmlsZV9jb25k aXRpb25fZmxhZyk7CiB9CiAKIH0gLy8gYW5vbiBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2dj Yy9wYXNzZXMuY2MgYi9nY2MvcGFzc2VzLmNjCmluZGV4IDM2ZTViNGFjNDVmLi5lZTA5OTE4 ODg0NCAxMDA2NDQKLS0tIGEvZ2NjL3Bhc3Nlcy5jYworKysgYi9nY2MvcGFzc2VzLmNjCkBA IC0zNTIsNyArMzUyLDggQEAgZmluaXNoX29wdGltaXphdGlvbl9wYXNzZXMgKHZvaWQpCiAg IGdjYzo6ZHVtcF9tYW5hZ2VyICpkdW1wcyA9IG1fY3R4dC0+Z2V0X2R1bXBzICgpOwogCiAg IHRpbWV2YXJfcHVzaCAoVFZfRFVNUCk7Ci0gIGlmIChwcm9maWxlX2FyY19mbGFnIHx8IGZs YWdfdGVzdF9jb3ZlcmFnZSB8fCBmbGFnX2JyYW5jaF9wcm9iYWJpbGl0aWVzKQorICBpZiAo cHJvZmlsZV9hcmNfZmxhZyB8fCBwcm9maWxlX2NvbmRpdGlvbl9mbGFnIHx8IGZsYWdfdGVz dF9jb3ZlcmFnZQorICAgICAgICAgIHx8IGZsYWdfYnJhbmNoX3Byb2JhYmlsaXRpZXMpCiAg ICAgewogICAgICAgZHVtcHMtPmR1bXBfc3RhcnQgKHBhc3NfcHJvZmlsZV8xLT5zdGF0aWNf cGFzc19udW1iZXIsIE5VTEwpOwogICAgICAgZW5kX2JyYW5jaF9wcm9iICgpOwpkaWZmIC0t Z2l0IGEvZ2NjL3Byb2ZpbGUuY2MgYi9nY2MvcHJvZmlsZS5jYwppbmRleCBhNjdjY2U1YjE5 OS4uYjUxZmFiYmI1OWIgMTAwNjQ0Ci0tLSBhL2djYy9wcm9maWxlLmNjCisrKyBiL2djYy9w cm9maWxlLmNjCkBAIC02OSw2ICs2OSw5IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZp bGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAKICNpbmNsdWRlICJwcm9maWxlLmgiCiAKK2lu dCBmaW5kX2NvbmRpdGlvbnMgKGJhc2ljX2Jsb2NrLCBiYXNpY19ibG9jaywgYmFzaWNfYmxv Y2sqLCBpbnQqLCBpbnQpOworaW50IGluc3RydW1lbnRfZGVjaXNpb25zIChiYXNpY19ibG9j ayosIGludCwgaW50KTsKKwogLyogTWFwIGZyb20gQkJzL2VkZ2VzIHRvIGdjb3YgY291bnRl cnMuICAqLwogdmVjPGdjb3ZfdHlwZT4gYmJfZ2Nvdl9jb3VudHM7CiBoYXNoX21hcDxlZGdl LGdjb3ZfdHlwZT4gKmVkZ2VfZ2Nvdl9jb3VudHM7CkBAIC0xMDAsNiArMTAzLDcgQEAgc3Rh dGljIGludCB0b3RhbF9udW1fcGFzc2VzOwogc3RhdGljIGludCB0b3RhbF9udW1fdGltZXNf Y2FsbGVkOwogc3RhdGljIGludCB0b3RhbF9oaXN0X2JyX3Byb2JbMjBdOwogc3RhdGljIGlu dCB0b3RhbF9udW1fYnJhbmNoZXM7CitzdGF0aWMgaW50IHRvdGFsX251bV9jb25kczsKIAog LyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICAqLwogc3RhdGljIHZvaWQgZmluZF9zcGFubmlu Z190cmVlIChzdHJ1Y3QgZWRnZV9saXN0ICopOwpAQCAtMTE1NSw2ICsxMTU5LDEyIEBAIHJl YWRfdGh1bmtfcHJvZmlsZSAoc3RydWN0IGNncmFwaF9ub2RlICpub2RlKQogICAgdGhlIGZs b3cgZ3JhcGggdGhhdCBhcmUgbmVlZGVkIHRvIHJlY29uc3RydWN0IHRoZSBkeW5hbWljIGJl aGF2aW9yIG9mIHRoZQogICAgZmxvdyBncmFwaC4gIFRoaXMgZGF0YSBpcyB3cml0dGVuIHRv IHRoZSBnY25vIGZpbGUgZm9yIGdjb3YuCiAKKyAgIFdoZW4gRkxBR19QUk9GSUxFX0NPTkRJ VElPTlMgaXMgbm9uemVybywgdGhpcyBmdW5jdGlvbnMgaW5zdHJ1bWVudHMgdGhlCisgICBl ZGdlcyBpbiB0aGUgY29udHJvbCBmbG93IGdyYXBoIHRvIHRyYWNrIHdoYXQgY29uZGl0aW9u cyBhcmUgZXZhbHVhdGVkIHRvIGluCisgICBvcmRlciB0byBkZXRlcm1pbmUgd2hhdCBjb25k aXRpb25zIGFyZSBjb3ZlcmVkIGFuZCBoYXZlIGFuIGluZGVwZW5kZW50CisgICBlZmZlY3Qg b24gdGhlIG91dGNvbWUgKG1vZGlmaWVkIGNvbmRpdGlvbi9kZWNpc2lvbiBjb3ZlcmFnZSku ICBUaGlzIGRhdGEgaXMKKyAgIHdyaXR0ZW4gdG8gdGhlIGdjbm8gZmlsZSBmb3IgZ2Nvdi4K KwogICAgV2hlbiBGTEFHX0JSQU5DSF9QUk9CQUJJTElUSUVTIGlzIG5vbnplcm8sIHRoaXMg ZnVuY3Rpb24gcmVhZHMgYXV4aWxpYXJ5CiAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnY2Rh IGZpbGUgY29udGFpbmluZyBlZGdlIGNvdW50IGluZm9ybWF0aW9uIGZyb20KICAgIHByZXZp b3VzIGV4ZWN1dGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNvbXBpbGVkLiAgSW4gdGhp cyBjYXNlLCB0aGUKQEAgLTExNzMsNiArMTE4Myw3IEBAIGJyYW5jaF9wcm9iIChib29sIHRo dW5rKQogICBzdHJ1Y3QgZWRnZV9saXN0ICplbDsKICAgaGlzdG9ncmFtX3ZhbHVlcyB2YWx1 ZXMgPSBoaXN0b2dyYW1fdmFsdWVzICgpOwogICB1bnNpZ25lZCBjZmdfY2hlY2tzdW0sIGxp bmVub19jaGVja3N1bTsKKyAgYm9vbCBvdXRwdXRfdG9fZmlsZTsKIAogICB0b3RhbF9udW1f dGltZXNfY2FsbGVkKys7CiAKQEAgLTEzODEsNyArMTM5Miw3IEBAIGJyYW5jaF9wcm9iIChi b29sIHRodW5rKQogCiAgIC8qIENvbXB1dGUgdHdvIGRpZmZlcmVudCBjaGVja3N1bXMuIE5v dGUgdGhhdCB3ZSB3YW50IHRvIGNvbXB1dGUKICAgICAgdGhlIGNoZWNrc3VtIGluIG9ubHkg b25jZSBwbGFjZSwgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgc2hhcGUKLSAgICAgb2YgdGhl IGNvbnRyb2wgZmxvdyB3aGljaCBjYW4gY2hhbmdlIGR1cmluZyAKKyAgICAgb2YgdGhlIGNv bnRyb2wgZmxvdyB3aGljaCBjYW4gY2hhbmdlIGR1cmluZwogICAgICB2YXJpb3VzIHRyYW5z Zm9ybWF0aW9ucy4gICovCiAgIGlmICh0aHVuaykKICAgICB7CkBAIC0xMzk3LDEwICsxNDA4 LDE4IEBAIGJyYW5jaF9wcm9iIChib29sIHRodW5rKQogCiAgIC8qIFdyaXRlIHRoZSBkYXRh IGZyb20gd2hpY2ggZ2NvdiBjYW4gcmVjb25zdHJ1Y3QgdGhlIGJhc2ljIGJsb2NrCiAgICAg IGdyYXBoIGFuZCBmdW5jdGlvbiBsaW5lIG51bWJlcnMgKHRoZSBnY25vIGZpbGUpLiAgKi8K KyAgb3V0cHV0X3RvX2ZpbGUgPSBmYWxzZTsKICAgaWYgKGNvdmVyYWdlX2JlZ2luX2Z1bmN0 aW9uIChsaW5lbm9fY2hlY2tzdW0sIGNmZ19jaGVja3N1bSkpCiAgICAgewogICAgICAgZ2Nv dl9wb3NpdGlvbl90IG9mZnNldDsKIAorICAgICAgLyogVGhlIGNvbmRpdGlvbiBjb3ZlcmFn ZSBuZWVkcyBhIGRlZXBlciBhbmFseXNpcyB0byBpZGVudGlmeSBleHByZXNzaW9ucworICAg ICAgICogb2YgY29uZGl0aW9ucywgd2hpY2ggbWVhbnMgaXQgaXMgbm90IHlldCByZWFkeSB0 byB3cml0ZSB0byB0aGUgZ2NubworICAgICAgICogZmlsZS4gIEl0IHdpbGwgd3JpdGUgaXRz IGVudHJpZXMgbGF0ZXIsIGJ1dCBuZWVkcyB0byBrbm93IGlmIGl0IGRvIGl0CisgICAgICAg KiBpbiB0aGUgZmlyc3QgcGxhY2UsIHdoaWNoIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHJldHVy biB2YWx1ZSBvZgorICAgICAgICogY292ZXJhZ2VfYmVnaW5fZnVuY3Rpb24uICovCisgICAg ICBvdXRwdXRfdG9fZmlsZSA9IHRydWU7CisKICAgICAgIC8qIEJhc2ljIGJsb2NrIGZsYWdz ICovCiAgICAgICBvZmZzZXQgPSBnY292X3dyaXRlX3RhZyAoR0NPVl9UQUdfQkxPQ0tTKTsK ICAgICAgIGdjb3Zfd3JpdGVfdW5zaWduZWQgKG5fYmFzaWNfYmxvY2tzX2Zvcl9mbiAoY2Z1 bikpOwpAQCAtMTUxMiwyOSArMTUzMSw2NyBAQCBicmFuY2hfcHJvYiAoYm9vbCB0aHVuaykK IAogICByZW1vdmVfZmFrZV9lZGdlcyAoKTsKIAorICBpZiAocHJvZmlsZV9jb25kaXRpb25f ZmxhZyB8fCBwcm9maWxlX2FyY19mbGFnKQorICAgICAgZ2ltcGxlX2luaXRfZ2Nvdl9wcm9m aWxlciAoKTsKKworICBpZiAocHJvZmlsZV9jb25kaXRpb25fZmxhZykKKyAgICB7CisgICAg ICBiYXNpY19ibG9jayBlbnRyeSA9IEVOVFJZX0JMT0NLX1BUUl9GT1JfRk4gKGNmdW4pLT5u ZXh0X2JiOworICAgICAgYmFzaWNfYmxvY2sgZXhpdCAgPSBFWElUX0JMT0NLX1BUUl9GT1Jf Rk4gKGNmdW4pOworCisgICAgICAvLyBmaW5kX2NvbmRpdGlvbnMgKCkgZXhwZWN0IG1lbW9y eSB1cCBmcm9udCwgc2VlIHRoYXQgZnVuY3Rpb24gZm9yCisgICAgICAvLyBkZXRhaWxzCisg ICAgICBjb25zdCBpbnQgbWF4X2Jsb2NrcyA9IDUgKiBuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4g KGNmdW4pOworICAgICAgYXV0b192ZWM8YmFzaWNfYmxvY2s+IGJsb2NrcyAobWF4X2Jsb2Nr cyk7CisgICAgICBibG9ja3MucXVpY2tfZ3JvdyAobWF4X2Jsb2Nrcyk7CisKKyAgICAgIGNv bnN0IGludCBtYXhfc2l6ZXMgPSBuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKGNmdW4pICsgMTsK KyAgICAgIGF1dG9fdmVjPGludD4gc2l6ZXMgKG1heF9zaXplcyk7CisgICAgICBzaXplcy5x dWlja19ncm93IChtYXhfc2l6ZXMpOworCisgICAgICBpbnQgbmNvbmRzID0gZmluZF9jb25k aXRpb25zCisJICAoZW50cnksIGV4aXQsIGJsb2Nrcy5hZGRyZXNzICgpLCBzaXplcy5hZGRy ZXNzICgpLCBtYXhfYmxvY2tzKTsKKyAgICAgIHRvdGFsX251bV9jb25kcyArPSBuY29uZHM7 CisKKyAgICAgIGlmIChuY29uZHMgPiAwCisJICAmJiBjb3ZlcmFnZV9jb3VudGVyX2FsbG9j IChHQ09WX0NPVU5URVJfQ09ORFMsIDIgKiBuY29uZHMpCisJICAmJiBvdXRwdXRfdG9fZmls ZSkKKwl7CisJICBnY292X3Bvc2l0aW9uX3Qgb2Zmc2V0ID0gZ2Nvdl93cml0ZV90YWcgKEdD T1ZfVEFHX0NPTkRTKTsKKwkgIGZvciAoaW50IGkgPSAwOyBpIDwgbmNvbmRzOyArK2kpCisJ ICAgIHsKKwkgICAgICBpbnQgaWR4ID0gc2l6ZXNbaV07CisJICAgICAgaW50IGxlbiA9IHNp emVzW2kgKyAxXSAtIGlkeDsKKwkgICAgICBiYXNpY19ibG9jayAqaXRyID0gYmxvY2tzLmFk ZHJlc3MgKCkgKyBpZHg7CisJICAgICAgaW50IHRlcm1zID0gaW5zdHJ1bWVudF9kZWNpc2lv bnMgKGl0ciwgbGVuLCBpKTsKKwkgICAgICBnY292X3dyaXRlX3Vuc2lnbmVkIChibG9ja3Nb aWR4XS0+aW5kZXgpOworCSAgICAgIGdjb3Zfd3JpdGVfdW5zaWduZWQgKHRlcm1zKTsKKwkg ICAgfQorCSAgZ2Nvdl93cml0ZV9sZW5ndGggKG9mZnNldCk7CisJfQorICAgIH0KKwogICAv KiBGb3IgZWFjaCBlZGdlIG5vdCBvbiB0aGUgc3Bhbm5pbmcgdHJlZSwgYWRkIGNvdW50aW5n IGNvZGUuICAqLwogICBpZiAocHJvZmlsZV9hcmNfZmxhZwogICAgICAgJiYgY292ZXJhZ2Vf Y291bnRlcl9hbGxvYyAoR0NPVl9DT1VOVEVSX0FSQ1MsIG51bV9pbnN0cnVtZW50ZWQpKQog ICAgIHsKICAgICAgIHVuc2lnbmVkIG5faW5zdHJ1bWVudGVkOwogCi0gICAgICBnaW1wbGVf aW5pdF9nY292X3Byb2ZpbGVyICgpOwotCiAgICAgICBuX2luc3RydW1lbnRlZCA9IGluc3Ry dW1lbnRfZWRnZXMgKGVsKTsKIAogICAgICAgZ2NjX2Fzc2VydCAobl9pbnN0cnVtZW50ZWQg PT0gbnVtX2luc3RydW1lbnRlZCk7CiAKICAgICAgIGlmIChmbGFnX3Byb2ZpbGVfdmFsdWVz KQogCWluc3RydW1lbnRfdmFsdWVzICh2YWx1ZXMpOwotCi0gICAgICAvKiBDb21taXQgY2hh bmdlcyBkb25lIGJ5IGluc3RydW1lbnRhdGlvbi4gICovCi0gICAgICBnc2lfY29tbWl0X2Vk Z2VfaW5zZXJ0cyAoKTsKICAgICB9CiAKICAgZnJlZV9hdXhfZm9yX2VkZ2VzICgpOwogCiAg IHZhbHVlcy5yZWxlYXNlICgpOwogICBmcmVlX2VkZ2VfbGlzdCAoZWwpOworICAvKiBDb21t aXQgY2hhbmdlcyBkb25lIGJ5IGluc3RydW1lbnRhdGlvbi4gICovCisgIGdzaV9jb21taXRf ZWRnZV9pbnNlcnRzICgpOworCiAgIGNvdmVyYWdlX2VuZF9mdW5jdGlvbiAobGluZW5vX2No ZWNrc3VtLCBjZmdfY2hlY2tzdW0pOwogICBpZiAoZmxhZ19icmFuY2hfcHJvYmFiaWxpdGll cwogICAgICAgJiYgKHByb2ZpbGVfc3RhdHVzX2Zvcl9mbiAoY2Z1bikgPT0gUFJPRklMRV9S RUFEKSkKQEAgLTE2NjQsNiArMTcyMSw3IEBAIGluaXRfYnJhbmNoX3Byb2IgKHZvaWQpCiAg IHRvdGFsX251bV9wYXNzZXMgPSAwOwogICB0b3RhbF9udW1fdGltZXNfY2FsbGVkID0gMDsK ICAgdG90YWxfbnVtX2JyYW5jaGVzID0gMDsKKyAgdG90YWxfbnVtX2NvbmRzID0gMDsKICAg Zm9yIChpID0gMDsgaSA8IDIwOyBpKyspCiAgICAgdG90YWxfaGlzdF9icl9wcm9iW2ldID0g MDsKIH0KQEAgLTE3MDMsNSArMTc2MSw3IEBAIGVuZF9icmFuY2hfcHJvYiAodm9pZCkKIAkJ ICAgICAodG90YWxfaGlzdF9icl9wcm9iW2ldICsgdG90YWxfaGlzdF9icl9wcm9iWzE5LWld KSAqIDEwMAogCQkgICAgIC8gdG90YWxfbnVtX2JyYW5jaGVzLCA1KmksIDUqaSs1KTsKIAl9 CisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJUb3RhbCBudW1iZXIgb2YgY29uZGl0aW9u czogJWRcbiIsCisJICAgICAgIHRvdGFsX251bV9jb25kcyk7CiAgICAgfQogfQpkaWZmIC0t Z2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvZ2Nvdi9nY292LTE4LkMgYi9nY2MvdGVzdHN1 aXRlL2crKy5kZy9nY292L2djb3YtMTguQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMC4uOWFjMTRkZmVmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1 aXRlL2crKy5kZy9nY292L2djb3YtMTguQwpAQCAtMCwwICsxLDIyNyBAQAorLyogeyBkZy1v cHRpb25zICItLWNvdmVyYWdlIC1mcHJvZmlsZS1jb25kaXRpb25zIC1zdGQ9YysrMTEiIH0g Ki8KKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IG5hdGl2ZSB9IH0gKi8KKworI2luY2x1ZGUg PHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK2NsYXNzIG5vbnRyaXZpYWxfZGVz dHJ1Y3RvcgoreworcHVibGljOgorICAgIGV4cGxpY2l0IG5vbnRyaXZpYWxfZGVzdHJ1Y3Rv ciAoaW50IHYpIDogdmFsICh2KSB7fQorICAgIH5ub250cml2aWFsX2Rlc3RydWN0b3IgKCkg e30KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBib29s KHZhbCk7IH0KKworICAgIGludCB2YWw7Cit9OworCitpbnQgaWRlbnRpdHkgKGludCB4KSB7 IHJldHVybiB4OyB9CitpbnQgdGhyb3dzIChpbnQpIHsgdGhyb3cgc3RkOjpydW50aW1lX2Vy cm9yKCJleGNlcHRpb24iKTsgfQorCitpbnQgdGhyb3dfaWYgKGludCB4KQoreworICAgIGlm ICh4KSAvKiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAqLworICAgICAgICB0aHJvdyBzdGQ6 OnJ1bnRpbWVfZXJyb3IoImV4Y2VwdGlvbiIpOworICAgIHJldHVybiB4OworfQorCisvKiB1 c2VkIGZvciBzaWRlIGVmZmVjdHMgdG8gaW5zZXJ0IG5vZGVzIGluIGNvbmRpdGlvbmFsIGJv ZGllcyBldGMuICovCitpbnQgeCA9IDA7CisKKy8qIGNvbmRpdGlvbmFscyB3b3JrIGluIHRo ZSBwcmVzZW5jZSBvZiBub24tdHJpdmlhbCBkZXN0cnVjdG9ycyAqLwordm9pZCBtY2RjMDAx YSAoaW50IGEpCit7CisgICAgbm9udHJpdmlhbF9kZXN0cnVjdG9yIHYgKGEpOworCisgICAg aWYgKHYudmFsID4gMCkgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgICAgIHggPSB2LnZh bDsKKyAgICBlbHNlCisgICAgICAgIHggPSAtdi52YWw7Cit9CisKKy8qIG5vbi10cml2aWFs IGRlc3RydWN0b3IgaW4tbG9vcCB0ZW1wb3JhcnkgKi8KK25vbnRyaXZpYWxfZGVzdHJ1Y3Rv cgorbWNkYzAwMmEgKGludCBhLCBpbnQgYikKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8 IGE7IGkrKykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworICAgICAgICBub250cml2 aWFsX2Rlc3RydWN0b3IgdG1wIChhKTsKKyAgICAgICAgaWYgKHRtcC52YWwgJSBiKSAvKiBj b25kaXRpb25zKDIvMikgKi8KKyAgICAgICAgICAgIHJldHVybiBub250cml2aWFsX2Rlc3Ry dWN0b3IgKDApOworICAgICAgICB4ICs9IGk7CisgICAgfSAvKiBjb25kaXRpb25zKHN1cHBy ZXNzKSAqLworICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisKKyAgICByZXR1cm4gbm9u dHJpdmlhbF9kZXN0cnVjdG9yIChhICogYik7Cit9CisKKy8qIGNvbmRpdGlvbmFsIGluIGNv bnN0cnVjdG9yICovCit2b2lkIG1jZGMwMDNhIChpbnQgYSkKK3sKKyAgICBjbGFzcyBDCisg ICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQyAoaW50IGUpIDogdiAoZSkg eworICAgICAgICAgICAgaWYgKGUpIC8qIGNvbmRpdGlvbnMoMS8yKSBmYWxzZSgwKSAqLwor ICAgICAgICAgICAgICAgIHYgPSB4IC0gZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdjsK KyAgICB9OworCisgICAgQyBjIChhKTsKKyAgICBpZiAoYy52ID4gMikgLyogY29uZGl0aW9u cygxLzIpIHRydWUoMCkgKi8KKyAgICAgICAgeCA9IGMudiArIGE7Cit9CisKKy8qIGNvbmRp dGlvbmFsIGluIGRlc3RydWN0b3IgKi8KK3ZvaWQgbWNkYzAwNGEgKGludCBhKQoreworICAg IGNsYXNzIEMKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDIChpbnQg ZSkgOiB2IChlKSB7fQorICAgICAgICB+QyAoKSB7CisgICAgICAgICAgICBpZiAodikgLyog Y29uZGl0aW9ucygyLzIpICovCisgICAgICAgICAgICAgICAgeCA9IDIgKiB2OworICAgICAg ICB9CisgICAgICAgIGludCB2OworICAgIH07CisKKyAgICBDIGMgKGEpOworICAgIHggPSAx OyAvLyBhcmJpdHJhcnkgYWN0aW9uIGJldHdlZW4gY3RvcitkdG9yCit9CisKKy8qIGNvbmRp dGlvbmFsIGluIHRyeSAqLwordm9pZCBtY2RjMDA1YSAoaW50IGEpCit7CisgICAgdHJ5Cisg ICAgeworICAgICAgICBpZiAoYSkgLyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKyAg ICAgICAgICAgIHggPSAyICogaWRlbnRpdHkgKGEpOworICAgICAgICBlbHNlCisgICAgICAg ICAgICB4ID0gMTsKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHgg PSAwOworICAgIH0KK30KKworLyogY29uZGl0aW9uYWwgaW4gY2F0Y2ggKi8KK3ZvaWQgbWNk YzAwNmEgKGludCBhKSB7CisgICAgdHJ5CisgICAgeworICAgICAgICB0aHJvd3MgKGEpOwor ICAgIH0KKyAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mKQorICAgIHsKKyAgICAgICAgaWYg KGEpIC8qIGNvbmRpdGlvbnMoMS8yKSBmYWxzZSgwKSAqLworICAgICAgICAgICAgeCA9IGlk ZW50aXR5IChhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeCA9IDA7CisgICAgfQor fQorCit2b2lkIG1jZGMwMDZiIChpbnQgYSkKK3sKKyAgICBpZiAoYSkgLyogY29uZGl0aW9u cygxLzIpIHRydWUoMCkgKi8KKyAgICAgICAgdGhyb3dzIChhKTsKKyAgICBlbHNlCisgICAg ICAgIHggPSAxOworfQorCit2b2lkIG1jZGMwMDZjIChpbnQgYSkgdHJ5Cit7CisgICAgdGhy b3dzIChhKTsKK30KK2NhdGNoICguLi4pIHsKKyAgICBpZiAoYSkgLyogY29uZGl0aW9ucygy LzIpICovCisgICAgICAgIHggPSA1OworfQorCisvKiB0ZW1wb3Jhcnkgd2l0aCBkZXN0cnVj dG9yIGFzIHRlcm0gKi8KK3ZvaWQgbWNkYzAwN2EgKGludCBhLCBpbnQgYikKK3sKKyAgICB4 ID0gYSAmJiBub250cml2aWFsX2Rlc3RydWN0b3IgKGIpOyAvKiBjb25kaXRpb25zKDMvNCkg ZmFsc2UoMSkgZGVzdHJ1Y3RvcigpICovCit9CisKK3ZvaWQgbWNkYzAwN2IgKGludCBhLCBp bnQgYikKK3sKKyAgICBpZiAoYSB8fCB0aHJvd19pZiAoYikpIC8qIGNvbmRpdGlvbnMoMy80 KSB0cnVlKDEpIGRlc3RydWN0b3IoKSAqLworICAgICAgICB4ID0gLTE7CisgICAgZWxzZQor ICAgICAgICB4ID0gMTsKK30KKwordm9pZCBtY2RjMDA3YyAoaW50IGEsIGludCBiKQorewor ICAgIGlmICh0aHJvd19pZiAoYSkgfHwgdGhyb3dfaWYgKGIpKSAvKiBjb25kaXRpb25zKDIv NCkgdHJ1ZSgwIDEpIGRlc3RydWN0b3IoKSAqLworICAgICAgICB4ID0gLTE7CisgICAgZWxz ZQorICAgICAgICB4ID0gMTsKK30KKworLyogZGVzdHJ1Y3RvciB3aXRoIGRlbGV0ZSAqLwor dm9pZCBtY2RjMDA4YSAoaW50IGEpCit7CisgICAgY2xhc3MgQworICAgIHsKKyAgICBwdWJs aWM6CisgICAgICAgIGludCBzaXplID0gNTsKKyAgICAgICAgaW50KiBwdHIgPSBudWxscHRy OworCisgICAgICAgIGV4cGxpY2l0IEMgKGludCB2KSA6IHNpemUodiArIDUpLCBwdHIgKG5l dyBpbnRbc2l6ZV0pIC8qIGNvbmRpdGlvbnMoc3VwcHJlc3MpICovCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNv bmRpdGlvbnMoZW5kKSAqLworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0g MDsgaSA8IHNpemU7IGkrKykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgICAgICAgICAg ICAgcHRyW2ldID0gaSArIDE7CisgICAgICAgIH0KKyAgICAgICAgfkMoKQorICAgICAgICB7 CisgICAgICAgICAgICBpZiAocHRyKSAvKiBjb25kaXRpb25zKDEvMikgZmFsc2UoMCkgKi8K KyAgICAgICAgICAgICAgICBkZWxldGUgcHRyOyAvKiBjb25kaXRpb25zKHN1cHByZXNzKSAq LworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLwor ICAgICAgICB9CisgICAgfTsKKworICAgIEMgYyAoYSk7CisgICAgaWYgKGMucHRyW2EgKyAx XSkgLyogY29uZGl0aW9ucygxLzIpIGZhbHNlKDApICovCisgICAgICAgIHggPSBhOworfQor CitpbnQKK21haW4gKHZvaWQpCit7CisgICAgbWNkYzAwMWEgKDApOworICAgIG1jZGMwMDFh ICgxKTsKKworICAgIG1jZGMwMDJhICgxLCAxKTsKKyAgICBtY2RjMDAyYSAoMSwgMik7CisK KyAgICBtY2RjMDAzYSAoMSk7CisKKyAgICBtY2RjMDA0YSAoMCk7CisgICAgbWNkYzAwNGEg KDEpOworCisgICAgbWNkYzAwNWEgKDApOworCisgICAgbWNkYzAwNmEgKDEpOworCisgICAg bWNkYzAwNmIgKDApOworCisgICAgbWNkYzAwNmMgKDApOworICAgIG1jZGMwMDZjICgxKTsK KworICAgIG1jZGMwMDdhICgwLCAwKTsKKyAgICBtY2RjMDA3YSAoMSwgMSk7CisKKyAgICBt Y2RjMDA3YiAoMCwgMCk7CisgICAgbWNkYzAwN2IgKDEsIDApOworCisgICAgbWNkYzAwN2Mg KDAsIDApOworCisgICAgbWNkYzAwOGEgKDEpOworCit9CisKKy8qIHsgZGctZmluYWwgeyBy dW4tZ2NvdiBjb25kaXRpb25zIHsgLS1jb25kaXRpb25zIGdjb3YtMTguQyB9IH0gfSAqLwpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MubWlzYy10ZXN0cy9nY292LTE5LmMgYi9n Y2MvdGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMTkuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNTE5MGMzZmQ1OGEKLS0tIC9kZXYvbnVsbAorKysg Yi9nY2MvdGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMTkuYwpAQCAtMCwwICsxLDcy NyBAQAorLyogeyBkZy1vcHRpb25zICItZnByb2ZpbGUtY29uZGl0aW9ucyAtZnRlc3QtY292 ZXJhZ2UiIH0gKi8KKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IG5hdGl2ZSB9IH0gKi8KKwor Lyogc29tZSBzaWRlIGVmZmVjdCB0byBzdG9wIGJyYW5jaGVzIGZyb20gYmVpbmcgcHJ1bmVk ICovCitpbnQgeCA9IDA7CisKKy8qIHx8IHdvcmtzICovCit2b2lkIG1jZGMwMDFhIChpbnQg YSwgaW50IGIpCit7CisgICAgaWYgKGEgfHwgYikgLyogY29uZGl0aW9ucygxLzQpIHRydWUo MCkgZmFsc2UoMCAxKSAqLworCQkvKiBjb25kaXRpb25zKGVuZCkgKi8KKwl4ID0gMTsKKyAg ICBlbHNlCisJeCA9IDI7Cit9CisKK3ZvaWQgbWNkYzAwMWIgKGludCBhLCBpbnQgYikKK3sK KyAgICBpZiAoYSB8fCBiKSAvKiBjb25kaXRpb25zKDMvNCkgdHJ1ZSgwKSBmYWxzZSgpICov CisJCS8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXggPSAxOworICAgIGVsc2UKKwl4ID0gMjsK K30KKwordm9pZCBtY2RjMDAxYyAoaW50IGEsIGludCBiKQoreworICAgIGlmIChhIHx8IGIp IC8qIGNvbmRpdGlvbnMoNC80KSAqLworCXggPSAxOworICAgIGVsc2UKKwl4ID0gMjsKK30K Kwordm9pZCBtY2RjMDAxZCAoaW50IGEsIGludCBiLCBpbnQgYykKK3sKKyAgICBpZiAoYSB8 fCBiIHx8IGMpIC8qIGNvbmRpdGlvbnMoMy82KSBmYWxzZSgxIDIpIHRydWUoMikgKi8KKwkJ ICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKwl4ID0gMTsKK30KKworLyogJiYgd29ya3Mg Ki8KK3ZvaWQgbWNkYzAwMmEgKGludCBhLCBpbnQgYikKK3sKKyAgICBpZiAoYSAmJiBiKSAv KiBjb25kaXRpb25zKDEvNCkgdHJ1ZSgwIDEpIGZhbHNlKDApICovCisJCS8qIGNvbmRpdGlv bnMoZW5kKSAqLworCXggPSAxOworICAgIGVsc2UKKwl4ID0gMjsKK30KKwordm9pZCBtY2Rj MDAyYiAoaW50IGEsIGludCBiKQoreworICAgIGlmIChhICYmIGIpIC8qIGNvbmRpdGlvbnMo My80KSBmYWxzZSgwKSAqLworCQkvKiBjb25kaXRpb25zKGVuZCkgKi8KKwl4ID0gMTsKKyAg ICBlbHNlCisJeCA9IDI7Cit9CisKK3ZvaWQgbWNkYzAwMmMgKGludCBhLCBpbnQgYikKK3sK KyAgICBpZiAoYSAmJiBiKSAvKiBjb25kaXRpb25zKDQvNCkgKi8KKwl4ID0gMTsKKyAgICBl bHNlCisJeCA9IDI7Cit9CisKK3ZvaWQgbWNkYzAwMmQgKGludCBhLCBpbnQgYiwgaW50IGMp Cit7CisgICAgLyoKKyAgICAgKiBUaGlzIGlzIGFuIG9kZCBjYXNlLCBhbmQgZmFsbHMgdmlj dGltIHRvIHRyeWluZyB0byBkZXRlY3QgbmVzdGVkIGlmcy4KKyAgICAgKgorICAgICAqIGlm IChhKSBpZiAoYikgaWYgKGMpIHdpdGggbm8gZWxzZSBpcyBlcXVpdmFsZW50IHRvIGlmIChh ICYmIGIgJiYgYykgYW5kCisgICAgICogdGhlIENGR3MgYXJlIGlkZW50aWNhbCAqdW5sZXNz KiB0aGUgZWxzZSBub2RlcyBhcmUgZ2VuZXJhdGVkIHRvby4gSW4gdGhlCisgICAgICogJiYg ZXhwcmVzc2lvbiwgYWxsIGZhbHNlIGVkZ2VzIHNob3VsZCBnbyB0byB0aGUgc2FtZSBlbHNl LCBidXQgaW4gdGhlCisgICAgICogbmVzdGVkLWlmIGNhc2UgdGhleSBnbyB0byBkaWZmZXJl bnQgZWxzZXMuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbiBiZSBzdXJwcmlzaW5nLCBhbmQg YmFkIGZvciBNQy9EQyBiZWNhdXNlIG5vbi1pbmRlcGVuZGVudAorICAgICAqIGNvbmRpdGlv bmFscyBtYXNrZWQgYnkgdGVybXMgZnVydGhlci1yaWdodCBjYW4gbm90IGJlIGRldGVjdGVk LiBJZiBhbgorICAgICAqIGVsc2Ugbm9kZSBpcyBnZW5lcmF0ZWQsIHRoaXMgZXhwcmVzc2lv biBiZWNvbWVzIGEgMy10ZXJtIGRlY2lzaW9uIGFnYWluLgorICAgICAqLworICAgIGlmIChh ICYmIGIgJiYgYykgLyogY29uZGl0aW9ucyhzdXBwcmVzcykgY29uZGl0aW9ucyg0LzYpIGZh bHNlKDAgMikgKi8KKwkvKiBjb25kaXRpb25zKGVuZCkgKi8KKwl4ID0gMTsKK30KKworLyog bmVnYXRpb24gd29ya3MgKi8KK3ZvaWQgbWNkYzAwM2EgKGludCBhLCBpbnQgYikKK3sKKyAg ICBpZiAoIWEgfHwgIWIpIC8qIGNvbmRpdGlvbnMoMi80KSBmYWxzZSgwIDEpICovCisJCSAg LyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7CisgICAgZWxzZQorCXggPSAyOworfQor CisvKiBzaW5nbGUgY29uZGl0aW9uYWxzIHdpdGggYW5kIHdpdGhvdXQgZWxzZSAqLwordm9p ZCBtY2RjMDA0YSAoaW50IGEpCit7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMoMS8yKSB0 cnVlKDApICovCisJICAgLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7CisgICAgZWxz ZQorCXggPSAyOworfQorCit2b2lkIG1jZGMwMDRiIChpbnQgYSkKK3sKKyAgICBpZiAoYSkg LyogY29uZGl0aW9ucygyLzIpICovCisJeCA9IDE7CisgICAgZWxzZQorCXggPSAyOworfQor Cit2b2lkIG1jZGMwMDRjIChpbnQgYSkKK3sKKyAgICBpZiAoYSkgLyogY29uZGl0aW9ucygx LzIpIGZhbHNlKDApICovCisJICAgLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7Cit9 CisKK3ZvaWQgbWNkYzAwNGQgKGludCBhLCBpbnQgYiwgaW50IGMpIHsKKyAgICBpZiAoYSkg IC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwlpZiAoYiB8fCBjKSAvKiBjb25kaXRp b25zKDEvNCkgdHJ1ZSgxKSBmYWxzZSgwIDEpICovCisJICAgIHggPSBhICsgYiArIGM7Cisg ICAgfQorfQorCisvKiBtaXhpbmcgJiYgYW5kIHx8IHdvcmtzICovCit2b2lkIG1jZGMwMDVh IChpbnQgYSwgaW50IGIsIGludCBjKQoreworICAgIGlmICgoYSAmJiBiKSB8fCBjKSAvKiBj b25kaXRpb25zKDEvNikgdHJ1ZSgwIDEpIGZhbHNlKDAgMSAyKSAqLworCQkgICAgICAgLyog Y29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7CisgICAgZWxzZQorCXggPSAyOworfQorCit2 b2lkIG1jZGMwMDViIChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkKK3sKKyAgICBpZiAo KGEgJiYgKGIgfHwgYykpICYmIGQpIC8qIGNvbmRpdGlvbnMoNC84KSB0cnVlKDEgMiAzKSBm YWxzZSgwKSAqLworCQkJICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7Cisg ICAgZWxzZQorCXggPSAyOworfQorCisvKiBuZXN0ZWQgY29uZGl0aW9uYWxzICovCit2b2lk IG1jZGMwMDZhIChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUpCit7CisgICAg aWYgKGEpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwlpZiAoYiAmJiBjKSAvKiBj b25kaXRpb25zKDMvNCkgZmFsc2UoMSkgKi8KKwkJICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAq LworCSAgICB4ID0gMTsKKwllbHNlCisJICAgIHggPSAyOworICAgIH0KKyAgICBlbHNlCisg ICAgeworCWlmIChjIHx8IGQpIC8qIGNvbmRpdGlvbnMoMi80KSB0cnVlKDAgMSkgKi8KKwkJ ICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCSAgICB4ID0gMzsKKwllbHNlCisJICAgIHgg PSA0OworICAgIH0KK30KKwordm9pZCBtY2RjMDA2YiAoaW50IGEsIGludCBiLCBpbnQgYykK K3sKKyAgICBpZiAoYSkgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworCWlmIChiKSAv KmNvbmRpdGlvbnMoMi8yKSAqLworCXsKKwkgICAgaWYgKGMpIC8qIGNvbmRpdGlvbnMoMi8y KSAqLworCSAgICB7CisJCXggPSBhICsgYiArIGM7CisJICAgIH0KKwl9CisgICAgfQorfQor CisvKiBlbHNlL2lmICovCit2b2lkIG1jZGMwMDdhIChpbnQgYSwgaW50IGIsIGludCBjLCBp bnQgZCkKK3sKKyAgICBpZiAoYSkgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworCWlm IChiKSAvKiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAqLworCSAgICAgICAvKiBjb25kaXRp b25zKGVuZCkgKi8KKwkgICAgeCA9IDE7CisJZWxzZQorCSAgICB4ID0gMjsKKyAgICB9Cisg ICAgZWxzZSBpZiAoYykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworCWlmIChkKSAv KiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAqLworCSAgICAgICAvKiBjb25kaXRpb25zKGVu ZCkgKi8KKwkgICAgeCA9IDM7CisgICAgfQorfQorCit2b2lkIG1jZGMwMDdiIChpbnQgYSwg aW50IGIsIGludCBjKQoreworICAgIC8qIHNpbWlsYXIgdG8gaWYgKGEgfHwgYiB8fCBjKSB4 ID0gMSAqLworICAgIGlmIChhKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKwlnb3RvIHRoZW47 CisgICAgZWxzZSBpZiAoYikgLyogY29uZGl0aW9ucygyLzIpICovCisJZ290byB0aGVuOwor ICAgIGVsc2UgaWYgKGMpIC8qIGNvbmRpdGlvbnMoMS8yKSB0cnVlKDApICovCisJLyogY29u ZGl0aW9ucyhlbmQpICovCisJZ290byB0aGVuOworCisgICAgcmV0dXJuOworCit0aGVuOgor ICAgIHggPSAxOworfQorCisvKiB3aGlsZSBsb29wICovCit2b2lkIG1jZGMwMDhhIChpbnQg YSkKK3sKKyAgICB3aGlsZSAoYSA8IDEwKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKwl4ID0g YSsrOworfQorCit2b2lkIG1jZGMwMDhiIChpbnQgYSkKK3sKKyAgICB3aGlsZSAoYSA+IDEw KSAvKiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAqLworCQkgICAvKiBjb25kaXRpb25zKGVu ZCkgKi8KKwl4ID0gYS0tOworfQorCit2b2lkIG1jZGMwMDhjIChpbnQgYSkKK3sKKyAgICAv LyBzaG91bGQgd29yaywgZXZlbiB3aXRoIG5vIGJvZHkKKyAgICB3aGlsZSAoYSkgLyogY29u ZGl0aW9ucygyLzIpwqAqLworCWJyZWFrOworfQorCit2b2lkIG1jZGMwMDhkIChpbnQgYSwg aW50IGIsIGludCBjLCBpbnQgZCkKK3sKKyAgICAvKiBtdWx0aS10ZXJtIGxvb3AgY29uZGl0 aW9uYWwgKi8KKyAgICB3aGlsZSAoKGEgJiYgKGIgfHwgYykpICYmIGQpIC8qIGNvbmRpdGlv bnMoOC84KSAqLworCWEgPSBiID0gYyA9IGQgPSAwOworfQorCit2b2lkIG1jZGMwMDlhIChp bnQgYSwgaW50IGIpCit7CisgICAgd2hpbGUgKGEgPiAwICYmIGIgPiAwKSAvKiBjb25kaXRp b25zKDMvNCkgZmFsc2UoMSkgKi8KKwkJCSAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXgg PSBhLS07Cit9CisKKy8qIGZvciBsb29wICovCit2b2lkIG1jZGMwMTBhKGludCBhLCBpbnQg YikKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGI7IGkrKykgLyogY29uZGl0aW9ucygy LzIpICovCisgICAgeworCWlmIChhIDwgYikgLyogY29uZGl0aW9ucygyLzIpICovCisJICAg IHggPSAxOworCWVsc2UKKwkgICAgeCA9IGEgKz0gMjsKKyAgICB9Cit9CisKK2ludCBhbHdh eXMgKGludCkgeyByZXR1cm4gMTsgfQorCisvKiBuby1jb25kaXRpb24gaW5maW5pdGUgbG9v cHMgKi8KK3ZvaWQgbWNkYzAxMGIgKGludCBhKQoreworICAgIGZvciAoOzspCisgICAgewor CWlmIChhbHdheXMoYSkpIC8qIGNvbmRpdGlvbnMoMS8yKSBmYWxzZSgwKSAqLworCQkgICAg ICAgLyogY29uZGl0aW9ucyhlbmQpICovCisJeworCSAgICB4ID0gYTsKKwkgICAgYnJlYWs7 CisJfQorCXggKz0gYSArIDE7CisgICAgfQorfQorCisvKiBjb25kaXRpb25hbHMgd2l0aG91 dCBjb250cm9sIGZsb3cgY29uc3RydWN0cyB3b3JrICovCit2b2lkIG1jZGMwMTFhIChpbnQg YSwgaW50IGIsIGludCBjKQoreworICAgIHggPSAoYSAmJiBiKSB8fCBjOyAvKiBjb25kaXRp b25zKDUvNikgZmFsc2UoMSkgKi8KKwkJICAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLwor fQorCisvKiBzZXF1ZW50aWFsIGV4cHJlc3Npb25zIGFyZSBoYW5kbGVkIGluZGVwZW5kZW50 bHkgKi8KK3ZvaWQgbWNkYzAxMmEgKGludCBhLCBpbnQgYiwgaW50IGMpIHsKKyAgICBpZiAo YSB8fCBiKSAvKiBjb25kaXRpb25zKDMvNCkgdHJ1ZSgwKSAqLworCS8qIGNvbmRpdGlvbnMo ZW5kKSAqLworCXggPSAxOworICAgIGVsc2UKKwl4ID0gMjsKKworICAgIGlmIChjKSAvKiBj b25kaXRpb25zKDIvMikgKi8KKwl4ID0gMTsKK30KKworLyoKKyAqIGNhbm5vdCBldmVyIHNh dGlzZnkgTUMvREMsIGV2ZW4gd2l0aCBhbGwgaW5wdXQgY29tYmluYXRpb25zLCBiZWNhdXNl IG5vdCBhbGwKKyAqIHZhcmlhYmxlcyBpbmRlcGVuZGVudGx5IGFmZmVjdCB0aGUgZGVjaXNp b24KKyAqLwordm9pZCBtY2RjMDEzYSAoaW50IGEsIGludCAvKiBiICovLCBpbnQgYykKK3sK KyAgICAvKgorICAgICAqIFNwZWNpZmljYXRpb246IChhICYmIGIpIHx8IGMKKyAgICAgKgor ICAgICAqIEJ1dCB0aGUgZXhwcmVzc2lvbiB3YXMgaW1wbGVtZW50ZWQgd3JvbmcuIFRoaXMg aGFzIGJyYW5jaCBjb3ZlcmFnZSwgYnV0CisgICAgICogbm90IE1DL0RDCisgICAgICovCisg ICAgaWYgKChhICYmICFjKSB8fCBjKSAvKiBjb25kaXRpb25zKDUvNikgZmFsc2UoMSkgKi8K KwkvKiBjb25kaXRpb25zKGVuZCkgKi8KKwl4ID0gMTsKKyAgICBlbHNlCisJeCA9IDI7Cit9 CisKK3ZvaWQgbWNkYzAxNGEgKCkKK3sKKyAgICBpbnQgY29uZHNbNjRdID0geyAwIH07Cisg ICAgLyogY29uZGl0aW9ucyg2NC8xMjgpIHRydWUoMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAx MSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAy OSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0 NyA0OCA0OSA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MykgKi8K KyAgICB4ID0gY29uZHNbIDBdIHx8IGNvbmRzWyAxXSB8fCBjb25kc1sgMl0gfHwgY29uZHNb IDNdIHx8IGNvbmRzWyA0XSB8fAorCWNvbmRzWyA1XSB8fCBjb25kc1sgNl0gfHwgY29uZHNb IDddIHx8IGNvbmRzWyA4XSB8fCBjb25kc1sgOV0gfHwKKwljb25kc1sxMF0gfHwgY29uZHNb MTFdIHx8IGNvbmRzWzEyXSB8fCBjb25kc1sxM10gfHwgY29uZHNbMTRdIHx8CisJY29uZHNb MTVdIHx8IGNvbmRzWzE2XSB8fCBjb25kc1sxN10gfHwgY29uZHNbMThdIHx8IGNvbmRzWzE5 XSB8fAorCWNvbmRzWzIwXSB8fCBjb25kc1syMV0gfHwgY29uZHNbMjJdIHx8IGNvbmRzWzIz XSB8fCBjb25kc1syNF0gfHwKKwljb25kc1syNV0gfHwgY29uZHNbMjZdIHx8IGNvbmRzWzI3 XSB8fCBjb25kc1syOF0gfHwgY29uZHNbMjldIHx8CisJY29uZHNbMzBdIHx8IGNvbmRzWzMx XSB8fCBjb25kc1szMl0gfHwgY29uZHNbMzNdIHx8IGNvbmRzWzM0XSB8fAorCWNvbmRzWzM1 XSB8fCBjb25kc1szNl0gfHwgY29uZHNbMzddIHx8IGNvbmRzWzM4XSB8fCBjb25kc1szOV0g fHwKKwljb25kc1s0MF0gfHwgY29uZHNbNDFdIHx8IGNvbmRzWzQyXSB8fCBjb25kc1s0M10g fHwgY29uZHNbNDRdIHx8CisJY29uZHNbNDVdIHx8IGNvbmRzWzQ2XSB8fCBjb25kc1s0N10g fHwgY29uZHNbNDhdIHx8IGNvbmRzWzQ5XSB8fAorCWNvbmRzWzUwXSB8fCBjb25kc1s1MV0g fHwgY29uZHNbNTJdIHx8IGNvbmRzWzUzXSB8fCBjb25kc1s1NF0gfHwKKwljb25kc1s1NV0g fHwgY29uZHNbNTZdIHx8IGNvbmRzWzU3XSB8fCBjb25kc1s1OF0gfHwgY29uZHNbNTldIHx8 CisJY29uZHNbNjBdIHx8IGNvbmRzWzYxXSB8fCBjb25kc1s2Ml0gfHwgY29uZHNbNjNdCisJ OyAgLyogY29uZGl0aW9ucyhlbmQpICovCit9CisKKy8qIGVhcmx5IHJldHVybnMgKi8KK3Zv aWQgbWNkYzAxNWEgKGludCBhLCBpbnQgYikKK3sKKyAgICBpZiAoYSkgLyogY29uZGl0aW9u cygyLzIpICovCisJcmV0dXJuOworCisgICAgaWYgKGIpIC8qIGNvbmRpdGlvbnMoMS8yKSB0 cnVlKDApICovCisJICAgLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7Cit9CisKK3Zv aWQgbWNkYzAxNWIgKGludCBhLCBpbnQgYikKK3sKKyAgICBmb3IgKGludCBpID0gNTsgaSA+ IGE7IGktLSkgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworCWlmIChpID09IGIpIC8q IGNvbmRpdGlvbnMoMi8yKSAqLworCSAgICByZXR1cm47CisJeCA9IGk7CisgICAgfQorfQor Cit2b2lkIG1jZGMwMTVjIChpbnQgYSwgaW50IGIpCit7CisgICAgZm9yIChpbnQgaSA9IDU7 IGkgPiBhOyBpLS0pIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwlpZiAoaSA9PSBi KSAvKiBjb25kaXRpb25zKDIvMikgKi8KKwl7CisJICAgIHggPSAwOworCSAgICByZXR1cm47 CisJfQorCWVsc2UKKwl7CisJICAgIHggPSAxOworCSAgICByZXR1cm47CisJfQorCisJeCA9 IGk7CisgICAgfQorfQorCisKKy8qIGNoZWNrIG5lc3RlZCBsb29wcyAqLwordm9pZCBtY2Rj MDE2YSAoaW50IGEsIGludCBiKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTsgaSsr KSAvKiBjb25kaXRpb25zKDIvMikgKi8KKwlmb3IgKGludCBrID0gMDsgayA8IGI7IGsrKykg LyogY29uZGl0aW9ucygyLzIpICovCisJICAgIHggPSBpICsgazsKK30KKwordm9pZCBtY2Rj MDE2YiAoaW50IGEsIGludCBiKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTsgaSsr KSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICB7CisJaWYgKGEgPiA1KSAvKiBjb25kaXRp b25zKDIvMikgKi8KKwkgICAgYnJlYWs7CisKKwlmb3IgKGludCBrID0gMDsgayA8IGI7IGsr KykgLyogY29uZGl0aW9ucygyLzIpICovCisJICAgIHggPSBpICsgazsKKyAgICB9Cit9CisK K3ZvaWQgbWNkYzAxNmMgKGludCBhLCBpbnQgYikKK3sKKyAgICBmb3IgKGludCBpID0gMDsg aSA8IGE7IGkrKykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworCWlmIChhID4gNSkg LyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKwkJICAgLyogY29uZGl0aW9ucyhlbmQp ICovCisJICAgIHJldHVybjsKKworCWZvciAoaW50IGsgPSAwOyBrIDwgYjsgaysrKSAvKiBj b25kaXRpb25zKDIvMikgKi8KKwkgICAgeCA9IGkgKyBrOworICAgIH0KK30KKwordm9pZCBt Y2RjMDE2ZCAoaW50IGEsIGludCBiKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTsg aSsrKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICB7CisJZm9yIChpbnQgayA9IDA7IGsg PCA1OyBrKyspIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCXsKKwkgICAgaWYgKGIgPiA1KSAv KiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAqLworCQkgICAgICAgLyogY29uZGl0aW9ucyhl bmQpICovCisJCXJldHVybjsKKwkgICAgeCA9IGkgKyBrOworCX0KKworICAgIH0KK30KKwor LyogZG8td2hpbGUgbG9vcHMgKi8KK3ZvaWQgbWNkYzAxN2EgKGludCBhKQoreworICAgIGRv IHsKKwlhLS07CisgICAgfSB3aGlsZSAoYSA+IDApOyAvKiBjb25kaXRpb25zKDIvMikgKi8K K30KKwordm9pZCBub29wICgpIHt9CisKK3ZvaWQgbWNkYzAxN2IgKGludCBhLCBpbnQgYikK K3sKKyAgICBkbyB7CisJLyoKKwkgKiBUaGlzIGNhbGwgaXMgaW1wb3J0YW50OyBpdCBjYW4g YWRkIG1vcmUgbm9kZXMgdG8gdGhlIGJvZHkgaW4gdGhlCisJICogQ0ZHLCB3aGljaCBoYXMg Y2hhbmdlcyBob3cgY2xvc2UgZXhpdHMgYW5kIGJyZWFrcyBhcmUgdG8gdGhlIGxvb3AKKwkg KiBjb25kaXRpb25hbC4KKwkgKi8KKwlub29wICgpOworCWEtLTsKKwlpZiAoYikgLyogY29u ZGl0aW9ucygyLzIpICovCisJICAgIGJyZWFrOworCisgICAgfSB3aGlsZSAoYSA+IDApOyAv KiBjb25kaXRpb25zKDIvMikgKi8KK30KKwordm9pZCBtY2RjMDE3YyAoaW50IGEsIGludCBi KQoreworICAgIGludCBsZWZ0ID0gMDsKKyAgICBpbnQgcmlnaHQgPSAwOworICAgIGludCBu ID0gYSArIGI7CisgICAgZG8geworCWlmIChhKSAvKiBjb25kaXRpb25zKDEvMikgZmFsc2Uo MCkgKi8KKwkgICAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisJeworCSAgICBsZWZ0ID0g YSA+IGxlZnQgPyBiIDogbGVmdDsgLyogY29uZGl0aW9ucygyLzIpICovCisJfQorCWlmIChi KSAvKiBjb25kaXRpb25zKDEvMikgZmFsc2UoMCkgKi8KKwl7CisJICAgIHJpZ2h0ID0gYiA+ IHJpZ2h0ID8gYSA6IHJpZ2h0OyAvKiBjb25kaXRpb25zKDIvMikgKi8KKwl9CisgICAgfSB3 aGlsZSAobi0tID4gMCk7IC8qIGNvbmRpdGlvbnMoMi8yKSAqLworfQorCitpbnQgaWQgIChp bnQgeCkgeyByZXR1cm4gIHg7IH0KK2ludCBpbnYgKGludCB4KSB7IHJldHVybiAheDsgfQor CisvKiBjb2xsZWN0aW9uIG9mIG9kZCBjYXNlcyBsaWZ0ZWQtYW5kLWFkYXB0ZWQgZnJvbSBy ZWFsLXdvcmxkIGNvZGUgKi8KK2ludCBtY2RjMDE4YSAoaW50IGEsIGludCBiLCBpbnQgYywg aW50IGQsIGludCBlLCBpbnQgZiwgaW50IGcsIGludCBsZW4pCit7CisgICAgaW50IG47Cisg ICAgLyogYWRhcHRlZCBmcm9tIHpsaWIvZ3pfcmVhZCAqLworICAgIGRvCisgICAgeworCW4g PSAtMTsKKwlpZiAobiA+IGxlbikgLyogY29uZGl0aW9ucygyLzIpICovCisJICAgIG4gPSBs ZW47CisKKwlpZiAoYikgLyogY29uZGl0aW9ucygyLzIpICovCisJeworCSAgICBpZiAoYiA8 IDUpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCQl4ID0gMTsKKwkgICAgbm9vcCgpOworCX0K KwllbHNlIGlmIChjICYmIGQpIC8qIGNvbmRpdGlvbnMoMy80KSBmYWxzZSgxKSAqLworCXsK KwkgICAgeCA9IDI7CisJICAgIGJyZWFrOworCX0KKwllbHNlIGlmIChlIHx8IGYpIC8qIGNv bmRpdGlvbnMoMi80KSBmYWxzZSgwIDEpICovCisJCQkgLyogY29uZGl0aW9ucyhlbmQpICov CisJeworCSAgICBpZiAoaWQoZykpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCQlyZXR1cm4g MDsKKwkgICAgY29udGludWU7CisJfQorICAgIH0gd2hpbGUgKGEtLSA+IDApOyAvKiBjb25k aXRpb25zKDIvMikgKi8KKworICAgIHJldHVybiAxOworfQorCit2b2lkIG1jZGMwMThiIChp bnQgYSwgaW50IGIsIGludCBjKSB7CisgICAgaW50IG47CisgICAgd2hpbGUgKGEpIC8qIGNv bmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwkvKgorCSAqIGVsc2UgYmxvY2sgZG9lcyBub3Qg bWFrZSBhIGRpZmZlcmVuY2UgZm9yIHRoZSBwcm9ibGVtLCBidXQgZW5zdXJlcworCSAqIGxv b3AgdGVybWluYXRpb24KKwkgKi8KKwlpZiAoYikgLyogY29uZGl0aW9ucygyLzIpICovCisJ ICAgIG4gPSBjID8gMCA6IDA7IC8vIGRvZXMgbm90IHNob3cgdXAgaW4gQ0ZHIChlbWJlZGRl ZCBpbiB0aGUgYmxvY2spCisJZWxzZQorCSAgICBuID0gMDsKKwlhID0gbjsKKyAgICB9Cit9 CisKKy8qIHRvbyBtYW55IGNvbmRpdGlvbnMsIGNvdmVyYWdlIGdpdmVzIHVwICovCit2b2lk IG1jZGMwMTlhICgpCit7CisgICAgaW50IGNvbmRzWzY1XSA9IHsgMCB9OworICAgICNwcmFn bWEgR0NDIGRpYWdub3N0aWMgcHVzaAorICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdu b3JlZCAiLVdjb3ZlcmFnZS10b28tbWFueS1jb25kaXRpb25zIgorICAgIHggPSBjb25kc1sg MF0gfHwgY29uZHNbIDFdIHx8IGNvbmRzWyAyXSB8fCBjb25kc1sgM10gfHwgY29uZHNbIDRd IHx8CisJY29uZHNbIDVdIHx8IGNvbmRzWyA2XSB8fCBjb25kc1sgN10gfHwgY29uZHNbIDhd IHx8IGNvbmRzWyA5XSB8fAorCWNvbmRzWzEwXSB8fCBjb25kc1sxMV0gfHwgY29uZHNbMTJd IHx8IGNvbmRzWzEzXSB8fCBjb25kc1sxNF0gfHwKKwljb25kc1sxNV0gfHwgY29uZHNbMTZd IHx8IGNvbmRzWzE3XSB8fCBjb25kc1sxOF0gfHwgY29uZHNbMTldIHx8CisJY29uZHNbMjBd IHx8IGNvbmRzWzIxXSB8fCBjb25kc1syMl0gfHwgY29uZHNbMjNdIHx8IGNvbmRzWzI0XSB8 fAorCWNvbmRzWzI1XSB8fCBjb25kc1syNl0gfHwgY29uZHNbMjddIHx8IGNvbmRzWzI4XSB8 fCBjb25kc1syOV0gfHwKKwljb25kc1szMF0gfHwgY29uZHNbMzFdIHx8IGNvbmRzWzMyXSB8 fCBjb25kc1szM10gfHwgY29uZHNbMzRdIHx8CisJY29uZHNbMzVdIHx8IGNvbmRzWzM2XSB8 fCBjb25kc1szN10gfHwgY29uZHNbMzhdIHx8IGNvbmRzWzM5XSB8fAorCWNvbmRzWzQwXSB8 fCBjb25kc1s0MV0gfHwgY29uZHNbNDJdIHx8IGNvbmRzWzQzXSB8fCBjb25kc1s0NF0gfHwK Kwljb25kc1s0NV0gfHwgY29uZHNbNDZdIHx8IGNvbmRzWzQ3XSB8fCBjb25kc1s0OF0gfHwg Y29uZHNbNDldIHx8CisJY29uZHNbNTBdIHx8IGNvbmRzWzUxXSB8fCBjb25kc1s1Ml0gfHwg Y29uZHNbNTNdIHx8IGNvbmRzWzU0XSB8fAorCWNvbmRzWzU1XSB8fCBjb25kc1s1Nl0gfHwg Y29uZHNbNTddIHx8IGNvbmRzWzU4XSB8fCBjb25kc1s1OV0gfHwKKwljb25kc1s2MF0gfHwg Y29uZHNbNjFdIHx8IGNvbmRzWzYyXSB8fCBjb25kc1s2M10gfHwgY29uZHNbNjRdCisJOwor ICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCit9CisKKy8qIHRlcm5hcnkgKi8KK3Zv aWQgbWNkYzAyMGEgKGludCBhKQoreworICAgIC8vIHNwZWNpYWwgY2FzZSwgdGhpcyBjYW4g YmUgcmVkdWNlZCB0bzoKKyAgICAvLyBfMSA9IGFyZ2MgIT0gMDsKKyAgICAvLyBlID0gKGlu dCkgXzE7CisgICAgeCA9IGEgPyAxIDogMDsKKworICAgIC8vIGNoYW5naW5nIHRvIGRpZmZl cmVudCBpbnQgbWFrZXMgYnJhbmNoCisgICAgeCA9IGEgPyAyIDogMTsgLyogY29uZGl0aW9u cygyLzIpICovCit9CisKK3ZvaWQgbWNkYzAyMGIgKGludCBhLCBpbnQgYikKK3sKKyAgICB4 ID0gKGEgfHwgYikgPyAxIDogMDsgLyogY29uZGl0aW9ucygzLzQpIHRydWUoMSkgKi8KK30K Kwordm9pZCBtY2RjMDIwYyAoaW50IGEsIGludCBiKQoreworICAgIHggPSBhID8gMAorCTog YiA/IDEgLyogY29uZGl0aW9ucygyLzIpICovCisJOiAyOyAgICAvKiBjb25kaXRpb25zKDEv MikgZmFsc2UoMCkgKi8KKwkJLyogY29uZGl0aW9ucyhlbmQpICovCit9CisKKy8qIHRlc3Qg d2l0aCBmdW5jdGlvbnMgYXMgY29uZGl0aW9uYWxzICovCisKK2ludCBtYWluICgpCit7Cisg ICAgbWNkYzAwMWEgKDAsIDEpOworCisgICAgbWNkYzAwMWIgKDAsIDEpOworICAgIG1jZGMw MDFiICgwLCAwKTsKKworICAgIG1jZGMwMDFjICgwLCAxKTsKKyAgICBtY2RjMDAxYyAoMCwg MCk7CisgICAgbWNkYzAwMWMgKDEsIDEpOworCisgICAgbWNkYzAwMWQgKDEsIDEsIDEpOwor ICAgIG1jZGMwMDFkICgwLCAxLCAwKTsKKworICAgIG1jZGMwMDJhICgxLCAwKTsKKworICAg IG1jZGMwMDJiICgxLCAwKTsKKyAgICBtY2RjMDAyYiAoMSwgMSk7CisKKyAgICBtY2RjMDAy YyAoMCwgMCk7CisgICAgbWNkYzAwMmMgKDEsIDEpOworICAgIG1jZGMwMDJjICgxLCAwKTsK KworICAgIG1jZGMwMDJkICgxLCAxLCAxKTsKKyAgICBtY2RjMDAyZCAoMSwgMCwgMCk7CisK KyAgICBtY2RjMDAzYSAoMCwgMCk7CisgICAgbWNkYzAwM2EgKDEsIDApOworCisgICAgbWNk YzAwNGEgKDApOworICAgIG1jZGMwMDRiICgwKTsKKyAgICBtY2RjMDA0YiAoMSk7CisgICAg bWNkYzAwNGMgKDEpOworCisgICAgbWNkYzAwNGQgKDAsIDAsIDApOworICAgIG1jZGMwMDRk ICgxLCAxLCAxKTsKKworICAgIG1jZGMwMDVhICgxLCAwLCAxKTsKKworICAgIG1jZGMwMDVi ICgxLCAxLCAwLCAwKTsKKyAgICBtY2RjMDA1YiAoMSwgMCwgMCwgMCk7CisKKyAgICBtY2Rj MDA2YSAoMCwgMCwgMCwgMCwgMCk7CisgICAgbWNkYzAwNmEgKDEsIDAsIDAsIDAsIDApOwor ICAgIG1jZGMwMDZhICgxLCAxLCAxLCAwLCAwKTsKKworICAgIG1jZGMwMDZiICgwLCAwLCAw KTsKKyAgICBtY2RjMDA2YiAoMSwgMCwgMCk7CisgICAgbWNkYzAwNmIgKDEsIDEsIDApOwor ICAgIG1jZGMwMDZiICgxLCAxLCAxKTsKKworICAgIG1jZGMwMDdhICgwLCAwLCAwLCAwKTsK KyAgICBtY2RjMDA3YSAoMSwgMCwgMCwgMCk7CisgICAgbWNkYzAwN2EgKDAsIDAsIDEsIDAp OworCisgICAgbWNkYzAwN2IgKDAsIDAsIDApOworICAgIG1jZGMwMDdiICgwLCAxLCAxKTsK KyAgICBtY2RjMDA3YiAoMSwgMCwgMSk7CisKKyAgICBtY2RjMDA4YSAoMCk7CisKKyAgICBt Y2RjMDA4YiAoMCk7CisKKyAgICBtY2RjMDA4YyAoMCk7CisgICAgbWNkYzAwOGMgKDEpOwor CisgICAgbWNkYzAwOGQgKDAsIDAsIDAsIDApOworICAgIG1jZGMwMDhkICgxLCAwLCAwLCAw KTsKKyAgICBtY2RjMDA4ZCAoMSwgMCwgMSwgMCk7CisgICAgbWNkYzAwOGQgKDEsIDAsIDEs IDEpOworICAgIG1jZGMwMDhkICgxLCAxLCAxLCAxKTsKKworICAgIG1jZGMwMDlhICgwLCAw KTsKKyAgICBtY2RjMDA5YSAoMSwgMSk7CisKKyAgICBtY2RjMDEwYSAoMCwgMCk7CisgICAg bWNkYzAxMGEgKDAsIDkpOworICAgIG1jZGMwMTBhICgyLCAxKTsKKworICAgIG1jZGMwMTBi ICgxKTsKKworICAgIG1jZGMwMTFhICgwLCAwLCAwKTsKKyAgICBtY2RjMDExYSAoMSwgMSwg MCk7CisgICAgbWNkYzAxMWEgKDEsIDAsIDEpOworCisgICAgbWNkYzAxMmEgKDAsIDAsIDAp OworICAgIG1jZGMwMTJhICgwLCAxLCAxKTsKKworICAgIG1jZGMwMTNhICgwLCAwLCAwKTsK KyAgICBtY2RjMDEzYSAoMCwgMCwgMSk7CisgICAgbWNkYzAxM2EgKDAsIDEsIDApOworICAg IG1jZGMwMTNhICgwLCAxLCAxKTsKKyAgICBtY2RjMDEzYSAoMSwgMCwgMCk7CisgICAgbWNk YzAxM2EgKDEsIDAsIDEpOworICAgIG1jZGMwMTNhICgxLCAxLCAwKTsKKyAgICBtY2RjMDEz YSAoMSwgMSwgMSk7CisKKyAgICBtY2RjMDE0YSAoKTsKKworICAgIG1jZGMwMTVhICgwLCAw KTsKKyAgICBtY2RjMDE1YSAoMSwgMCk7CisKKyAgICBtY2RjMDE1YiAoMCwgMCk7CisgICAg bWNkYzAxNWIgKDAsIDEpOworICAgIG1jZGMwMTViICg2LCAxKTsKKworICAgIG1jZGMwMTVj ICgwLCAwKTsKKyAgICBtY2RjMDE1YyAoMCwgNSk7CisgICAgbWNkYzAxNWMgKDYsIDEpOwor CisgICAgbWNkYzAxNmEgKDUsIDUpOworCisgICAgbWNkYzAxNmIgKDUsIDUpOworICAgIG1j ZGMwMTZiICg2LCA1KTsKKworICAgIG1jZGMwMTZjICg1LCA1KTsKKworICAgIG1jZGMwMTZk ICgxLCAwKTsKKworICAgIG1jZGMwMTdhICgwKTsKKyAgICBtY2RjMDE3YSAoMik7CisKKyAg ICBtY2RjMDE3YiAoMiwgMCk7CisgICAgbWNkYzAxN2IgKDAsIDEpOworCisgICAgbWNkYzAx N2MgKDEsIDEpOworCisgICAgbWNkYzAxOGEgKDAsIDAsIDEsIDEsIDAsIDAsIDAsIDApOwor ICAgIG1jZGMwMThhICgwLCAxLCAwLCAwLCAwLCAwLCAxLCAtMik7CisgICAgbWNkYzAxOGEg KDAsIDYsIDAsIDAsIDAsIDAsIDEsIC0yKTsKKyAgICBtY2RjMDE4YSAoMCwgNiwgMCwgMCwg MCwgMCwgMSwgLTIpOworICAgIG1jZGMwMThhICgwLCAwLCAwLCAxLCAwLCAxLCAxLCAwKTsK KyAgICBtY2RjMDE4YSAoMSwgMCwgMCwgMCwgMSwgMSwgMCwgMCk7CisKKyAgICBtY2RjMDE4 YiAoMSwgMCwgMCk7CisgICAgbWNkYzAxOGIgKDEsIDEsIDApOworCisgICAgbWNkYzAxOWEg KCk7CisKKyAgICBtY2RjMDIwYSAoMCk7CisgICAgbWNkYzAyMGEgKDEpOworCisgICAgbWNk YzAyMGIgKDAsIDApOworICAgIG1jZGMwMjBiICgxLCAwKTsKKworICAgIG1jZGMwMjBjICgw LCAxKTsKKyAgICBtY2RjMDIwYyAoMSwgMSk7Cit9CisKKy8qIHsgZGctZmluYWwgeyBydW4t Z2NvdiBjb25kaXRpb25zIHsgLS1jb25kaXRpb25zIGdjb3YtMTkuYyB9IH0gfSAqLwpkaWZm IC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MubWlzYy10ZXN0cy9nY292LTIwLmMgYi9nY2Mv dGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMC4uNTZkZDZjZjg5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9n Y2MvdGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMjAuYwpAQCAtMCwwICsxLDIxIEBA CisvKiB7IGRnLW9wdGlvbnMgIi1mcHJvZmlsZS1jb25kaXRpb25zIC1mdGVzdC1jb3ZlcmFn ZSAtZnByb2ZpbGUtdXBkYXRlPWF0b21pYyIgfSAqLworLyogeyBkZy1kbyBydW4geyB0YXJn ZXQgbmF0aXZlIH0gfSAqLworCisvKiBzb21lIHNpZGUgZWZmZWN0IHRvIHN0b3AgYnJhbmNo ZXMgZnJvbSBiZWluZyBwcnVuZWQgKi8KK2ludCB4ID0gMDsKKwordm9pZCBjb25kaXRpb25z X2F0b21pYzAwMShpbnQgYSwgaW50IGIpCit7CisgIGlmIChhIHx8IGIpIC8qIGNvbmRpdGlv bnMoMS80KSB0cnVlKDApIGZhbHNlKDAgMSkgKi8KKwkgICAgICAvKiBjb25kaXRpb25zKGVu ZCkgKi8KKyAgICAgIHggPSAxOworICBlbHNlCisgICAgICB4ID0gMjsKK30KKworaW50IG1h aW4gKCkKK3sKKyAgICBjb25kaXRpb25zX2F0b21pYzAwMSAoMCwgMSk7Cit9CisKKy8qIHsg ZGctZmluYWwgeyBydW4tZ2NvdiBjb25kaXRpb25zIHsgLS1jb25kaXRpb25zIGdjb3YtMjAu YyB9IH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9saWIvZ2Nvdi5leHAgYi9n Y2MvdGVzdHN1aXRlL2xpYi9nY292LmV4cAppbmRleCA5ZDViMmNkYjg2Yi4uODhmMjhkMjZi YjYgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvbGliL2djb3YuZXhwCisrKyBiL2djYy90 ZXN0c3VpdGUvbGliL2djb3YuZXhwCkBAIC0xNzQsNiArMTc0LDE4MCBAQCBwcm9jIHZlcmlm eS1icmFuY2hlcyB7IHRlc3RuYW1lIHRlc3RjYXNlIGZpbGUgfSB7CiAgICAgcmV0dXJuICRm YWlsZWQKIH0KIAorIworIyB2ZXJpZnktY29uZGl0aW9ucyAtLSBjaGVjayB0aGF0IGNvbmRp dGlvbnMgYXJlIGNoZWNrZWQgYXMgZXhwZWN0ZWQKKyMKKyMgVEVTVE5BTUUgaXMgdGhlIG5h bWUgb2YgdGhlIHRlc3QsIGluY2x1ZGluZyB1bmlxdWUgZmxhZ3MuCisjIFRFU1RDQVNFIGlz IHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZpbGUuCisjIEZJTEUgaXMgdGhlIG5hbWUgb2YgdGhl IGdjb3Ygb3V0cHV0IGZpbGUuCisjCisjIENoZWNrcyBhcmUgYmFzZWQgb24gY29tbWVudHMg aW4gdGhlIHNvdXJjZSBmaWxlLiBDb25kaXRpb24gY292ZXJhZ2UgY29tZXMKKyMgd2l0aCB3 aXRoIHR3byB0eXBlcyBvZiBvdXRwdXQsIGEgc3VtbWFyeSBhbmQgYSBsaXN0IG9mIHRoZSB1 bmNvdmVyZWQKKyMgY29uZGl0aW9ucy4gQm90aCBtdXN0IGJlIGNoZWNrZWQgdG8gcGFzcyB0 aGUgdGVzdAorIworIyBUbyBjaGVjayBmb3IgY29uZGl0aW9ucywgYWRkIGEgY29tbWVudCB0 aGUgbGluZSBvZiBhIGNvbmRpdGlvbmFsOgorIyAvKiBjb25kaXRpb25zKG4vbSkgdHJ1ZSgw IDEpIGZhbHNlKDEpICovCisjCisjIHdoZXJlIG4vbSBhcmUgdGhlIGNvdmVyZWQgYW5kIHRv dGFsIGNvbmRpdGlvbnMgaW4gdGhlIGV4cHJlc3Npb24uIFRoZSB0cnVlKCkKKyMgYW5kIGZh bHNlKCkgdGFrZSB0aGUgaW5kaWNlcyBleHBlY3RlZCAqbm90KiBjb3ZlcmVkLgorIworIyBU aGlzIG1lYW5zIHRoYXQgYWxsIGNvdmVyYWdlIHN0YXRlbWVudHMgc2hvdWxkIGhhdmUgYmVl biBzZWVuOgorIyAvKiBjb25kaXRpb25zKGVuZCkgKi8KKyMKKyMgSWYgYWxsIGNvbmRpdGlv bnMgYXJlIGNvdmVyZWQgaS5lLiBuID09IG0sIHRoZW4gY29uZGl0aW9ucyhlbmQpIGNhbiBi ZQorIyBvbWl0dGVkLiBJZiBlaXRoZXIgdHJ1ZSgpIG9yIGZhbHNlKCkgYXJlIGVtcHR5IHRo ZXkgY2FuIGJlIG9taXR0ZWQgdG9vLgorIworIyBDKysgY2FuIGluc2VydCBjb25kaXRpb25h bHMgaW4gdGhlIENGRyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiBzb3VyY2UgY29kZS4KKyMg VGhlc2UgbXVzdCBiZSBtYW51YWxseSBzdXBwcmVzc2VkIHNpbmNlIHVuZXhwZWN0ZWQgYW5k IHVuaGFuZGxlZCBjb25kaXRpb25zCisjIGFyZSBhbiBlcnJvciAodG8gaGVscCBjb21iYXQg cmVncmVzc2lvbnMpLiBPdXRwdXQgY2FuIGJlIHN1cHByZXNzZWQgd2l0aAorIyBjb25kaXRp b25zKHN1cHByZXNzKSBhbmQgY29uZGl0aW9ucyhlbmQpLiBzdXBwcmVzcyBzaG91bGQgdXN1 YWxseSBiZSBvbiBhCisjIGNsb3NpbmcgYnJhY2UuCisjCisjIFNvbWUgZXhwcmVzc2lvbnMs IHdoZW4gdXNpbmcgdW5uYW1lZCB0ZW1wb3JhcmllcyBhcyBvcGVyYW5kcywgd2lsbCBoYXZl CisjIGRlc3RydWN0b3JzIGluIGV4cHJlc3Npb25zLiBUaGUgY292ZXJhZ2Ugb2YgdGhlIGRl c3RydWN0b3Igd2lsbCBiZSByZXBvcnRlZAorIyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBl eHByZXNzaW9uIGl0c2VsZiwgYnV0IHN1cHByZXNzKCkgd291bGQgYWxzbyBzd2FsbG93Cisj IHRoZSBleHBlY3RlZCB0ZXN0ZWQtZm9yIG1lc3NhZ2VzLiBUbyBoYW5kbGUgdGhlc2UsIHVz ZSB0aGUgZGVzdHJ1Y3RvcigpIFsxXQorIyB3aGljaCB3aWxsIHN1cHByZXNzIGV2ZXJ5dGhp bmcgZnJvbSBhbmQgaW5jbHVkaW5nIHRoZSBzZWNvbmQgImNvbmRpdGlvbnMKKyMgY292ZXJl ZCIuCisjCisjIFsxXSBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgZGVzdHJ1Y3RvcigpIGlz ICpvbiB0aGUgc2FtZSBsaW5lKiBhcyB0aGUKKyMgICAgIGNvbmRpdGlvbnMobS9uKQorcHJv YyB2ZXJpZnktY29uZGl0aW9ucyB7IHRlc3RuYW1lIHRlc3RjYXNlIGZpbGUgfSB7CisgICAg c2V0IGZhaWxlZCAwCisgICAgc2V0IHN1cHByZXNzIDAKKyAgICBzZXQgZGVzdHJ1Y3RvciAw CisgICAgc2V0IHNob3VsZHQgIiIKKyAgICBzZXQgc2hvdWxkZiAiIgorICAgIHNldCBzaG91 bGRhbGwgIiIKKyAgICBzZXQgZmQgW29wZW4gJGZpbGUgcl0KKyAgICBzZXQgbiAwCisgICAg c2V0IGtleXdvcmRzIHsiZW5kIiAic3VwcHJlc3MifQorICAgIHdoaWxlIHtbZ2V0cyAkZmQg bGluZV0gPj0gMH0geworICAgICAgICByZWdleHAgIl5cW146XF0rOiAqKFxbMC05XF0rKToi ICIkbGluZSIgYWxsIG4KKyAgICAgICAgc2V0IHByZWZpeCAiJHRlc3RuYW1lIGxpbmUgJG4i CisKKyAgICAgICAgaWYgeyFbcmVnZXhwICJjb25kaXRpb24iICRsaW5lXX0geworICAgICAg ICAgICAgY29udGludWUKKyAgICAgICAgfQorCisgICAgICAgICMgTWlzc2luZyBjb3ZlcmFn ZSBmb3IgYm90aCB0cnVlIGFuZCBmYWxzZSB3aWxsIGNhdXNlIGEgZmFpbHVyZSwgYnV0Cisg ICAgICAgICMgb25seSBjb3VudCBpdCBvbmNlIGZvciB0aGUgcmVwb3J0LgorICAgICAgICBz ZXQgb2sgMQorICAgICAgICBpZiBbcmVnZXhwIHtjb25kaXRpb25zICpcKChbMC05YS16L10r KVwpfSAiJGxpbmUiIGFsbCBlXSB7CisgICAgICAgICAgICAjICpWZXJ5KiBjb2Fyc2Ugc2Fu aXR5IGNoZWNrOiBjb25kaXRpb25zKCkgc2hvdWxkIGVpdGhlciBiZSBhCisgICAgICAgICAg ICAjIGtleXdvcmQgb3Igbi9tLCBhbnl0aGluZyBlbHNlIG1lYW5zIGEgYnVnZ3kgdGVzdCBj YXNlLiBlbmQgaXMKKyAgICAgICAgICAgICMgb3B0aW9uYWwgZm9yIGNhc2VzIHdoZXJlIGFs bCBjb25kaXRpb25zIGFyZSBjb3ZlcmVkLCBzaW5jZSBpdAorICAgICAgICAgICAgIyBvbmx5 IGV4cGVjdHMgYSBzaW5nbGUgbGluZSBvZiBvdXRwdXQuCisgICAgICAgICAgICBpZiB7KFts c2VhcmNoIC1leGFjdCAka2V5d29yZHMgJGVdID49IDAgfHwgW3JlZ2V4cCB7XGQrL1xkK30g IiRlIl0pID09IDB9IHsKKyAgICAgICAgICAgICAgICBmYWlsICIkcHJlZml4OiBleHBlY3Rl ZCBjb25kaXRpb25zIChuL20pLCAoc3VwcHJlc3MpIG9yIChlbmQpOyB3YXMgKCRlKSIKKyAg ICAgICAgICAgICAgICBpbmNyIGZhaWxlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisg ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgQW55IGtleXdvcmQgbWVhbnMgYSBuZXcg Y29udGV4dC4gU2V0IHRoZSBlcnJvciBmbGFnIGlmIG5vdCBhbGwKKyAgICAgICAgICAgICMg ZXhwZWN0ZWQgb3V0cHV0IGhhcyBiZWVuIHNlZW4sIGFuZCByZXNldCB0aGUgc3RhdGUuCisK KyAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkc2hvdWxkdF0gIT0gMH0geworICAgICAgICAg ICAgICAgIGZhaWwgIiRwcmVmaXg6IGV4cGVjdGVkIHVuY292ZXJlZCAodHJ1ZSkgZm9yIHRl cm1zICRzaG91bGR0IgorICAgICAgICAgICAgICAgIHNldCBvayAwCisgICAgICAgICAgICB9 CisKKyAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkc2hvdWxkZl0gIT0gMH0geworICAgICAg ICAgICAgICAgIGZhaWwgIiRwcmVmaXg6IGV4cGVjdGVkIHVuY292ZXJlZCAoZmFsc2UpIGZv ciB0ZXJtcyAkc2hvdWxkZiIKKyAgICAgICAgICAgICAgICBzZXQgb2sgMAorICAgICAgICAg ICAgfQorCisgICAgICAgICAgICBpZiB7JHNob3VsZGFsbCBuZSAiIn0geworICAgICAgICAg ICAgICAgIGZhaWwgIiRwcmVmaXg6IGNvdmVyYWdlIHN1bW1hcnkgbm90IGZvdW5kOyBleHBl Y3RlZCAkc2hvdWxkYWxsIgorICAgICAgICAgICAgICAgIHNldCBvayAwCisgICAgICAgICAg ICB9CisKKyAgICAgICAgICAgIHNldCBzdXBwcmVzcyAwCisgICAgICAgICAgICBzZXQgZGVz dHJ1Y3RvciAwCisgICAgICAgICAgICBzZXQgc2hvdWxkdCAiIgorICAgICAgICAgICAgc2V0 IHNob3VsZGYgIiIKKyAgICAgICAgICAgIHNldCBzaG91bGRhbGwgIiIKKyAgICAgICAgICAg IHNldCBuZXd0ICIiCisgICAgICAgICAgICBzZXQgbmV3ZiAiIgorCisgICAgICAgICAgICBp ZiBbcmVnZXhwIHtkZXN0cnVjdG9yXChcKX0gIiRsaW5lIl0geworICAgICAgICAgICAgICAg IHNldCBkZXN0cnVjdG9yIDEKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgW3Jl Z2V4cCB7KFxkKykvKFxkKyl9ICIkZSIgYWxsIGkga10geworICAgICAgICAgICAgICAgIHJl Z2V4cCB7dHJ1ZVwoKFswLTkgXSspXCl9ICAiJGxpbmUiIGFsbCBuZXd0CisgICAgICAgICAg ICAgICAgcmVnZXhwIHtmYWxzZVwoKFswLTkgXSspXCl9ICIkbGluZSIgYWxsIG5ld2YKKwor ICAgICAgICAgICAgICAgICMgU2FuaXR5IGNoZWNrIC0gaWYgdGhlIHRydWUoKSBhbmQgZmFs c2UoKSB2ZWN0b3JzIHNob3VsZCBoYXZlCisgICAgICAgICAgICAgICAgIyBtLW4gZWxlbWVu dHMgdG8gY292ZXIgYWxsIHVuY292ZXJlZCBjb25kaXRpb25zLiBCZWNhdXNlIG9mCisgICAg ICAgICAgICAgICAgIyBtYXNraW5nIGl0IGNhbiBzb21ldGltZXMgYmUgc3VycHJpc2luZyB3 aGF0IHRlcm1zIGFyZQorICAgICAgICAgICAgICAgICMgaW5kZXBlbmRlbnQsIHNvIHRoaXMg bWFrZXMgZm9yIG1vcmUgcm9idXN0IHRlc3QgYXQgdGhlIGNvc3QKKyAgICAgICAgICAgICAg ICAjIG9mIGJlaW5nIHNsaWdodGx5IG1vcmUgYW5ub3lpbmcgdG8gd3JpdGUuCisgICAgICAg ICAgICAgICAgc2V0IG50ZXJtcyBbZXhwciBbbGxlbmd0aCAkbmV3dF0gKyBbbGxlbmd0aCAk bmV3Zl1dCisgICAgICAgICAgICAgICAgc2V0IG5leHBlY3RlZCBbZXhwciB7JGsgLSAkaX1d CisgICAgICAgICAgICAgICAgaWYgeyRudGVybXMgIT0gJG5leHBlY3RlZH0geworICAgICAg ICAgICAgICAgICAgICBmYWlsICIkcHJlZml4OiBleHBlY3RlZCAkbmV4cGVjdGVkIHVuY292 ZXJlZCB0ZXJtczsgZ290ICRudGVybXMiCisgICAgICAgICAgICAgICAgICAgIHNldCBvayAw CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldCBzaG91bGRhbGwgJGUK KyAgICAgICAgICAgICAgICBzZXQgc2hvdWxkdCAkbmV3dAorICAgICAgICAgICAgICAgIHNl dCBzaG91bGRmICRuZXdmCisgICAgICAgICAgICB9IGVsc2VpZiB7JGUgPT0gImVuZCJ9IHsK KyAgICAgICAgICAgICAgICAjIG5vLW9wIC0gc3RhdGUgaGFzIGFscmVhZHkgYmVlbiByZXNl dCwgYW5kIGVycm9ycyBmbGFnZ2VkCisgICAgICAgICAgICB9IGVsc2VpZiB7JGUgPT0gInN1 cHByZXNzIn0geworICAgICAgICAgICAgICAgIHNldCBzdXBwcmVzcyAxCisgICAgICAgICAg ICB9IGVsc2UgeworICAgICAgICAgICAgICAgICMgdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFi bGUsIAorICAgICAgICAgICAgICAgIGZhaWwgIiRwcmVmaXg6IHVuaGFuZGxlZCBjb250cm9s ICgkZSksIHNob3VsZCBiZSB1bnJlYWNoYWJsZSIKKyAgICAgICAgICAgICAgICBzZXQgb2sg MAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2VpZiB7JHN1cHByZXNzID09IDF9IHsK KyAgICAgICAgICAgICMgaWdub3JlIGV2ZXJ5dGhpbmcgaW4gYSBzdXBwcmVzcyBibG9jay4g QysrIGVzcGVjaWFsbHkgY2FuIGluc2VydAorICAgICAgICAgICAgIyBjb25kaXRpb25hbHMg aW4gZXhjZXB0aW9ucyBhbmQgZGVzdHJ1Y3RvcnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlCisg ICAgICAgICAgICAjIGJlIGNvbnNpZGVyZWQgdW5oYW5kbGVkLgorICAgICAgICAgICAgY29u dGludWUKKyAgICAgICAgfSBlbHNlaWYgW3JlZ2V4cCB7Y29uZGl0aW9uICsoXGQrKSBub3Qg Y292ZXJlZCBcKHRydWVcKX0gIiRsaW5lIiBhbGwgY29uZF0geworICAgICAgICAgICAgc2V0 IGkgW2xzZWFyY2ggJHNob3VsZHQgJGNvbmRdCisgICAgICAgICAgICBpZiB7JGkgIT0gLTF9 IHsKKyAgICAgICAgICAgICAgICBzZXQgc2hvdWxkdCBbbHJlcGxhY2UgJHNob3VsZHQgJGkg JGldCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWwgIiR0ZXN0 bmFtZSBsaW5lICRuOiB1bmV4cGVjdGVkIHVuY292ZXJlZCB0ZXJtICRjb25kICh0cnVlKSIK KyAgICAgICAgICAgICAgICBzZXQgb2sgMAorICAgICAgICAgICAgfQorICAgICAgICB9IGVs c2VpZiBbcmVnZXhwIHtjb25kaXRpb24gKyhcZCspIG5vdCBjb3ZlcmVkIFwoZmFsc2VcKX0g IiRsaW5lIiBhbGwgY29uZF0geworICAgICAgICAgICAgc2V0IGkgW2xzZWFyY2ggJHNob3Vs ZGYgJGNvbmRdCisgICAgICAgICAgICBpZiB7JGkgIT0gLTF9IHsKKyAgICAgICAgICAgICAg ICBzZXQgc2hvdWxkZiBbbHJlcGxhY2UgJHNob3VsZGYgJGkgJGldCisgICAgICAgICAgICB9 IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWwgIiR0ZXN0bmFtZSBsaW5lICRuOiB1bmV4 cGVjdGVkIHVuY292ZXJlZCB0ZXJtICRjb25kIChmYWxzZSkiCisgICAgICAgICAgICAgICAg c2V0IG9rIDAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlaWYgW3JlZ2V4cCB7Y29u ZGl0aW9ucyBjb3ZlcmVkIChcZCsvXGQrKX0gIiRsaW5lIiBhbGwgY29uZF0geworICAgICAg ICAgICAgIyB0aGUgZGVzdHJ1Y3Rvci1nZW5lcmF0ZWQgImNvbmRpdGlvbnMgY292ZXJlZCIg bGluZXMgd2lsbCBiZQorICAgICAgICAgICAgIyB3cml0dGVuIGFmdGVyIGFsbCBleHByZXNz aW9uLXJlbGF0ZWQgb3V0cHV0LiBIYW5kbGUgdGhlc2UgYnkKKyAgICAgICAgICAgICMgdHVy bmluZyBvbiBzdXBwcmVzc2lvbiBpZiB0aGUgZGVzdHJ1Y3Rvci1zdXBwcmVzc2lvbiBpcwor ICAgICAgICAgICAgIyByZXF1ZXN0ZWQuCisgICAgICAgICAgICBpZiB7JHNob3VsZGFsbCA9 PSAiIiAmJiAkZGVzdHJ1Y3RvciA9PSAxfSB7CisgICAgICAgICAgICAgICAgc2V0IHN1cHBy ZXNzIDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgfQorCisgICAg ICAgICAgICBpZiB7JGNvbmQgPT0gJHNob3VsZGFsbH0geworICAgICAgICAgICAgICAgIHNl dCBzaG91bGRhbGwgIiIKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg ZmFpbCAiJHRlc3RuYW1lIGxpbmUgJG46IHVuZXhwZWN0ZWQgc3VtbWFyeSAkY29uZCIKKyAg ICAgICAgICAgICAgICBzZXQgb2sgMAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg ICAgICAgaWYgeyRvayAhPSAxfSB7CisgICAgICAgICAgICBpbmNyIGZhaWxlZAorICAgICAg ICB9CisgICAgfQorICAgIGNsb3NlICRmZAorICAgIHJldHVybiAkZmFpbGVkCit9CisKICMK ICMgdmVyaWZ5LWNhbGxzIC0tIGNoZWNrIHRoYXQgY2FsbCByZXR1cm4gcGVyY2VudGFnZXMg YXJlIGFzIGV4cGVjdGVkCiAjCkBAIC0zMjEsNiArNDk1LDcgQEAgcHJvYyBydW4tZ2NvdiB7 IGFyZ3MgfSB7CiAgICAgc2V0IGdjb3ZfYXJncyAiIgogICAgIHNldCBnY292X3ZlcmlmeV9j YWxscyAwCiAgICAgc2V0IGdjb3ZfdmVyaWZ5X2JyYW5jaGVzIDAKKyAgICBzZXQgZ2Nvdl92 ZXJpZnlfY29uZGl0aW9ucyAwCiAgICAgc2V0IGdjb3ZfdmVyaWZ5X2xpbmVzIDEKICAgICBz ZXQgZ2Nvdl92ZXJpZnlfaW50ZXJtZWRpYXRlIDAKICAgICBzZXQgZ2Nvdl9yZW1vdmVfZ2Nk YSAwCkBAIC0zMzEsMTAgKzUwNiwxMyBAQCBwcm9jIHJ1bi1nY292IHsgYXJncyB9IHsKIAkg IHNldCBnY292X3ZlcmlmeV9jYWxscyAxCiAJfSBlbHNlaWYgeyAkYSA9PSAiYnJhbmNoZXMi IH0gewogCSAgc2V0IGdjb3ZfdmVyaWZ5X2JyYW5jaGVzIDEKKwl9IGVsc2VpZiB7ICRhID09 ICJjb25kaXRpb25zIiB9IHsKKwkgIHNldCBnY292X3ZlcmlmeV9jb25kaXRpb25zIDEKIAl9 IGVsc2VpZiB7ICRhID09ICJpbnRlcm1lZGlhdGUiIH0gewogCSAgc2V0IGdjb3ZfdmVyaWZ5 X2ludGVybWVkaWF0ZSAxCiAJICBzZXQgZ2Nvdl92ZXJpZnlfY2FsbHMgMAogCSAgc2V0IGdj b3ZfdmVyaWZ5X2JyYW5jaGVzIDAKKwkgIHNldCBnY292X3ZlcmlmeV9jb25kaXRpb25zIDAK IAkgIHNldCBnY292X3ZlcmlmeV9saW5lcyAwCiAJfSBlbHNlaWYgeyAkYSA9PSAicmVtb3Zl LWdjZGEiIH0gewogCSAgc2V0IGdjb3ZfcmVtb3ZlX2djZGEgMQpAQCAtNDA0LDYgKzU4Miwx MSBAQCBwcm9jIHJ1bi1nY292IHsgYXJncyB9IHsKICAgICB9IGVsc2UgewogCXNldCBiZmFp bGVkIDAKICAgICB9CisgICAgaWYgeyAkZ2Nvdl92ZXJpZnlfY29uZGl0aW9ucyB9IHsKKwlz ZXQgY2RmYWlsZWQgW3ZlcmlmeS1jb25kaXRpb25zICR0ZXN0bmFtZSAkdGVzdGNhc2UgJHRl c3RjYXNlLmdjb3ZdCisgICAgfSBlbHNlIHsKKwlzZXQgY2RmYWlsZWQgMAorICAgIH0KICAg ICBpZiB7ICRnY292X3ZlcmlmeV9jYWxscyB9IHsKIAlzZXQgY2ZhaWxlZCBbdmVyaWZ5LWNh bGxzICR0ZXN0bmFtZSAkdGVzdGNhc2UgJHRlc3RjYXNlLmdjb3ZdCiAgICAgfSBlbHNlIHsK QEAgLTQxOCwxMiArNjAxLDEyIEBAIHByb2MgcnVuLWdjb3YgeyBhcmdzIH0gewogCiAgICAg IyBSZXBvcnQgd2hldGhlciB0aGUgZ2NvdiB0ZXN0IHBhc3NlZCBvciBmYWlsZWQuICBJZiB0 aGVyZSB3ZXJlCiAgICAgIyBtdWx0aXBsZSBmYWlsdXJlcyB0aGVuIHRoZSBtZXNzYWdlIGlz IGEgc3VtbWFyeS4KLSAgICBzZXQgdGZhaWxlZCBbZXhwciAkbGZhaWxlZCArICRiZmFpbGVk ICsgJGNmYWlsZWQgKyAkaWZhaWxlZF0KKyAgICBzZXQgdGZhaWxlZCBbZXhwciAkbGZhaWxl ZCArICRiZmFpbGVkICsgJGNkZmFpbGVkICsgJGNmYWlsZWQgKyAkaWZhaWxlZF0KICAgICBp ZiB7ICR4ZmFpbGVkIH0gewogCXNldHVwX3hmYWlsICIqLSotKiIKICAgICB9CiAgICAgaWYg eyAkdGZhaWxlZCA+IDAgfSB7Ci0JZmFpbCAiJHRlc3RuYW1lIGdjb3Y6ICRsZmFpbGVkIGZh aWx1cmVzIGluIGxpbmUgY291bnRzLCAkYmZhaWxlZCBpbiBicmFuY2ggcGVyY2VudGFnZXMs ICRjZmFpbGVkIGluIHJldHVybiBwZXJjZW50YWdlcywgJGlmYWlsZWQgaW4gaW50ZXJtZWRp YXRlIGZvcm1hdCIKKwlmYWlsICIkdGVzdG5hbWUgZ2NvdjogJGxmYWlsZWQgZmFpbHVyZXMg aW4gbGluZSBjb3VudHMsICRiZmFpbGVkIGluIGJyYW5jaCBwZXJjZW50YWdlcywgJGNkZmFp bGVkIGluIGNvbmRpdGlvbi9kZWNpc2lvbiwgJGNmYWlsZWQgaW4gcmV0dXJuIHBlcmNlbnRh Z2VzLCAkaWZhaWxlZCBpbiBpbnRlcm1lZGlhdGUgZm9ybWF0IgogCWlmIHsgJHhmYWlsZWQg fSB7CiAJICAgIGNsZWFuLWdjb3YgJHRlc3RjYXNlCiAJfQpkaWZmIC0tZ2l0IGEvZ2NjL3Ry ZWUtcHJvZmlsZS5jYyBiL2djYy90cmVlLXByb2ZpbGUuY2MKaW5kZXggNmQ0MDQwMWY4NmYu LjJmNTE1ZGFmOWRkIDEwMDY0NAotLS0gYS9nY2MvdHJlZS1wcm9maWxlLmNjCisrKyBiL2dj Yy90cmVlLXByb2ZpbGUuY2MKQEAgLTI0LDYgKzI0LDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNl ZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKIC8qIEdlbmVyYXRlIGJhc2ljIGJs b2NrIHByb2ZpbGUgaW5zdHJ1bWVudGF0aW9uIGFuZCBhdXhpbGlhcnkgZmlsZXMuCiAgICBU cmVlLWJhc2VkIHZlcnNpb24uICBTZWUgcHJvZmlsZS5jYyBmb3Igb3ZlcnZpZXcuICAqLwog CisjZGVmaW5lIElOQ0xVREVfQUxHT1JJVEhNCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5j bHVkZSAic3lzdGVtLmgiCiAjaW5jbHVkZSAiY29yZXR5cGVzLmgiCkBAIC01OCw2ICs1OSw4 IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2Vl CiAjaW5jbHVkZSAiYWxsb2MtcG9vbC5oIgogI2luY2x1ZGUgInN5bWJvbC1zdW1tYXJ5Lmgi CiAjaW5jbHVkZSAic3ltdGFiLXRodW5rcy5oIgorI2luY2x1ZGUgImNmZ2FuYWwuaCIKKyNp bmNsdWRlICJjZmdsb29wLmgiCiAKIHN0YXRpYyBHVFkoKCkpIHRyZWUgZ2Nvdl90eXBlX25v ZGU7CiBzdGF0aWMgR1RZKCgpKSB0cmVlIHRyZWVfaW50ZXJ2YWxfcHJvZmlsZXJfZm47CkBA IC03Myw2ICs3Niw4ODAgQEAgc3RhdGljIEdUWSgoKSkgdHJlZSBpY190dXBsZV92YXI7CiBz dGF0aWMgR1RZKCgpKSB0cmVlIGljX3R1cGxlX2NvdW50ZXJzX2ZpZWxkOwogc3RhdGljIEdU WSgoKSkgdHJlZSBpY190dXBsZV9jYWxsZWVfZmllbGQ7CiAKK25hbWVzcGFjZQoreworCitz dHJ1Y3QgY29uZHNfY3R4Cit7CisgICAgLyogT3V0cHV0IGFycmF5cyBhbGxvY2F0ZWQgYnkg dGhlIGNhbGxlci4gICovCisgICAgYmFzaWNfYmxvY2sgKmJsb2NrczsKKyAgICBpbnQgKnNp emVzOworCisgICAgLyogVGhlIHNpemUgb2YgdGhlIGJsb2NrcyBidWZmZXIuICBUaGlzIGlz IGp1c3QgYnVnIHByb3RlY3Rpb24sCisgICAgICAgdGhlIGNhbGxlciBzaG91bGQgaGF2ZSBh bGxvY2F0ZWQgZW5vdWdoIG1lbW9yeSBmb3IgYmxvY2tzIHRvIG5ldmVyIGdldAorICAgICAg IHRoaXMgbWFueSBlbGVtZW50cy4KKyAgICAgICAqLworICAgIGludCBtYXhzaXplOworCisg ICAgLyogTnVtYmVyIG9mIGV4cHJlc3Npb25zIGZvdW5kIC0gdGhpcyB2YWx1ZSBpcyB0aGUg bnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlCisgICAgICAgZ2NvdiBvdXRwdXQgYW5kIHRoZSBw YXJhbWV0ZXIgdG8gZ2Nvdl9jb3VudGVyX2FsbG9jICgpLgorICAgICAgICovCisgICAgaW50 IGV4cHJzOworCisgICAgLyogQml0bWFwIG9mIHRoZSBwcm9jZXNzZWQgYmxvY2tzIC0gYml0 IG4gc2V0IG1lYW5zIGJhc2ljX2Jsb2NrLT5pbmRleCBoYXMKKyAgICAgICBiZWVuIHByb2Nl c3NlZCBhcyBhIGZpcnN0LWluLWV4cHJlc3Npb24gYmxvY2suICBUaGlzIGVmZmVjdGl2ZWx5 IHN0b3BzCisgICAgICAgbG9vcCBlZGdlcyBmcm9tIGJlaW5nIHRha2VuIGFuZCBzdWJncmFw aHMgcmUtcHJvY2Vzc2VkLgorICAgICAgICovCisgICAgYXV0b19zYml0bWFwIHNlZW47CisK KyAgICAvKiBQcmUtYWxsb2NhdGUgYml0bWFwcyBmb3IgcGVyLWZ1bmN0aW9uIGJvb2sga2Vl cGluZy4gIFRoaXMgaXMgcHVyZQorICAgICAgIGluc3RhbmNlIHJldXNlIGFuZCB0aGUgYml0 bWFwcyBjYXJyaWVzIG5vIGRhdGEgYmV0d2VlbiBmdW5jdGlvbiBjYWxscy4KKyAgICAgICAq LworICAgIGF1dG9fc2JpdG1hcCBleHByOworICAgIGF1dG9fc2JpdG1hcCByZWFjaGFibGU7 CisKKyAgICBleHBsaWNpdCBjb25kc19jdHggKHVuc2lnbmVkIHNpemUpIG5vZXhjZXB0ICh0 cnVlKSA6IG1heHNpemUgKDApLCBleHBycyAoMCksCisgICAgc2VlbiAoc2l6ZSksIGV4cHIg KHNpemUpLCByZWFjaGFibGUgKHNpemUpCisgICAgeworCWJpdG1hcF9jbGVhciAoc2Vlbik7 CisgICAgfQorCisgICAgdm9pZCBjb21taXQgKGJhc2ljX2Jsb2NrIHRvcCwgaW50IG5ibG9j a3MpIG5vZXhjZXB0ICh0cnVlKQorICAgIHsKKwlibG9ja3MgICs9IG5ibG9ja3M7CisJKnNp emVzICArPSBuYmxvY2tzOworCW1heHNpemUgLT0gbmJsb2NrczsKKworCWV4cHJzKys7CisJ c2l6ZXMrKzsKKwkqc2l6ZXMgPSAwOworCisJYml0bWFwX3NldF9iaXQgKHNlZW4sIHRvcC0+ aW5kZXgpOworICAgIH0KK307CisKKy8qIE9ubHkgaW5zdHJ1bWVudCB0ZXJtcyB3aXRoIGZl d2VyIHRoYW4gbnVtYmVyIG9mIGJpdHMgaW4gYSAod2lkZSkgZ2NvdgorICAgaW50ZWdlciwg d2hpY2ggaXMgcHJvYmFibHkgNjQuICBUaGUgYWxnb3JpdGhtIGl0c2VsZiBkb2VzIG5vdCBp bXBvc2UgdGhpcworICAgbGltaXRhdGlvbiwgYnV0IGl0IG1ha2VzIGZvciBhIHNpbXBsZXIg aW1wbGVtZW50YXRpb24uCisKKyAgICogQWxsb2NhdGluZyB0aGUgb3V0cHV0IGRhdGEgc3Ry dWN0dXJlIChjb3ZlcmFnZV9jb3VudGVyX2FsbG9jICgpKSBjYW4KKyAgICAgYXNzdW1lIHBh aXJzIG9mIGdjb3ZfdHlwZV91bnNpZ25lZCBhbmQgbm90IHVzZSBhIHNlcGFyYXRlIGxlbmd0 aCBmaWVsZC4KKyAgICogQSBwYWlyIGdjb3ZfdHlwZV91bnNpZ25lZCBjYW4gYmUgdXNlZCBh cyBhY2N1bXVsYXRvcnMuCisgICAqIFVwZGF0aW5nIGFjY3VtdWxhdG9ycyBpcyBjYW4gdXNl IHRoZSBiaXR3aXNlIG9wZXJhdGlvbnMgfD0sICY9IGFuZCBub3QKKyAgICAgY3VzdG9tIG9w ZXJhdG9ycyB0aGF0IHdvcmsgZm9yIGFyYml0cmFyeS1zaXplZCBiaXQtc2V0cy4KKworICAg TW9zdCByZWFsLXdvcmxkIGNvZGUgc2hvdWxkIGJlIHVuYWZmZWN0ZWQgYnkgdGhpcywgYnV0 IGl0IGlzIHBvc3NpYmxlCisgICAoZXNwZWNpYWxseSBmb3IgZ2VuZXJhdGVkIGNvZGUpIHRv IGV4Y2VlZCB0aGlzIGxpbWl0LgorICovCisjZGVmaW5lIENPTkRJVElPTlNfTUFYX1RFUk1T IChzaXplb2YgKGdjb3ZfdHlwZV91bnNpZ25lZCkgKiBCSVRTX1BFUl9VTklUKQorCitpbnQK K2luZGV4X29mIChjb25zdF9iYXNpY19ibG9jayBuZWVkbGUsIGNvbnN0IGNvbnN0X2Jhc2lj X2Jsb2NrICpibG9ja3MsIGludCBzaXplKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg c2l6ZTsgaSsrKQorICAgIHsKKwlpZiAoYmxvY2tzW2ldID09IG5lZWRsZSkKKwkgICAgcmV0 dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworYm9vbAoraW5kZXhfbHQgKGNv bnN0IGJhc2ljX2Jsb2NrIHgsIGNvbnN0IGJhc2ljX2Jsb2NrIHkpCit7CisgICAgcmV0dXJu IHgtPmluZGV4IDwgeS0+aW5kZXg7Cit9CisKKy8qIFNwZWNpYWwgY2FzZXMgb2YgdGhlIHNp bmdsZV8qX3AgYW5kIHNpbmdsZV8qX2VkZ2UgZnVuY3Rpb25zIGluIGJhc2ljLWJsb2NrLmgK KyAgIHRoYXQgZG9uJ3QgY29uc2lkZXIgZXhjZXB0aW9uIGhhbmRsaW5nIG9yIG90aGVyIGNv bXBsZXggZWRnZXMuICBUaGlzIGhlbHBzCisgICBjcmVhdGUgYSB2aWV3IG9mIHRoZSBDRkcg d2l0aCBvbmx5IG5vcm1hbCBlZGdlcyAtIGlmIGEgYmFzaWMgYmxvY2sgaGFzIGJvdGgKKyAg IGFuIG91dGdvaW5nIGZhbGx0aHJvdWdoIGFuZCBleGNlcHRpb25hbCBlZGdlIFsxXSwgaXQg c2hvdWxkIGJlIGNvbnNpZGVyZWQgYQorICAgc2luZ2xlLXN1Y2Nlc3Nvci4KKworICAgWzFd IGlmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIHJlbW92 ZWQgYW5kIHJlcGxhY2VkIGJ5CisgICAgICAgdGhlaXIgYmFzaWMtYmxvY2suaCBjb3VzaW5z LgorICovCitib29sCitzaW5nbGUgKGNvbnN0IHZlYzxlZGdlLCB2YV9nYz4gKmVkZ2VzKQor eworICAgIGludCBuID0gRURHRV9DT1VOVCAoZWRnZXMpOworICAgIGlmIChuID09IDApCisJ cmV0dXJuIGZhbHNlOworCisgICAgZm9yIChlZGdlIGUgOiBlZGdlcykKKwlpZiAoZS0+Zmxh Z3MgJiBFREdFX0NPTVBMRVgpCisJICAgIG4gLT0gMTsKKworICAgIHJldHVybiBuID09IDE7 Cit9CisKK2VkZ2UKK3NpbmdsZV9lZGdlIChjb25zdCB2ZWM8ZWRnZSwgdmFfZ2M+ICplZGdl cykKK3sKKyAgICBmb3IgKGVkZ2UgZSA6IGVkZ2VzKQorICAgIHsKKwlpZiAoZS0+ZmxhZ3Mg JiBFREdFX0NPTVBMRVgpCisJICAgIGNvbnRpbnVlOworCXJldHVybiBlOworICAgIH0KKyAg ICBnY2NfdW5yZWFjaGFibGUgKCk7Cit9CisKKy8qIFNvbWV0aW1lcywgZm9yIGV4YW1wbGUg d2l0aCBmdW5jdGlvbiBjYWxscyBhbmQgQysrIGRlc3RydWN0b3JzIHRoZSBDRkcgZ2V0cwor ICAgZXh0cmEgbm9kZXMgdGhhdCBhcmUgZXNzZW50aWFsbHkgc2luZ2xlLWVudHJ5LXNpbmds ZS1leGl0IGluIHRoZSBtaWRkbGUgb2YKKyAgIGJvb2xlYW4gZXhwcmVzc2lvbnMuICBGb3Ig ZXhhbXBsZToKKworICAgICAgeCB8fCBjYW5fdGhyb3cgKHkpCisKKyAgICAgICAgICAgICAg IEEKKyAgICAgICAgICAgICAgL3wKKyAgICAgICAgICAgICAvIHwKKyAgICAgICAgICAgIEIg IHwKKyAgICAgICAgICAgIHwgIHwKKyAgICAgICAgICAgIEMgIHwKKyAgICAgICAgICAgLyBc IHwKKyAgICAgICAgICAvICAgXHwKKyAgICAgICAgIEYgICAgIFQKKworICAgV2l0aG91dCB0 aGUgZXh0cmEgbm9kZSBpbnNlcnRlZCBieSB0aGUgZnVuY3Rpb24gKyBleGNlcHRpb24gaXQg YmVjb21lcyBhCisgICBwcm9wZXIgMi10ZXJtIGdyYXBoLCBub3QgMiBzaW5nbGUtdGVybSBn cmFwaHMuCisKKyAgICAgICAgICAgICAgIEEKKyAgICAgICAgICAgICAgL3wKKyAgICAgICAg ICAgICBDIHwKKyAgICAgICAgICAgIC8gXHwKKyAgICAgICAgICAgRiAgIFQKKworICAgY29u dHJhY3RfZWRnZSBpZ25vcmVzIHRoZSBzZXJpZXMgb2YgaW50ZXJtZWRpYXRlIG5vZGVzIGFu ZCBtYWtlcyBhIHZpcnR1YWwKKyAgIGVkZ2UgQSAtPiBDLCB3aXRob3V0IGhhdmluZyB0byBj b25zdHJ1Y3QgYSBuZXcgc2ltcGxpZmllZCBDRkcgZXhwbGljaXRseS4KKworICAgU3VjaCBh biBleHByZXNzaW9uIGNhbm5vdCBjb3JyZWN0bHkgYmUgcmVwcmV0ZWQgYXMgdHdvIDEtdGVy bSBleHByZXNzaW9ucywKKyAgIGFzIGl0IHdvdWxkIGJyZWFrIHRoZSBjb25kaXRpb24gbWFz a2luZy4KKyAqLworZWRnZQorY29udHJhY3RfZWRnZSAoZWRnZSBlLCBzYml0bWFwIGV4cHIp Cit7CisgICAgd2hpbGUgKHRydWUpCisgICAgeworCWJhc2ljX2Jsb2NrIHNyYyAgPSBlLT5z cmM7CisJYmFzaWNfYmxvY2sgZGVzdCA9IGUtPmRlc3Q7CisKKwlpZiAoIXNpbmdsZSAoZGVz dC0+c3VjY3MpKQorCSAgICByZXR1cm4gZTsKKwlpZiAoIXNpbmdsZSAoZGVzdC0+cHJlZHMp KQorCSAgICByZXR1cm4gZTsKKwlpZiAoIXNpbmdsZSAoc3JjLT5wcmVkcykpCisJICAgIHJl dHVybiBlOworCisJZWRnZSBzdWNjZSA9IHNpbmdsZV9lZGdlIChkZXN0LT5zdWNjcyk7CisJ aWYgKCFzaW5nbGUgKHN1Y2NlLT5kZXN0LT5wcmVkcykpCisJICAgIHJldHVybiBlOworCisJ Yml0bWFwX3NldF9iaXQgKGV4cHIsIGRlc3QtPmluZGV4KTsKKwllID0gc3VjY2U7CisgICAg fQorfQorCitlZGdlCitjb250cmFjdF9lZGdlX3VwIChlZGdlIGUsIHNiaXRtYXAgZXhwcikK K3sKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisJYmFzaWNfYmxvY2sgc3JjICA9IGUtPnNy YzsKKwliYXNpY19ibG9jayBkZXN0ID0gZS0+ZGVzdDsKKworCWlmICghc2luZ2xlIChkZXN0 LT5zdWNjcykpCisJICAgIHJldHVybiBlOworCWlmICghc2luZ2xlIChkZXN0LT5wcmVkcykp CisJICAgIHJldHVybiBlOworCWlmICghc2luZ2xlIChzcmMtPnByZWRzKSkKKwkgICAgcmV0 dXJuIGU7CisKKwlpZiAoZXhwcikgYml0bWFwX3NldF9iaXQgKGV4cHIsIHNyYy0+aW5kZXgp OworCWUgPSBzaW5nbGVfcHJlZF9lZGdlIChzcmMpOworICAgIH0KK30KKworYm9vbAoraXNf Y29uZGl0aW9uYWxfcCAoY29uc3QgYmFzaWNfYmxvY2sgYikKK3sKKyAgICBpZiAoc2luZ2xl X3N1Y2NfcCAoYikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHQg PSAwOworICAgIHVuc2lnbmVkIGYgPSAwOworICAgIGZvciAoZWRnZSBlIDogYi0+c3VjY3Mp CisgICAgeworICAgICAgICB0IHw9IChlLT5mbGFncyAmIEVER0VfVFJVRV9WQUxVRSk7Cisg ICAgICAgIGYgfD0gKGUtPmZsYWdzICYgRURHRV9GQUxTRV9WQUxVRSk7CisgICAgfQorICAg IHJldHVybiB0ICYmIGY7Cit9CisKKy8qIFRoZSBmaXJzdCBibG9jayBpbiB0aGUgb3V0cHV0 IHdpbGwgYWx3YXlzIGJlIHRoZSBzb3VyY2UgYmxvY2sgb2YgdGhlIGVkZ2UKKyAgIHRoYXQg d2lsbCBhcHBseSB0aGUgbWFza2luZyBvcGVyYXRpb24sIHdpdGggdGhlIHJlbWFpbmluZyBi bG9ja3MgZWZmZWN0aXZlbHkKKyAgIHVub3JkZXJlZC4KKyAqLworaW50CitmaW5kX2NvbmRp dGlvbnNfbWFza2VkX2J5ICgKKyAgICBiYXNpY19ibG9jayBibG9jaywKKyAgICBjb25zdCBz Yml0bWFwIGV4cHIsCisgICAgY29uc3QgdW5zaWduZWQgKmZsYWcsCisgICAgYmFzaWNfYmxv Y2sgKm91dCwKKyAgICBpbnQgbWF4c2l6ZSkKK3sKKyAgICBpbnQgbiA9IDA7CisgICAgZm9y IChlZGdlIGUgOiBibG9jay0+cHJlZHMpCisgICAgeworCS8qIFNraXAgYW55IHByZWRlY2Vz c29yIG5vdCBpbiB0aGUgZXhwcmVzc2lvbiAtIHRoZXJlIG1pZ2h0IGJlIHN1Y2ggYW4KKwkg ICBlZGdlIHRvIHRoZSBlbmNsb3NpbmcgZXhwcmVzc2lvbiBvciBpbiB0aGUgcHJlc2VuY2Ug b2YgbG9vcHMsIGJ1dAorCSAgIG1hc2tpbmcgY2Fubm90IGhhcHBlbiBvdXRzaWRlIHRoZSBl eHByZXNzaW9uIGl0c2VsZi4KKwkgICAqLworCWlmICghYml0bWFwX2JpdF9wIChleHByLCBl LT5zcmMtPmluZGV4KSkKKwkgICAgY29udGludWU7CisKKwllID0gY29udHJhY3RfZWRnZV91 cCAoZSwgTlVMTCk7CisJaWYgKGUtPmZsYWdzICYgZmxhZ1swXSkKKwkgICAgb3V0W24rK10g PSBlLT5zcmM7CisgICAgfQorCisgICAgaWYgKG4gPiAxKQorICAgIHsKKwliYXNpY19ibG9j ayAqdG9wID0gc3RkOjptYXhfZWxlbWVudCAob3V0LCBvdXQgKyBuLCBpbmRleF9sdCk7CisJ c3RkOjppdGVyX3N3YXAgKHRvcCwgb3V0KTsKKyAgICB9CisKKyAgICBmb3IgKGludCBwb3Mg PSAwOyBwb3MgPCBuOyBwb3MrKykKKyAgICB7CisJZm9yIChlZGdlIGUgOiBvdXRbcG9zXS0+ cHJlZHMpCisJeworCSAgICBpZiAoIWJpdG1hcF9iaXRfcCAoZXhwciwgZS0+c3JjLT5pbmRl eCkpCisJCWNvbnRpbnVlOworCSAgICBpZiAoaW5kZXhfb2YgKGUtPnNyYywgb3V0LCBuKSAh PSAtMSkKKwkJY29udGludWU7CisKKwkgICAgZSA9IGNvbnRyYWN0X2VkZ2VfdXAgKGUsIE5V TEwpOworCSAgICBpZiAoZS0+ZmxhZ3MgJiBmbGFnWzFdKQorCQlvdXRbbisrXSA9IGUtPnNy YzsKKworCSAgICBnY2NfYXNzZXJ0IChuIDwgbWF4c2l6ZSk7CisJfQorICAgIH0KKworICAg IHJldHVybiBuOworfQorCisvKiBTY2FuIHRoZSBibG9ja3MgdGhhdCBtYWtlIHVwIGFuIGV4 cHJlc3Npb24gYW5kIGxvb2sgZm9yIGNvbmRpdGlvbnMgdGhhdAorICAgd291bGQgbWFzayBv dGhlciBjb25kaXRpb25zLiAgRm9yIGEgZGVlcGVyIGRpc2N1c3Npb24gb24gbWFza2luZywg c2VlCisgICBXaGFsZW4sIEhlaW1kYWhsLCBEZSBTaWx2YSAiRWZmaWNpZW50IFRlc3QgQ292 ZXJhZ2UgTWVhc3VyZW1lbnQgZm9yIE1DL0RDIi4KKyAgIE1hc2tpbmcgaXMgYmVzdCBpbGx1 c3RyYXRlZCB3aXRoIGFuIGV4YW1wbGU6CisKKyAgIEEgfHwgQi4gIElmIEIgaXMgdHJ1ZSB0 aGVuIEEgd2lsbCBkb2VzIG5vdCBpbmRlcGVuZGVudGx5IGFmZmVjdCB0aGUgZGVjaXNpb24u CisgICBJbiBhIHdheSwgdGhpcyBpcyAicmV2ZXJzZSIgc2hvcnQgY2lyY3VpdGluZywgYW5k IGFsd2F5cyB3b3JrIG9uIHRoZQorICAgcmlnaHQtaGFuZCBzaWRlIG9mIGV4cHJlc3Npb25z LiAgKiB8fCB0cnVlIGlzIGFsd2F5cyB0cnVlIGFuZCAqICYmIGZhbHNlIGlzCisgICBhbHdh eXMgZmFsc2UgLSB0aGUgbGVmdC1oYW5kLXNpZGUgZG9lcyBub3QgYWZmZWN0IHRoZSBvdXRj b21lLCBhbmQgdGhlaXIKKyAgIHZhbHVlcyBzaG91bGQgbm90IGNvbnRyaWJ1dGUgdG8gbW9k aWZpZGllZCBjb25kaXRpb24vZGVjaXNpb24gY292ZXJhZ2UuCisKKyAgIEEgfHwgQiBpbnRl cnByZXRlZCBhcyBhIGRlY2lzaW9uIGRpYWdyYW0gYmVjb21lczoKKworICAgIEEKKyAgIHR8 XGYKKyAgICB8IFwKKyAgICB8ICBCCisgICAgfHQvIFxmCisgICAgfC8gICBcCisgICAgVCAg ICAgRgorCisgICBUaGUgYWxnb3JpdGhtIGxvb2tzIGZvciB0cmlhbmdsZXMgbGlrZSBBVEIu ICBNYXNraW5nIHJpZ2h0LWhhbmQgc2lkZXMgaGFwcGVuCisgICB3aGVuIGEgYmxvY2sgaGFz IGEgcGFpciBvZiBpbmNvbWluZyBlZGdlcyBvZiB0aGUgc2FtZSBib29sZWFuIHZhbHVlLCBh bmQKKyAgIHRoZXJlIGlzIGFuIGVkZ2UgY29ubmVjdGluZyB0aGUgdHdvIHByZWRlY2Vzc29y cyB3aXRoIHRoZSAqb3Bwb3NpdGUqIGJvb2xlYW4KKyAgIHZhbHVlLiAgVGhlIG1hc2tpbmcg YmxvY2sgaXMgQiwgYW5kIHRoZSBtYXNrZWQgYmxvY2sgaXMgQS4gIEluIHRoaXMKKyAgIHBh cnRpY3VsYXIgZXhhbXBsZToKKworICAgTWFza2luZyBjYW4gYWZmZWN0ICJvdXRzaWRlIiBp dHMgb3duIHN1YmV4cHJlc3Npb247IGluIEEgfHwgKEIgJiYgQykgaWYgQyBpcworICAgZmFs c2UsIEIgaXMgbWFza2VkLiAgSG93ZXZlciwgaWYgKEIgJiYgQykgaXMgdHJ1ZSwgQSBnZXRz IG1hc2tlZC4gIEIgJiYgQworICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSBldmFsdWF0aW5n IEMgc2luY2UgIUIgd291bGQgc2hvcnQtY2lyY3VpdCwgc28gYSB0cnVlCisgICBDIHdvdWxk IG1hc2sgQS4KKworICAgIEEKKyAgIHR8XGYKKyAgICB8IFwKKyAgICB8ICBcCisgICAgfCAg IFwKKyAgICB8ICAgIEIKKyAgICB8ICB0LyBcZgorICAgIHwgIEMgICB8CisgICAgfHQvIFxm IHwKKyAgICB8LyAgIFwgfAorICAgIFQgICAgIEYKKworICAgTm90aWNlIGhvdyBCRkMgZm9y bXMgYSB0cmlhbmdsZS4gIEV4cHJlc3Npb25zIG1hc2tlZCBieSBhbiBlZGdlIGFyZQorICAg ZGV0ZXJtaW5lZCBieToKKyAgICogR28gdG8gdGhlIHByZWRlY2Vzc29yIHdpdGggdHJ1dGgg dmFsdWUgYiAoaWYgaXQgZXhpc3RzKS4KKyAgICogRm9sbG93IHRoZSBwYXRoIG9mIGFuY2Vz dG9ycyB3aXRoIHRha2luZyBvbmx5ICFiIGVkZ2VzLCByZWNvcmRpbmcgZXZlcnkKKyAgICAg bm9kZSBmcm9tIGhlcmUgb24uCisKKyAgIEZvciB0aGUgY2FzZSB3aGVyZSBDIGNhbiBtYXNr IEEsIHRoZSBwYXRoIGdvZXMgQyBbdHJ1ZV0tPiBCIC0+IFtmYWxzZV0gQSwgc28KKyAgIEMg W3RydWVdIG1hc2tzIEEuCisKKyAgIFRoZSBtYXNrIGlzIG91dHB1dCBhcyBhIGJpdC1zZXQg c3RvcmVkIGluIGEgZ2Nvdl90eXBlX3Vuc2lnbmVkLiAgVGhlCisgICBiaXQtc2V0cyBhcmUg b3V0cHV0IGluIHBhaXJzLCBvbmUgZm9yIGVhY2ggZGVjaXNpb24gKHRoZSBvdXRjb21lIG9m IHRoZQorICAgYm9vbGVhbiBleHByZXNzaW9uLCBvciB3aGljaCBhcmMgdG8gdGFrZSBpbiB0 aGUgQ0ZHKS4KKyAqLwordm9pZAorZmluZF9zdWJleHByX21hc2tzICgKKyAgICBjb25zdCBi YXNpY19ibG9jayAqYmxvY2tzLAorICAgIGludCBuYmxvY2tzLAorICAgIGdjb3ZfdHlwZV91 bnNpZ25lZCAqbWFza3MpCit7CisgICAgY29uc3QgdW5zaWduZWQgZmxhZ3NbXSA9IHsKKwlF REdFX1RSVUVfVkFMVUUsCisJRURHRV9GQUxTRV9WQUxVRSwKKwlFREdFX1RSVUVfVkFMVUUs CisgICAgfTsKKworICAgIGJhc2ljX2Jsb2NrIHBhdGhbQ09ORElUSU9OU19NQVhfVEVSTVNd OworICAgIGF1dG9fc2JpdG1hcCBleHByIChuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKGNmdW4p KTsKKyAgICBiaXRtYXBfY2xlYXIgKGV4cHIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg bmJsb2NrczsgaSsrKQorCWJpdG1hcF9zZXRfYml0IChleHByLCBibG9ja3NbaV0tPmluZGV4 KTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKQorICAgIHsKKwli YXNpY19ibG9jayBibG9jayA9IGJsb2Nrc1tpXTsKKwlpZiAoc2luZ2xlX3ByZWRfcCAoYmxv Y2spKQorCSAgICBjb250aW51ZTsKKworCWZvciAoaW50IGsgPSAwOyBrIDwgMjsgaysrKQor CXsKKwkgICAgY29uc3QgaW50IG4gPSBmaW5kX2NvbmRpdGlvbnNfbWFza2VkX2J5CisJCShi bG9jaywgZXhwciwgZmxhZ3MgKyBrLCBwYXRoLCBDT05ESVRJT05TX01BWF9URVJNUyk7CisK KwkgICAgaWYgKG4gPCAyKQorCQljb250aW51ZTsKKworCSAgICBjb25zdCBpbnQgbSA9IDIq aW5kZXhfb2YgKHBhdGhbMF0sIGJsb2NrcywgbmJsb2NrcykgKyBrOworCSAgICBmb3IgKGlu dCBpID0gMTsgaSA8IG47IGkrKykKKwkgICAgeworCQljb25zdCBpbnQgaW5kZXggPSBpbmRl eF9vZiAocGF0aFtpXSwgYmxvY2tzLCBuYmxvY2tzKTsKKwkJbWFza3NbbV0gfD0gZ2Nvdl90 eXBlX3Vuc2lnbmVkICgxKSA8PCBpbmRleDsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK2lu dAorY29sbGVjdF9yZWFjaGFibGVfY29uZGl0aW9uYWxzICgKKyAgICBiYXNpY19ibG9jayBw cmUsCisgICAgYmFzaWNfYmxvY2sgcG9zdCwKKyAgICBiYXNpY19ibG9jayAqb3V0LAorICAg IGludCBtYXhzaXplLAorICAgIHNiaXRtYXAgZXhwcikKK3sKKyAgICBnY2NfYXNzZXJ0ICht YXhzaXplID4gMCk7CisKKyAgICBiYXNpY19ibG9jayBsb29wID0gcHJlLT5sb29wX2ZhdGhl ci0+aGVhZGVyOworICAgIGludCBuID0gMDsKKyAgICBvdXRbbisrXSA9IHByZTsKKyAgICBi aXRtYXBfc2V0X2JpdCAoZXhwciwgcHJlLT5pbmRleCk7CisKKyAgICBmb3IgKGludCBwb3Mg PSAwOyBwb3MgPCBuOyBwb3MrKykKKyAgICB7CisJYmFzaWNfYmxvY2sgYmxvY2sgPSBvdXRb cG9zXTsKKworCWZvciAoZWRnZSBlIDogYmxvY2stPnN1Y2NzKQorCXsKKwkgICAgYmFzaWNf YmxvY2sgZGVzdCA9IGNvbnRyYWN0X2VkZ2UgKGUsIGV4cHIpLT5kZXN0OworCisJICAgIC8q IFNraXAgbG9vcCBlZGdlcywgYXMgdGhleSBnbyBvdXRzaWRlIHRoZSBleHByZXNzaW9uLiAg Ki8KKwkgICAgaWYgKGRlc3QgPT0gbG9vcCkKKwkJY29udGludWU7CisJICAgIGlmIChkZXN0 ID09IHBvc3QpCisJCWNvbnRpbnVlOworCSAgICBpZiAoIWlzX2NvbmRpdGlvbmFsX3AgKGRl c3QpKQorCQljb250aW51ZTsKKwkgICAgLyogQWxyZWFkeS1zZWVuLCBkb24ndCByZS1hZGQu ICAqLworCSAgICBpZiAoYml0bWFwX2JpdF9wIChleHByLCBkZXN0LT5pbmRleCkpCisJCWNv bnRpbnVlOworCisJICAgIGJpdG1hcF9zZXRfYml0IChleHByLCBkZXN0LT5pbmRleCk7CisJ ICAgIG91dFtuKytdID0gZGVzdDsKKwkgICAgaWYgKG4gPT0gbWF4c2l6ZSkKKwkJcmV0dXJu IG47CisJfQorICAgIH0KKworICAgIHJldHVybiBuOworfQorCitpbnQKK2NvbGxlY3RfbmVp Z2hib3JzIChiYXNpY19ibG9jayAqYmxvY2tzLCBpbnQgbmJsb2Nrcywgc2JpdG1hcCByZWFj aGFibGUpCit7CisgICAgaW50IG4gPSAwOworICAgIGJhc2ljX2Jsb2NrICpleGl0cyA9IGJs b2NrcyArIG5ibG9ja3M7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYmxvY2tzOyBpKysp CisgICAgeworCWZvciAoZWRnZSBlIDogYmxvY2tzW2ldLT5zdWNjcykKKwl7CisJICAgIGlm IChiaXRtYXBfYml0X3AgKHJlYWNoYWJsZSwgZS0+ZGVzdC0+aW5kZXgpKQorCQljb250aW51 ZTsKKworCSAgICBiaXRtYXBfc2V0X2JpdCAocmVhY2hhYmxlLCBlLT5kZXN0LT5pbmRleCk7 CisJICAgIGV4aXRzW24rK10gPSBlLT5kZXN0OworCX0KKyAgICB9CisKKyAgICByZXR1cm4g bjsKK30KKworLyogRmluZCBhbmQgaXNvbGF0ZSB0aGUgZmlyc3QgZXhwcmVzc2lvbiBiZXR3 ZWVuIHR3byBkb21pbmF0b3JzLgorCisgICBFaXRoZXIgYmxvY2sgb2YgYSBjb25kaXRpb25h bCBjb3VsZCBoYXZlIG1vcmUgZGVjaXNpb25zIGFuZCBsb29wcywgc28KKyAgIGlzb2xhdGUg dGhlIGZpcnN0IGRlY2lzaW9uIGJ5IHNldC1pbnRlcnNlY3RpbmcgYWxsIHBhdGhzIGZyb20g dGhlCisgICBwb3N0LWRvbWluYXRvciB0byB0aGUgZW50cnkgYmxvY2suCisKKyAgIFRoZSBm dW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYmxvY2tzIGZyb20gbiB0aGF0IG1ha2Ug dXAgdGhlIGxlYWRpbmcKKyAgIGV4cHJlc3Npb24gaW4gcHJlZml4IG9yZGVyIChpLmUuIHRo ZSBvcmRlciBleHBlY3RlZCBieSB0aGUgaW5zdHJ1bWVudGluZworICAgY29kZSkuICBXaGVu IHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIHRoZXJlIGFyZSBubyBkZWNpc2lvbnMgYmV0d2Vl biBwcmUgYW5kCisgICBwb3N0LCBhbmQgdGhpcyBzZWdtZW50IG9mIHRoZSBDRkcgY2FuIHNh ZmVseSBiZSBza2lwcGVkLgorCisgICBUaGUgcG9zdCBub2RlcyBjYW4gaGF2ZSBwcmVkZWNl c3NvcnMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoaXMgc3ViZ3JhcGgsCisgICB3aGljaCBh cmUgc2tpcHBlZC4gIFRoaXMgaXMgZXhwZWN0ZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUg aXMgYQorICAgY29uZGl0aW9uYWwgaW4gdGhlIGVsc2UtYmxvY2sgb2YgYSBsYXJnZXIgZXhw cmVzc2lvbjoKKworICAgaWYgKEEpCisgICB7CisgICAgICBpZiAoQikge30KKyAgIH0KKyAg IGVsc2UKKyAgIHsKKyAgICAgIGlmIChDKSB7fSBlbHNlIHt9CisgICB9CisKKyAgICAgICAg ICAgICBBCisgICAgICAgICAgdCAvIFwgZgorICAgICAgICAgICAvICAgXAorICAgICAgICAg IEIgICAgIEMKKyAgICAgICAgIC9cICAgIC8gXAorICAgICAgICAvICBcICBUICAgRgorICAg ICAgIFQgICAgXCAgXCAvCisgICAgICAgIFwgICB8ICAgbworICAgICAgICAgXCAgfCAgLwor ICAgICAgICAgIFwgfCAvCisgICAgICAgICAgIFx8LworICAgICAgICAgICAgRQorCisgICBQ cm9jZXNzaW5nIFtCLCBFKSB3aGljaCBsb29rcyBsaWtlOgorCisgICAgICBCCisgICAgIC98 CisgICAgLyB8CisgICBUICB8CisgICAgXCAvCisgICAgIEUgLS0tLT4gbyAvLyBwcmVkZWNl c3NvciBvdXRzaWRlIFtCLCBlKQorICovCisKKy8qIERvIGEgKHVwd2FyZHMpIHNlYXJjaCBm b3IgcmVhY2hhYmxlIG5vZGVzIGFuZCBtYXJrIHRoZW0gaW4gdGhlIHJlYWNoYWJsZQorICAg c2V0LCBtYWtpbmcgc3VyZSBub3QgdG8gdGFrZSBsb29wIGVkZ2VzLiAgZGZzX2VudW1lcmF0 ZV9mcm9tICgpIHdvbid0IHdvcmsgYXMKKyAgIHRoZSBmaWx0ZXIgZnVuY3Rpb24gbmVlZHMg aW5mb3JtYXRpb24gZnJvbSB0aGUgZWRnZS4KKyAqLwordm9pZAorZmluZF9yZWFjaGFibGUg KAorICAgIHNiaXRtYXAgcmVhY2hhYmxlLAorICAgIGJhc2ljX2Jsb2NrIHByZSwKKyAgICBi YXNpY19ibG9jayBwb3N0LAorICAgIGJhc2ljX2Jsb2NrICpzdGFjaykKK3sKKyAgICBzdGFj a1swXSA9IHByZTsKKyAgICBiaXRtYXBfc2V0X2JpdCAocmVhY2hhYmxlLCBwcmUtPmluZGV4 KTsKKyAgICBiaXRtYXBfc2V0X2JpdCAocmVhY2hhYmxlLCBwb3N0LT5pbmRleCk7CisgICAg Zm9yIChpbnQgbiA9IDA7IG4gPj0gMDsgbi0tKQorICAgIHsKKwlmb3IgKGVkZ2UgZSA6IHN0 YWNrW25dLT5wcmVkcykKKwl7CisJICAgIGlmIChiaXRtYXBfYml0X3AgKHJlYWNoYWJsZSwg ZS0+c3JjLT5pbmRleCkpCisJCWNvbnRpbnVlOworCisJICAgIC8qIElnbm9yZSBhbnkgbG9v cCBlZGdlcy4gICovCisJICAgIGlmIChkb21pbmF0ZWRfYnlfcCAoQ0RJX0RPTUlOQVRPUlMs IGUtPnNyYywgZS0+ZGVzdCkpCisJCWNvbnRpbnVlOworCisJICAgIGJhc2ljX2Jsb2NrIHNy YyA9IGNvbnRyYWN0X2VkZ2VfdXAgKGUsIHJlYWNoYWJsZSktPnNyYzsKKwkgICAgYml0bWFw X3NldF9iaXQgKHJlYWNoYWJsZSwgc3JjLT5pbmRleCk7CisJICAgIHN0YWNrW24rK10gPSBz cmM7CisJfQorICAgIH0KK30KKworaW50CitmaW5kX2ZpcnN0X2NvbmRpdGlvbmFsIChjb25k c19jdHggJmN0eCwgYmFzaWNfYmxvY2sgcHJlLCBiYXNpY19ibG9jayBwb3N0KQoreworICAg IGJhc2ljX2Jsb2NrICpibG9ja3MgPSBjdHguYmxvY2tzOworICAgIHNiaXRtYXAgZXhwciA9 IGN0eC5leHByOworICAgIHNiaXRtYXAgcmVhY2hhYmxlID0gY3R4LnJlYWNoYWJsZTsKKyAg ICBiaXRtYXBfY2xlYXIgKGV4cHIpOworICAgIGJpdG1hcF9jbGVhciAocmVhY2hhYmxlKTsK KyAgICBibG9ja3NbMF0gPSBwcmU7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBhIGRpcmVjdCBl ZGdlIHRvIHRoZSBwb3N0IGRvbWluYXRvciB0aGVuIHRoaXMgY2Fubm90IG9ubHkgYmUKKyAg ICAgICBhIHNpbmdsZS10ZXJtIGNvbmRpdGlvbmFsICp1bmxlc3MqIGl0IGlzIGEgbG9vcCAo aW4gd2hpY2ggY2FzZSB0aGUKKyAgICAgICB0by1wb3N0IGVkZ2UgaXMgdGhlIGxvb3AgZXhp dCBlZGdlKS4KKyAgICAgKi8KKyAgICBjb25zdCBib29sIGRvd2hpbGUgPSAhbG9vcF9leGl0 c19mcm9tX2JiX3AgKHByZS0+bG9vcF9mYXRoZXIsIHByZSk7CisgICAgY29uc3QgYm9vbCBp c2xvb3AgPSBiYl9sb29wX2hlYWRlcl9wIChwcmUpICYmICFkb3doaWxlOworICAgIGlmIChm aW5kX2VkZ2UgKHByZSwgcG9zdCkgJiYgIWlzbG9vcCkKKwlyZXR1cm4gMTsKKworICAgIGNv bnN0IGludCBuYmxvY2tzID0gY29sbGVjdF9yZWFjaGFibGVfY29uZGl0aW9uYWxzCisJKHBy ZSwgcG9zdCwgYmxvY2tzLCBjdHgubWF4c2l6ZSwgZXhwcik7CisgICAgaWYgKG5ibG9ja3Mg PT0gMSkKKwlyZXR1cm4gbmJsb2NrczsKKworICAgIGJpdG1hcF9jb3B5IChyZWFjaGFibGUs IGV4cHIpOworICAgIGNvbnN0IGludCBuZXhpdHMgPSBjb2xsZWN0X25laWdoYm9ycyAoYmxv Y2tzLCBuYmxvY2tzLCByZWFjaGFibGUpOworICAgIGlmIChuZXhpdHMgPT0gMikKKwlyZXR1 cm4gbmJsb2NrczsKKworICAgIC8qIEZpbmQgcmVhY2hhYmxlIG5vZGVzIGZyb20gdGhlIG5l aWdoYm9ycy4gICovCisgICAgYmFzaWNfYmxvY2sgKmV4aXRzID0gYmxvY2tzICsgbmJsb2Nr czsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5leGl0czsgaSsrKQorICAgIHsKKwlmb3Ig KGVkZ2UgZSA6IGV4aXRzW2ldLT5wcmVkcykKKwl7CisJICAgIGlmICghZG9taW5hdGVkX2J5 X3AgKENESV9ET01JTkFUT1JTLCBlLT5zcmMsIHByZSkpCisJCWNvbnRpbnVlOworCisJICAg IGJpdG1hcF9jbGVhciAocmVhY2hhYmxlKTsKKwkgICAgZmluZF9yZWFjaGFibGUgKHJlYWNo YWJsZSwgZS0+c3JjLCBwcmUsIGV4aXRzICsgbmV4aXRzKTsKKwkgICAgZm9yIChlZGdlIGYg OiBleGl0c1tpXS0+cHJlZHMpCisJCWJpdG1hcF9zZXRfYml0IChyZWFjaGFibGUsIGYtPnNy Yy0+aW5kZXgpOworCSAgICBiaXRtYXBfYW5kIChleHByLCBleHByLCByZWFjaGFibGUpOwor CX0KKyAgICB9CisKKyAgICBpbnQgayA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBu YmxvY2tzOyBpKyspCisJaWYgKGJpdG1hcF9iaXRfcCAoZXhwciwgYmxvY2tzW2ldLT5pbmRl eCkpCisJICAgIGJsb2Nrc1trKytdID0gYmxvY2tzW2ldOworICAgIHJldHVybiBrOworfQor Cit2b2lkCitlbWl0X2JpdHdpc2Vfb3AgKGVkZ2UgZSwgdHJlZSBsaHMsIHRyZWUgb3AxLCB0 cmVlX2NvZGUgb3AsIHRyZWUgb3AyLAorCQkgaW50IGF0b21pYyA9IDApCit7CisgICAgdHJl ZSB0bXA7CisgICAgZ2Fzc2lnbiAqcmVhZDsKKyAgICBnYXNzaWduICpiaXR3OworICAgIGdp bXBsZSAgKndyaXRlOworCisgICAgLyogSW5zZXJ0IGxocyA9IG9wMSA8Yml0LW9wPiBvcDIu CisKKyAgICAgICBUaGUgb3BlcmFuZHMgYXJlIGFzc3VtZWQgdG8gYmUgbG9jYWwgYWNjdW11 bGF0b3JzIG9yIGFscmVhZHkgU1NBJ2QgKGFuZAorICAgICAgIG5vdCByZWZlcmVuY2luZyBn bG9iYWxzKSBhbmQgZG9uJ3QgbmVlZCBhdG9taWMgcmVhZHMgYW55bW9yZS4KKyAgICAgKi8K KyAgICB0bXAgICA9IG1ha2VfdGVtcF9zc2FfbmFtZSAoZ2Nvdl90eXBlX25vZGUsIE5VTEws ICJfX2NvbmRpdGlvbnNfdG1wIik7CisgICAgcmVhZCAgPSBnaW1wbGVfYnVpbGRfYXNzaWdu ICh0bXAsIG9wMSk7CisgICAgdG1wICAgPSBtYWtlX3RlbXBfc3NhX25hbWUgKGdjb3ZfdHlw ZV9ub2RlLCBOVUxMLCAiX19jb25kaXRpb25zX3RtcCIpOworICAgIGJpdHcgID0gZ2ltcGxl X2J1aWxkX2Fzc2lnbiAodG1wLCBvcCwgZ2ltcGxlX2Fzc2lnbl9saHMgKHJlYWQpLCBvcDIp OworCisgICAgaWYgKGF0b21pYykKKyAgICB7CisJdHJlZSByZWxheGVkID0gYnVpbGRfaW50 X2NzdCAoaW50ZWdlcl90eXBlX25vZGUsIE1FTU1PREVMX1JFTEFYRUQpOworCXRyZWUgc3Rv cmUgPSBidWlsdGluX2RlY2xfZXhwbGljaXQgKAorCQlUWVBFX1BSRUNJU0lPTiAoZ2Nvdl90 eXBlX25vZGUpID4gMzIKKwkJPyBCVUlMVF9JTl9BVE9NSUNfU1RPUkVfOAorCQk6IEJVSUxU X0lOX0FUT01JQ19TVE9SRV80KTsKKworCS8vIF9fYXRvbWljX3N0b3JlXzggKCZsaHMsIChv cDEgfCBvcDIpLCBfX0FUT01JQ19SRUxBWEVEKQorCXdyaXRlID0gZ2ltcGxlX2J1aWxkX2Nh bGwKKwkgICAgKHN0b3JlLCAzLCBidWlsZF9hZGRyIChsaHMpLCBnaW1wbGVfYXNzaWduX2xo cyAoYml0dyksIHJlbGF4ZWQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXdyaXRlID0g Z2ltcGxlX2J1aWxkX2Fzc2lnbiAobGhzLCBnaW1wbGVfYXNzaWduX2xocyAoYml0dykpOwor ICAgIH0KKworICAgIGdzaV9pbnNlcnRfb25fZWRnZSAoZSwgcmVhZCk7CisgICAgZ3NpX2lu c2VydF9vbl9lZGdlIChlLCBiaXR3KTsKKyAgICBnc2lfaW5zZXJ0X29uX2VkZ2UgKGUsIHdy aXRlKTsKK30KKworLyogV2FsayB0aGUgQ0ZHIGFuZCBjb2xsZWN0IGNvbmRpdGlvbmFscy4K KworICAgMS4gQ29sbGVjdCBhbGwgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlIHJvb3Qgbm9k ZSB0aHJvdWdoIChjb250cmFjdGVkKSBwYXRocworICAgICAgb2YgdHJ1ZS9mYWxzZSBlZGdl cy4KKyAgIDIuIENvbGxlY3QgdGhlIG5laWdoYm9ycyBvZiB0aGUgcmVhY2hhYmxlIG5vZGUg KHNldCkuCisgICAzLiBGcm9tIGV2ZXJ5IG5vZGUgaW4gdGhlIG5laWdoYm9yaG9vZCwgd2Fs ayB0aGUgdXAgdGhlIENGRyBhbmQgbWFyayBldmVyeQorICAgICAgcmVhY2hhYmxlIG5vZGUu ICBPbmx5IHRoZSBub2RlcyByZWFjaGFibGUgZnJvbSAqZXZlcnkqIG5vZGUgaW4gdGhlCisg ICAgICBuZWlnaGJvcmhvb2QgYXJlIGEgcGFydCBvZiB0aGUgZmlyc3QgZXhwcmVzc2lvbi4K KyAgIDQuIFJlY29yZCB0aGUgZXhwcmVzc2lvbiBwbHVzIHRoZSB0d28gc3VjY2Vzc29ycyBv ZiB0aGUgbGFzdCAoaGlnaGVzdC1pbmRleCkKKyAgICAgIG5vZGUgaW4gdGhlIGV4cHJlc3Np b24sIGkuZS4gdGhlIGxhc3QgdGVybS4KKyAgIDUuIFJlcGVhdCB1c2luZyB0aGUgdHdvIHN1 Y2Nlc3NvcnMgYXMgbmV3IHJvb3Qgbm9kZXMuCisKKyAgIEl0IGlzIG5vdCBndWFyYW50ZWVk IHRvIGZpbmQgbm9kZXMgaW4gdGhlIG9yZGVyIG9mIHRoZSBleHByZXNzaW9uLCBpLmUuIGl0 CisgICBtaWdodCBmaW5kIChhIHx8IGIpICYmIGMgYXMgW2EgYyBiXSwgc28gdGhlIG91dHB1 dCBpcyBzb3J0ZWQgYnkKKyAgIGJhc2ljX2Jsb2NrLT5pbmRleC4KKworICAgU3RlcHMgMiBh bmQgMyBhcmUgbmVjZXNzYXJ5IHRvIGRpc3Rpbmd1aXNoIGNoYWluZWQgY29uZGl0aW9uYWxz IGZyb20KKyAgIG11bHRpLXRlcm0gY29uZGl0aW9uYWxzLCBlLmcuIHRvIHNlcGFyYXRlCisK KyAgICAgICBpZiAoYSkKKyAgICAgICB7CisgICAgICAgICAgIGlmIChiKQorICAgICAgICAg ICAgICAgd29yayAoKTsKKyAgICAgICB9CisgICAgICAgaWYgKGEgJiYgYikKKyAgICAgICAg ICAgd29yayAoKTsKKyAqLwordm9pZAorY29sbGVjdF9jb25kaXRpb25zIChjb25kc19jdHgm IGN0eCwgYmFzaWNfYmxvY2sgZW50cnksIGJhc2ljX2Jsb2NrIGV4aXQpCit7CisgICAgYmFz aWNfYmxvY2sgcHJlOworICAgIGJhc2ljX2Jsb2NrIHBvc3Q7CisgICAgZm9yIChwcmUgPSBl bnRyeSA7OyBwcmUgPSBwb3N0KQorICAgIHsKKwlpZiAocHJlID09IGV4aXQpCisJICAgIGJy ZWFrOworCWlmIChiaXRtYXBfYml0X3AgKGN0eC5zZWVuLCBwcmUtPmluZGV4KSkKKwkgICAg YnJlYWs7CisKKwlwb3N0ID0gZ2V0X2ltbWVkaWF0ZV9kb21pbmF0b3IgKENESV9QT1NUX0RP TUlOQVRPUlMsIHByZSk7CisJaWYgKCFpc19jb25kaXRpb25hbF9wIChwcmUpKQorCXsKKwkg ICAgZm9yIChlZGdlIGUgOiBwcmUtPnN1Y2NzKQorCQljb2xsZWN0X2NvbmRpdGlvbnMgKGN0 eCwgZS0+ZGVzdCwgcG9zdCk7CisJICAgIGNvbnRpbnVlOworCX0KKworCWludCBudGVybXMg PSBmaW5kX2ZpcnN0X2NvbmRpdGlvbmFsIChjdHgsIHByZSwgcG9zdCk7CisJc3RkOjpzb3J0 IChjdHguYmxvY2tzLCBjdHguYmxvY2tzICsgbnRlcm1zLCBpbmRleF9sdCk7CisJYmFzaWNf YmxvY2sgbGFzdCA9IGN0eC5ibG9ja3NbbnRlcm1zIC0gMV07CisJaWYgKHNpemVfdCAobnRl cm1zKSA8PSBDT05ESVRJT05TX01BWF9URVJNUykKKwl7CisJICAgIGZvciAoZWRnZSBlIDog bGFzdC0+c3VjY3MpCisJCWlmIChlLT5mbGFncyAmIChFREdFX1RSVUVfVkFMVUUgfCBFREdF X0ZBTFNFX1ZBTFVFKSkKKwkJICAgIGN0eC5ibG9ja3NbbnRlcm1zKytdID0gZS0+ZGVzdDsK KwkgICAgY3R4LmNvbW1pdCAocHJlLCBudGVybXMpOworCX0KKwllbHNlCisJeworCSAgICBs b2NhdGlvbl90IGxvYyA9IGdpbXBsZV9sb2NhdGlvbiAoZ3NpX3N0bXQgKGdzaV9sYXN0X2Ji IChwcmUpKSk7CisJICAgIHdhcm5pbmdfYXQKKwkJKGxvYywgT1BUX1djb3ZlcmFnZV90b29f bWFueV9jb25kaXRpb25zLAorCQkgIlRvbyBtYW55IGNvbmRpdGlvbnMgKGZvdW5kICVkKTsg Z2l2aW5nIHVwIGNvdmVyYWdlIiwgbnRlcm1zKTsKKwl9CisKKwlmb3IgKGVkZ2UgZSA6IGxh c3QtPnN1Y2NzKQorCSAgICBjb2xsZWN0X2NvbmRpdGlvbnMgKGN0eCwgZS0+ZGVzdCwgcG9z dCk7CisgICAgfQorfQorCit9CisKKy8qIENvbmRpdGlvbiBjb3ZlcmFnZSAoTUMvREMpCisK KyAgIEFsZ29yaXRobQorICAgLS0tLS0tLS0tCisgICBXaGFsZW4sIEhlaW1kYWhsLCBEZSBT aWx2YSBpbiAiRWZmaWNpZW50IFRlc3QgQ292ZXJhZ2UgTWVhc3VyZW1lbnQgZm9yCisgICBN Qy9EQyIgZGVzY3JpYmUgYW4gYWxnb3JpdGhtIGZvciBtb2RpZmllZCBjb25kaXRpb24vZGVj aXNpb24gY292ZXJhZ2UgYmFzZWQKKyAgIG9uIEFTVCBhbmFseXNpcy4gIFRoaXMgYWxnb3Jp dGhtIGFuYWx5c2VzIHRoZSBjb250cm9sIGZsb3cgZ3JhcGgsIGJ1dCB0aGUKKyAgIGFjY3Vt dWxhdGlvbiBhbmQgcmVjb3JkaW5nIG9mIChwYXJ0aWFsKSByZXN1bHRzIGlzIGluc3BpcmVk IGJ5IHRoZWlyIHdvcmsuCisgICBUaGUgaW5kaXZpZHVhbCBwaGFzZXMgYXJlIGRlc2NyaWJl ZCBpbiBtb3JlIGRldGFpbCBjbG9zZXIgdG8gdGhlCisgICBpbXBsZW1lbnRhdGlvbi4KKwor ICAgVGhlIENGRyBpcyBicm9rZW4gdXAgaW50byBzZWdtZW50cyBiZXR3ZWVuIGRvbWluYXRv cnMuICBUaGlzIGlzbid0IHN0cmljdGx5CisgICBuZWNlc3NhcnksIGJ1dCBzaW5jZSBib29s ZWFuIGV4cHJlc3Npb25zIGNhbm5vdCBjcm9zcyBkb21pbmF0b3JzIGl0IG1ha2VzCisgICBm b3IgYSBuaWNlIHdheSB0byByZWR1Y2Ugd29yay4KKworICAgVGhlIGNvdmVyYWdlIG9ubHkg Y29uc2lkZXJzIHRoZSBwb3NpdGlvbnMsIG5vdCB0aGUgc3ltYm9scywgaW4gYQorICAgY29u ZGl0aW9uYWwsIGUuZy4gIUEgfHwgKCFCICYmIEEpIGlzIGEgMy10ZXJtIGNvbmRpdGlvbmFs IGV2ZW4gdGhvdWdoIEEKKyAgIGFwcGVhcnMgdHdpY2UuICBTdWJleHByZXNzaW9ucyBoYXZl IG5vIGVmZmVjdCBvbiB0ZXJtIG9yZGVyaW5nOgorICAgKGEgJiYgKGIgfHwgKGMgJiYgZCkp IHx8IGUpIGNvbWVzIG91dCBhcyBbYSBiIGMgZCBlXS4KKworICAgVGhlIG91dHB1dCBmb3Ig Z2NvdiBpcyBhIHZlY3RvciBvZiBwYWlycyBvZiB1bnNpZ25lZCBpbnRlZ2VycywgaW50ZXJw cmV0ZWQKKyAgIGFzIGJpdC1zZXRzLCB3aGVyZSB0aGUgYml0IGluZGV4IGNvcnJlc3BvbmRz IHRvIHRoZSBpbmRleCBvZiB0aGUgY29uZGl0aW9uCisgICBpbiB0aGUgZXhwcmVzc2lvbi4K KworICAgSW1wbGVtZW50YXRpb24gYW5kIGludGVyZmFjZQorICAgLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorICAgVHdvIHB1YmxpYyBmdW5jdGlvbnMgLSBmaW5kX2NvbmRpdGlv bnMgYW5kIGluc3RydW1lbnRfZGVjaXNpb25zLgorCisgICBmaW5kX2NvbmRpdGlvbnMgb3V0 cHV0cyB0d28gYXJyYXlzLCBibG9ja3MgYW5kIHNpemVzLiAgVGhlIHNpemVzIGRlc2NyaWJl cworICAgdGhlIHJhbmdlcyBvZiBibG9ja3MgdGhhdCBtYWtlIHVwIGV2ZXJ5IGNvbmRpdGlv bmFsLCBpbiBhIFtmaXJzdCwgbGFzdCkKKyAgIGZhc2hpb24sIGkuZS4gYmVnaW4gPSBibG9j a3Nbc2l6ZXNbbl1dLCBlbmQgPSBibG9ja3Nbc2l6ZXNbbisxXV0gZm9yCisgICBleHByZXNz aW9uIG4uICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25z LgorCisgICBUaGUgY292ZXJhZ2UgaXMgZGVzaWduZWQgdG8gZ2V0IG1vc3Qgb2YgaXRzIG1l bW9yeSBuZWVkcyBtZXQgYnkgdGhlIGNhbGxlciwKKyAgIGFuZCBoZWF2aWx5IHVzZXMgdGhl IGVuZCBvZiB0aGUgYmxvY2tzIGFycmF5IGZvciBidWZmZXIuICBUaGlzIGlzIGJvdGggZm9y CisgICBwZXJmb3JtYW5jZSAobm8gcmVzaXplcywgYW1vcnRpemVkIGNvc3Qgb2YgYWxsb2Nh dGlvbikgYW5kCisgICBlYXNlLW9mLWltcGxlbWVudGF0aW9uLiAgVGhpcyBtYWtlcyB0aGUg Y2FsbGVyIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nCisgICBsYXJnZSBlbm91Z2ggYXJy YXlzLgorCisgICBibG9ja3M6CisgICAgRXZlcnkgcGVybWFuZW50IGNvbmRpdGlvbnMgYWRk IDIgYmxvY2tzICh0aGUgdHJ1ZSAmIGZhbHNlIGRlc3QgYmxvY2tzKSwgYW5kCisgICAgYXNz dW1pbmcgYSB3b3JzdCBjYXNlIG9mIG9uZS1ibG9jay1wZXItZXhwciBqdXN0IHN0b3Jpbmcg dGhlIG91dHB1dCBuZWVkcworICAgIDMqbl9iYXNpY19ibG9ja3NfZm9yX2ZuICgpLiAgQWRk aXRpb25hbGx5LCB0aGUgc2VhcmNoZXMgbWlnaHQgbmVlZCB0byBidWZmZXIKKyAgICB0aGUg ZnVsbCBncmFwaCBiZXR3ZWVuIGVudHJ5IGFuZCBleGl0IFsxXS4gSW4gdG90YWwgdGhhdCBt ZWFucworICAgIDUqbl9iYXNpY19ibG9ja3NfZm9yX2ZuICgpIHNob3VsZCBzaG91bGQgYmUg cGxlbnR5LCBhbmQgdGhlIHNhdmluZ3MgZm9yCisgICAgcmVkdWNpbmcgdGhpcyBudW1iZXIg aXMgcHJvYmFibHkgbm90IHdvcnRoIHRoZSByaXNrLgorICAgc2l6ZXM6CisgICAgc2l6ZXMg Z2V0cyBvbmUgZW50cnkgcGVyIGV4cHJlc3Npb24gcGx1cyBpbml0aWFsLCBzbworICAgIDEr bl9iYXNpY19ibG9ja3NfZm9yX2ZuICgpIGlzIHN1ZmZpY2llbnQuCisKKyAgIGluc3RydW1l bnRfZGVjaXNpb25zIHVzZXMgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IGZpbmRfY29u ZGl0aW9ucyB0bworICAgaW5qZWN0IGNvZGUgb250byBlZGdlcyBpbiB0aGUgQ0ZHLiAgRXZl cnkgaW5zdHJ1bWVudGVkIGZ1bmN0aW9uIGdldHMgbG9jYWwKKyAgIGFjY3VtdWxhdG9ycyB6 ZXJvJ2Qgb24gZnVuY3Rpb24gZW50cnksIHdoaWNoIG9uIGZ1bmN0aW9uIGV4aXQgYXJlIGZs dXNoZWQgdG8KKyAgIHRoZSBnbG9iYWwgYWNjdW11bGF0b3JzIChjcmVhdGVkIGJ5IGNvdmVy YWdlX2NvdW50ZXJfYWxsb2MgKCkpLgorCisgICBbMV0gSW4gdHJ1dGgsIHRoZSBzZXQgb2Yg bm9kZXMgdGhhdCBjb3VsZCBiZSBidWZmZXJlZCBnZXRzIHNtYWxsZXIgYXMgdGhlCisgICAg ICAgYWxnb3JpdGhtIHdhbGtzIHRoZSBDRkcsIGJ1dCBhc3N1bWluZyBqdXN0IHVzaW5nIG5v ZGUtY291bnQgY29tZXMgYXQKKyAgICAgICBsaXR0bGUgcnVuLXRpbWUgY29zdCBhbmQgaXMg Z3VhcmFudGVlZCB0byBiZSBzdWZmaWNpZW50LgorICovCitpbnQKK2ZpbmRfY29uZGl0aW9u cyAoCisgICAgYmFzaWNfYmxvY2sgZW50cnksCisgICAgYmFzaWNfYmxvY2sgZXhpdCwKKyAg ICBiYXNpY19ibG9jayAqYmxvY2tzLAorICAgIGludCAqc2l6ZXMsCisgICAgaW50IG1heHNp emUpCit7CisgICAgcmVjb3JkX2xvb3BfZXhpdHMgKCk7CisgICAgYm9vbCBmcmVlX2RvbSA9 IGZhbHNlOworICAgIGJvb2wgZnJlZV9wb3N0X2RvbSA9IGZhbHNlOworICAgIGlmICghZG9t X2luZm9fYXZhaWxhYmxlX3AgKENESV9QT1NUX0RPTUlOQVRPUlMpKQorICAgIHsKKwljYWxj dWxhdGVfZG9taW5hbmNlX2luZm8gKENESV9QT1NUX0RPTUlOQVRPUlMpOworCWZyZWVfcG9z dF9kb20gPSB0cnVlOworICAgIH0KKworICAgIGlmICghZG9tX2luZm9fYXZhaWxhYmxlX3Ag KENESV9ET01JTkFUT1JTKSkKKyAgICB7CisJY2FsY3VsYXRlX2RvbWluYW5jZV9pbmZvIChD RElfRE9NSU5BVE9SUyk7CisJZnJlZV9kb20gPSB0cnVlOworICAgIH0KKworICAgIGNvbmRz X2N0eCBjdHggKG1heHNpemUpOworICAgIGN0eC5ibG9ja3MgPSBibG9ja3M7CisgICAgY3R4 LnNpemVzID0gc2l6ZXMgKyAxOworICAgIGN0eC5tYXhzaXplID0gbWF4c2l6ZTsKKyAgICBz aXplc1swXSA9IHNpemVzWzFdID0gMDsKKyAgICBjb2xsZWN0X2NvbmRpdGlvbnMgKGN0eCwg ZW50cnksIGV4aXQpOworCisgICAgLyogUGFydGlhbCBzdW0uICAqLworICAgIGZvciAoaW50 IGkgPSAwOyBpIDwgY3R4LmV4cHJzOyArK2kpCisJc2l6ZXNbaSArIDFdICs9IHNpemVzW2ld OworCisgICAgaWYgKGZyZWVfcG9zdF9kb20pCisJZnJlZV9kb21pbmFuY2VfaW5mbyAoQ0RJ X1BPU1RfRE9NSU5BVE9SUyk7CisgICAgaWYgKGZyZWVfZG9tKQorCWZyZWVfZG9taW5hbmNl X2luZm8gKENESV9ET01JTkFUT1JTKTsKKworICAgIHJldHVybiBjdHguZXhwcnM7Cit9CisK K2ludCBpbnN0cnVtZW50X2RlY2lzaW9ucyAoYmFzaWNfYmxvY2sgKmJsb2NrcywgaW50IG5i bG9ja3MsIGludCBjb25kbm8pCit7CisgICAgLyogSW5zZXJ0IGZ1bmN0aW9uLWxvY2FsIGFj Y3VtdWxhdG9ycyBwZXIgZGVjaXNpb24uICAqLworICAgIHRyZWUgYWNjdVsyXSA9IHsKKwli dWlsZF9kZWNsCisJICAgIChVTktOT1dOX0xPQ0FUSU9OLCBWQVJfREVDTCwKKwkgICAgIGdl dF9pZGVudGlmaWVyICgiX19jb25kaXRpb25zX2FjY3VfdHJ1ZSIpLCBnY292X3R5cGVfbm9k ZSksCisJYnVpbGRfZGVjbAorCSAgICAoVU5LTk9XTl9MT0NBVElPTiwgVkFSX0RFQ0wsCisJ ICAgICBnZXRfaWRlbnRpZmllciAoIl9fY29uZGl0aW9uc19hY2N1X2ZhbHNlIiksIGdjb3Zf dHlwZV9ub2RlKSwKKyAgICB9OworICAgIGZvciAodHJlZSBhY2MgOiBhY2N1KQorICAgIHsK Kwl0cmVlIHplcm8gPSBidWlsZF9pbnRfY3N0IChnY292X3R5cGVfbm9kZSwgMCk7CisJZm9y IChlZGdlIGUgOiBFTlRSWV9CTE9DS19QVFJfRk9SX0ZOIChjZnVuKS0+c3VjY3MpCisJICAg IGdzaV9pbnNlcnRfb25fZWRnZSAoZSwgZ2ltcGxlX2J1aWxkX2Fzc2lnbiAoYWNjLCB6ZXJv KSk7CisgICAgfQorCisgICAgYXV0b192ZWM8Z2Nvdl90eXBlX3Vuc2lnbmVkLCAzMj4gbWFz a3MgKG5ibG9ja3MgKiAyKTsKKyAgICBtYXNrcy5xdWlja19ncm93X2NsZWFyZWQgKG5ibG9j a3MgKiAyKTsKKyAgICBmaW5kX3N1YmV4cHJfbWFza3MgKGJsb2NrcywgbmJsb2NrcywgbWFz a3MuYWRkcmVzcyAoKSk7CisKKyAgICAvKiBUaGUgdHJ1ZS9mYWxzZSB0YXJnZXQgYmxvY2tz IGFyZSBpbmNsdWRlZCBpbiB0aGUgbmJsb2NrcyBzZXQsIGJ1dAorICAgICAgIHRoZWlyIG91 dGdvaW5nIGVkZ2VzIHNob3VsZCBub3QgYmUgaW5zdHJ1bWVudGVkLgorICAgICAqLworICAg IGdjY19hc3NlcnQgKG5ibG9ja3MgPiAyKTsKKworICAgIC8qIEFkZCBpbnN0cnVjdGlvbnMg Zm9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbi1sb2NhbCBhY2N1bXVsYXRvcnMuICAqLworICAg IGZvciAoaW50IGkgPSAwOyBpIDwgbmJsb2NrcyAtIDI7IGkrKykKKyAgICB7CisJZm9yIChl ZGdlIGUgOiBibG9ja3NbaV0tPnN1Y2NzKQorCXsKKwkgICAgaWYgKCEoZS0+ZmxhZ3MgJiAo RURHRV9UUlVFX1ZBTFVFIHwgRURHRV9GQUxTRV9WQUxVRSkpKQorCQljb250aW51ZTsKKwor CSAgICAvKiBhY2N1IHw9IGV4cHJbaV0gKi8KKwkgICAgY29uc3QgaW50IHQgPSAhIShlLT5m bGFncyAmIEVER0VfRkFMU0VfVkFMVUUpOworCSAgICB0cmVlIHJocyA9IGJ1aWxkX2ludF9j c3QgKGdjb3ZfdHlwZV9ub2RlLCAxVUxMIDw8IGkpOworCSAgICBlbWl0X2JpdHdpc2Vfb3Ag KGUsIGFjY3VbdF0sIGFjY3VbdF0sIEJJVF9JT1JfRVhQUiwgcmhzKTsKKworCSAgICBpZiAo bWFza3NbMippICsgdF0gPT0gMCkKKwkJY29udGludWU7CisKKwkgICAgLyogYWNjdSAmPSBt YXNrW2ldICovCisJICAgIHRyZWUgbWFzayA9IGJ1aWxkX2ludF9jc3QgKGdjb3ZfdHlwZV9u b2RlLCB+bWFza3NbMippICsgdF0pOworCSAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGor KykKKwkJZW1pdF9iaXR3aXNlX29wIChlLCBhY2N1W2pdLCBhY2N1W2pdLCBCSVRfQU5EX0VY UFIsIG1hc2spOworCX0KKyAgICB9CisKKyAgICAvKiBBZGQgaW5zdHJ1Y3Rpb25zIGZvciB1 cGRhdGluZyB0aGUgZ2xvYmFsIGFjY3VtdWxhdG9ycy4gICovCisgICAgYmFzaWNfYmxvY2sg ZXhpdCA9IEVYSVRfQkxPQ0tfUFRSX0ZPUl9GTiAoY2Z1bik7CisgICAgZm9yIChlZGdlIGUg OiBleGl0LT5wcmVkcykKKyAgICB7CisJZm9yIChpbnQgayA9IDA7IGsgPCAyOyBrKyspCisJ eworCSAgICB0cmVlIHJlZiA9IHRyZWVfY292ZXJhZ2VfY291bnRlcl9yZWYKKwkJKEdDT1Zf Q09VTlRFUl9DT05EUywgMipjb25kbm8gKyBrKTsKKworCSAgICB0cmVlIHRtcCA9IG1ha2Vf dGVtcF9zc2FfbmFtZQorCQkoZ2Nvdl90eXBlX25vZGUsIE5VTEwsICJfX2NvbmRpdGlvbnNf dG1wIik7CisKKwkgICAgY29uc3QgYm9vbCBhdG9taWMgPSBmbGFnX3Byb2ZpbGVfdXBkYXRl ID09IFBST0ZJTEVfVVBEQVRFX0FUT01JQzsKKwkgICAgaWYgKGF0b21pYykKKwkgICAgewor CQl0cmVlIHJlbGF4ZWQgPSBidWlsZF9pbnRfY3N0CisJCSAgICAoaW50ZWdlcl90eXBlX25v ZGUsIE1FTU1PREVMX1JFTEFYRUQpOworCQl0cmVlIGF0b21pY19sb2FkID0gYnVpbHRpbl9k ZWNsX2V4cGxpY2l0CisJCSAgICAoVFlQRV9QUkVDSVNJT04gKGdjb3ZfdHlwZV9ub2RlKSA+ IDMyCisJCSAgICAgPyBCVUlMVF9JTl9BVE9NSUNfTE9BRF84CisJCSAgICAgOiBCVUlMVF9J Tl9BVE9NSUNfTE9BRF80KTsKKworCQl0cmVlIGxoc190eXBlID0gVFJFRV9UWVBFIChUUkVF X1RZUEUgKGF0b21pY19sb2FkKSk7CisJCXRyZWUgbGhzID0gbWFrZV90ZW1wX3NzYV9uYW1l CisJCSAgICAobGhzX3R5cGUsIE5VTEwsICJfX2NvbmRpdGlvbnNfbG9hZF9saHMiKTsKKwor CQlnY2FsbCAqbG9hZCA9IGdpbXBsZV9idWlsZF9jYWxsCisJCSAgICAoYXRvbWljX2xvYWQs IDIsIGJ1aWxkX2FkZHIgKHJlZiksIHJlbGF4ZWQpOworCQlnaW1wbGVfc2V0X2xocyAobG9h ZCwgbGhzKTsKKwkJZ2Fzc2lnbiAqYXNzaWduID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbgorCQkg ICAgKHRtcCwgTk9QX0VYUFIsIGdpbXBsZV9jYWxsX2xocyAobG9hZCkpOworCisJCWdzaV9p bnNlcnRfb25fZWRnZSAoZSwgbG9hZCk7CisJCWdzaV9pbnNlcnRfb25fZWRnZSAoZSwgYXNz aWduKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZ2Fzc2lnbiAqcmVhZCA9IGdp bXBsZV9idWlsZF9hc3NpZ24gKHRtcCwgcmVmKTsKKwkJdG1wID0gZ2ltcGxlX2Fzc2lnbl9s aHMgKHJlYWQpOworCQlnc2lfaW5zZXJ0X29uX2VkZ2UgKGUsIHJlYWQpOworCSAgICB9CisK KwkgICAgcmVmID0gdW5zaGFyZV9leHByIChyZWYpOworCSAgICBlbWl0X2JpdHdpc2Vfb3Ag KGUsIHJlZiwgYWNjdVtrXSwgQklUX0lPUl9FWFBSLCB0bXAsIGF0b21pYyk7CisJfQorICAg IH0KKworICAgIHJldHVybiBuYmxvY2tzIC0gMjsKK30KKworI3VuZGVmIENPTkRJVElPTlNf TUFYX1RFUk1TCisKIC8qIERvIGluaXRpYWxpemF0aW9uIHdvcmsgZm9yIHRoZSBlZGdlIHBy b2ZpbGVyLiAgKi8KIAogLyogQWRkIGNvZGU6CkBAIC03NTgsNyArMTYzNSw3IEBAIHRyZWVf cHJvZmlsaW5nICh2b2lkKQogCSAgdGh1bmsgPSB0cnVlOwogCSAgLyogV2hlbiBnZW5lcmF0 ZSBwcm9maWxlLCBleHBhbmQgdGh1bmsgdG8gZ2ltcGxlIHNvIGl0IGNhbiBiZQogCSAgICAg aW5zdHJ1bWVudGVkIHNhbWUgd2F5IGFzIG90aGVyIGZ1bmN0aW9ucy4gICovCi0JICBpZiAo cHJvZmlsZV9hcmNfZmxhZykKKwkgIGlmIChwcm9maWxlX2FyY19mbGFnIHx8IHByb2ZpbGVf Y29uZGl0aW9uX2ZsYWcpCiAJICAgIGV4cGFuZF90aHVuayAobm9kZSwgZmFsc2UsIHRydWUp OwogCSAgLyogUmVhZCBjZ3JhcGggcHJvZmlsZSBidXQga2VlcCBmdW5jdGlvbiBhcyB0aHVu ayBhdCBwcm9maWxlLXVzZQogCSAgICAgdGltZS4gICovCkBAIC04MDMsNyArMTY4MCw3IEBA IHRyZWVfcHJvZmlsaW5nICh2b2lkKQogICByZWxlYXNlX3Byb2ZpbGVfZmlsZV9maWx0ZXJp bmcgKCk7CiAKICAgLyogRHJvcCBwdXJlL2NvbnN0IGZsYWdzIGZyb20gaW5zdHJ1bWVudGVk IGZ1bmN0aW9ucy4gICovCi0gIGlmIChwcm9maWxlX2FyY19mbGFnIHx8IGZsYWdfdGVzdF9j b3ZlcmFnZSkKKyAgaWYgKHByb2ZpbGVfYXJjX2ZsYWcgfHwgcHJvZmlsZV9jb25kaXRpb25f ZmxhZyB8fCBmbGFnX3Rlc3RfY292ZXJhZ2UpCiAgICAgRk9SX0VBQ0hfREVGSU5FRF9GVU5D VElPTiAobm9kZSkKICAgICAgIHsKIAlpZiAoIWdpbXBsZV9oYXNfYm9keV9wIChub2RlLT5k ZWNsKQpAQCAtODk3LDcgKzE3NzQsNyBAQCBwYXNzX2lwYV90cmVlX3Byb2ZpbGU6OmdhdGUg KGZ1bmN0aW9uICopCiAgICAgIGRpc2FibGVkLiAgKi8KICAgcmV0dXJuICghaW5fbHRvX3Ag JiYgIWZsYWdfYXV0b19wcm9maWxlCiAJICAmJiAoZmxhZ19icmFuY2hfcHJvYmFiaWxpdGll cyB8fCBmbGFnX3Rlc3RfY292ZXJhZ2UKLQkgICAgICB8fCBwcm9maWxlX2FyY19mbGFnKSk7 CisJICAgICAgfHwgcHJvZmlsZV9hcmNfZmxhZyB8fCBwcm9maWxlX2NvbmRpdGlvbl9mbGFn KSk7CiB9CiAKIH0gLy8gYW5vbiBuYW1lc3BhY2UKLS0gCjIuMjAuMQoK --------------DX2gGx7OWgaoz6YgdSKBs14e--