From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15421 invoked by alias); 25 Nov 2007 21:32:00 -0000 Received: (qmail 15412 invoked by uid 22791); 25 Nov 2007 21:31:58 -0000 X-Spam-Check-By: sourceware.org Received: from mail-dub.bigfish.com (HELO mail17-dub-R.bigfish.com) (213.199.154.10) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 25 Nov 2007 21:31:46 +0000 Received: from mail17-dub (localhost.localdomain [127.0.0.1]) by mail17-dub-R.bigfish.com (Postfix) with ESMTP id 16CC512E02B0; Sun, 25 Nov 2007 21:31:43 +0000 (UTC) X-BigFish: VP X-MS-Exchange-Organization-Antispam-Report: OrigIP: 163.181.251.8;Service: EHS Received: by mail17-dub (MessageSwitch) id 1196026302886821_7140; Sun, 25 Nov 2007 21:31:42 +0000 (UCT) Received: from ausb3extmailp01.amd.com (unknown [163.181.251.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail17-dub.bigfish.com (Postfix) with ESMTP id 837121330070; Sun, 25 Nov 2007 21:31:41 +0000 (UTC) Received: from SAUSGW02.amd.com (sausgw02.amd.com [163.181.250.22]) by ausb3extmailp01.amd.com (Switch-3.2.7/Switch-3.2.7) with ESMTP id lAPLVRKZ015626; Sun, 25 Nov 2007 15:31:30 -0600 Received: from [163.181.22.102] by SAUSGW01.amd.com with ESMTP (AMD SMTP Relay (Email Firewall v6.3.1)); Sun, 25 Nov 2007 15:31:22 -0600 X-Server-Uuid: D6C75999-9DAF-4D89-B9AC-C25E3A0BB76A Received: from SAUSEXMB3.amd.com ([163.181.22.202]) by sausexbh2.amd.com with Microsoft SMTPSVC(6.0.3790.2499); Sun, 25 Nov 2007 15:31:22 -0600 Content-class: urn:content-classes:message MIME-Version: 1.0 Subject: RE: [PATCH,vect] ppc cost model options Date: Mon, 26 Nov 2007 02:24:00 -0000 Message-ID: In-Reply-To: From: "Jagasia, Harsha" To: "Dorit Nuzman" , gcc-patches@gcc.gnu.org X-WSS-ID: 6B57362024S3459427-01-01 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C82FAA.85E842CA" X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2007-11/txt/msg01339.txt.bz2 This is a multi-part message in MIME format. ------_=_NextPart_001_01C82FAA.85E842CA Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Content-length: 13768 >Sorry for not being able to respond earlier to this thread. The attached patch bootstrapped and passed test on amd64-linux. Ok for mainline? Thanks, >>> >vectorized and such) because the vectorizer cost-model is pending some >>> >fixes from Harsha >>> (http://gcc.gnu.org/ml/gcc-patches/2007-09/msg00916.html >>> >), to be followed by target-specific tuning of costs.) >>> >>> Here is the patch implementing the early cost model check. >>> >> >>great! >> >>> The check is added as follows: >>> - If we do versioning, the threshold comparison is and'ed to the guard >>> that controls the versioning, >>> - Otherwise, if we do peeling for alignment, we can determine the >>> loop-count of the prolog loop according to the threshold test >>> - Otherwise, the threshold comparison is or'ed with the guard that >>> controls whether to bypass the vector code and go straight to the scalar >>> epilogue. >>> >> >>The only technical issue I have is with the fact that I think we're not >>taking into account that because of the presence of the runtime-test, >there >>are costs that should be added also to the scalar side of the equasion >>(branch costs), and these costs are different in each of the above 3 >cases. >>(This is something we don't need to worry about when we make the decision >>at compile time). For example, in case 2, even if we choose to execute >the >>scalar loop we pay the cost of 2 branches that did not exist in the >>original code; in case 3 we pay the cost of 1-3 branches (depending on >>whether we also peel for alignment and if so, if we also enter the prolog >>loop). (We also pay for these branches on the vector side of the equasion, >>but this is already taken into account). So we actually have 4 slighlty >>different equasions: >> >>equasion for compile-time test: >> scalar_costs >=3D vector_costs >> >>equasion for run-time test, case 1: >> scalar_costs >> + versioning_guard_cost >=3D vector_costs >> >>equasion for run-time test, case 2: >> scalar_costs >> + cost_of_guard_for_prolog_peel >=3D vector_costs >> >>equasion for run-time test, case 3: >> scalar_costs >> + cost_of_guard_for_prolog_peel >> + cost_of_guard_for_epilog_peel >=3D vector_costs > >Just to clarify > >In case 1, the check is: > if (cost > th & ...) > jmp to vector code >Hence the run-time scalar cost should be incremented by a NOT-TAKEN branch. > >In case 2, the check is: > if (cost <=3D th) > prologue=3Dscalar_iters > if (prologue =3D=3D 0) > jmp to vector code > else > execute prologue > if (prologue =3D=3D num_iters) > go to exit > >Hence the run-time scalar cost should be incremented by a taken branch, >which on architectures like x86-64 should be a conditional move, plus a >NOT-TAKEN branch, plus a TAKEN BRANCH. > >In case 3, the check is: > if (prologue =3D=3D 0) > jmp to vector code > else > execute prologue > if prologue=3Dnum_iters > go to exit > vector code: > if (cost <=3Dth | (scalar_iters-prologue-epilogue =3D=3D 0)) > jmp to epilogue > >Hence the run-time scalar cost should be incremented by a (taken branch or >2 not-taken branches for prologue) plus taken branch. > >>Do you think we can add these 3 different fixups somehow, depending on >>where the run-time test is actually placed? (this can be important for >>platforms like the SPU, where branches can be very costly, such that we >may >>choose to vectorize the less efficient vector version and not pay the >>branch cost involved with branching to skip the vector code). > >Indeed, I will add the costs. > >> >>The rest are just various style issues: >> >>> * tree-vect-transform.c (vect_do_peeling_for_loop_bound): Computes >>> the treshold if the cost model check has not been done already. >> >>treshold -> threshold >> >>> Index: tree-vectorizer.c >>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> --- tree-vectorizer.c (revision 129356) >>> +++ tree-vectorizer.c (working copy) >>... >>> slpeel_tree_peel_loop_to_edge (struct loop *loop, >>> edge e, tree first_niters, >>> tree niters, bool update_first_loop_count, >>> - unsigned int th) >>> + unsigned int th, bool check) >> >>Please document the new function argument "check" (I see that a >>documentation for "th" is also missing; if you feel like it, please add >>that too while you're at it...) >> >>Actually, maybe we can come up with something more descriptive than >>"check"? e.g. "check_profitability", "add_cost_model_check"... > >Ok. > >> >>> - /* 2. Add the guard that controls whether the first loop is executed. >>> - Resulting CFG would be: >>> + /* 2.a Add the guard that controls whether the first loop is >executed. >>> + Resulting CFG would be: >>> >>> - bb_before_first_loop: >>> - if (FIRST_NITERS =3D=3D 0) GOTO bb_before_second_loop >>> - GOTO first-loop >>> + bb_before_first_loop: >>> + if (FIRST_NITERS =3D=3D 0) GOTO bb_before_second_loop >>> + GOTO first-loop >>> >>> - first_loop: >>> - do { >>> - } while ... >>> + first_loop: >>> + do { >>> + } while ... >>> >>> - bb_before_second_loop: >>> + bb_before_second_loop: >>> >>> - second_loop: >>> - do { >>> - } while ... >>> + second_loop: >>> + do { >>> + } while ... >>> >>> - orig_exit_bb: >>> - */ >>> + orig_exit_bb: >>> + */ >>> + >>> + >>> + /* 2.b Add the cost model check that allows the prologue >>> + to iterate for the entire unchanged scalar >>> + iterations of the loop in the event that the cost >>> + model indicates that the scalar loop is more >>> + profitable than the vector one. >>> + >>> + Resulting CFG after prologue peeling would be: >>> + >>> + if (scalar_loop_iterations <=3D th) >>> + FIRST_NITERS =3D scalar_loop_iterations >>> + >>> + bb_before_first_loop: >>> + if (FIRST_NITERS =3D=3D 0) GOTO bb_before_second_loop >>> + GOTO first-loop >>> + >>> + first_loop: >>> + do { >>> + } while ... >>> + >>> + bb_before_second_loop: >>> + >>> + second_loop: >>> + do { >>> + } while ... >>> + >>> + orig_exit_bb: >>> + */ >>> + >>> + /* 2.c Add the cost model check that allows the epilogue >>> + to iterate for the entire unchanged scalar >>> + iterations of the loop in the event that the cost >>> + model indicates that the scalar loop is more >>> + profitable than the vector one. >>> + >>> + Resulting CFG after prologue peeling would be: >>> + >>> + bb_before_first_loop: >>> + if ((scalar_loop_iterations <=3D th) >>> + || >>> + FIRST_NITERS =3D=3D 0) GOTO bb_before_second_loop >>> + GOTO first-loop >>> + >>> + first_loop: >>> + do { >>> + } while ... >>> + >>> + bb_before_second_loop: >>> + >>> + second_loop: >>> + do { >>> + } while ... >>> + >>> + orig_exit_bb: >>> + */ >>> >> >>Just so it's clear that this function does only one of the above per >>invocation, maybe write: "2. Add the control/guard code in one of the >>following ways: 2.a. ..." > >Ok. > >>Also, I was wondering if it would be clearer if the description was more >>compact - i.e. instead of duplicating 3 times the pseudo-code that remains >>the same in all 3 alternatives, do something along these lines: >>" >>2. Add the control/guard code. Resulting CFG would be: >> >> bb_before_first_loop: >> if (COND) GOTO bb_before_second_loop >> GOTO first-loop >> >> first_loop: >> do { >> } while ... >> >> bb_before_second_loop: >> >> second_loop: >> do { >> } while ... >> >> orig_exit_bb: >> >>The following 3 variants are supported: >>2a. The guard controls whether the first loop is executed. >> COND: FIRST_NITERS =3D=3D 0 >>2b. Add the cost model check that allows the prologue to iterate.... >> if (scalar_loop_iterations <=3D th) >> FIRST_NITERS =3D scalar_loop_iterations >> COND: FIRST_NITERS =3D=3D 0 >>2c. Add the cost model check that allows the epilogue to iterate... >> COND: (scalar_loop_iterations <=3D th) || FIRST_NITERS =3D=3D 0 >>" >> >>... but in the end I'm not sure which way is clearer, so I'll leave the >>decision to you. >> > >Ok, I will try to make it clearer. But its hard to say which is clearer >because the same function is used to do different things for prologue and >epilogue. > >>A general comment about the changes to slpeel_tree_peel_loop_to_edge: I >>wonder if this function would be taken out of the vectorizer one day and >>merged with the generic peeling utils. In any case, it would be desirable >>if instead of manipulating the condition inside the function, the function >>would get the condition as an input? (even if it ends up remaining a >>vectorizer specific function - I think this will be a good thing to do). >If >>this looks like too much work, then please consider factoring out the new >>code that builds the condition in 3 different ways, or at least just the >>part that creates the if-stmt for the "Peologue peeling case: > >Ok. > >> >>> + /* Epilogue peeling. */ >>> + if (!update_first_loop_count) >>> + { >>... >>> + } >>> + /* Prologue peeling. */ >>> + else >>> + { >>> + if (check) >>> + first_niters =3D conditionally_reset_first_niters (...) >>> + >>... >>> + } >> >> >>> Index: tree-vect-transform.c >>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> --- tree-vect-transform.c (revision 129356) >>> +++ tree-vect-transform.c (working copy) >>... >>> @@ -6482,28 +6483,35 @@ vect_do_peeling_for_loop_bound (loop_vec >>> >>> loop_num =3D loop->num; >>> >>> - /* Analyze cost to set threshhold for vectorized loop. */ >> >>threshhold --> threshold >> >>... > > >Ok. > >>> + /* Analyze cost to set threshhold for vectorized loop. */ >>> + min_profitable_iters =3D LOOP_VINFO_COST_MODEL_MIN_ITERS >>(loop_vinfo); >>> >> >>about the comment - we don't "Analyze cost" here, just use the already >>precalculcated threshold. (it also repeats in other places). >> >>> - th =3D (unsigned) min_scalar_loop_bound; >>> - if (min_profitable_iters >>> - && (!min_scalar_loop_bound >>> - || min_profitable_iters > min_scalar_loop_bound)) >>> - th =3D (unsigned) min_profitable_iters; >>> + min_scalar_loop_bound =3D ((PARAM_VALUE (PARAM_MIN_VECT_LOOP_BOUND) >>> + * LOOP_VINFO_VECT_FACTOR (loop_vinfo)) - 1); >>> >>> - if (((LOOP_PEELING_FOR_ALIGNMENT (loop_vinfo) < 0) >>> - || !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)) >>> - && vect_print_dump_info (REPORT_DETAILS)) >>> - fprintf (vect_dump, "vectorization may not be profitable."); >>> + /* Use the cost model only if it is more conservative than >>> user specified >>> + threshold. */ >>> + th =3D (unsigned) min_scalar_loop_bound; >>> + if (min_profitable_iters >>> + && (!min_scalar_loop_bound >>> + || min_profitable_iters > min_scalar_loop_bound)) >>> + th =3D (unsigned) min_profitable_iters; >>> + >>> + if (th && vect_print_dump_info (REPORT_DETAILS)) >>> + fprintf (vect_dump, "loop bound peeling: vectorization may not be >>> profitable."); >>> + } >> >>The above code repeats almost identically 3 times: here, in >>vect_do_peeling_for_alignment and in vect_loop_versioning. Please it >factor >>out... >> >Ok. > >>> @@ -7031,7 +7078,11 @@ vect_create_cond_for_alias_checks (loop_ >>> data references that may or may not be aligned. An additional >>> sequence of runtime tests is generated for each pairs of DDRs whose >>> independence was not proven. The vectorized version of loop is >>> - executed only if both alias and alignment tests are passed. */ >>> + executed only if both alias and alignment tests are passed. >>> + >>> + The test generated to check which version of loop is executed >>> + is modified to check for profitability as indicated by the >> >>--> "is modified to *also* check for profitability", right? >> > >Yes. > >Thanks, >Harsha > >>thanks, >>dorit >> >> >>> The patch bootstrapped and passed test on amd64-linux. >>> >>> Ok for trunk? >>> >>> > >>> >> Thanks, David >>> >> >>> >> * gcc.dg/vect/costmodel/ppc/ppc-costmodel-vect.exp: Use >>> >> -mcpu=3D970 instead of 7400. >>> >> >>> >> Index: ppc-costmodel-vect.exp >>> >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> >> --- ppc-costmodel-vect.exp (revision 129469) >>> >> +++ ppc-costmodel-vect.exp (working copy) >>> >> @@ -49,7 +49,7 @@ >>> >> } else { >>> >> if [is-effective-target ilp32] { >>> >> # Specify a cpu that supports VMX for compile-only tests. >>> >> - lappend DEFAULT_VECTCFLAGS "-mcpu=3D7400" >>> >> + lappend DEFAULT_VECTCFLAGS "-mcpu=3D970" >>> >> } >>> >> set dg-do-what-default compile >>> >> } >>> > >>> > >>> >>> [attachment "0008-costmodel-early-scalar.diff" deleted by Dorit >>> Nuzman/Haifa/IBM] >> >> ------_=_NextPart_001_01C82FAA.85E842CA Content-Type: application/octet-stream; name=0009-costmodel-early-scalar.diff Content-Transfer-Encoding: base64 Content-Description: 0009-costmodel-early-scalar.diff Content-Disposition: attachment; filename=0009-costmodel-early-scalar.diff Content-length: 40793 CSogdHJlZS12ZWN0b3JpemVyLmMgKHNscGVlbF9hZGRfbG9vcF9ndWFyZCk6 IEdpbXBsaWZ5IHRoZSBjb25kaXRpb24uCgkoc2V0X3Byb2xvZ3VlX2l0ZXJh dGlvbnMpOiBOZXcuIFNldCB0aGUgcHJvbG9ndWUgaXRlcmF0aW9ucyB0byB0 b3RhbAoJIG51bWJlciBvZiBzY2FsYXIgaXRlcmF0aW9ucyBpZiB0aGUgY29z dCBtb2RlbCBjaGVjayBpbmRpY2F0ZXMgdGhhdAoJIHNjYWxhciBjb2RlIHNo b3VsZCBiZSBnZW5lcmF0ZWQuCgkoc2xwZWVsX3RyZWVfcGVlbF9sb29wX3Rv X2VkZ2UpOiBBZGQgYSBuZXcgcGFyYW1ldGVyIGFuZCBjb2RlIGZvciAKCWdl bmVyYXRpbmcgdGhlIGNvc3QgY29uZGl0aW9uIGZvciBlcGlsb2cuIENhbGwK CXNldF9wcm9sb2d1ZV9pdGVyYXRpb25zIHRvIGdlbmVyYXRlIGNvc3QgY29u ZGl0aW9uIGZvciBwcm9sb2cuCgkobmV3X2xvb3BfdmVjX2luZm8pOiBJbml0 aWFsaXplIExPT1BfVklORk9fTklURVJTX1VOQ0hBTkdFRC4KCSogdHJlZS12 ZWN0b3JpemVyLmggKExPT1BfVklORk9fTklURVJTX1VOQ0hBTkdFRCk6IE5l dy4KCShzbHBlZWxfdHJlZV9wZWVsX2xvb3BfdG9fZWRnZSk6IFVwZGF0ZSBk ZWNsYXJhdGlvbi4KCShzZXRfcHJvbG9ndWVfaXRlcmF0aW9ucyk6IE5ldyBk ZWNsYXJhdGlvbi4KCSogdHJlZS12ZWN0LWFuYWx5emUuYyAodmVjdF9hbmFs eXplX2xvb3BfZm9ybSk6IFVwZGF0ZSAKCUxPT1BfVklORk9fTklURVJTX1VO Q0hBTkdFRC4KCSogdHJlZS12ZWN0LXRyYW5zZm9ybS5jCgkodmVjdF9lc3Rp bWF0ZV9taW5fcHJvZml0YWJsZV9pdGVycyk6IEFkZCBuZXcgcGFyYW1ldGVy IGFuZAoJY29kZSB0byAgY2hlY2sgaWYgcnVuIHRpbWUgY29zdCBtb2RlbCB0 ZXN0IGlzIG5lZWRlZC4KCVJlbW92ZSBjb2RlIHRoYXQgYWRkcyBidWlsdGlu IHZlY3Rvcml6YXRpb24gY29zdCB0byBzY2FsYXIKCW91dHNpZGUgY29zdCBm b3IgdGhlIHJ1biB0aW1lIGNvc3QgbW9kZWwgdGVzdC4gSWYgcnVuIHRpbWUK CWNvc3QgbW9kZWwgdGVzdCBpcyBuZWVkZWQgYWRkIHRoZSBhcHByb3ByaWF0 ZSBndWFyZCBjb3N0IHRvCgl0aGUgc2NhbGFyIG91dHNpZGUgY29zdC4gVGhl IGd1YXJkIGNvc3QgZGVwZW5kcyBvbiB3aGV0aGVyCgl0aGUgZ3VhcmQgaXMg Z2VuZXJhdGVkIGF0IHZlcnNpb25pbmcgb3IgYXQgcHJvbG9nIGdlbmVyYXRp b24KCW9yIGF0IGVwaWxvZyBnZW5lcmF0aW9uLiBDaGFuZ2UgY29zdCBtb2Rl bCBlcXVhdGlvbiB0byBpbmNsdWRlCglzY2FsYXIgb3V0c2lkZSBjb3N0LgoJ KGNvbnNlcnZhdGl2ZV9jb3N0X3RocmVzaG9sZCk6IE5ldy4gUmV0dXJuIHRo ZSBsZXNzIGNvbnNlcnZhdGl2ZQoJIHByb2ZpdGFiaWxpdHkgdGhyZXNob2xk IGJldHdlZW4gdGhlIGNvc3QgbW9kZWwgdGhyZXNob2xkIGFuZCB0aGUKCSB1 c2VyIGRlZmluZWQgdmVjdG9yaXphdGlvbiB0aHJlc2hvbGQuCgkodmVjdF9k b19wZWVsaW5nX2Zvcl9sb29wX2JvdW5kKTogQ2FsbCBjb25zZXJ2YXRpdmVf Y29zdF90aHJlc2hvbGQuCgkodmVjdF9kb19wZWVsaW5nX2Zvcl9hbGlnbm1l bnQpOiBTYW1lLgoJKHZlY3RfbG9vcF92ZXJzaW9uaW5nKTogU2FtZS4KCSh2 ZWN0X2NyZWF0ZV9jb25kX2Zvcl9hbGlnbl9jaGVja3MpOiBBTkRzIHRoZSBj b3N0IG1vZGVsIGNvbmRpdGlvbgoJd2l0aCB0aGUgYWxpZ25tZW50IGNvbmRp dGlvbi4KCSh2ZWN0X3RyYW5zZm9ybV9sb29wKTogQ2FsbCBsb29wIHZlcnNp b25pbmcgb25seSB3aGVuIHRoZXJlIGlzIGEKCSBtaXNhbGlnbm1lbnQgb3Ig YW4gYWxpYXNpbmcgcHJvYmxlbS4KCgpJbmRleDogdHJlZS12ZWN0b3JpemVy LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gdHJlZS12ZWN0b3JpemVy LmMJKHJldmlzaW9uIDEyOTM1NikKKysrIHRyZWUtdmVjdG9yaXplci5jCSh3 b3JraW5nIGNvcHkpCkBAIC05MTgsMjAgKzkxOCwyOSBAQCBzbHBlZWxfdHJl ZV9kdXBsaWNhdGVfbG9vcF90b19lZGdlX2NmZyAoCiAKIHN0YXRpYyBlZGdl CiBzbHBlZWxfYWRkX2xvb3BfZ3VhcmQgKGJhc2ljX2Jsb2NrIGd1YXJkX2Ji LCB0cmVlIGNvbmQsIGJhc2ljX2Jsb2NrIGV4aXRfYmIsCi0JCSAgICAgICAg YmFzaWNfYmxvY2sgZG9tX2JiKQorICAgICAgICAgICAgICAgICAgICAgICBi YXNpY19ibG9jayBkb21fYmIpCiB7CiAgIGJsb2NrX3N0bXRfaXRlcmF0b3Ig YnNpOwogICBlZGdlIG5ld19lLCBlbnRlcl9lOwogICB0cmVlIGNvbmRfc3Rt dDsKKyAgdHJlZSBnaW1wbGlmeV9zdG10X2xpc3Q7CiAKICAgZW50ZXJfZSA9 IEVER0VfU1VDQyAoZ3VhcmRfYmIsIDApOwogICBlbnRlcl9lLT5mbGFncyAm PSB+RURHRV9GQUxMVEhSVTsKICAgZW50ZXJfZS0+ZmxhZ3MgfD0gRURHRV9G QUxTRV9WQUxVRTsKICAgYnNpID0gYnNpX2xhc3QgKGd1YXJkX2JiKTsKIAor ICBjb25kID0KKyAgICBmb3JjZV9naW1wbGVfb3BlcmFuZCAoY29uZCwgJmdp bXBsaWZ5X3N0bXRfbGlzdCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgTlVMTF9UUkVFKTsKICAgY29uZF9zdG10ID0gYnVpbGQzIChDT05E X0VYUFIsIHZvaWRfdHlwZV9ub2RlLCBjb25kLAogCQkgICAgICBOVUxMX1RS RUUsIE5VTExfVFJFRSk7CisgIGlmIChnaW1wbGlmeV9zdG10X2xpc3QpCisg ICAgYnNpX2luc2VydF9hZnRlciAoJmJzaSwgZ2ltcGxpZnlfc3RtdF9saXN0 LCBCU0lfTkVXX1NUTVQpOworCisgIGJzaSA9IGJzaV9sYXN0IChndWFyZF9i Yik7CiAgIGJzaV9pbnNlcnRfYWZ0ZXIgKCZic2ksIGNvbmRfc3RtdCwgQlNJ X05FV19TVE1UKTsKKwogICAvKiBBZGQgbmV3IGVkZ2UgdG8gY29ubmVjdCBn dWFyZCBibG9jayB0byB0aGUgbWVyZ2UvbG9vcC1leGl0IGJsb2NrLiAgKi8K ICAgbmV3X2UgPSBtYWtlX2VkZ2UgKGd1YXJkX2JiLCBleGl0X2JiLCBFREdF X1RSVUVfVkFMVUUpOwogICBzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJ X0RPTUlOQVRPUlMsIGV4aXRfYmIsIGRvbV9iYik7CkBAIC0xMDA3LDEyICsx MDE2LDk0IEBAIHNscGVlbF92ZXJpZnlfY2ZnX2FmdGVyX3BlZWxpbmcgKHN0 cnVjdCAKIH0KICNlbmRpZgogCisKKyAgLyogRnVuY3Rpb24gc2V0X3Byb2xv Z3VlX2l0ZXJhdGlvbnMuCisKKyAgICAgSWYgdGhlIHJ1biB0aW1lIGNvc3Qg bW9kZWwgY2hlY2sgZGV0ZXJtaW5lcyB0aGF0IHZlY3Rvcml6YXRpb24KKyAg ICAgaXMgbm90IHByb2ZpdGFibGUgYW5kIGhlbmNlIHNjYWxhciBsb29wIHNo b3VsZCBiZSBnZW5lcmF0ZWQKKyAgICAgdGhlbiBzZXQgRklSU1RfTklURVJT IHRvIHByb2xvZ3VlIHBlZWxlZCBpdGVyYXRpb25zLiBUaGlzIHdpbGwKKyAg ICAgYWxsb3cgYWxsIHRoZSBpdGVyYXRpb25zIHRvIGJlIGV4ZWN1dGVkIGlu IHRoZSBwcm9sb2d1ZSBwZWVsZWQKKyAgICAgc2NhbGFyIGxvb3AqLworCit2 b2lkCitzZXRfcHJvbG9ndWVfaXRlcmF0aW9ucyAoYmFzaWNfYmxvY2sgYmJf YmVmb3JlX2ZpcnN0X2xvb3AsCisJCQkgdHJlZSBmaXJzdF9uaXRlcnMsCisJ CQkgc3RydWN0IGxvb3AgKmxvb3AsCisJCQkgdW5zaWduZWQgaW50IHRoKQor eworCSAgCisJICBlZGdlIGU7CisJICBiYXNpY19ibG9jayBjb25kX2JiLCB0 aGVuX2JiOworCSAgdHJlZSB2YXIsIHByb2xvZ3VlX2FmdGVyX2Nvc3RfYWRq dXN0X25hbWUsIHN0bXQ7CisJICBibG9ja19zdG10X2l0ZXJhdG9yIGJzaTsK KwkgIHRyZWUgbmV3cGhpOworCSAgZWRnZSBlX3RydWUsIGVfZmFsc2UsIGVf ZmFsbHRocnU7CisJICB0cmVlIGNvbmRfc3RtdDsKKwkgIHRyZWUgZ2ltcGxp Znlfc3RtdF9saXN0OworCSAgdHJlZSBjb3N0X3ByZV9jb25kaXRpb24gPSBO VUxMX1RSRUU7CisJICB0cmVlIHNjYWxhcl9sb29wX2l0ZXJzID0gCisJICAg IExPT1BfVklORk9fTklURVJTX1VOQ0hBTkdFRCAobG9vcF92ZWNfaW5mb19m b3JfbG9vcCAobG9vcCkpOworCisJICBlID0gc2luZ2xlX3ByZWRfZWRnZSAo YmJfYmVmb3JlX2ZpcnN0X2xvb3ApOworCSAgY29uZF9iYiA9IHNwbGl0X2Vk Z2UoZSk7CisKKwkgIGUgPSBzaW5nbGVfcHJlZF9lZGdlIChiYl9iZWZvcmVf Zmlyc3RfbG9vcCk7CisJICB0aGVuX2JiID0gc3BsaXRfZWRnZShlKTsKKwkg IHNldF9pbW1lZGlhdGVfZG9taW5hdG9yIChDRElfRE9NSU5BVE9SUywgdGhl bl9iYiwgY29uZF9iYik7CisKKwkgIGVfZmFsc2UgPSBtYWtlX3NpbmdsZV9z dWNjX2VkZ2UgKGNvbmRfYmIsIGJiX2JlZm9yZV9maXJzdF9sb29wLAorCSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURHRV9GQUxTRV9W QUxVRSk7CisJICBzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJX0RPTUlO QVRPUlMsIGJiX2JlZm9yZV9maXJzdF9sb29wLCBjb25kX2JiKTsKKworCSAg ZV90cnVlID0gRURHRV9QUkVEICh0aGVuX2JiLCAwKTsKKwkgIGVfdHJ1ZS0+ ZmxhZ3MgJj0gfkVER0VfRkFMTFRIUlU7CisJICBlX3RydWUtPmZsYWdzIHw9 IEVER0VfVFJVRV9WQUxVRTsKKworCSAgZV9mYWxsdGhydSA9IEVER0VfU1VD QyAodGhlbl9iYiwgMCk7CisKKwkgIGNvc3RfcHJlX2NvbmRpdGlvbiA9CisJ ICAgIGJ1aWxkMiAoTEVfRVhQUiwgYm9vbGVhbl90eXBlX25vZGUsIHNjYWxh cl9sb29wX2l0ZXJzLCAKKwkJICAgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQ RSAoc2NhbGFyX2xvb3BfaXRlcnMpLCB0aCkpOworCSAgY29zdF9wcmVfY29u ZGl0aW9uID0KKwkgICAgZm9yY2VfZ2ltcGxlX29wZXJhbmQgKGNvc3RfcHJl X2NvbmRpdGlvbiwgJmdpbXBsaWZ5X3N0bXRfbGlzdCwKKwkgICAgICAgICAg ICAgICAgICAgICAgICAgIHRydWUsIE5VTExfVFJFRSk7CisgICAgICAgICAg Y29uZF9zdG10ID0gYnVpbGQzIChDT05EX0VYUFIsIHZvaWRfdHlwZV9ub2Rl LCBjb3N0X3ByZV9jb25kaXRpb24sCisJICAgICAgICAgICAgICAgICAgICAg IE5VTExfVFJFRSwgTlVMTF9UUkVFKTsKKworCSAgYnNpID0gYnNpX2xhc3Qg KGNvbmRfYmIpOworICAgICAgICAgIGlmIChnaW1wbGlmeV9zdG10X2xpc3Qp CisgICAgICAgICAgICBic2lfaW5zZXJ0X2FmdGVyICgmYnNpLCBnaW1wbGlm eV9zdG10X2xpc3QsIEJTSV9ORVdfU1RNVCk7CisKKwkgIGJzaSA9IGJzaV9s YXN0IChjb25kX2JiKTsKKwkgIGJzaV9pbnNlcnRfYWZ0ZXIgKCZic2ksIGNv bmRfc3RtdCwgQlNJX05FV19TVE1UKTsKKwkJCQkJICAKKwkgIHZhciA9IGNy ZWF0ZV90bXBfdmFyIChUUkVFX1RZUEUgKHNjYWxhcl9sb29wX2l0ZXJzKSwK KwkJCQkicHJvbG9ndWVfYWZ0ZXJfY29zdF9hZGp1c3QiKTsKKwkgIGFkZF9y ZWZlcmVuY2VkX3ZhciAodmFyKTsKKwkgIHByb2xvZ3VlX2FmdGVyX2Nvc3Rf YWRqdXN0X25hbWUgPSAKKwkgICAgZm9yY2VfZ2ltcGxlX29wZXJhbmQgKHNj YWxhcl9sb29wX2l0ZXJzLCAmc3RtdCwgZmFsc2UsIHZhcik7CisKKwkgIGJz aSA9IGJzaV9sYXN0ICh0aGVuX2JiKTsKKwkgIGlmIChzdG10KQorCSAgICBi c2lfaW5zZXJ0X2FmdGVyICgmYnNpLCBzdG10LCBCU0lfTkVXX1NUTVQpOwor CisJICBuZXdwaGkgPSBjcmVhdGVfcGhpX25vZGUgKHZhciwgYmJfYmVmb3Jl X2ZpcnN0X2xvb3ApOworCSAgYWRkX3BoaV9hcmcgKG5ld3BoaSwgcHJvbG9n dWVfYWZ0ZXJfY29zdF9hZGp1c3RfbmFtZSwgZV9mYWxsdGhydSk7CisJICBh ZGRfcGhpX2FyZyAobmV3cGhpLCBmaXJzdF9uaXRlcnMsIGVfZmFsc2UpOwor CisJICBmaXJzdF9uaXRlcnMgPSBQSElfUkVTVUxUIChuZXdwaGkpOworfQor CisKIC8qIEZ1bmN0aW9uIHNscGVlbF90cmVlX3BlZWxfbG9vcF90b19lZGdl LgogCiAgICBQZWVsIHRoZSBmaXJzdCAobGFzdCkgaXRlcmF0aW9ucyBvZiBM T09QIGludG8gYSBuZXcgcHJvbG9nIChlcGlsb2cpIGxvb3AKICAgIHRoYXQg aXMgcGxhY2VkIG9uIHRoZSBlbnRyeSAoZXhpdCkgZWRnZSBFIG9mIExPT1Au IEFmdGVyIHRoaXMgdHJhbnNmb3JtYXRpb24KICAgIHdlIGhhdmUgdHdvIGxv b3BzIG9uZSBhZnRlciB0aGUgb3RoZXIgLSBmaXJzdC1sb29wIGl0ZXJhdGVz IEZJUlNUX05JVEVSUwogICAgdGltZXMsIGFuZCBzZWNvbmQtbG9vcCBpdGVy YXRlcyB0aGUgcmVtYWluZGVyIE5JVEVSUyAtIEZJUlNUX05JVEVSUyB0aW1l cy4KKyAgIElmIHRoZSBjb3N0IG1vZGVsIGluZGljYXRlcyB0aGF0IGl0IGlz IHByb2ZpdGFibGUgdG8gZW1pdCBhIHNjYWxhciAKKyAgIGxvb3AgaW5zdGVh ZCBvZiB0aGUgdmVjdG9yIG9uZSwgdGhlbiB0aGUgcHJvbG9nIChlcGlsb2cp IGxvb3Agd2lsbCBpdGVyYXRlCisgICBmb3IgdGhlIGVudGlyZSB1bmNoYW5n ZWQgc2NhbGFyIGl0ZXJhdGlvbnMgb2YgdGhlIGxvb3AuCiAKICAgIElucHV0 OgogICAgLSBMT09QOiB0aGUgbG9vcCB0byBiZSBwZWVsZWQuCkBAIC0xMDI3 LDYgKzExMTgsMTMgQEAgc2xwZWVsX3ZlcmlmeV9jZmdfYWZ0ZXJfcGVlbGlu ZyAoc3RydWN0IAogICAgICAgICBmb3IgdXBkYXRpbmcgdGhlIGxvb3AgYm91 bmQgb2YgdGhlIGZpcnN0LWxvb3AgdG8gRklSU1RfTklURVJTLiAgSWYgaXQK ICAgICAgICAgaXMgZmFsc2UsIHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlv biBtYXkgd2FudCB0byB0YWtlIGNhcmUgb2YgdGhpcwogICAgICAgICAodGhp cyBjYW4gYmUgdXNlZnVsIGlmIHdlIGRvbid0IHdhbnQgbmV3IHN0bXRzIGFk ZGVkIHRvIGZpcnN0LWxvb3ApLgorICAgLSBUSDogY29zdCBtb2RlbCBwcm9m aXRhYmlsaXR5IHRocmVzaG9sZCBvZiBpdGVyYXRpb25zIGZvciB2ZWN0b3Jp emF0aW9uLgorICAgLSBDSEVDS19QUk9GSVRBQklMSVRZOiBzcGVjaWZ5IHdo ZXRoZXIgY29zdCBtb2RlbCBjaGVjayBoYXMgbm90IG9jY3VyZWQKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIHZlcnNpb25pbmcgYW5kIGhl bmNlIG5lZWRzIHRvIG9jY3VyIGR1cmluZworCQkJICBwcm9sb2d1ZSBnZW5l cmF0aW9uIG9yIHdoZXRoZXIgY29zdCBtb2RlbCBjaGVjayAKKwkJCSAgaGFz IG5vdCBvY2N1cmVkIGR1cmluZyBwcm9sb2d1ZSBnZW5lcmF0aW9uIGFuZCBo ZW5jZQorCQkJICBuZWVkcyB0byBvY2N1ciBkdXJpbmcgZXBpbG9ndWUgZ2Vu ZXJhdGlvbi4KKwkgICAgCiAKICAgIE91dHB1dDoKICAgIFRoZSBmdW5jdGlv biByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IGxvb3AtY29weSwgb3Ig TlVMTCBpZiBpdCBmYWlsZWQKQEAgLTEwNDgsMTEgKzExNDYsMTEgQEAgc3Ry dWN0IGxvb3AqCiBzbHBlZWxfdHJlZV9wZWVsX2xvb3BfdG9fZWRnZSAoc3Ry dWN0IGxvb3AgKmxvb3AsIAogCQkJICAgICAgIGVkZ2UgZSwgdHJlZSBmaXJz dF9uaXRlcnMsIAogCQkJICAgICAgIHRyZWUgbml0ZXJzLCBib29sIHVwZGF0 ZV9maXJzdF9sb29wX2NvdW50LAotCQkJICAgICAgIHVuc2lnbmVkIGludCB0 aCkKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGgsIGJvb2wgY2hlY2tfcHJv Zml0YWJpbGl0eSkKIHsKICAgc3RydWN0IGxvb3AgKm5ld19sb29wID0gTlVM TCwgKmZpcnN0X2xvb3AsICpzZWNvbmRfbG9vcDsKICAgZWRnZSBza2lwX2U7 Ci0gIHRyZWUgcHJlX2NvbmRpdGlvbjsKKyAgdHJlZSBwcmVfY29uZGl0aW9u ID0gTlVMTF9UUkVFOwogICBiaXRtYXAgZGVmaW5pdGlvbnM7CiAgIGJhc2lj X2Jsb2NrIGJiX2JlZm9yZV9zZWNvbmRfbG9vcCwgYmJfYWZ0ZXJfc2Vjb25k X2xvb3A7CiAgIGJhc2ljX2Jsb2NrIGJiX2JlZm9yZV9maXJzdF9sb29wOwpA QCAtMTA2MCw2ICsxMTU4LDkgQEAgc2xwZWVsX3RyZWVfcGVlbF9sb29wX3Rv X2VkZ2UgKHN0cnVjdCBsbwogICBiYXNpY19ibG9jayBuZXdfZXhpdF9iYjsK ICAgZWRnZSBleGl0X2UgPSBzaW5nbGVfZXhpdCAobG9vcCk7CiAgIExPQyBs b29wX2xvYzsKKyAgdHJlZSBjb3N0X3ByZV9jb25kaXRpb24gPSBOVUxMX1RS RUU7CisgIHRyZWUgc2NhbGFyX2xvb3BfaXRlcnMgPSAKKyAgICBMT09QX1ZJ TkZPX05JVEVSU19VTkNIQU5HRUQgKGxvb3BfdmVjX2luZm9fZm9yX2xvb3Ag KGxvb3ApKTsKICAgCiAgIGlmICghc2xwZWVsX2Nhbl9kdXBsaWNhdGVfbG9v cF9wIChsb29wLCBlKSkKICAgICByZXR1cm4gTlVMTDsKQEAgLTExMTYsMzIg KzEyMTcsMTIwIEBAIHNscGVlbF90cmVlX3BlZWxfbG9vcF90b19lZGdlIChz dHJ1Y3QgbG8KICAgcmVuYW1lX3ZhcmlhYmxlc19pbl9sb29wIChuZXdfbG9v cCk7CiAKIAotICAvKiAyLiBBZGQgdGhlIGd1YXJkIHRoYXQgY29udHJvbHMg d2hldGhlciB0aGUgZmlyc3QgbG9vcCBpcyBleGVjdXRlZC4KLSAgICAgICAg UmVzdWx0aW5nIENGRyB3b3VsZCBiZToKKyAgLyogMi4gIEFkZCB0aGUgZ3Vh cmQgY29kZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgogCi0gICAg ICAgIGJiX2JlZm9yZV9maXJzdF9sb29wOgotICAgICAgICBpZiAoRklSU1Rf TklURVJTID09IDApIEdPVE8gYmJfYmVmb3JlX3NlY29uZF9sb29wCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgR09UTyBmaXJzdC1sb29wCisg ICAgIDIuYSBBZGQgdGhlIGd1YXJkIHRoYXQgY29udHJvbHMgd2hldGhlciB0 aGUgZmlyc3QgbG9vcCBpcyBleGVjdXRlZC4KKyAgICAgICAgIFRoaXMgb2Nj dXJzIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZvciBwcm9sb2d1 ZSBvciBlcGlsb2dpdWUKKwkgZ2VuZXJhdGlvbiBhbmQgd2hlbiB0aGUgY29z dCBtb2RlbCBjaGVjayBjYW4gYmUgZG9uZSBhdCBjb21waWxlIHRpbWUuCiAK LSAgICAgICAgZmlyc3RfbG9vcDoKLSAgICAgICAgZG8gewotICAgICAgICB9 IHdoaWxlIC4uLgorICAgICAgICAgUmVzdWx0aW5nIENGRyB3b3VsZCBiZToK IAotICAgICAgICBiYl9iZWZvcmVfc2Vjb25kX2xvb3A6CisgICAgICAgICBi Yl9iZWZvcmVfZmlyc3RfbG9vcDoKKyAgICAgICAgIGlmIChGSVJTVF9OSVRF UlMgPT0gMCkgR09UTyBiYl9iZWZvcmVfc2Vjb25kX2xvb3AKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgR09UTyBmaXJzdC1sb29wCiAKLSAg ICAgICAgc2Vjb25kX2xvb3A6Ci0gICAgICAgIGRvIHsKLSAgICAgICAgfSB3 aGlsZSAuLi4KKyAgICAgICAgIGZpcnN0X2xvb3A6CisgICAgICAgICBkbyB7 CisgICAgICAgICB9IHdoaWxlIC4uLgogCi0gICAgICAgIG9yaWdfZXhpdF9i YjoKLSAgICovCisgICAgICAgICBiYl9iZWZvcmVfc2Vjb25kX2xvb3A6CisK KyAgICAgICAgIHNlY29uZF9sb29wOgorICAgICAgICAgZG8geworICAgICAg ICAgfSB3aGlsZSAuLi4KKworICAgICAgICAgb3JpZ19leGl0X2JiOgorCisg ICAgIDIuYiBBZGQgdGhlIGNvc3QgbW9kZWwgY2hlY2sgdGhhdCBhbGxvd3Mg dGhlIHByb2xvZ3VlCisgICAgICAgICB0byBpdGVyYXRlIGZvciB0aGUgZW50 aXJlIHVuY2hhbmdlZCBzY2FsYXIKKyAgICAgICAgIGl0ZXJhdGlvbnMgb2Yg dGhlIGxvb3AgaW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvc3QKKyAgICAgICAg IG1vZGVsIGluZGljYXRlcyB0aGF0IHRoZSBzY2FsYXIgbG9vcCBpcyBtb3Jl CisgICAgICAgICBwcm9maXRhYmxlIHRoYW4gdGhlIHZlY3RvciBvbmUuIFRo aXMgb2NjdXJzIHdoZW4KKwkgdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZv ciBwcm9sb2d1ZSBnZW5lcmF0aW9uCisJIGFuZCB0aGUgY29zdCBtb2RlbCBj aGVjayBuZWVkcyB0byBiZSBkb25lIGF0IHJ1bgorCSB0aW1lLgorCisgICAg ICAgICBSZXN1bHRpbmcgQ0ZHIGFmdGVyIHByb2xvZ3VlIHBlZWxpbmcgd291 bGQgYmU6CisKKyAgICAgICAgIGlmIChzY2FsYXJfbG9vcF9pdGVyYXRpb25z IDw9IHRoKQorICAgICAgICAgICBGSVJTVF9OSVRFUlMgPSBzY2FsYXJfbG9v cF9pdGVyYXRpb25zCisKKyAgICAgICAgIGJiX2JlZm9yZV9maXJzdF9sb29w OgorICAgICAgICAgaWYgKEZJUlNUX05JVEVSUyA9PSAwKSBHT1RPIGJiX2Jl Zm9yZV9zZWNvbmRfbG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBHT1RPIGZpcnN0LWxvb3AKKworICAgICAgICAgZmlyc3RfbG9vcDoK KyAgICAgICAgIGRvIHsKKyAgICAgICAgIH0gd2hpbGUgLi4uCisKKyAgICAg ICAgIGJiX2JlZm9yZV9zZWNvbmRfbG9vcDoKKworICAgICAgICAgc2Vjb25k X2xvb3A6CisgICAgICAgICBkbyB7CisgICAgICAgICB9IHdoaWxlIC4uLgor CisgICAgICAgICBvcmlnX2V4aXRfYmI6CisKKyAgICAgMi5jIEFkZCB0aGUg Y29zdCBtb2RlbCBjaGVjayB0aGF0IGFsbG93cyB0aGUgZXBpbG9ndWUKKyAg ICAgICAgIHRvIGl0ZXJhdGUgZm9yIHRoZSBlbnRpcmUgdW5jaGFuZ2VkIHNj YWxhcgorICAgICAgICAgaXRlcmF0aW9ucyBvZiB0aGUgbG9vcCBpbiB0aGUg ZXZlbnQgdGhhdCB0aGUgY29zdAorICAgICAgICAgbW9kZWwgaW5kaWNhdGVz IHRoYXQgdGhlIHNjYWxhciBsb29wIGlzIG1vcmUKKyAgICAgICAgIHByb2Zp dGFibGUgdGhhbiB0aGUgdmVjdG9yIG9uZS4gVGhpcyBvY2N1cnMgd2hlbgor CSB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZm9yIGVwaWxvZ3VlIGdlbmVy YXRpb24KKwkgYW5kIHRoZSBjb3N0IG1vZGVsIGNoZWNrIG5lZWRzIHRvIGJl IGRvbmUgYXQgcnVuCisJIHRpbWUuCisKKyAgICAgICAgIFJlc3VsdGluZyBD RkcgYWZ0ZXIgcHJvbG9ndWUgcGVlbGluZyB3b3VsZCBiZToKKworICAgICAg ICAgYmJfYmVmb3JlX2ZpcnN0X2xvb3A6CisgICAgICAgICBpZiAoKHNjYWxh cl9sb29wX2l0ZXJhdGlvbnMgPD0gdGgpCisgICAgICAgICAgICAgfHwKKyAg ICAgICAgICAgICBGSVJTVF9OSVRFUlMgPT0gMCkgR09UTyBiYl9iZWZvcmVf c2Vjb25kX2xvb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg R09UTyBmaXJzdC1sb29wCisKKyAgICAgICAgIGZpcnN0X2xvb3A6CisgICAg ICAgICBkbyB7CisgICAgICAgICB9IHdoaWxlIC4uLgorCisgICAgICAgICBi Yl9iZWZvcmVfc2Vjb25kX2xvb3A6CisKKyAgICAgICAgIHNlY29uZF9sb29w OgorICAgICAgICAgZG8geworICAgICAgICAgfSB3aGlsZSAuLi4KKworICAg ICAgICAgb3JpZ19leGl0X2JiOgorICAqLwogCiAgIGJiX2JlZm9yZV9maXJz dF9sb29wID0gc3BsaXRfZWRnZSAobG9vcF9wcmVoZWFkZXJfZWRnZSAoZmly c3RfbG9vcCkpOwogICBiYl9iZWZvcmVfc2Vjb25kX2xvb3AgPSBzcGxpdF9l ZGdlIChzaW5nbGVfZXhpdCAoZmlyc3RfbG9vcCkpOwogCi0gIHByZV9jb25k aXRpb24gPQotICAgIGZvbGRfYnVpbGQyIChMRV9FWFBSLCBib29sZWFuX3R5 cGVfbm9kZSwgZmlyc3Rfbml0ZXJzLCAKLQlidWlsZF9pbnRfY3N0IChUUkVF X1RZUEUgKGZpcnN0X25pdGVycyksIHRoKSk7CisgIC8qIEVwaWxvZ3VlIHBl ZWxpbmcuICAqLworICBpZiAoIXVwZGF0ZV9maXJzdF9sb29wX2NvdW50KQor ICAgIHsKKyAgICAgIHByZV9jb25kaXRpb24gPQorCWZvbGRfYnVpbGQyIChM RV9FWFBSLCBib29sZWFuX3R5cGVfbm9kZSwgZmlyc3Rfbml0ZXJzLCAKKwkJ ICAgICBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKGZpcnN0X25pdGVycyks IDApKTsKKyAgICAgIGlmIChjaGVja19wcm9maXRhYmlsaXR5KQorCXsKKwkg ICAgY29zdF9wcmVfY29uZGl0aW9uID0gCisJICAgIGJ1aWxkMiAoTEVfRVhQ UiwgYm9vbGVhbl90eXBlX25vZGUsIHNjYWxhcl9sb29wX2l0ZXJzLCAKKwkJ ICAgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAoc2NhbGFyX2xvb3BfaXRl cnMpLCB0aCkpOworICAKKwkgIHByZV9jb25kaXRpb24gPSBmb2xkX2J1aWxk MiAoVFJVVEhfT1JfRVhQUiwgYm9vbGVhbl90eXBlX25vZGUsCisJCQkJICAg ICAgIGNvc3RfcHJlX2NvbmRpdGlvbiwgcHJlX2NvbmRpdGlvbik7CisJfQor ICAgIH0KKyAgLyogUHJvbG9ndWUgcGVlbGluZy4gICovICAKKyAgZWxzZQor ICAgIHsKKyAgICAgIGlmIChjaGVja19wcm9maXRhYmlsaXR5KQorCXNldF9w cm9sb2d1ZV9pdGVyYXRpb25zIChiYl9iZWZvcmVfZmlyc3RfbG9vcCwgZmly c3Rfbml0ZXJzLAorCQkJCSBsb29wLCB0aCk7CisKKyAgICAgIHByZV9jb25k aXRpb24gPQorCWZvbGRfYnVpbGQyIChMRV9FWFBSLCBib29sZWFuX3R5cGVf bm9kZSwgZmlyc3Rfbml0ZXJzLCAKKwkJICAgICBidWlsZF9pbnRfY3N0IChU UkVFX1RZUEUgKGZpcnN0X25pdGVycyksIDApKTsKKyAgICB9CiAKICAgc2tp cF9lID0gc2xwZWVsX2FkZF9sb29wX2d1YXJkIChiYl9iZWZvcmVfZmlyc3Rf bG9vcCwgcHJlX2NvbmRpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBiYl9iZWZvcmVfc2Vjb25kX2xvb3AsIGJiX2JlZm9yZV9m aXJzdF9sb29wKTsKQEAgLTE0NjgsNiArMTY1Nyw3IEBAIG5ld19sb29wX3Zl Y19pbmZvIChzdHJ1Y3QgbG9vcCAqbG9vcCkKIAogICBMT09QX1ZJTkZPX0JC UyAocmVzKSA9IGJiczsKICAgTE9PUF9WSU5GT19OSVRFUlMgKHJlcykgPSBO VUxMOworICBMT09QX1ZJTkZPX05JVEVSU19VTkNIQU5HRUQgKHJlcykgPSBO VUxMOwogICBMT09QX1ZJTkZPX0NPU1RfTU9ERUxfTUlOX0lURVJTIChyZXMp ID0gMDsKICAgTE9PUF9WSU5GT19WRUNUT1JJWkFCTEVfUCAocmVzKSA9IDA7 CiAgIExPT1BfUEVFTElOR19GT1JfQUxJR05NRU5UIChyZXMpID0gMDsKSW5k ZXg6IHRyZWUtdmVjdG9yaXplci5oCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K LS0tIHRyZWUtdmVjdG9yaXplci5oCShyZXZpc2lvbiAxMjkzNTYpCisrKyB0 cmVlLXZlY3Rvcml6ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjI4LDYgKzIy OCw5IEBAIHR5cGVkZWYgc3RydWN0IF9sb29wX3ZlY19pbmZvIHsKICNkZWZp bmUgTE9PUF9WSU5GT19MT09QKEwpICAgICAgICAgICAgKEwpLT5sb29wCiAj ZGVmaW5lIExPT1BfVklORk9fQkJTKEwpICAgICAgICAgICAgIChMKS0+YmJz CiAjZGVmaW5lIExPT1BfVklORk9fTklURVJTKEwpICAgICAgICAgIChMKS0+ bnVtX2l0ZXJzCisvKiBTaW5jZSBMT09QX1ZJTkZPX05JVEVSUyBjYW4gY2hh bmdlIGFmdGVyIHByb2xvZ3VlIHBlZWxpbmcKKyAgIHJldGFpbiB0b3RhbCB1 bmNoYW5nZWQgc2NhbGFyIGxvb3AgaXRlcmF0aW9ucyBmb3IgY29zdCBtb2Rl bC4gICovCisjZGVmaW5lIExPT1BfVklORk9fTklURVJTX1VOQ0hBTkdFRChM KSAgICAgICAgICAoTCktPm51bV9pdGVycwogI2RlZmluZSBMT09QX1ZJTkZP X0NPU1RfTU9ERUxfTUlOX0lURVJTKEwpCShMKS0+bWluX3Byb2ZpdGFibGVf aXRlcnMKICNkZWZpbmUgTE9PUF9WSU5GT19WRUNUT1JJWkFCTEVfUChMKSAg KEwpLT52ZWN0b3JpemFibGUKICNkZWZpbmUgTE9PUF9WSU5GT19WRUNUX0ZB Q1RPUihMKSAgICAgKEwpLT52ZWN0b3JpemF0aW9uX2ZhY3RvcgpAQCAtNjMw LDcgKzYzMyw5IEBAIGV4dGVybiBiaXRtYXAgdmVjdF9tZW1zeW1zX3RvX3Jl bmFtZTsKICAgIGRpdmlkZSBieSB0aGUgdmVjdG9yaXphdGlvbiBmYWN0b3Is IGFuZCB0byBwZWVsIHRoZSBmaXJzdCBmZXcgaXRlcmF0aW9ucwogICAgdG8g Zm9yY2UgdGhlIGFsaWdubWVudCBvZiBkYXRhIHJlZmVyZW5jZXMgaW4gdGhl IGxvb3AuICAqLwogZXh0ZXJuIHN0cnVjdCBsb29wICpzbHBlZWxfdHJlZV9w ZWVsX2xvb3BfdG9fZWRnZSAKLSAgKHN0cnVjdCBsb29wICosIGVkZ2UsIHRy ZWUsIHRyZWUsIGJvb2wsIHVuc2lnbmVkIGludCk7CisgIChzdHJ1Y3QgbG9v cCAqLCBlZGdlLCB0cmVlLCB0cmVlLCBib29sLCB1bnNpZ25lZCBpbnQsIGJv b2wpOworZXh0ZXJuIHZvaWQgc2V0X3Byb2xvZ3VlX2l0ZXJhdGlvbnMgKGJh c2ljX2Jsb2NrLCB0cmVlLAorCQkJCSAgICAgc3RydWN0IGxvb3AgKiwgdW5z aWduZWQgaW50KTsKIGV4dGVybiB2b2lkIHNscGVlbF9tYWtlX2xvb3BfaXRl cmF0ZV9udGltZXMgKHN0cnVjdCBsb29wICosIHRyZWUpOwogZXh0ZXJuIGJv b2wgc2xwZWVsX2Nhbl9kdXBsaWNhdGVfbG9vcF9wIChjb25zdCBzdHJ1Y3Qg bG9vcCAqLCBjb25zdF9lZGdlKTsKICNpZmRlZiBFTkFCTEVfQ0hFQ0tJTkcK SW5kZXg6IHRyZWUtdmVjdC1hbmFseXplLmMKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gdHJlZS12ZWN0LWFuYWx5emUuYwkocmV2aXNpb24gMTI5MzU2 KQorKysgdHJlZS12ZWN0LWFuYWx5emUuYwkod29ya2luZyBjb3B5KQpAQCAt NTg3LDYgKzU4Nyw3IEBAIHZlY3RfYW5hbHl6ZV9vcGVyYXRpb25zIChsb29w X3ZlY19pbmZvIGwKIAogICBtaW5fcHJvZml0YWJsZV9pdGVycyA9IHZlY3Rf ZXN0aW1hdGVfbWluX3Byb2ZpdGFibGVfaXRlcnMgKGxvb3BfdmluZm8pOwog ICBMT09QX1ZJTkZPX0NPU1RfTU9ERUxfTUlOX0lURVJTIChsb29wX3ZpbmZv KSA9IG1pbl9wcm9maXRhYmxlX2l0ZXJzOworCiAgIGlmIChtaW5fcHJvZml0 YWJsZV9pdGVycyA8IDApCiAgICAgewogICAgICAgaWYgKHZlY3RfcHJpbnRf ZHVtcF9pbmZvIChSRVBPUlRfVU5WRUNUT1JJWkVEX0xPT1BTKSkKQEAgLTQx NzUsNiArNDE3Niw3IEBAIHZlY3RfYW5hbHl6ZV9sb29wX2Zvcm0gKHN0cnVj dCBsb29wICpsb28KIAogICBsb29wX3ZpbmZvID0gbmV3X2xvb3BfdmVjX2lu Zm8gKGxvb3ApOwogICBMT09QX1ZJTkZPX05JVEVSUyAobG9vcF92aW5mbykg PSBudW1iZXJfb2ZfaXRlcmF0aW9uczsKKyAgTE9PUF9WSU5GT19OSVRFUlNf VU5DSEFOR0VEIChsb29wX3ZpbmZvKSA9IG51bWJlcl9vZl9pdGVyYXRpb25z OwogCiAgIFNUTVRfVklORk9fVFlQRSAodmluZm9fZm9yX3N0bXQgKGxvb3Bf Y29uZCkpID0gbG9vcF9leGl0X2N0cmxfdmVjX2luZm9fdHlwZTsKIApJbmRl eDogdHJlZS12ZWN0LXRyYW5zZm9ybS5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0tIHRyZWUtdmVjdC10cmFuc2Zvcm0uYwkocmV2aXNpb24gMTI5MzU2 KQorKysgdHJlZS12ZWN0LXRyYW5zZm9ybS5jCSh3b3JraW5nIGNvcHkpCkBA IC0xLDQgKzEsNCBAQAotLyogVHJhbnNmb3JtYXRpb24gVXRpbGl0aWVzIGZv ciBMb29wIFZlY3Rvcml6YXRpb24uCisvKgogICAgQ29weXJpZ2h0IChDKSAy MDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwgSW5jLgogICAgQ29udHJpYnV0ZWQgYnkgRG9yaXQgTmFpc2hs b3MgPGRvcml0QGlsLmlibS5jb20+CiAKQEAgLTExOSwxMSArMTE5LDEzIEBA IHZlY3RfZXN0aW1hdGVfbWluX3Byb2ZpdGFibGVfaXRlcnMgKGxvb3AKICAg aW50IHZlY19pbnNpZGVfY29zdCA9IDA7CiAgIGludCB2ZWNfb3V0c2lkZV9j b3N0ID0gMDsKICAgaW50IHNjYWxhcl9zaW5nbGVfaXRlcl9jb3N0ID0gMDsK KyAgaW50IHNjYWxhcl9vdXRzaWRlX2Nvc3QgPSAwOworICBib29sIHJ1bnRp bWVfdGVzdCA9IGZhbHNlOwogICBpbnQgdmYgPSBMT09QX1ZJTkZPX1ZFQ1Rf RkFDVE9SIChsb29wX3ZpbmZvKTsKICAgc3RydWN0IGxvb3AgKmxvb3AgPSBM T09QX1ZJTkZPX0xPT1AgKGxvb3BfdmluZm8pOwogICBiYXNpY19ibG9jayAq YmJzID0gTE9PUF9WSU5GT19CQlMgKGxvb3BfdmluZm8pOwogICBpbnQgbmJi cyA9IGxvb3AtPm51bV9ub2RlczsKLSAgaW50IGJ5dGVfbWlzYWxpZ247Cisg IGludCBieXRlX21pc2FsaWduID0gTE9PUF9QRUVMSU5HX0ZPUl9BTElHTk1F TlQgKGxvb3BfdmluZm8pOwogICBpbnQgcGVlbF9ndWFyZF9jb3N0cyA9IDA7 CiAgIGludCBpbm5lcmxvb3BfaXRlcnMgPSAwLCBmYWN0b3I7CiAgIFZFQyAo c2xwX2luc3RhbmNlLCBoZWFwKSAqc2xwX2luc3RhbmNlczsKQEAgLTEzNyw2 ICsxMzksMTMgQEAgdmVjdF9lc3RpbWF0ZV9taW5fcHJvZml0YWJsZV9pdGVy cyAobG9vcAogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgIC8qIElmIHRo ZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyB1bmtub3duLCBvciB0aGUKKyAg ICAgcGVlbGluZy1mb3ItbWlzYWxpZ25tZW50IGFtb3VudCBpcyB1bmtub3du LCB3ZSBlaWxsIGhhdmUgdG8gZ2VuZXJhdGUKKyAgICAgYSBydW50aW1lIHRl c3QgdG8gdGVzdCB0aGUgbG9vcCBjb3VudCBhZ2FpbnN0IHRoZSB0aHJlc2hv bGQuICAgICovCisgIGlmICghTE9PUF9WSU5GT19OSVRFUlNfS05PV05fUCAo bG9vcF92aW5mbykKKyAgICAgIHx8IChieXRlX21pc2FsaWduIDwgMCkpCisg ICAgcnVudGltZV90ZXN0ID0gdHJ1ZTsKKwogICAvKiBSZXF1aXJlcyBsb29w IHZlcnNpb25pbmcgdGVzdHMgdG8gaGFuZGxlIG1pc2FsaWdubWVudC4gICov CiAKICAgaWYgKFZFQ19sZW5ndGggKHRyZWUsIExPT1BfVklORk9fTUFZX01J U0FMSUdOX1NUTVRTIChsb29wX3ZpbmZvKSkpCkBAIC0yMTEsOCArMjIwLDYg QEAgdmVjdF9lc3RpbWF0ZV9taW5fcHJvZml0YWJsZV9pdGVycyAobG9vcAog ICAgICBUT0RPOiBCdWlsZCBhbiBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50 cyBwZWVsX2l0ZXJzIGZvciBwcm9sb2d1ZSBhbmQKICAgICAgZXBpbG9ndWUg dG8gYmUgdXNlZCBpbiBhIHJ1bi10aW1lIHRlc3QuICAqLwogCi0gIGJ5dGVf bWlzYWxpZ24gPSBMT09QX1BFRUxJTkdfRk9SX0FMSUdOTUVOVCAobG9vcF92 aW5mbyk7Ci0KICAgaWYgKGJ5dGVfbWlzYWxpZ24gPCAwKQogICAgIHsKICAg ICAgIHBlZWxfaXRlcnNfcHJvbG9ndWUgPSB2Zi8yOwpAQCAtMjc2LDI0ICsy ODMsMjIgQEAgdmVjdF9lc3RpbWF0ZV9taW5fcHJvZml0YWJsZV9pdGVycyAo bG9vcAogICAgICAgICAgICAgICAgICAgICAgICsgKHBlZWxfaXRlcnNfZXBp bG9ndWUgKiBzY2FsYXJfc2luZ2xlX2l0ZXJfY29zdCkKICAgICAgICAgICAg ICAgICAgICAgICArIHBlZWxfZ3VhcmRfY29zdHM7CiAKLSAgLyogQWxsb3cg dGFyZ2V0cyBhZGQgYWRkaXRpb25hbCAob3V0c2lkZS1vZi1sb29wKSBjb3N0 cy4gRk9STk9XLCB0aGUgb25seQotICAgICBpbmZvcm1hdGlvbiB3ZSBwcm92 aWRlIGZvciB0aGUgdGFyZ2V0IGlzIHdoZXRoZXIgdGVzdGluZyBhZ2FpbnN0 IHRoZQotICAgICB0aHJlc2hvbGQgaW52b2x2ZXMgYSBydW50aW1lIHRlc3Qu ICAqLwotICBpZiAodGFyZ2V0bS52ZWN0b3JpemUuYnVpbHRpbl92ZWN0b3Jp emF0aW9uX2Nvc3QpCi0gICAgewotICAgICAgYm9vbCBydW50aW1lX3Rlc3Qg PSBmYWxzZTsKLQotICAgICAgLyogSWYgdGhlIG51bWJlciBvZiBpdGVyYXRp b25zIGlzIHVua25vd24sIG9yIHRoZQotCSBwZWVsaW5nLWZvci1taXNhbGln bm1lbnQgYW1vdW50IGlzIHVua25vd24sIHdlIGVpbGwgaGF2ZSB0byBnZW5l cmF0ZQotCSBhIHJ1bnRpbWUgdGVzdCB0byB0ZXN0IHRoZSBsb29wIGNvdW50 IGFnYWluc3QgdGhlIHRocmVzaG9sZC4gICovCi0gICAgICBpZiAoIUxPT1Bf VklORk9fTklURVJTX0tOT1dOX1AgKGxvb3BfdmluZm8pCi0JICB8fCAoYnl0 ZV9taXNhbGlnbiA8IDApKQotCXJ1bnRpbWVfdGVzdCA9IHRydWU7Ci0gICAg ICB2ZWNfb3V0c2lkZV9jb3N0ICs9Ci0JdGFyZ2V0bS52ZWN0b3JpemUuYnVp bHRpbl92ZWN0b3JpemF0aW9uX2Nvc3QgKHJ1bnRpbWVfdGVzdCk7Ci0gICAg ICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkK LQlmcHJpbnRmICh2ZWN0X2R1bXAsICJjb3N0IG1vZGVsIDogQWRkaW5nIHRh cmdldCBvdXQtb2YtbG9vcCBjb3N0ID0gJWQiLAotCQkgIHRhcmdldG0udmVj dG9yaXplLmJ1aWx0aW5fdmVjdG9yaXphdGlvbl9jb3N0IChydW50aW1lX3Rl c3QpKTsKKyAgaWYgKHJ1bnRpbWVfdGVzdCkKKyAgICB7CisgICAgICAvKiBD b3N0IG1vZGVsIGNoZWNrIG9jY3VycyBhdCB2ZXJzaW9uaW5nLiAgKi8KKyAg ICAgIGlmIChWRUNfbGVuZ3RoICh0cmVlLCBMT09QX1ZJTkZPX01BWV9NSVNB TElHTl9TVE1UUyAobG9vcF92aW5mbykpCisJICB8fCBWRUNfbGVuZ3RoIChk ZHJfcCwgTE9PUF9WSU5GT19NQVlfQUxJQVNfRERSUyAobG9vcF92aW5mbykp KQorCXNjYWxhcl9vdXRzaWRlX2Nvc3QgKz0gVEFSR19DT05EX05PVF9UQUtF Tl9CUkFOQ0hfQ09TVDsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBDb3N0IG1v ZGVsIG9jY3VycyBhdCBwcm9sb2d1ZSBnZW5lcmF0aW9uLiAgKi8KKwkgIGlm IChMT09QX1ZJTkZPX05JVEVSU19LTk9XTl9QIChsb29wX3ZpbmZvKSkKKwkg ICAgc2NhbGFyX291dHNpZGVfY29zdCArPSAyICogVEFSR19DT05EX05PVF9U QUtFTl9CUkFOQ0hfQ09TVAorCSAgICAgICsgVEFSR19DT05EX05PVF9UQUtF Tl9CUkFOQ0hfQ09TVDsKKwkgIC8qIENvc3QgbW9kZWwgY2hlY2sgb2NjdXJz IGF0IGVwaWxvZ3VlIGdlbmVyYXRpb24uICAqLworCSAgZWxzZQorCSAgICBz Y2FsYXJfb3V0c2lkZV9jb3N0ICs9IDIgKiBUQVJHX0NPTkRfTk9UX1RBS0VO X0JSQU5DSF9DT1NUOworCX0KICAgICB9CiAKICAgLyogQWRkIFNMUCBjb3N0 cy4gICovCkBAIC0zMDYsOSArMzExLDEzIEBAIHZlY3RfZXN0aW1hdGVfbWlu X3Byb2ZpdGFibGVfaXRlcnMgKGxvb3AKIAogICAvKiBDYWxjdWxhdGUgbnVt YmVyIG9mIGl0ZXJhdGlvbnMgcmVxdWlyZWQgdG8gbWFrZSB0aGUgdmVjdG9y IHZlcnNpb24gCiAgICAgIHByb2ZpdGFibGUsIHJlbGF0aXZlIHRvIHRoZSBs b29wIGJvZGllcyBvbmx5LiBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbgotICAg ICBtdXN0IGhvbGQgdHJ1ZTogKChTSUMqVkYpLVZJQykqbml0ZXJzID4gVk9D KlZGLCB3aGVyZQorICAgICBtdXN0IGhvbGQgdHJ1ZTogCisgICAgIFNJQyAq IG5pdGVycyArIFNPQyA+IFZJQyAqICgobml0ZXJzLVBMX0lURVJTLUVQX0lU RVJTKS9WRikgKyBWT0MKKyAgICAgd2hlcmUKICAgICAgU0lDID0gc2NhbGFy IGl0ZXJhdGlvbiBjb3N0LCBWSUMgPSB2ZWN0b3IgaXRlcmF0aW9uIGNvc3Qs Ci0gICAgIFZPQyA9IHZlY3RvciBvdXRzaWRlIGNvc3QgYW5kIFZGID0gdmVj dG9yaXphdGlvbiBmYWN0b3IuICAqLworICAgICBWT0MgPSB2ZWN0b3Igb3V0 c2lkZSBjb3N0LCBWRiA9IHZlY3Rvcml6YXRpb24gZmFjdG9yLAorICAgICBQ TF9JVEVSUyA9IHByb2xvZ3VlIGl0ZXJhdGlvbnMsIEVQX0lURVJTPSBlcGls b2d1ZSBpdGVyYXRpb25zCisgICAgIFNPQyA9IHNjYWxhciBvdXRzaWRlIGNv c3QgZm9yIHJ1biB0aW1lIGNvc3QgY29zdCBtb2RlbCBjaGVjay4gICovCiAK ICAgaWYgKChzY2FsYXJfc2luZ2xlX2l0ZXJfY29zdCAqIHZmKSA+IHZlY19p bnNpZGVfY29zdCkKICAgICB7CkBAIC0zMTYsMTUgKzMyNSwxNSBAQCB2ZWN0 X2VzdGltYXRlX21pbl9wcm9maXRhYmxlX2l0ZXJzIChsb29wCiAgICAgICAg IG1pbl9wcm9maXRhYmxlX2l0ZXJzID0gMTsKICAgICAgIGVsc2UKICAgICAg ICAgewotICAgICAgICAgIG1pbl9wcm9maXRhYmxlX2l0ZXJzID0gKHZlY19v dXRzaWRlX2Nvc3QgKiB2ZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAtIHZlY19pbnNpZGVfY29zdCAqIHBlZWxfaXRlcnNfcHJvbG9n dWUKKyAgICAgICAgICBtaW5fcHJvZml0YWJsZV9pdGVycyA9ICgodmVjX291 dHNpZGVfY29zdCAtIHNjYWxhcl9vdXRzaWRlX2Nvc3QpICogdmYKKwkJCQkg IC0gdmVjX2luc2lkZV9jb3N0ICogcGVlbF9pdGVyc19wcm9sb2d1ZQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdmVjX2luc2lkZV9j b3N0ICogcGVlbF9pdGVyc19lcGlsb2d1ZSkKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC8gKChzY2FsYXJfc2luZ2xlX2l0ZXJfY29zdCAq IHZmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB2 ZWNfaW5zaWRlX2Nvc3QpOwogCiAgICAgICAgICAgaWYgKChzY2FsYXJfc2lu Z2xlX2l0ZXJfY29zdCAqIHZmICogbWluX3Byb2ZpdGFibGVfaXRlcnMpCiAg ICAgICAgICAgICAgIDw9ICgodmVjX2luc2lkZV9jb3N0ICogbWluX3Byb2Zp dGFibGVfaXRlcnMpCi0gICAgICAgICAgICAgICAgICArICh2ZWNfb3V0c2lk ZV9jb3N0ICogdmYpKSkKKyAgICAgICAgICAgICAgICAgICsgKCh2ZWNfb3V0 c2lkZV9jb3N0IC0gc2NhbGFyX291dHNpZGVfY29zdCkgKiB2ZikpKQogICAg ICAgICAgICAgbWluX3Byb2ZpdGFibGVfaXRlcnMrKzsKICAgICAgICAgfQog ICAgIH0KQEAgLTM0Niw3ICszNTUsOSBAQCB2ZWN0X2VzdGltYXRlX21pbl9w cm9maXRhYmxlX2l0ZXJzIChsb29wCiAJICAgICAgIHZlY19pbnNpZGVfY29z dCk7CiAgICAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICIgIFZlY3RvciBvdXRz aWRlIG9mIGxvb3AgY29zdDogJWRcbiIsCiAJICAgICAgIHZlY19vdXRzaWRl X2Nvc3QpOwotICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAiICBTY2FsYXIg Y29zdDogJWRcbiIsIHNjYWxhcl9zaW5nbGVfaXRlcl9jb3N0KTsKKyAgICAg IGZwcmludGYgKHZlY3RfZHVtcCwgIiAgU2NhbGFyIGl0ZXJhdGlvbiBjb3N0 OiAlZFxuIiwKKwkgICAgICAgc2NhbGFyX3NpbmdsZV9pdGVyX2Nvc3QpOwor ICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAiICBTY2FsYXIgb3V0c2lkZSBj b3N0OiAlZFxuIiwgc2NhbGFyX291dHNpZGVfY29zdCk7CiAgICAgICBmcHJp bnRmICh2ZWN0X2R1bXAsICIgIHByb2xvZ3VlIGl0ZXJhdGlvbnM6ICVkXG4i LAogICAgICAgICAgICAgICAgcGVlbF9pdGVyc19wcm9sb2d1ZSk7CiAgICAg ICBmcHJpbnRmICh2ZWN0X2R1bXAsICIgIGVwaWxvZ3VlIGl0ZXJhdGlvbnM6 ICVkXG4iLApAQCAtNjQ0Myw2ICs2NDU0LDM3IEBAIHZlY3RfdXBkYXRlX2l2 c19hZnRlcl92ZWN0b3JpemVyIChsb29wX3YKICAgICB9CiB9CiAKKy8qIFJl dHVybiB0aGUgbW9yZSBjb25zZXJ2YXRpdmUgdGhyZXNob2xkIGJldHdlZW4g dGhlCisgICBtaW5fcHJvZml0YWJsZV9pdGVycyByZXR1cm5lZCBieSB0aGUg Y29zdCBtb2RlbCBhbmQgdGhlIHVzZXIKKyAgIHNwZWNpZmllZCB0aHJlc2hv bGQsIGlmIHByb3ZpZGVkLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAor Y29uc2VydmF0aXZlX2Nvc3RfdGhyZXNob2xkIChsb29wX3ZlY19pbmZvIGxv b3BfdmluZm8sCisJCQkgICAgIGludCBtaW5fcHJvZml0YWJsZV9pdGVycykK K3sKKyAgdW5zaWduZWQgaW50IHRoOworICBpbnQgbWluX3NjYWxhcl9sb29w X2JvdW5kOworCisgIG1pbl9zY2FsYXJfbG9vcF9ib3VuZCA9ICgoUEFSQU1f VkFMVUUgKFBBUkFNX01JTl9WRUNUX0xPT1BfQk9VTkQpCisJCQkgICAgKiBM T09QX1ZJTkZPX1ZFQ1RfRkFDVE9SIChsb29wX3ZpbmZvKSkgLSAxKTsKKwor ICAvKiBVc2UgdGhlIGNvc3QgbW9kZWwgb25seSBpZiBpdCBpcyBtb3JlIGNv bnNlcnZhdGl2ZSB0aGFuIHVzZXIgc3BlY2lmaWVkCisgICAgIHRocmVzaG9s ZC4gICovCisgIHRoID0gKHVuc2lnbmVkKSBtaW5fc2NhbGFyX2xvb3BfYm91 bmQ7CisgIGlmIChtaW5fcHJvZml0YWJsZV9pdGVycworICAgICAgJiYgKCFt aW5fc2NhbGFyX2xvb3BfYm91bmQKKyAgICAgICAgICB8fCBtaW5fcHJvZml0 YWJsZV9pdGVycyA+IG1pbl9zY2FsYXJfbG9vcF9ib3VuZCkpCisgICAgdGgg PSAodW5zaWduZWQpIG1pbl9wcm9maXRhYmxlX2l0ZXJzOworCisgIGlmICh2 ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX1VOVkVDVE9SSVpFRF9MT09Q UykpCSAgICAgIAorICAgIGZwcmludGYgKHZlY3RfZHVtcCwgIm5vdCB2ZWN0 b3JpemVkOiB2ZWN0b3JpemF0aW9uIG1heSBub3QgYmUiCisJICAgICAicHJv Zml0YWJsZS4iKTsKKyAgCisgIGlmICh0aCAmJiB2ZWN0X3ByaW50X2R1bXBf aW5mbyAoUkVQT1JUX0RFVEFJTFMpKQorICAgIGZwcmludGYgKHZlY3RfZHVt cCwgIlZlY3Rvcml6YXRpb24gbWF5IG5vdCBiZSBwcm9maXRhYmxlLiIpOwor CisgIHJldHVybiB0aDsKK30KIAogLyogRnVuY3Rpb24gdmVjdF9kb19wZWVs aW5nX2Zvcl9sb29wX2JvdW5kCiAKQEAgLTY0NjMsOCArNjUwNSw4IEBAIHZl Y3RfZG9fcGVlbGluZ19mb3JfbG9vcF9ib3VuZCAobG9vcF92ZWMKICAgZWRn ZSB1cGRhdGVfZTsKICAgYmFzaWNfYmxvY2sgcHJlaGVhZGVyOwogICBpbnQg bG9vcF9udW07Ci0gIHVuc2lnbmVkIGludCB0aDsKLSAgaW50IG1pbl9zY2Fs YXJfbG9vcF9ib3VuZDsKKyAgYm9vbCBjaGVja19wcm9maXRhYmlsaXR5ID0g ZmFsc2U7CisgIHVuc2lnbmVkIGludCB0aCA9IDA7CiAgIGludCBtaW5fcHJv Zml0YWJsZV9pdGVyczsKIAogICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8g KFJFUE9SVF9ERVRBSUxTKSkKQEAgLTY0ODIsMjggKzY1MjQsMjQgQEAgdmVj dF9kb19wZWVsaW5nX2Zvcl9sb29wX2JvdW5kIChsb29wX3ZlYwogCiAgIGxv b3BfbnVtICA9IGxvb3AtPm51bTsgCiAKLSAgLyogQW5hbHl6ZSBjb3N0IHRv IHNldCB0aHJlc2hob2xkIGZvciB2ZWN0b3JpemVkIGxvb3AuICAqLwotICBt aW5fcHJvZml0YWJsZV9pdGVycyA9IExPT1BfVklORk9fQ09TVF9NT0RFTF9N SU5fSVRFUlMgKGxvb3BfdmluZm8pOwotICBtaW5fc2NhbGFyX2xvb3BfYm91 bmQgPSAoKFBBUkFNX1ZBTFVFIChQQVJBTV9NSU5fVkVDVF9MT09QX0JPVU5E KQotCQkJICAgICogTE9PUF9WSU5GT19WRUNUX0ZBQ1RPUiAobG9vcF92aW5m bykpIC0gMSk7Ci0KLSAgLyogVXNlIHRoZSBjb3N0IG1vZGVsIG9ubHkgaWYg aXQgaXMgbW9yZSBjb25zZXJ2YXRpdmUgdGhhbiB1c2VyIHNwZWNpZmllZAot ICAgICB0aHJlc2hvbGQuICAqLworICAvKiBJZiBjb3N0IG1vZGVsIGNoZWNr IG5vdCBkb25lIGR1cmluZyB2ZXJzaW9uaW5nIGFuZCAKKyAgICAgcGVlbGlu ZyBmb3IgYWxpZ25tZW50LiAgKi8KKyAgaWYgKCFWRUNfbGVuZ3RoICh0cmVl LCBMT09QX1ZJTkZPX01BWV9NSVNBTElHTl9TVE1UUyAobG9vcF92aW5mbykp CisgICAgICAmJiAhVkVDX2xlbmd0aCAoZGRyX3AsIExPT1BfVklORk9fTUFZ X0FMSUFTX0REUlMgKGxvb3BfdmluZm8pKQorICAgICAgJiYgIUxPT1BfUEVF TElOR19GT1JfQUxJR05NRU5UIChsb29wX3ZpbmZvKSkKKyAgICB7CisgICAg ICBjaGVja19wcm9maXRhYmlsaXR5ID0gdHJ1ZTsKIAotICB0aCA9ICh1bnNp Z25lZCkgbWluX3NjYWxhcl9sb29wX2JvdW5kOwotICBpZiAobWluX3Byb2Zp dGFibGVfaXRlcnMKLSAgICAgICYmICghbWluX3NjYWxhcl9sb29wX2JvdW5k Ci0gICAgICAgICAgfHwgbWluX3Byb2ZpdGFibGVfaXRlcnMgPiBtaW5fc2Nh bGFyX2xvb3BfYm91bmQpKQotICAgIHRoID0gKHVuc2lnbmVkKSBtaW5fcHJv Zml0YWJsZV9pdGVyczsKKyAgICAgIC8qIFNldCBwcm9maXRhYmlsaXR5IHRo cmVzaGhvbGQgZm9yIHZlY3Rvcml6ZWQgbG9vcC4gICovCisgICAgICBtaW5f cHJvZml0YWJsZV9pdGVycyA9IExPT1BfVklORk9fQ09TVF9NT0RFTF9NSU5f SVRFUlMgKGxvb3BfdmluZm8pOwogCi0gIGlmICgoKExPT1BfUEVFTElOR19G T1JfQUxJR05NRU5UIChsb29wX3ZpbmZvKSA8IDApCi0gICAgICB8fCAhTE9P UF9WSU5GT19OSVRFUlNfS05PV05fUCAobG9vcF92aW5mbykpCi0gICAgICAm JiB2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQotICAg IGZwcmludGYgKHZlY3RfZHVtcCwgInZlY3Rvcml6YXRpb24gbWF5IG5vdCBi ZSBwcm9maXRhYmxlLiIpOworICAgICAgdGggPSBjb25zZXJ2YXRpdmVfY29z dF90aHJlc2hvbGQgKGxvb3BfdmluZm8sIAorCQkJCQltaW5fcHJvZml0YWJs ZV9pdGVycyk7CisgICAgfQogCiAgIG5ld19sb29wID0gc2xwZWVsX3RyZWVf cGVlbF9sb29wX3RvX2VkZ2UgKGxvb3AsIHNpbmdsZV9leGl0IChsb29wKSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmF0aW9fbXVsdF92Zl9uYW1lLCBuaV9uYW1lLCBmYWxzZSwKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGgpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aCwg Y2hlY2tfcHJvZml0YWJpbGl0eSk7CiAgIGdjY19hc3NlcnQgKG5ld19sb29w KTsKICAgZ2NjX2Fzc2VydCAobG9vcF9udW0gPT0gbG9vcC0+bnVtKTsKICNp ZmRlZiBFTkFCTEVfQ0hFQ0tJTkcKQEAgLTY3MjEsNiArNjc1OSw5IEBAIHZl Y3RfZG9fcGVlbGluZ19mb3JfYWxpZ25tZW50IChsb29wX3ZlY18KICAgdHJl ZSBuaXRlcnNfb2ZfcHJvbG9nX2xvb3AsIG5pX25hbWU7CiAgIHRyZWUgbl9p dGVyczsKICAgc3RydWN0IGxvb3AgKm5ld19sb29wOworICBib29sIGNoZWNr X3Byb2ZpdGFiaWxpdHkgPSBmYWxzZTsKKyAgdW5zaWduZWQgaW50IHRoID0g MDsKKyAgaW50IG1pbl9wcm9maXRhYmxlX2l0ZXJzOwogCiAgIGlmICh2ZWN0 X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQogICAgIGZwcmlu dGYgKHZlY3RfZHVtcCwgIj09PSB2ZWN0X2RvX3BlZWxpbmdfZm9yX2FsaWdu bWVudCA9PT0iKTsKQEAgLTY3MzAsMTAgKzY3NzEsMjYgQEAgdmVjdF9kb19w ZWVsaW5nX2Zvcl9hbGlnbm1lbnQgKGxvb3BfdmVjXwogICBuaV9uYW1lID0g dmVjdF9idWlsZF9sb29wX25pdGVycyAobG9vcF92aW5mbyk7CiAgIG5pdGVy c19vZl9wcm9sb2dfbG9vcCA9IHZlY3RfZ2VuX25pdGVyc19mb3JfcHJvbG9n X2xvb3AgKGxvb3BfdmluZm8sIG5pX25hbWUpOwogICAKKworICAvKiBJZiBj b3N0IG1vZGVsIGNoZWNrIG5vdCBkb25lIGR1cmluZyB2ZXJzaW9uaW5nLiAg Ki8KKyAgaWYgKCFWRUNfbGVuZ3RoICh0cmVlLCBMT09QX1ZJTkZPX01BWV9N SVNBTElHTl9TVE1UUyAobG9vcF92aW5mbykpCisgICAgICAmJiAhVkVDX2xl bmd0aCAoZGRyX3AsIExPT1BfVklORk9fTUFZX0FMSUFTX0REUlMgKGxvb3Bf dmluZm8pKSkKKyAgICB7CisgICAgICBjaGVja19wcm9maXRhYmlsaXR5ID0g dHJ1ZTsKKworICAgICAgLyogU2V0IHByb2ZpdGFiaWxpdHkgdGhyZXNoaG9s ZCBmb3IgdmVjdG9yaXplZCBsb29wLiAgKi8KKyAgICAgIG1pbl9wcm9maXRh YmxlX2l0ZXJzID0gTE9PUF9WSU5GT19DT1NUX01PREVMX01JTl9JVEVSUyAo bG9vcF92aW5mbyk7CisKKyAgICAgIHRoID0gY29uc2VydmF0aXZlX2Nvc3Rf dGhyZXNob2xkIChsb29wX3ZpbmZvLCAKKwkJCQkJbWluX3Byb2ZpdGFibGVf aXRlcnMpOworICAgIH0KKwogICAvKiBQZWVsIHRoZSBwcm9sb2cgbG9vcCBh bmQgaXRlcmF0ZSBpdCBuaXRlcnNfb2ZfcHJvbG9nX2xvb3AuICAqLwotICBu ZXdfbG9vcCA9IAotCXNscGVlbF90cmVlX3BlZWxfbG9vcF90b19lZGdlIChs b29wLCBsb29wX3ByZWhlYWRlcl9lZGdlIChsb29wKSwgCi0JCQkJICAgICAg IG5pdGVyc19vZl9wcm9sb2dfbG9vcCwgbmlfbmFtZSwgdHJ1ZSwgMCk7IAor ICBuZXdfbG9vcCA9CisgICAgc2xwZWVsX3RyZWVfcGVlbF9sb29wX3RvX2Vk Z2UgKGxvb3AsIGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApLAorCQkJCSAg IG5pdGVyc19vZl9wcm9sb2dfbG9vcCwgbmlfbmFtZSwgdHJ1ZSwKKwkJCQkg ICB0aCwgY2hlY2tfcHJvZml0YWJpbGl0eSk7CisKICAgZ2NjX2Fzc2VydCAo bmV3X2xvb3ApOwogI2lmZGVmIEVOQUJMRV9DSEVDS0lORwogICBzbHBlZWxf dmVyaWZ5X2NmZ19hZnRlcl9wZWVsaW5nIChuZXdfbG9vcCwgbG9vcCk7CkBA IC02NzYxLDYgKzY4MTgsOCBAQCB2ZWN0X2RvX3BlZWxpbmdfZm9yX2FsaWdu bWVudCAobG9vcF92ZWNfCiAgICBjaGVja2VkIGF0IHJ1bnRpbWUuCiAKICAg IElucHV0OgorICAgQ09ORF9FWFBSICAtIGlucHV0IGNvbmRpdGlvbmFsIGV4 cHJlc3Npb24uICBOZXcgY29uZGl0aW9ucyB3aWxsIGJlIGNoYWluZWQKKyAg ICAgICAgICAgICAgICB3aXRoIGxvZ2ljYWwgQU5EIG9wZXJhdGlvbi4KICAg IExPT1BfVklORk8gLSB0d28gZmllbGRzIG9mIHRoZSBsb29wIGluZm9ybWF0 aW9uIGFyZSB1c2VkLgogICAgICAgICAgICAgICAgIExPT1BfVklORk9fUFRS X01BU0sgaXMgdGhlIG1hc2sgdXNlZCB0byBjaGVjayB0aGUgYWxpZ25tZW50 LgogICAgICAgICAgICAgICAgIExPT1BfVklORk9fTUFZX01JU0FMSUdOX1NU TVRTIGNvbnRhaW5zIHRoZSByZWZzIHRvIGJlIGNoZWNrZWQuCkBAIC02Nzc3 LDggKzY4MzYsOSBAQCB2ZWN0X2RvX3BlZWxpbmdfZm9yX2FsaWdubWVudCAo bG9vcF92ZWNfCiAgICAgICAgIHRlc3QgY2FuIGJlIGRvbmUgYXMgYSYobi0x KSA9PSAwLiAgRm9yIGV4YW1wbGUsIGZvciAxNgogICAgICAgICBieXRlIHZl Y3RvcnMgdGhlIHRlc3QgaXMgYSYweGYgPT0gMC4gICovCiAKLXN0YXRpYyB0 cmVlCitzdGF0aWMgdm9pZAogdmVjdF9jcmVhdGVfY29uZF9mb3JfYWxpZ25f Y2hlY2tzIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8sCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUgKmNvbmRfZXhwciwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSAqY29uZF9l eHByX3N0bXRfbGlzdCkKIHsKICAgc3RydWN0IGxvb3AgKmxvb3AgPSBMT09Q X1ZJTkZPX0xPT1AgKGxvb3BfdmluZm8pOwpAQCAtNjc5NCw2ICs2ODU0LDcg QEAgdmVjdF9jcmVhdGVfY29uZF9mb3JfYWxpZ25fY2hlY2tzIChsb29wXwog ICB0cmVlIG9yX3RtcF9uYW1lID0gTlVMTF9UUkVFOwogICB0cmVlIGFuZF90 bXAsIGFuZF90bXBfbmFtZSwgYW5kX3N0bXQ7CiAgIHRyZWUgcHRyc2l6ZV96 ZXJvOworICB0cmVlIHBhcnRfY29uZF9leHByOwogCiAgIC8qIENoZWNrIHRo YXQgbWFzayBpcyBvbmUgbGVzcyB0aGFuIGEgcG93ZXIgb2YgMiwgaS5lLiwg bWFzayBpcwogICAgICBhbGwgemVyb3MgZm9sbG93ZWQgYnkgYWxsIG9uZXMu ICAqLwpAQCAtNjg2Nyw4ICs2OTI4LDEzIEBAIHZlY3RfY3JlYXRlX2NvbmRf Zm9yX2FsaWduX2NoZWNrcyAobG9vcF8KICAgLyogTWFrZSBhbmRfdG1wIHRo ZSBsZWZ0IG9wZXJhbmQgb2YgdGhlIGNvbmRpdGlvbmFsIHRlc3QgYWdhaW5z dCB6ZXJvLgogICAgICBpZiBhbmRfdG1wIGhhcyBhIG5vbnplcm8gYml0IHRo ZW4gc29tZSBhZGRyZXNzIGlzIHVuYWxpZ25lZC4gICovCiAgIHB0cnNpemVf emVybyA9IGJ1aWxkX2ludF9jc3QgKGludF9wdHJzaXplX3R5cGUsIDApOwot ICByZXR1cm4gYnVpbGQyIChFUV9FWFBSLCBib29sZWFuX3R5cGVfbm9kZSwK LSAgICAgICAgICAgICAgICAgYW5kX3RtcF9uYW1lLCBwdHJzaXplX3plcm8p OworICBwYXJ0X2NvbmRfZXhwciA9IGZvbGRfYnVpbGQyIChFUV9FWFBSLCBi b29sZWFuX3R5cGVfbm9kZSwKKwkJCQlhbmRfdG1wX25hbWUsIHB0cnNpemVf emVybyk7CisgIGlmICgqY29uZF9leHByKQorICAgICpjb25kX2V4cHIgPSBm b2xkX2J1aWxkMiAoVFJVVEhfQU5EX0VYUFIsIGJvb2xlYW5fdHlwZV9ub2Rl LAorCQkJICAgICAgKmNvbmRfZXhwciwgcGFydF9jb25kX2V4cHIpOworICBl bHNlCisgICAgKmNvbmRfZXhwciA9IHBhcnRfY29uZF9leHByOwogfQogCiAv KiBGdW5jdGlvbiB2ZWN0X3ZmYV9zZWdtZW50X3NpemUuCkBAIC02OTA5LDcg KzY5NzUsNyBAQCB2ZWN0X3ZmYV9zZWdtZW50X3NpemUgKHN0cnVjdCBkYXRh X3JlZmVyCiAKICAgIElucHV0OgogICAgQ09ORF9FWFBSICAtIGlucHV0IGNv bmRpdGlvbmFsIGV4cHJlc3Npb24uICBOZXcgY29uZGl0aW9ucyB3aWxsIGJl IGNoYWluZWQKLSAgICAgICAgICAgICAgICB3aXRoIGxvZ2ljYWwgYW5kIG9w ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICB3aXRoIGxvZ2ljYWwgQU5EIG9w ZXJhdGlvbi4KICAgIExPT1BfVklORk8gLSBmaWVsZCBMT09QX1ZJTkZPX01B WV9BTElBU19TVE1UUyBjb250YWlucyB0aGUgbGlzdCBvZiBkZHJzCiAJICAg ICAgICB0byBiZSBjaGVja2VkLgogCkBAIC03MDMxLDcgKzcwOTcsMTEgQEAg dmVjdF9jcmVhdGVfY29uZF9mb3JfYWxpYXNfY2hlY2tzIChsb29wXwogICAg ZGF0YSByZWZlcmVuY2VzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgYWxpZ25l ZC4gIEFuIGFkZGl0aW9uYWwKICAgIHNlcXVlbmNlIG9mIHJ1bnRpbWUgdGVz dHMgaXMgZ2VuZXJhdGVkIGZvciBlYWNoIHBhaXJzIG9mIEREUnMgd2hvc2UK ICAgIGluZGVwZW5kZW5jZSB3YXMgbm90IHByb3Zlbi4gIFRoZSB2ZWN0b3Jp emVkIHZlcnNpb24gb2YgbG9vcCBpcyAKLSAgIGV4ZWN1dGVkIG9ubHkgaWYg Ym90aCBhbGlhcyBhbmQgYWxpZ25tZW50IHRlc3RzIGFyZSBwYXNzZWQuICAq LworICAgZXhlY3V0ZWQgb25seSBpZiBib3RoIGFsaWFzIGFuZCBhbGlnbm1l bnQgdGVzdHMgYXJlIHBhc3NlZC4gIAorICAKKyAgIFRoZSB0ZXN0IGdlbmVy YXRlZCB0byBjaGVjayB3aGljaCB2ZXJzaW9uIG9mIGxvb3AgaXMgZXhlY3V0 ZWQKKyAgIGlzIG1vZGlmaWVkIHRvIGFsc28gY2hlY2sgZm9yIHByb2ZpdGFi aWxpdHkgYXMgaW5kaWNhdGVkIGJ5IHRoZSAKKyAgIGNvc3QgbW9kZWwgaW5p dGlhbGx5LiAgKi8KIAogc3RhdGljIHZvaWQKIHZlY3RfbG9vcF92ZXJzaW9u aW5nIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8pCkBAIC03MDQ4LDE3ICs3 MTE4LDMwIEBAIHZlY3RfbG9vcF92ZXJzaW9uaW5nIChsb29wX3ZlY19pbmZv IGxvb3AKICAgdHJlZSBvcmlnX3BoaSwgbmV3X3BoaSwgYXJnOwogICB1bnNp Z25lZCBwcm9iID0gNCAqIFJFR19CUl9QUk9CX0JBU0UgLyA1OwogICB0cmVl IGdpbXBsaWZ5X3N0bXRfbGlzdDsKKyAgdHJlZSBzY2FsYXJfbG9vcF9pdGVy cyA9IExPT1BfVklORk9fTklURVJTIChsb29wX3ZpbmZvKTsKKyAgaW50IG1p bl9wcm9maXRhYmxlX2l0ZXJzID0gMDsKKyAgdW5zaWduZWQgaW50IHRoOwog Ci0gIGlmICghVkVDX2xlbmd0aCAodHJlZSwgTE9PUF9WSU5GT19NQVlfTUlT QUxJR05fU1RNVFMgKGxvb3BfdmluZm8pKQotICAgICAgJiYgIVZFQ19sZW5n dGggKGRkcl9wLCBMT09QX1ZJTkZPX01BWV9BTElBU19ERFJTIChsb29wX3Zp bmZvKSkpCi0gICAgcmV0dXJuOworICAvKiBTZXQgcHJvZml0YWJpbGl0eSB0 aHJlc2hvbGQgZm9yIHZlY3Rvcml6ZWQgbG9vcC4gICovCisgIG1pbl9wcm9m aXRhYmxlX2l0ZXJzID0gTE9PUF9WSU5GT19DT1NUX01PREVMX01JTl9JVEVS UyAobG9vcF92aW5mbyk7CisKKyAgdGggPSBjb25zZXJ2YXRpdmVfY29zdF90 aHJlc2hvbGQgKGxvb3BfdmluZm8sCisJCQkJICAgIG1pbl9wcm9maXRhYmxl X2l0ZXJzKTsKKworICBjb25kX2V4cHIgPQorICAgIGJ1aWxkMiAoR1RfRVhQ UiwgYm9vbGVhbl90eXBlX25vZGUsIHNjYWxhcl9sb29wX2l0ZXJzLCAKKwkg ICAgYnVpbGRfaW50X2NzdCAoVFJFRV9UWVBFIChzY2FsYXJfbG9vcF9pdGVy cyksIHRoKSk7CisKKyAgY29uZF9leHByID0gZm9yY2VfZ2ltcGxlX29wZXJh bmQgKGNvbmRfZXhwciwgJmNvbmRfZXhwcl9zdG10X2xpc3QsCisJCQkJICAg IGZhbHNlLCBOVUxMX1RSRUUpOwogCiAgIGlmIChWRUNfbGVuZ3RoICh0cmVl LCBMT09QX1ZJTkZPX01BWV9NSVNBTElHTl9TVE1UUyAobG9vcF92aW5mbykp KQotICAgIGNvbmRfZXhwciA9Ci0gICAgICB2ZWN0X2NyZWF0ZV9jb25kX2Zv cl9hbGlnbl9jaGVja3MgKGxvb3BfdmluZm8sICZjb25kX2V4cHJfc3RtdF9s aXN0KTsKKyAgICAgIHZlY3RfY3JlYXRlX2NvbmRfZm9yX2FsaWduX2NoZWNr cyAobG9vcF92aW5mbywgJmNvbmRfZXhwciwKKwkJCQkJICZjb25kX2V4cHJf c3RtdF9saXN0KTsKIAogICBpZiAoVkVDX2xlbmd0aCAoZGRyX3AsIExPT1Bf VklORk9fTUFZX0FMSUFTX0REUlMgKGxvb3BfdmluZm8pKSkKLSAgICB2ZWN0 X2NyZWF0ZV9jb25kX2Zvcl9hbGlhc19jaGVja3MgKGxvb3BfdmluZm8sICZj b25kX2V4cHIsICZjb25kX2V4cHJfc3RtdF9saXN0KTsKKyAgICB2ZWN0X2Ny ZWF0ZV9jb25kX2Zvcl9hbGlhc19jaGVja3MgKGxvb3BfdmluZm8sICZjb25k X2V4cHIsIAorCQkJCSAgICAgICAmY29uZF9leHByX3N0bXRfbGlzdCk7CiAK ICAgY29uZF9leHByID0KICAgICBmb2xkX2J1aWxkMiAoTkVfRVhQUiwgYm9v bGVhbl90eXBlX25vZGUsIGNvbmRfZXhwciwgaW50ZWdlcl96ZXJvX25vZGUp OwpAQCAtNzIzNiw3ICs3MzE5LDEwIEBAIHZlY3RfdHJhbnNmb3JtX2xvb3Ag KGxvb3BfdmVjX2luZm8gbG9vcF8KIAogICBpZiAodmVjdF9wcmludF9kdW1w X2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKICAgICBmcHJpbnRmICh2ZWN0X2R1 bXAsICI9PT0gdmVjX3RyYW5zZm9ybV9sb29wID09PSIpOwotICB2ZWN0X2xv b3BfdmVyc2lvbmluZyAobG9vcF92aW5mbyk7CisKKyAgaWYgKFZFQ19sZW5n dGggKHRyZWUsIExPT1BfVklORk9fTUFZX01JU0FMSUdOX1NUTVRTIChsb29w X3ZpbmZvKSkKKyAgICAgIHx8IFZFQ19sZW5ndGggKGRkcl9wLCBMT09QX1ZJ TkZPX01BWV9BTElBU19ERFJTIChsb29wX3ZpbmZvKSkpCisgICAgdmVjdF9s b29wX3ZlcnNpb25pbmcgKGxvb3BfdmluZm8pOwogCiAgIC8qIENIRUNLTUU6 IHdlIHdvdWxkbid0IG5lZWQgdGhpcyBpZiB3ZSBjYWxsZWQgdXBkYXRlX3Nz YSBvbmNlCiAgICAgIGZvciBhbGwgbG9vcHMuICAqLwo= ------_=_NextPart_001_01C82FAA.85E842CA--