From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 124446 invoked by alias); 5 Nov 2019 14:36:00 -0000 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 Received: (qmail 124429 invoked by uid 89); 5 Nov 2019 14:35:59 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-13.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,SPF_PASS autolearn=ham version=3.3.1 spammy=ATM, simplest, Care, gimplify_expr X-HELO: esa3.mentor.iphmx.com Received: from esa3.mentor.iphmx.com (HELO esa3.mentor.iphmx.com) (68.232.137.180) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 05 Nov 2019 14:35:52 +0000 IronPort-SDR: jgYDmXZLKhav+UUIREkxoDM5e4CTxAo6MGM1gg1z4CljmFjQjzK4rP+P8GVo8hW/Ajh66IGRFl 8LUCIUHRrq9jVe850PrKi8cYSZiTQzS/aI5+KAgBys/bOubqIx0vXKgRH9UvNlCqD8MQIL/P9R mqRQW8k1G6zr8FWwJuWw/Al2ceziDLivO+xpBQ6Lnx4vMI+vnxlf1/YBUT2bI7FYVt9Vr3XfA8 Fzxq2UM/10EtB0dM6EKRGSKYfjmI6j5oBVVrbjXmz9tzcxyNsreudlU8/e1XJ1nmR3I0wZVEaF +Gs= Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa3.mentor.iphmx.com with ESMTP; 05 Nov 2019 06:35:50 -0800 IronPort-SDR: 8MAmjykhKl8UMyknOEh21JTVX8BYLDKLBaMtuZTCHjCrliaOPI6H/MTDEthAkPu+Y0LK96+UPz w/2L+6SRF+WtG1/qDUgZcRDmPECqVeki+ZCN2Hcudjj357IyfDiqsj//ip+XuHEcSqYQBudoe4 gk3QnlToB00F9rJKIfF6BZ8n2c0J0aLc42jJ6kfDFdJxcN4BAhrsBY2BP8VhszixZ9uppcrh/2 yokmCF8GGaEiAbZWws8hSVQ5P3nZe1QTIxMVZJYTER84oOEN1Ak91uWjL1HyzAuqD4jR3yDE6y agQ= From: Chung-Lin Tang Subject: [PATCH, OpenACC, v2] Non-contiguous array support for OpenACC data clauses Reply-To: To: gcc-patches , Thomas Schwinge Message-ID: Date: Tue, 05 Nov 2019 14:36:00 -0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------5965C2E5AD025572BB199F06" Return-Path: chunglin_tang@mentor.com X-SW-Source: 2019-11/txt/msg00299.txt.bz2 --------------5965C2E5AD025572BB199F06 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Content-length: 6001 Hi Thomas, after your last round of review, I realized that the bulk of the compiler omp-low work was simply a case of dumb over-engineering in the wrong direction :P (although it did painstakingly function correctly) Instead of making code changes for bias adjustment in the child function code in the omp-low phase, this should simply be done by the libgomp runtime map preparation (similar to how the current single-dimension array biases are handled) So this updated patch (1) discards away a large part of the last omp-low.c patch, and (2) adjusts the libgomp/target.c patch to do the per-dimensional adjustments. Also, the bit of C/C++ front-end logic you mentioned that was questionable was removed. After looking closely, it wasn't needed; the relaxing of pointers for OpenACC was enough. Still some aspects of handling arrays inside the multi-dimension type still need some more work, e.g. see the catching in the omp-low.c part. A compiler dg-scan testcase was also added. However, the issue of ACC_DEVICE_TYPE=host not working (and hence "!openacc_host_selected" in the testcases) actually is a bit more sophisticated than I thought: The reason it doesn't work for the host device, is because we use the map pointer (i.e. a hostaddrs[] entry when passed into libgomp) to point to an array descriptor to pass the whole array information, and rely on code inside gomp_map_vars_* to setup things, and place the final on-device address of the non-contig. array into devaddrs[], therefore only using a single map entry (something I thought was quite clever) However, this broke down on the host and host-fallback devices, simply because, there we do NOT do any gomp_map_vars processing; our current code in GOACC_parallel_keyed simply skips it and passes the offload function the original hostaddrs[] contents. Lacking the processing to transform the descriptor pointer into a proper array ref, things of course segfault. So I think we have three options for this (which may have some interactions with say, the "proper" host-side parallelization we eventually need to implement for OpenACC 2.7) (1) The simplest solution: implement a processing which searches and reverts such non-contiguous array map entries in GOACC_parallel_keyed. (note: I have implemented this in the current attached "v2" patch) (2) Make the GOACC_parallel_keyed code to not make short cuts for host-modes; i.e. still do the proper gomp_map_vars processing for all cases. (3) Modify the non-contiguous array map conventions: a possible solution is to use two maps placed together: one for the array pointer, another for the array descriptor (as opposed to the current style of using only one map) This needs more further elaborate compiler/runtime work. The first two options will pessimize host-mode performance somewhat. The third I have some WIP patches, but it's still buggy ATM. Seeking your opinion on what we should do. Thanks, Chung-Lin gcc/c/ * c-typeck.c (handle_omp_array_sections_1): Add 'bool &non_contiguous' parameter, adjust recursive call site, add cases for allowing pointer based multi-dimensional arrays for OpenACC. (handle_omp_array_sections): Adjust handle_omp_array_sections_1 call, handle non-contiguous case to create dynamic array map. gcc/cp/ * semantics.c (handle_omp_array_sections_1): Add 'bool &non_contiguous' parameter, adjust recursive call site, add cases for allowing pointer based multi-dimensional arrays for OpenACC. (handle_omp_array_sections): Adjust handle_omp_array_sections_1 call, handle non-contiguous case to create dynamic array map. gcc/ * gimplify.c (gimplify_scan_omp_clauses): For non-contiguous array map kinds, make sure bias in each dimension are put into firstprivate variables. * omp-low.c (append_field_to_record_type): New function. (create_noncontig_array_descr_type): Likewise. (create_noncontig_array_descr_init_code): Likewise. (scan_sharing_clauses): For non-contiguous array map kinds, check for supported dimension structure, and install non-contiguous array variable into current omp_context. (reorder_noncontig_array_clauses): New function. (scan_omp_target): Call reorder_noncontig_array_clauses to place non-contiguous array map clauses at beginning of clause sequence. (lower_omp_target): Add handling for non-contiguous array map kinds. * tree-pretty-print.c (dump_omp_clauses): Add cases for printing GOMP_MAP_NONCONTIG_ARRAY map kinds. include/ * gomp-constants.h (GOMP_MAP_FLAG_SPECIAL_3): Define. (enum gomp_map_kind): Add GOMP_MAP_NONCONTIG_ARRAY, GOMP_MAP_NONCONTIG_ARRAY_TO, GOMP_MAP_NONCONTIG_ARRAY_FROM, GOMP_MAP_NONCONTIG_ARRAY_TOFROM, GOMP_MAP_NONCONTIG_ARRAY_FORCE_TO, GOMP_MAP_NONCONTIG_ARRAY_FORCE_FROM, GOMP_MAP_NONCONTIG_ARRAY_FORCE_TOFROM, GOMP_MAP_NONCONTIG_ARRAY_ALLOC, GOMP_MAP_NONCONTIG_ARRAY_FORCE_ALLOC, GOMP_MAP_NONCONTIG_ARRAY_FORCE_PRESENT. (GOMP_MAP_NONCONTIG_ARRAY_P): Define. gcc/testsuite/ * c-c++-common/goacc/noncontig_array-1.c: New test. libgomp/ * target.c (struct gomp_ncarray_dim): New struct declaration. (struct gomp_ncarray_descr_type): Likewise. (struct ncarray_info): Likewise. (gomp_noncontig_array_count_rows): New function. (gomp_noncontig_array_compute_info): Likewise. (gomp_noncontig_array_fill_rows_1): Likewise. (gomp_noncontig_array_fill_rows): Likewise. (gomp_noncontig_array_create_ptrblock): Likewise. (gomp_map_vars_internal): Add code to handle non-contiguous array map kinds. * oacc-parallel.c (revert_noncontig_array_map_pointers): New function. (GOACC_parallel_keyed): Call revert_noncontig_array_map_pointers when executing for host-modes. * testsuite/libgomp.oacc-c-c++-common/noncontig_array-1.c: New test. * testsuite/libgomp.oacc-c-c++-common/noncontig_array-2.c: New test. * testsuite/libgomp.oacc-c-c++-common/noncontig_array-3.c: New test. * testsuite/libgomp.oacc-c-c++-common/noncontig_array-4.c: New test. * testsuite/libgomp.oacc-c-c++-common/noncontig_array-utils.h: Support header for new tests. --------------5965C2E5AD025572BB199F06 Content-Type: text/plain; charset="UTF-8"; x-mac-type=0; x-mac-creator=0; name="openacc-noncontig-arrays-v2.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="openacc-noncontig-arrays-v2.patch" Content-length: 65197 SW5kZXg6IGdjYy9jL2MtdHlwZWNrLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQotLS0gZ2NjL2MvYy10eXBlY2suYwkocmV2aXNpb24gMjc3ODI3KQorKysg Z2NjL2MvYy10eXBlY2suYwkod29ya2luZyBjb3B5KQpAQCAtMTI4NjgsNyAr MTI4NjgsNyBAQCBjX2ZpbmlzaF9vbXBfY2FuY2VsbGF0aW9uX3BvaW50IChs b2NhdGlvbl90IGxvYywgdAogc3RhdGljIHRyZWUKIGhhbmRsZV9vbXBfYXJy YXlfc2VjdGlvbnNfMSAodHJlZSBjLCB0cmVlIHQsIHZlYzx0cmVlPiAmdHlw ZXMsCiAJCQkgICAgIGJvb2wgJm1heWJlX3plcm9fbGVuLCB1bnNpZ25lZCBp bnQgJmZpcnN0X25vbl9vbmUsCi0JCQkgICAgIGVudW0gY19vbXBfcmVnaW9u X3R5cGUgb3J0KQorCQkJICAgICBib29sICZub25fY29udGlndW91cywgZW51 bSBjX29tcF9yZWdpb25fdHlwZSBvcnQpCiB7CiAgIHRyZWUgcmV0LCBsb3df Ym91bmQsIGxlbmd0aCwgdHlwZTsKICAgaWYgKFRSRUVfQ09ERSAodCkgIT0g VFJFRV9MSVNUKQpAQCAtMTI5NTMsNyArMTI5NTMsOCBAQCBoYW5kbGVfb21w X2FycmF5X3NlY3Rpb25zXzEgKHRyZWUgYywgdHJlZSB0LCB2ZWM8dAogICAg IH0KIAogICByZXQgPSBoYW5kbGVfb21wX2FycmF5X3NlY3Rpb25zXzEgKGMs IFRSRUVfQ0hBSU4gKHQpLCB0eXBlcywKLQkJCQkgICAgIG1heWJlX3plcm9f bGVuLCBmaXJzdF9ub25fb25lLCBvcnQpOworCQkJCSAgICAgbWF5YmVfemVy b19sZW4sIGZpcnN0X25vbl9vbmUsCisJCQkJICAgICBub25fY29udGlndW91 cywgb3J0KTsKICAgaWYgKHJldCA9PSBlcnJvcl9tYXJrX25vZGUgfHwgcmV0 ID09IE5VTExfVFJFRSkKICAgICByZXR1cm4gcmV0OwogCkBAIC0xMzE2MCwx NCArMTMxNjEsMjEgQEAgaGFuZGxlX29tcF9hcnJheV9zZWN0aW9uc18xICh0 cmVlIGMsIHRyZWUgdCwgdmVjPHQKIAkgIHJldHVybiBlcnJvcl9tYXJrX25v ZGU7CiAJfQogICAgICAgLyogSWYgdGhlcmUgaXMgYSBwb2ludGVyIHR5cGUg YW55d2hlcmUgYnV0IGluIHRoZSB2ZXJ5IGZpcnN0Ci0JIGFycmF5LXNlY3Rp b24tc3Vic2NyaXB0LCB0aGUgYXJyYXkgc2VjdGlvbiBjYW4ndCBiZSBjb250 aWd1b3VzLiAgKi8KKwkgYXJyYXktc2VjdGlvbi1zdWJzY3JpcHQsIHRoZSBh cnJheSBzZWN0aW9uIGNhbid0IGJlIGNvbnRpZ3VvdXMuCisJIE5vdGUgdGhh dCBPcGVuQUNDIGRvZXMgYWNjZXB0IHRoZXNlIGtpbmRzIG9mIG5vbi1jb250 aWd1b3VzIHBvaW50ZXIKKwkgYmFzZWQgYXJyYXlzLiAgKi8KICAgICAgIGlm IChPTVBfQ0xBVVNFX0NPREUgKGMpICE9IE9NUF9DTEFVU0VfREVQRU5ECiAJ ICAmJiBUUkVFX0NPREUgKFRSRUVfQ0hBSU4gKHQpKSA9PSBUUkVFX0xJU1Qp CiAJewotCSAgZXJyb3JfYXQgKE9NUF9DTEFVU0VfTE9DQVRJT04gKGMpLAot CQkgICAgImFycmF5IHNlY3Rpb24gaXMgbm90IGNvbnRpZ3VvdXMgaW4gJXFz IGNsYXVzZSIsCi0JCSAgICBvbXBfY2xhdXNlX2NvZGVfbmFtZVtPTVBfQ0xB VVNFX0NPREUgKGMpXSk7Ci0JICByZXR1cm4gZXJyb3JfbWFya19ub2RlOwor CSAgaWYgKG9ydCA9PSBDX09SVF9BQ0MpCisJICAgIG5vbl9jb250aWd1b3Vz ID0gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGVycm9yX2F0IChP TVBfQ0xBVVNFX0xPQ0FUSU9OIChjKSwKKwkJCSJhcnJheSBzZWN0aW9uIGlz IG5vdCBjb250aWd1b3VzIGluICVxcyBjbGF1c2UiLAorCQkJb21wX2NsYXVz ZV9jb2RlX25hbWVbT01QX0NMQVVTRV9DT0RFIChjKV0pOworCSAgICAgIHJl dHVybiBlcnJvcl9tYXJrX25vZGU7CisJICAgIH0KIAl9CiAgICAgfQogICBl bHNlCkBAIC0xMzE5Niw2ICsxMzIwNCw3IEBAIGhhbmRsZV9vbXBfYXJyYXlf c2VjdGlvbnMgKHRyZWUgYywgZW51bSBjX29tcF9yZWdpCiB7CiAgIGJvb2wg bWF5YmVfemVyb19sZW4gPSBmYWxzZTsKICAgdW5zaWduZWQgaW50IGZpcnN0 X25vbl9vbmUgPSAwOworICBib29sIG5vbl9jb250aWd1b3VzID0gZmFsc2U7 CiAgIGF1dG9fdmVjPHRyZWUsIDEwPiB0eXBlczsKICAgdHJlZSAqdHAgPSAm T01QX0NMQVVTRV9ERUNMIChjKTsKICAgaWYgKE9NUF9DTEFVU0VfQ09ERSAo YykgPT0gT01QX0NMQVVTRV9ERVBFTkQKQEAgLTEzMjA1LDcgKzEzMjE0LDcg QEAgaGFuZGxlX29tcF9hcnJheV9zZWN0aW9ucyAodHJlZSBjLCBlbnVtIGNf b21wX3JlZ2kKICAgICB0cCA9ICZUUkVFX1ZBTFVFICgqdHApOwogICB0cmVl IGZpcnN0ID0gaGFuZGxlX29tcF9hcnJheV9zZWN0aW9uc18xIChjLCAqdHAs IHR5cGVzLAogCQkJCQkgICAgbWF5YmVfemVyb19sZW4sIGZpcnN0X25vbl9v bmUsCi0JCQkJCSAgICBvcnQpOworCQkJCQkgICAgbm9uX2NvbnRpZ3VvdXMs IG9ydCk7CiAgIGlmIChmaXJzdCA9PSBlcnJvcl9tYXJrX25vZGUpCiAgICAg cmV0dXJuIHRydWU7CiAgIGlmIChmaXJzdCA9PSBOVUxMX1RSRUUpCkBAIC0x MzIzOCw2ICsxMzI0Nyw3IEBAIGhhbmRsZV9vbXBfYXJyYXlfc2VjdGlvbnMg KHRyZWUgYywgZW51bSBjX29tcF9yZWdpCiAgICAgICB1bnNpZ25lZCBpbnQg bnVtID0gdHlwZXMubGVuZ3RoICgpLCBpOwogICAgICAgdHJlZSB0LCBzaWRl X2VmZmVjdHMgPSBOVUxMX1RSRUUsIHNpemUgPSBOVUxMX1RSRUU7CiAgICAg ICB0cmVlIGNvbmRpdGlvbiA9IE5VTExfVFJFRTsKKyAgICAgIHRyZWUgbmNh cnJheV9kaW1zID0gTlVMTF9UUkVFOwogCiAgICAgICBpZiAoaW50X3NpemVf aW5fYnl0ZXMgKFRSRUVfVFlQRSAoZmlyc3QpKSA8PSAwKQogCW1heWJlX3pl cm9fbGVuID0gdHJ1ZTsKQEAgLTEzMjYxLDYgKzEzMjcxLDEzIEBAIGhhbmRs ZV9vbXBfYXJyYXlfc2VjdGlvbnMgKHRyZWUgYywgZW51bSBjX29tcF9yZWdp CiAJICAgIGxlbmd0aCA9IGZvbGRfY29udmVydCAoc2l6ZXR5cGUsIGxlbmd0 aCk7CiAJICBpZiAobG93X2JvdW5kID09IE5VTExfVFJFRSkKIAkgICAgbG93 X2JvdW5kID0gaW50ZWdlcl96ZXJvX25vZGU7CisKKwkgIGlmIChub25fY29u dGlndW91cykKKwkgICAgeworCSAgICAgIG5jYXJyYXlfZGltcyA9IHRyZWVf Y29ucyAobG93X2JvdW5kLCBsZW5ndGgsIG5jYXJyYXlfZGltcyk7CisJICAg ICAgY29udGludWU7CisJICAgIH0KKwogCSAgaWYgKCFtYXliZV96ZXJvX2xl biAmJiBpID4gZmlyc3Rfbm9uX29uZSkKIAkgICAgewogCSAgICAgIGlmIChp bnRlZ2VyX25vbnplcm9wIChsb3dfYm91bmQpKQpAQCAtMTMzNTcsNiArMTMz NzQsMTQgQEAgaGFuZGxlX29tcF9hcnJheV9zZWN0aW9ucyAodHJlZSBjLCBl bnVtIGNfb21wX3JlZ2kKIAkJc2l6ZSA9IHNpemVfYmlub3AgKE1VTFRfRVhQ Uiwgc2l6ZSwgbCk7CiAJICAgIH0KIAl9CisgICAgICBpZiAobm9uX2NvbnRp Z3VvdXMpCisJeworCSAgaW50IGtpbmQgPSBPTVBfQ0xBVVNFX01BUF9LSU5E IChjKTsKKwkgIE9NUF9DTEFVU0VfU0VUX01BUF9LSU5EIChjLCBraW5kIHwg R09NUF9NQVBfTk9OQ09OVElHX0FSUkFZKTsKKwkgIE9NUF9DTEFVU0VfREVD TCAoYykgPSB0OworCSAgT01QX0NMQVVTRV9TSVpFIChjKSA9IG5jYXJyYXlf ZGltczsKKwkgIHJldHVybiBmYWxzZTsKKwl9CiAgICAgICBpZiAoc2lkZV9l ZmZlY3RzKQogCXNpemUgPSBidWlsZDIgKENPTVBPVU5EX0VYUFIsIHNpemV0 eXBlLCBzaWRlX2VmZmVjdHMsIHNpemUpOwogICAgICAgaWYgKE9NUF9DTEFV U0VfQ09ERSAoYykgPT0gT01QX0NMQVVTRV9SRURVQ1RJT04KSW5kZXg6IGdj Yy9jcC9zZW1hbnRpY3MuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBn Y2MvY3Avc2VtYW50aWNzLmMJKHJldmlzaW9uIDI3NzgyNykKKysrIGdjYy9j cC9zZW1hbnRpY3MuYwkod29ya2luZyBjb3B5KQpAQCAtNDczMiw3ICs0NzMy LDcgQEAgb21wX3ByaXZhdGl6ZV9maWVsZCAodHJlZSB0LCBib29sIHNoYXJl ZCkKIHN0YXRpYyB0cmVlCiBoYW5kbGVfb21wX2FycmF5X3NlY3Rpb25zXzEg KHRyZWUgYywgdHJlZSB0LCB2ZWM8dHJlZT4gJnR5cGVzLAogCQkJICAgICBi b29sICZtYXliZV96ZXJvX2xlbiwgdW5zaWduZWQgaW50ICZmaXJzdF9ub25f b25lLAotCQkJICAgICBlbnVtIGNfb21wX3JlZ2lvbl90eXBlIG9ydCkKKwkJ CSAgICAgYm9vbCAmbm9uX2NvbnRpZ3VvdXMsIGVudW0gY19vbXBfcmVnaW9u X3R5cGUgb3J0KQogewogICB0cmVlIHJldCwgbG93X2JvdW5kLCBsZW5ndGgs IHR5cGU7CiAgIGlmIChUUkVFX0NPREUgKHQpICE9IFRSRUVfTElTVCkKQEAg LTQ4MTcsNyArNDgxNyw4IEBAIGhhbmRsZV9vbXBfYXJyYXlfc2VjdGlvbnNf MSAodHJlZSBjLCB0cmVlIHQsIHZlYzx0CiAgICAgICAmJiBUUkVFX0NPREUg KFRSRUVfQ0hBSU4gKHQpKSA9PSBGSUVMRF9ERUNMKQogICAgIFRSRUVfQ0hB SU4gKHQpID0gb21wX3ByaXZhdGl6ZV9maWVsZCAoVFJFRV9DSEFJTiAodCks IGZhbHNlKTsKICAgcmV0ID0gaGFuZGxlX29tcF9hcnJheV9zZWN0aW9uc18x IChjLCBUUkVFX0NIQUlOICh0KSwgdHlwZXMsCi0JCQkJICAgICBtYXliZV96 ZXJvX2xlbiwgZmlyc3Rfbm9uX29uZSwgb3J0KTsKKwkJCQkgICAgIG1heWJl X3plcm9fbGVuLCBmaXJzdF9ub25fb25lLAorCQkJCSAgICAgbm9uX2NvbnRp Z3VvdXMsIG9ydCk7CiAgIGlmIChyZXQgPT0gZXJyb3JfbWFya19ub2RlIHx8 IHJldCA9PSBOVUxMX1RSRUUpCiAgICAgcmV0dXJuIHJldDsKIApAQCAtNTAz NiwxNCArNTAzNywyMSBAQCBoYW5kbGVfb21wX2FycmF5X3NlY3Rpb25zXzEg KHRyZWUgYywgdHJlZSB0LCB2ZWM8dAogCSAgcmV0dXJuIGVycm9yX21hcmtf bm9kZTsKIAl9CiAgICAgICAvKiBJZiB0aGVyZSBpcyBhIHBvaW50ZXIgdHlw ZSBhbnl3aGVyZSBidXQgaW4gdGhlIHZlcnkgZmlyc3QKLQkgYXJyYXktc2Vj dGlvbi1zdWJzY3JpcHQsIHRoZSBhcnJheSBzZWN0aW9uIGNhbid0IGJlIGNv bnRpZ3VvdXMuICAqLworCSBhcnJheS1zZWN0aW9uLXN1YnNjcmlwdCwgdGhl IGFycmF5IHNlY3Rpb24gY2FuJ3QgYmUgY29udGlndW91cy4KKwkgTm90ZSB0 aGF0IE9wZW5BQ0MgZG9lcyBhY2NlcHQgdGhlc2Uga2luZHMgb2Ygbm9uLWNv bnRpZ3VvdXMgcG9pbnRlcgorCSBiYXNlZCBhcnJheXMuICAqLwogICAgICAg aWYgKE9NUF9DTEFVU0VfQ09ERSAoYykgIT0gT01QX0NMQVVTRV9ERVBFTkQK IAkgICYmIFRSRUVfQ09ERSAoVFJFRV9DSEFJTiAodCkpID09IFRSRUVfTElT VCkKIAl7Ci0JICBlcnJvcl9hdCAoT01QX0NMQVVTRV9MT0NBVElPTiAoYyks Ci0JCSAgICAiYXJyYXkgc2VjdGlvbiBpcyBub3QgY29udGlndW91cyBpbiAl cXMgY2xhdXNlIiwKLQkJICAgIG9tcF9jbGF1c2VfY29kZV9uYW1lW09NUF9D TEFVU0VfQ09ERSAoYyldKTsKLQkgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7 CisJICBpZiAob3J0ID09IENfT1JUX0FDQykKKwkgICAgbm9uX2NvbnRpZ3Vv dXMgPSB0cnVlOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZXJyb3JfYXQg KE9NUF9DTEFVU0VfTE9DQVRJT04gKGMpLAorCQkJImFycmF5IHNlY3Rpb24g aXMgbm90IGNvbnRpZ3VvdXMgaW4gJXFzIGNsYXVzZSIsCisJCQlvbXBfY2xh dXNlX2NvZGVfbmFtZVtPTVBfQ0xBVVNFX0NPREUgKGMpXSk7CisJICAgICAg cmV0dXJuIGVycm9yX21hcmtfbm9kZTsKKwkgICAgfQogCX0KICAgICB9CiAg IGVsc2UKQEAgLTUwODMsNiArNTA5MSw3IEBAIGhhbmRsZV9vbXBfYXJyYXlf c2VjdGlvbnMgKHRyZWUgYywgZW51bSBjX29tcF9yZWdpCiB7CiAgIGJvb2wg bWF5YmVfemVyb19sZW4gPSBmYWxzZTsKICAgdW5zaWduZWQgaW50IGZpcnN0 X25vbl9vbmUgPSAwOworICBib29sIG5vbl9jb250aWd1b3VzID0gZmFsc2U7 CiAgIGF1dG9fdmVjPHRyZWUsIDEwPiB0eXBlczsKICAgdHJlZSAqdHAgPSAm T01QX0NMQVVTRV9ERUNMIChjKTsKICAgaWYgKE9NUF9DTEFVU0VfQ09ERSAo YykgPT0gT01QX0NMQVVTRV9ERVBFTkQKQEAgLTUwOTIsNyArNTEwMSw3IEBA IGhhbmRsZV9vbXBfYXJyYXlfc2VjdGlvbnMgKHRyZWUgYywgZW51bSBjX29t cF9yZWdpCiAgICAgdHAgPSAmVFJFRV9WQUxVRSAoKnRwKTsKICAgdHJlZSBm aXJzdCA9IGhhbmRsZV9vbXBfYXJyYXlfc2VjdGlvbnNfMSAoYywgKnRwLCB0 eXBlcywKIAkJCQkJICAgIG1heWJlX3plcm9fbGVuLCBmaXJzdF9ub25fb25l LAotCQkJCQkgICAgb3J0KTsKKwkJCQkJICAgIG5vbl9jb250aWd1b3VzLCBv cnQpOwogICBpZiAoZmlyc3QgPT0gZXJyb3JfbWFya19ub2RlKQogICAgIHJl dHVybiB0cnVlOwogICBpZiAoZmlyc3QgPT0gTlVMTF9UUkVFKQpAQCAtNTEy Niw2ICs1MTM1LDcgQEAgaGFuZGxlX29tcF9hcnJheV9zZWN0aW9ucyAodHJl ZSBjLCBlbnVtIGNfb21wX3JlZ2kKICAgICAgIHVuc2lnbmVkIGludCBudW0g PSB0eXBlcy5sZW5ndGggKCksIGk7CiAgICAgICB0cmVlIHQsIHNpZGVfZWZm ZWN0cyA9IE5VTExfVFJFRSwgc2l6ZSA9IE5VTExfVFJFRTsKICAgICAgIHRy ZWUgY29uZGl0aW9uID0gTlVMTF9UUkVFOworICAgICAgdHJlZSBuY2FycmF5 X2RpbXMgPSBOVUxMX1RSRUU7CiAKICAgICAgIGlmIChpbnRfc2l6ZV9pbl9i eXRlcyAoVFJFRV9UWVBFIChmaXJzdCkpIDw9IDApCiAJbWF5YmVfemVyb19s ZW4gPSB0cnVlOwpAQCAtNTE1MSw2ICs1MTYxLDEzIEBAIGhhbmRsZV9vbXBf YXJyYXlfc2VjdGlvbnMgKHRyZWUgYywgZW51bSBjX29tcF9yZWdpCiAJICAg IGxlbmd0aCA9IGZvbGRfY29udmVydCAoc2l6ZXR5cGUsIGxlbmd0aCk7CiAJ ICBpZiAobG93X2JvdW5kID09IE5VTExfVFJFRSkKIAkgICAgbG93X2JvdW5k ID0gaW50ZWdlcl96ZXJvX25vZGU7CisKKwkgIGlmIChub25fY29udGlndW91 cykKKwkgICAgeworCSAgICAgIG5jYXJyYXlfZGltcyA9IHRyZWVfY29ucyAo bG93X2JvdW5kLCBsZW5ndGgsIG5jYXJyYXlfZGltcyk7CisJICAgICAgY29u dGludWU7CisJICAgIH0KKwogCSAgaWYgKCFtYXliZV96ZXJvX2xlbiAmJiBp ID4gZmlyc3Rfbm9uX29uZSkKIAkgICAgewogCSAgICAgIGlmIChpbnRlZ2Vy X25vbnplcm9wIChsb3dfYm91bmQpKQpAQCAtNTI0Miw2ICs1MjU5LDE0IEBA IGhhbmRsZV9vbXBfYXJyYXlfc2VjdGlvbnMgKHRyZWUgYywgZW51bSBjX29t cF9yZWdpCiAJfQogICAgICAgaWYgKCFwcm9jZXNzaW5nX3RlbXBsYXRlX2Rl Y2wpCiAJeworCSAgaWYgKG5vbl9jb250aWd1b3VzKQorCSAgICB7CisJICAg ICAgaW50IGtpbmQgPSBPTVBfQ0xBVVNFX01BUF9LSU5EIChjKTsKKwkgICAg ICBPTVBfQ0xBVVNFX1NFVF9NQVBfS0lORCAoYywga2luZCB8IEdPTVBfTUFQ X05PTkNPTlRJR19BUlJBWSk7CisJICAgICAgT01QX0NMQVVTRV9ERUNMIChj KSA9IHQ7CisJICAgICAgT01QX0NMQVVTRV9TSVpFIChjKSA9IG5jYXJyYXlf ZGltczsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KIAkgIGlmIChz aWRlX2VmZmVjdHMpCiAJICAgIHNpemUgPSBidWlsZDIgKENPTVBPVU5EX0VY UFIsIHNpemV0eXBlLCBzaWRlX2VmZmVjdHMsIHNpemUpOwogCSAgaWYgKE9N UF9DTEFVU0VfQ09ERSAoYykgPT0gT01QX0NMQVVTRV9SRURVQ1RJT04KSW5k ZXg6IGdjYy9naW1wbGlmeS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t IGdjYy9naW1wbGlmeS5jCShyZXZpc2lvbiAyNzc4MjcpCisrKyBnY2MvZ2lt cGxpZnkuYwkod29ya2luZyBjb3B5KQpAQCAtODYyMiw5ICs4NjIyLDE3IEBA IGdpbXBsaWZ5X3NjYW5fb21wX2NsYXVzZXMgKHRyZWUgKmxpc3RfcCwgZ2lt cGxlX3NlCiAJICBpZiAoT01QX0NMQVVTRV9TSVpFIChjKSA9PSBOVUxMX1RS RUUpCiAJICAgIE9NUF9DTEFVU0VfU0laRSAoYykgPSBERUNMX1AgKGRlY2wp ID8gREVDTF9TSVpFX1VOSVQgKGRlY2wpCiAJCQkJICA6IFRZUEVfU0laRV9V TklUIChUUkVFX1RZUEUgKGRlY2wpKTsKLQkgIGlmIChnaW1wbGlmeV9leHBy ICgmT01QX0NMQVVTRV9TSVpFIChjKSwgcHJlX3AsCi0JCQkgICAgIE5VTEws IGlzX2dpbXBsZV92YWwsIGZiX3J2YWx1ZSkgPT0gR1NfRVJST1IpCisJICBp ZiAoT01QX0NMQVVTRV9TSVpFIChjKQorCSAgICAgICYmIFRSRUVfQ09ERSAo T01QX0NMQVVTRV9TSVpFIChjKSkgPT0gVFJFRV9MSVNUCisJICAgICAgJiYg R09NUF9NQVBfTk9OQ09OVElHX0FSUkFZX1AgKE9NUF9DTEFVU0VfTUFQX0tJ TkQgKGMpKSkKIAkgICAgeworCSAgICAgIC8qIEZvciBub24tY29udGlndW91 cyBhcnJheSBtYXBzLCBPTVBfQ0xBVVNFX1NJWkUgaXMgYSBUUkVFX0xJU1QK KwkJIG9mIHRoZSBpbmRpdmlkdWFsIGFycmF5IGRpbWVuc2lvbnMsIHdoaWNo IGdpbXBsaWZ5X2V4cHIgZG9lc24ndAorCQkgaGFuZGxlLCBzbyBza2lwIHRo ZSBjYWxsIHRvIGdpbXBsaWZ5X2V4cHIgaGVyZS4gICovCisJICAgIH0KKwkg IGVsc2UgaWYgKGdpbXBsaWZ5X2V4cHIgKCZPTVBfQ0xBVVNFX1NJWkUgKGMp LCBwcmVfcCwKKwkJCQkgIE5VTEwsIGlzX2dpbXBsZV92YWwsIGZiX3J2YWx1 ZSkgPT0gR1NfRVJST1IpCisJICAgIHsKIAkgICAgICByZW1vdmUgPSB0cnVl OwogCSAgICAgIGJyZWFrOwogCSAgICB9CkluZGV4OiBnY2Mvb21wLWxvdy5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9vbXAtbG93LmMJKHJl dmlzaW9uIDI3NzgyNykKKysrIGdjYy9vbXAtbG93LmMJKHdvcmtpbmcgY29w eSkKQEAgLTg5NCw2ICs4OTQsMTM3IEBAIG9tcF9jb3B5X2RlY2wgKHRyZWUg dmFyLCBjb3B5X2JvZHlfZGF0YSAqY2IpCiAgIHJldHVybiBlcnJvcl9tYXJr X25vZGU7CiB9CiAKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgY3JlYXRlX25v bmNvbnRpZ19hcnJheV9kZXNjcl90eXBlKCksIHRvIGFwcGVuZCBhIG5ldyBm aWVsZAorICAgdG8gYSByZWNvcmQgdHlwZS4gICovCisKK3N0YXRpYyB2b2lk CithcHBlbmRfZmllbGRfdG9fcmVjb3JkX3R5cGUgKHRyZWUgcmVjb3JkX3R5 cGUsIHRyZWUgZmxkX2lkZW50LCB0cmVlIGZsZF90eXBlKQoreworICB0cmVl ICpwLCBmbGQgPSBidWlsZF9kZWNsIChVTktOT1dOX0xPQ0FUSU9OLCBGSUVM RF9ERUNMLCBmbGRfaWRlbnQsIGZsZF90eXBlKTsKKyAgREVDTF9DT05URVhU IChmbGQpID0gcmVjb3JkX3R5cGU7CisKKyAgZm9yIChwID0gJlRZUEVfRklF TERTIChyZWNvcmRfdHlwZSk7ICpwOyBwID0gJkRFQ0xfQ0hBSU4gKCpwKSkK KyAgICA7CisgICpwID0gZmxkOworfQorCisvKiBDcmVhdGUgdHlwZSBmb3Ig bm9uLWNvbnRpZ3VvdXMgYXJyYXkgZGVzY3JpcHRvci4gUmV0dXJucyBjcmVh dGVkIHR5cGUsIGFuZAorICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpbWVu c2lvbnMgaW4gKkRJTV9OVU0uICAqLworCitzdGF0aWMgdHJlZQorY3JlYXRl X25vbmNvbnRpZ19hcnJheV9kZXNjcl90eXBlICh0cmVlIGRlY2wsIHRyZWUg ZGltcywgaW50ICpkaW1fbnVtKQoreworICBpbnQgbiA9IDA7CisgIHRyZWUg YXJyYXlfZGVzY3JfdHlwZSwgbmFtZSwgeDsKKyAgZ2NjX2Fzc2VydCAoVFJF RV9DT0RFIChkaW1zKSA9PSBUUkVFX0xJU1QpOworCisgIGFycmF5X2Rlc2Ny X3R5cGUgPSBsYW5nX2hvb2tzLnR5cGVzLm1ha2VfdHlwZSAoUkVDT1JEX1RZ UEUpOworICBuYW1lID0gY3JlYXRlX3RtcF92YXJfbmFtZSAoIi5vbXBfbm9u Y29udGlnX2FycmF5X2Rlc2NyX3R5cGUiKTsKKyAgbmFtZSA9IGJ1aWxkX2Rl Y2wgKFVOS05PV05fTE9DQVRJT04sIFRZUEVfREVDTCwgbmFtZSwgYXJyYXlf ZGVzY3JfdHlwZSk7CisgIERFQ0xfQVJUSUZJQ0lBTCAobmFtZSkgPSAxOwor ICBERUNMX05BTUVMRVNTIChuYW1lKSA9IDE7CisgIFRZUEVfTkFNRSAoYXJy YXlfZGVzY3JfdHlwZSkgPSBuYW1lOworICBUWVBFX0FSVElGSUNJQUwgKGFy cmF5X2Rlc2NyX3R5cGUpID0gMTsKKworICAvKiBNYWluIHN0YXJ0aW5nIHBv aW50ZXIvYXJyYXkuICAqLworICB0cmVlIG1haW5fdmFyX3R5cGUgPSBUUkVF X1RZUEUgKGRlY2wpOworICBpZiAoVFJFRV9DT0RFIChtYWluX3Zhcl90eXBl KSA9PSBSRUZFUkVOQ0VfVFlQRSkKKyAgICBtYWluX3Zhcl90eXBlID0gVFJF RV9UWVBFIChtYWluX3Zhcl90eXBlKTsKKyAgYXBwZW5kX2ZpZWxkX3RvX3Jl Y29yZF90eXBlIChhcnJheV9kZXNjcl90eXBlLCBERUNMX05BTUUgKGRlY2wp LAorCQkJICAgICAgIChUUkVFX0NPREUgKFRSRUVfVFlQRSAoZGVjbCkpID09 IFBPSU5URVJfVFlQRQorCQkJCT8gbWFpbl92YXJfdHlwZQorCQkJCTogYnVp bGRfcG9pbnRlcl90eXBlIChtYWluX3Zhcl90eXBlKSkpOworICAvKiBOdW1i ZXIgb2YgZGltZW5zaW9ucy4gICovCisgIGFwcGVuZF9maWVsZF90b19yZWNv cmRfdHlwZSAoYXJyYXlfZGVzY3JfdHlwZSwgZ2V0X2lkZW50aWZpZXIgKCJf X2RpbV9udW0iKSwKKwkJCSAgICAgICBzaXpldHlwZSk7CisKKyAgZm9yICh4 ID0gZGltczsgeDsgeCA9IFRSRUVfQ0hBSU4gKHgpLCBuKyspCisgICAgewor ICAgICAgY2hhciAqZmxkbmFtZTsKKyAgICAgIC8qIE9uZSBmb3IgdGhlIHN0 YXJ0IGluZGV4LiAgKi8KKyAgICAgIEFTTV9GT1JNQVRfUFJJVkFURV9OQU1F IChmbGRuYW1lLCAiX19kaW1fYmFzZSIsIG4pOworICAgICAgYXBwZW5kX2Zp ZWxkX3RvX3JlY29yZF90eXBlIChhcnJheV9kZXNjcl90eXBlLCBnZXRfaWRl bnRpZmllciAoZmxkbmFtZSksCisJCQkJICAgc2l6ZXR5cGUpOworICAgICAg LyogT25lIGZvciB0aGUgbGVuZ3RoLiAgKi8KKyAgICAgIEFTTV9GT1JNQVRf UFJJVkFURV9OQU1FIChmbGRuYW1lLCAiX19kaW1fbGVuZ3RoIiwgbik7Cisg ICAgICBhcHBlbmRfZmllbGRfdG9fcmVjb3JkX3R5cGUgKGFycmF5X2Rlc2Ny X3R5cGUsIGdldF9pZGVudGlmaWVyIChmbGRuYW1lKSwKKwkJCQkgICBzaXpl dHlwZSk7CisgICAgICAvKiBPbmUgZm9yIHRoZSBlbGVtZW50IHNpemUuICAq LworICAgICAgQVNNX0ZPUk1BVF9QUklWQVRFX05BTUUgKGZsZG5hbWUsICJf X2RpbV9lbGVtX3NpemUiLCBuKTsKKyAgICAgIGFwcGVuZF9maWVsZF90b19y ZWNvcmRfdHlwZSAoYXJyYXlfZGVzY3JfdHlwZSwgZ2V0X2lkZW50aWZpZXIg KGZsZG5hbWUpLAorCQkJCSAgIHNpemV0eXBlKTsKKyAgICAgIC8qIE9uZSBm b3IgaXNfYXJyYXkgZmxhZy4gICovCisgICAgICBBU01fRk9STUFUX1BSSVZB VEVfTkFNRSAoZmxkbmFtZSwgIl9fZGltX2lzX2FycmF5Iiwgbik7CisgICAg ICBhcHBlbmRfZmllbGRfdG9fcmVjb3JkX3R5cGUgKGFycmF5X2Rlc2NyX3R5 cGUsIGdldF9pZGVudGlmaWVyIChmbGRuYW1lKSwKKwkJCQkgICBzaXpldHlw ZSk7CisgICAgfQorCisgIGxheW91dF90eXBlIChhcnJheV9kZXNjcl90eXBl KTsKKyAgKmRpbV9udW0gPSBuOworICByZXR1cm4gYXJyYXlfZGVzY3JfdHlw ZTsKK30KKworLyogR2VuZXJhdGUgY29kZSBzZXF1ZW5jZSBmb3IgaW5pdGlh bGl6aW5nIG5vbi1jb250aWd1b3VzIGFycmF5IGRlc2NyaXB0b3IuICAqLwor CitzdGF0aWMgdm9pZAorY3JlYXRlX25vbmNvbnRpZ19hcnJheV9kZXNjcl9p bml0X2NvZGUgKHRyZWUgYXJyYXlfZGVzY3IsIHRyZWUgYXJyYXlfdmFyLAor CQkJCQl0cmVlIGRpbWVuc2lvbnMsIGludCBkaW1fbnVtLAorCQkJCQlnaW1w bGVfc2VxICppbGlzdCkKK3sKKyAgdHJlZSBmbGQsIGZsZHJlZjsKKyAgdHJl ZSBhcnJheV9kZXNjcl90eXBlID0gVFJFRV9UWVBFIChhcnJheV9kZXNjcik7 CisgIHRyZWUgZGltX3R5cGUgPSBUUkVFX1RZUEUgKGFycmF5X3Zhcik7CisK KyAgZmxkID0gVFlQRV9GSUVMRFMgKGFycmF5X2Rlc2NyX3R5cGUpOworICBm bGRyZWYgPSBvbXBfYnVpbGRfY29tcG9uZW50X3JlZiAoYXJyYXlfZGVzY3Is IGZsZCk7CisgIGdpbXBsaWZ5X2Fzc2lnbiAoZmxkcmVmLCAoVFJFRV9DT0RF IChkaW1fdHlwZSkgPT0gQVJSQVlfVFlQRQorCQkJICAgID8gYnVpbGRfZm9s ZF9hZGRyX2V4cHIgKGFycmF5X3ZhcikgOiBhcnJheV92YXIpLAorCQkgICBp bGlzdCk7CisKKyAgaWYgKFRSRUVfQ09ERSAoZGltX3R5cGUpID09IFJFRkVS RU5DRV9UWVBFKQorICAgIGRpbV90eXBlID0gVFJFRV9UWVBFIChkaW1fdHlw ZSk7CisKKyAgZmxkID0gVFJFRV9DSEFJTiAoZmxkKTsKKyAgZmxkcmVmID0g b21wX2J1aWxkX2NvbXBvbmVudF9yZWYgKGFycmF5X2Rlc2NyLCBmbGQpOwor ICBnaW1wbGlmeV9hc3NpZ24gKGZsZHJlZiwgYnVpbGRfaW50X2NzdCAoc2l6 ZXR5cGUsIGRpbV9udW0pLCBpbGlzdCk7CisKKyAgd2hpbGUgKGRpbWVuc2lv bnMpCisgICAgeworICAgICAgdHJlZSBkaW1fYmFzZSA9IGZvbGRfY29udmVy dCAoc2l6ZXR5cGUsIFRSRUVfUFVSUE9TRSAoZGltZW5zaW9ucykpOworICAg ICAgdHJlZSBkaW1fbGVuZ3RoID0gZm9sZF9jb252ZXJ0IChzaXpldHlwZSwg VFJFRV9WQUxVRSAoZGltZW5zaW9ucykpOworICAgICAgdHJlZSBkaW1fZWxl bV9zaXplID0gVFlQRV9TSVpFX1VOSVQgKFRSRUVfVFlQRSAoZGltX3R5cGUp KTsKKyAgICAgIHRyZWUgZGltX2lzX2FycmF5ID0gKFRSRUVfQ09ERSAoZGlt X3R5cGUpID09IEFSUkFZX1RZUEUKKwkJCSAgID8gaW50ZWdlcl9vbmVfbm9k ZSA6IGludGVnZXJfemVyb19ub2RlKTsKKyAgICAgIC8qIFNldCBiYXNlLiAg Ki8KKyAgICAgIGZsZCA9IFRSRUVfQ0hBSU4gKGZsZCk7CisgICAgICBmbGRy ZWYgPSBvbXBfYnVpbGRfY29tcG9uZW50X3JlZiAoYXJyYXlfZGVzY3IsIGZs ZCk7CisgICAgICBkaW1fYmFzZSA9IGZvbGRfYnVpbGQyIChNVUxUX0VYUFIs IHNpemV0eXBlLCBkaW1fYmFzZSwgZGltX2VsZW1fc2l6ZSk7CisgICAgICBn aW1wbGlmeV9hc3NpZ24gKGZsZHJlZiwgZGltX2Jhc2UsIGlsaXN0KTsKKwor ICAgICAgLyogU2V0IGxlbmd0aC4gICovCisgICAgICBmbGQgPSBUUkVFX0NI QUlOIChmbGQpOworICAgICAgZmxkcmVmID0gb21wX2J1aWxkX2NvbXBvbmVu dF9yZWYgKGFycmF5X2Rlc2NyLCBmbGQpOworICAgICAgZGltX2xlbmd0aCA9 IGZvbGRfYnVpbGQyIChNVUxUX0VYUFIsIHNpemV0eXBlLCBkaW1fbGVuZ3Ro LCBkaW1fZWxlbV9zaXplKTsKKyAgICAgIGdpbXBsaWZ5X2Fzc2lnbiAoZmxk cmVmLCBkaW1fbGVuZ3RoLCBpbGlzdCk7CisKKyAgICAgIC8qIFNldCBlbGVt X3NpemUuICAqLworICAgICAgZmxkID0gVFJFRV9DSEFJTiAoZmxkKTsKKyAg ICAgIGZsZHJlZiA9IG9tcF9idWlsZF9jb21wb25lbnRfcmVmIChhcnJheV9k ZXNjciwgZmxkKTsKKyAgICAgIGRpbV9lbGVtX3NpemUgPSBmb2xkX2NvbnZl cnQgKHNpemV0eXBlLCBkaW1fZWxlbV9zaXplKTsKKyAgICAgIGdpbXBsaWZ5 X2Fzc2lnbiAoZmxkcmVmLCBkaW1fZWxlbV9zaXplLCBpbGlzdCk7CisKKyAg ICAgIC8qIFNldCBpc19hcnJheSBmbGFnLiAgKi8KKyAgICAgIGZsZCA9IFRS RUVfQ0hBSU4gKGZsZCk7CisgICAgICBmbGRyZWYgPSBvbXBfYnVpbGRfY29t cG9uZW50X3JlZiAoYXJyYXlfZGVzY3IsIGZsZCk7CisgICAgICBkaW1faXNf YXJyYXkgPSBmb2xkX2NvbnZlcnQgKHNpemV0eXBlLCBkaW1faXNfYXJyYXkp OworICAgICAgZ2ltcGxpZnlfYXNzaWduIChmbGRyZWYsIGRpbV9pc19hcnJh eSwgaWxpc3QpOworCisgICAgICBkaW1lbnNpb25zID0gVFJFRV9DSEFJTiAo ZGltZW5zaW9ucyk7CisgICAgICBkaW1fdHlwZSA9IFRSRUVfVFlQRSAoZGlt X3R5cGUpOworICAgIH0KKyAgZ2NjX2Fzc2VydCAoVFJFRV9DSEFJTiAoZmxk KSA9PSBOVUxMX1RSRUUpOworfQorCiAvKiBDcmVhdGUgYSBuZXcgY29udGV4 dCwgd2l0aCBPVVRFUl9DVFggYmVpbmcgdGhlIHN1cnJvdW5kaW5nIGNvbnRl eHQuICAqLwogCiBzdGF0aWMgb21wX2NvbnRleHQgKgpAQCAtMTM2Nyw2ICsx NDk4LDM4IEBAIHNjYW5fc2hhcmluZ19jbGF1c2VzICh0cmVlIGNsYXVzZXMs IG9tcF9jb250ZXh0ICpjCiAJICAgICAgaW5zdGFsbF92YXJfbG9jYWwgKGRl Y2wsIGN0eCk7CiAJICAgICAgYnJlYWs7CiAJICAgIH0KKworCSAgaWYgKE9N UF9DTEFVU0VfQ09ERSAoYykgPT0gT01QX0NMQVVTRV9NQVAKKwkgICAgICAm JiBHT01QX01BUF9OT05DT05USUdfQVJSQVlfUCAoT01QX0NMQVVTRV9NQVBf S0lORCAoYykpKQorCSAgICB7CisJICAgICAgdHJlZSBhcnJheV9kZWNsID0g T01QX0NMQVVTRV9ERUNMIChjKTsKKwkgICAgICB0cmVlIGFycmF5X3R5cGUg PSBUUkVFX1RZUEUgKGFycmF5X2RlY2wpOworCSAgICAgIGJvb2wgYnlfcmVm ID0gKFRSRUVfQ09ERSAoYXJyYXlfdHlwZSkgPT0gQVJSQVlfVFlQRQorCQkJ ICAgICA/IHRydWUgOiBmYWxzZSk7CisKKwkgICAgICAvKiBDaGVja2luZyBj b2RlIHRvIGVuc3VyZSB3ZSBvbmx5IGhhdmUgYXJyYXlzIGF0IHRvcCBkaW1l bnNpb24uCisJCSBUaGlzIGxpbWl0YXRpb24gbWlnaHQgYmUgbGlmdGVkIGlu IHRoZSBmdXR1cmUuICAqLworCSAgICAgIGlmIChUUkVFX0NPREUgKGFycmF5 X3R5cGUpID09IFJFRkVSRU5DRV9UWVBFKQorCQlhcnJheV90eXBlID0gVFJF RV9UWVBFIChhcnJheV90eXBlKTsKKwkgICAgICB0cmVlIHQgPSBhcnJheV90 eXBlLCBwcmV2X3QgPSBOVUxMX1RSRUU7CisJICAgICAgd2hpbGUgKHQpCisJ CXsKKwkJICBpZiAoVFJFRV9DT0RFICh0KSA9PSBBUlJBWV9UWVBFICYmIHBy ZXZfdCkKKwkJICAgIHsKKwkJICAgICAgZXJyb3JfYXQgKGdpbXBsZV9sb2Nh dGlvbiAoY3R4LT5zdG10KSwgImFycmF5IHR5cGVzIGFyZSIKKwkJCQkiIG9u bHkgYWxsb3dlZCBhdCBvdXRlcm1vc3QgZGltZW5zaW9uIG9mIgorCQkJCSIg bm9uLWNvbnRpZ3VvdXMgYXJyYXkiKTsKKwkJICAgICAgYnJlYWs7CisJCSAg ICB9CisJCSAgcHJldl90ID0gdDsKKwkJICB0ID0gVFJFRV9UWVBFICh0KTsK KwkJfQorCisJICAgICAgaW5zdGFsbF92YXJfZmllbGQgKGFycmF5X2RlY2ws IGJ5X3JlZiwgMywgY3R4KTsKKwkgICAgICBpbnN0YWxsX3Zhcl9sb2NhbCAo YXJyYXlfZGVjbCwgY3R4KTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCiAJ ICBpZiAoREVDTF9QIChkZWNsKSkKIAkgICAgewogCSAgICAgIGlmIChERUNM X1NJWkUgKGRlY2wpCkBAIC0yNTk3LDYgKzI3NjAsNTAgQEAgc2Nhbl9vbXBf c2luZ2xlIChnb21wX3NpbmdsZSAqc3RtdCwgb21wX2NvbnRleHQgKm8KICAg ICBsYXlvdXRfdHlwZSAoY3R4LT5yZWNvcmRfdHlwZSk7CiB9CiAKKy8qIFJl b3JkZXIgY2xhdXNlcyBzbyB0aGF0IG5vbi1jb250aWd1b3VzIGFycmF5IG1h cCBjbGF1c2VzIGFyZSBwbGFjZWQgYXQgdGhlIHZlcnkKKyAgIGZyb250IG9m IHRoZSBjaGFpbi4gICovCisKK3N0YXRpYyB2b2lkCityZW9yZGVyX25vbmNv bnRpZ19hcnJheV9jbGF1c2VzICh0cmVlICpjbGF1c2VzX3B0cikKK3sKKyAg dHJlZSBjLCBjbGF1c2VzID0gKmNsYXVzZXNfcHRyOworICB0cmVlIHByZXZf Y2xhdXNlID0gTlVMTF9UUkVFLCBuZXh0X2NsYXVzZTsKKyAgdHJlZSBhcnJh eV9jbGF1c2VzID0gTlVMTF9UUkVFLCBhcnJheV9jbGF1c2VzX3RhaWwgPSBO VUxMX1RSRUU7CisKKyAgZm9yIChjID0gY2xhdXNlczsgYzsgYyA9IG5leHRf Y2xhdXNlKQorICAgIHsKKyAgICAgIG5leHRfY2xhdXNlID0gT01QX0NMQVVT RV9DSEFJTiAoYyk7CisKKyAgICAgIGlmIChPTVBfQ0xBVVNFX0NPREUgKGMp ID09IE9NUF9DTEFVU0VfTUFQCisJICAmJiBHT01QX01BUF9OT05DT05USUdf QVJSQVlfUCAoT01QX0NMQVVTRV9NQVBfS0lORCAoYykpKQorCXsKKwkgIC8q IFVuY2hhaW4gYyBmcm9tIGNsYXVzZXMuICAqLworCSAgaWYgKGMgPT0gY2xh dXNlcykKKwkgICAgY2xhdXNlcyA9IG5leHRfY2xhdXNlOworCisJICAvKiBM aW5rIG9uIHRvIGFycmF5X2NsYXVzZXMuICAqLworCSAgaWYgKGFycmF5X2Ns YXVzZXNfdGFpbCkKKwkgICAgT01QX0NMQVVTRV9DSEFJTiAoYXJyYXlfY2xh dXNlc190YWlsKSA9IGM7CisJICBlbHNlCisJICAgIGFycmF5X2NsYXVzZXMg PSBjOworCSAgYXJyYXlfY2xhdXNlc190YWlsID0gYzsKKworCSAgaWYgKHBy ZXZfY2xhdXNlKQorCSAgICBPTVBfQ0xBVVNFX0NIQUlOIChwcmV2X2NsYXVz ZSkgPSBuZXh0X2NsYXVzZTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAg cHJldl9jbGF1c2UgPSBjOworICAgIH0gIAorCisgIC8qIFBsYWNlIG5vbi1j b250aWd1b3VzIGFycmF5IGNsYXVzZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBj bGF1c2UgbGlzdC4gICovCisgIGlmIChhcnJheV9jbGF1c2VzKQorICAgIHsK KyAgICAgIE9NUF9DTEFVU0VfQ0hBSU4gKGFycmF5X2NsYXVzZXNfdGFpbCkg PSBjbGF1c2VzOworICAgICAgKmNsYXVzZXNfcHRyID0gYXJyYXlfY2xhdXNl czsKKyAgICB9Cit9CisKIC8qIFNjYW4gYSBHSU1QTEVfT01QX1RBUkdFVC4g ICovCiAKIHN0YXRpYyB2b2lkCkBAIC0yNjA1LDcgKzI4MTIsNiBAQCBzY2Fu X29tcF90YXJnZXQgKGdvbXBfdGFyZ2V0ICpzdG10LCBvbXBfY29udGV4dCAq bwogICBvbXBfY29udGV4dCAqY3R4OwogICB0cmVlIG5hbWU7CiAgIGJvb2wg b2ZmbG9hZGVkID0gaXNfZ2ltcGxlX29tcF9vZmZsb2FkZWQgKHN0bXQpOwot ICB0cmVlIGNsYXVzZXMgPSBnaW1wbGVfb21wX3RhcmdldF9jbGF1c2VzIChz dG10KTsKIAogICBjdHggPSBuZXdfb21wX2NvbnRleHQgKHN0bXQsIG91dGVy X2N0eCk7CiAgIGN0eC0+ZmllbGRfbWFwID0gc3BsYXlfdHJlZV9uZXcgKHNw bGF5X3RyZWVfY29tcGFyZV9wb2ludGVycywgMCwgMCk7CkBAIC0yNjI0LDYg KzI4MzAsMTQgQEAgc2Nhbl9vbXBfdGFyZ2V0IChnb21wX3RhcmdldCAqc3Rt dCwgb21wX2NvbnRleHQgKm8KICAgICAgIGdpbXBsZV9vbXBfdGFyZ2V0X3Nl dF9jaGlsZF9mbiAoc3RtdCwgY3R4LT5jYi5kc3RfZm4pOwogICAgIH0KIAor ICAvKiBJZiBpcyBPcGVuQUNDIGNvbnN0cnVjdCwgcHV0IG5vbi1jb250aWd1 b3VzIGFycmF5IGNsYXVzZXMgKGlmIGFueSkKKyAgICAgaW4gZnJvbnQgb2Yg Y2xhdXNlIGNoYWluLiBUaGUgcnVudGltZSBjYW4gdGhlbiB0ZXN0IHRoZSBm aXJzdCB0byBzZWUKKyAgICAgaWYgdGhlIGFkZGl0aW9uYWwgbWFwIHByb2Nl c3NpbmcgZm9yIHRoZW0gaXMgcmVxdWlyZWQuICAqLworICBpZiAoaXNfZ2lt cGxlX29tcF9vYWNjIChzdG10KSkKKyAgICByZW9yZGVyX25vbmNvbnRpZ19h cnJheV9jbGF1c2VzIChnaW1wbGVfb21wX3RhcmdldF9jbGF1c2VzX3B0ciAo c3RtdCkpOworCisgIHRyZWUgY2xhdXNlcyA9IGdpbXBsZV9vbXBfdGFyZ2V0 X2NsYXVzZXMgKHN0bXQpOworICAKICAgc2Nhbl9zaGFyaW5nX2NsYXVzZXMg KGNsYXVzZXMsIGN0eCk7CiAgIHNjYW5fb21wIChnaW1wbGVfb21wX2JvZHlf cHRyIChzdG10KSwgY3R4KTsKIApAQCAtMTEzMzUsNiArMTE1NDksMTUgQEAg bG93ZXJfb21wX3RhcmdldCAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaV9w LCBvbXAKIAkgIGNhc2UgR09NUF9NQVBfRk9SQ0VfUFJFU0VOVDoKIAkgIGNh c2UgR09NUF9NQVBfRk9SQ0VfREVWSUNFUFRSOgogCSAgY2FzZSBHT01QX01B UF9ERVZJQ0VfUkVTSURFTlQ6CisJICBjYXNlIEdPTVBfTUFQX05PTkNPTlRJ R19BUlJBWV9UTzoKKwkgIGNhc2UgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZ X0ZST006CisJICBjYXNlIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9UT0ZS T006CisJICBjYXNlIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9GT1JDRV9U TzoKKwkgIGNhc2UgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZX0ZPUkNFX0ZS T006CisJICBjYXNlIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9GT1JDRV9U T0ZST006CisJICBjYXNlIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9BTExP QzoKKwkgIGNhc2UgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZX0ZPUkNFX0FM TE9DOgorCSAgY2FzZSBHT01QX01BUF9OT05DT05USUdfQVJSQVlfRk9SQ0Vf UFJFU0VOVDoKIAkgIGNhc2UgR09NUF9NQVBfTElOSzoKIAkgICAgZ2NjX2Fz c2VydCAoaXNfZ2ltcGxlX29tcF9vYWNjIChzdG10KSk7CiAJICAgIGJyZWFr OwpAQCAtMTEzOTcsNyArMTE2MjAsMTQgQEAgbG93ZXJfb21wX3RhcmdldCAo Z2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaV9wLCBvbXAKIAlpZiAob2ZmbG9h ZGVkICYmICEoT01QX0NMQVVTRV9DT0RFIChjKSA9PSBPTVBfQ0xBVVNFX01B UAogCQkJICAgJiYgT01QX0NMQVVTRV9NQVBfSU5fUkVEVUNUSU9OIChjKSkp CiAJICB7Ci0JICAgIHggPSBidWlsZF9yZWNlaXZlcl9yZWYgKHZhciwgdHJ1 ZSwgY3R4KTsKKwkgICAgdHJlZSB2YXJfdHlwZSA9IFRSRUVfVFlQRSAodmFy KTsKKwkgICAgYm9vbCByY3ZfYnlfcmVmID0KKwkgICAgICAoT01QX0NMQVVT RV9DT0RFIChjKSA9PSBPTVBfQ0xBVVNFX01BUAorCSAgICAgICAmJiBHT01Q X01BUF9OT05DT05USUdfQVJSQVlfUCAoT01QX0NMQVVTRV9NQVBfS0lORCAo YykpCisJICAgICAgICYmIFRSRUVfQ09ERSAodmFyX3R5cGUpICE9IEFSUkFZ X1RZUEUKKwkgICAgICAgPyBmYWxzZSA6IHRydWUpOworCisJICAgIHggPSBi dWlsZF9yZWNlaXZlcl9yZWYgKHZhciwgcmN2X2J5X3JlZiwgY3R4KTsKIAkg ICAgdHJlZSBuZXdfdmFyID0gbG9va3VwX2RlY2wgKHZhciwgY3R4KTsKIAog CSAgICBpZiAoT01QX0NMQVVTRV9DT0RFIChjKSA9PSBPTVBfQ0xBVVNFX01B UApAQCAtMTE2NDcsNiArMTE4NzcsMjQgQEAgbG93ZXJfb21wX3RhcmdldCAo Z2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaV9wLCBvbXAKIAkJICAgIGF2YXIg PSBidWlsZF9mb2xkX2FkZHJfZXhwciAoYXZhcik7CiAJCSAgICBnaW1wbGlm eV9hc3NpZ24gKHgsIGF2YXIsICZpbGlzdCk7CiAJCSAgfQorCQllbHNlIGlm IChPTVBfQ0xBVVNFX0NPREUgKGMpID09IE9NUF9DTEFVU0VfTUFQCisJCQkg JiYgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZX1AgKE9NUF9DTEFVU0VfTUFQ X0tJTkQgKGMpKSkKKwkJICB7CisJCSAgICBpbnQgZGltX251bTsKKwkJICAg IHRyZWUgZGltZW5zaW9ucyA9IE9NUF9DTEFVU0VfU0laRSAoYyk7CisKKwkJ ICAgIHRyZWUgYXJyYXlfZGVzY3JfdHlwZSA9CisJCSAgICAgIGNyZWF0ZV9u b25jb250aWdfYXJyYXlfZGVzY3JfdHlwZSAoT01QX0NMQVVTRV9ERUNMIChj KSwKKwkJCQkJCQkgZGltZW5zaW9ucywgJmRpbV9udW0pOworCQkgICAgdHJl ZSBhcnJheV9kZXNjciA9CisJCSAgICAgIGNyZWF0ZV90bXBfdmFyX3JhdyAo YXJyYXlfZGVzY3JfdHlwZSwgIi5vbXBfbm9uY29udGlnX2FycmF5X2Rlc2Ny Iik7CisJCSAgICBnaW1wbGVfYWRkX3RtcF92YXIgKGFycmF5X2Rlc2NyKTsK KworCQkgICAgY3JlYXRlX25vbmNvbnRpZ19hcnJheV9kZXNjcl9pbml0X2Nv ZGUKKwkJICAgICAgKGFycmF5X2Rlc2NyLCBvdmFyLCBkaW1lbnNpb25zLCBk aW1fbnVtLCAmaWxpc3QpOworCisJCSAgICBnaW1wbGlmeV9hc3NpZ24gKHgs IGJ1aWxkX2ZvbGRfYWRkcl9leHByIChhcnJheV9kZXNjciksICZpbGlzdCk7 CisJCSAgfQogCQllbHNlIGlmIChPTVBfQ0xBVVNFX0NPREUgKGMpID09IE9N UF9DTEFVU0VfRklSU1RQUklWQVRFKQogCQkgIHsKIAkJICAgIGdjY19hc3Nl cnQgKGlzX2dpbXBsZV9vbXBfb2FjYyAoY3R4LT5zdG10KSk7CkBAIC0xMTcx OCw2ICsxMTk2Niw5IEBAIGxvd2VyX29tcF90YXJnZXQgKGdpbXBsZV9zdG10 X2l0ZXJhdG9yICpnc2lfcCwgb21wCiAJCSAgcyA9IFRSRUVfVFlQRSAocyk7 CiAJCXMgPSBUWVBFX1NJWkVfVU5JVCAocyk7CiAJICAgICAgfQorCSAgICBl bHNlIGlmIChPTVBfQ0xBVVNFX0NPREUgKGMpID09IE9NUF9DTEFVU0VfTUFQ CisJCSAgICAgJiYgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZX1AgKE9NUF9D TEFVU0VfTUFQX0tJTkQgKGMpKSkKKwkgICAgICBzID0gTlVMTF9UUkVFOwog CSAgICBlbHNlCiAJICAgICAgcyA9IE9NUF9DTEFVU0VfU0laRSAoYyk7CiAJ ICAgIGlmIChzID09IE5VTExfVFJFRSkKSW5kZXg6IGdjYy90ZXN0c3VpdGUv Yy1jKystY29tbW9uL2dvYWNjL25vbmNvbnRpZ19hcnJheS0xLmMKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21t b24vZ29hY2Mvbm9uY29udGlnX2FycmF5LTEuYwkobm9uZXhpc3RlbnQpCisr KyBnY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9nb2FjYy9ub25jb250aWdf YXJyYXktMS5jCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjUgQEAKKy8q IHsgZGctZG8gY29tcGlsZSB9ICovCisKK3ZvaWQgZm9vICh2b2lkKQorewor ICBpbnQgYXJyYXlfb2ZfYXJyYXlbMTBdWzEwXTsKKyAgaW50ICoqcHRyX3Rv X3B0cjsKKyAgaW50ICphcnJheV9vZl9wdHJbMTBdOworICBpbnQgKCpwdHJf dG9fYXJyYXkpWzEwXTsKKyAKKyAgI3ByYWdtYSBhY2MgcGFyYWxsZWwgY29w eSAoYXJyYXlfb2ZfYXJyYXlbMjo0XVswOjEwXSkKKyAgICBhcnJheV9vZl9h cnJheVs1XVs1XSA9IDE7CisKKyAgI3ByYWdtYSBhY2MgcGFyYWxsZWwgY29w eSAocHRyX3RvX3B0clsyOjRdWzE6N10pCisgICAgcHRyX3RvX3B0cls1XVs1 XSA9IDE7CisKKyAgI3ByYWdtYSBhY2MgcGFyYWxsZWwgY29weSAoYXJyYXlf b2ZfcHRyWzI6NF1bMTo3XSkKKyAgICBhcnJheV9vZl9wdHJbNV1bNV0gPSAx OworCisgICNwcmFnbWEgYWNjIHBhcmFsbGVsIGNvcHkgKHB0cl90b19hcnJh eVsyOjRdWzE6N10pIC8qIHsgZGctZXJyb3IgImFycmF5IHNlY3Rpb24gaXMg bm90IGNvbnRpZ3VvdXMgaW4gJ21hcCcgY2xhdXNlIiB9ICovCisgICAgcHRy X3RvX2FycmF5WzVdWzVdID0gMTsKK30KKy8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcC10aW1lcyB7I3ByYWdtYSBvbXAgdGFyZ2V0IG9hY2NfcGFy YWxsZWwgbWFwXCh0b2Zyb206YXJyYXlfb2ZfYXJyYXl9IDEgZ2ltcGxlIH0g fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzIHsj cHJhZ21hIG9tcCB0YXJnZXQgb2FjY19wYXJhbGxlbCBtYXBcKHRvZnJvbSxu b25jb250aWdfYXJyYXk6cHRyX3RvX3B0ciBcW2RpbWVuc2lvbnM6IDIgNCwg MSA3XF19IDEgZ2ltcGxlIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t dHJlZS1kdW1wLXRpbWVzIHsjcHJhZ21hIG9tcCB0YXJnZXQgb2FjY19wYXJh bGxlbCBtYXBcKHRvZnJvbSxub25jb250aWdfYXJyYXk6YXJyYXlfb2ZfcHRy IFxbZGltZW5zaW9uczogMiA0LCAxIDdcXX0gMSBnaW1wbGUgfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgeyNwcmFnbWEg b21wIHRhcmdldCBvYWNjX3BhcmFsbGVsIG1hcFwodG9mcm9tLG5vbmNvbnRp Z19hcnJheTpwdHJfdG9fYXJyYXkgXFtkaW1lbnNpb25zOiAyIDQsIDEgN1xd fSAxIGdpbXBsZSB7IHhmYWlsICotKi0qIH0gfSB9ICovCkluZGV4OiBnY2Mv dHJlZS1wcmV0dHktcHJpbnQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t LSBnY2MvdHJlZS1wcmV0dHktcHJpbnQuYwkocmV2aXNpb24gMjc3ODI3KQor KysgZ2NjL3RyZWUtcHJldHR5LXByaW50LmMJKHdvcmtpbmcgY29weSkKQEAg LTg0OSw2ICs4NDksMzMgQEAgZHVtcF9vbXBfY2xhdXNlIChwcmV0dHlfcHJp bnRlciAqcHAsIHRyZWUgY2xhdXNlLAogCWNhc2UgR09NUF9NQVBfTElOSzoK IAkgIHBwX3N0cmluZyAocHAsICJsaW5rIik7CiAJICBicmVhazsKKwljYXNl IEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9UTzoKKwkgIHBwX3N0cmluZyAo cHAsICJ0byxub25jb250aWdfYXJyYXkiKTsKKwkgIGJyZWFrOworCWNhc2Ug R09NUF9NQVBfTk9OQ09OVElHX0FSUkFZX0ZST006CisJICBwcF9zdHJpbmcg KHBwLCAiZnJvbSxub25jb250aWdfYXJyYXkiKTsKKwkgIGJyZWFrOworCWNh c2UgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZX1RPRlJPTToKKwkgIHBwX3N0 cmluZyAocHAsICJ0b2Zyb20sbm9uY29udGlnX2FycmF5Iik7CisJICBicmVh azsKKwljYXNlIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9GT1JDRV9UTzoK KwkgIHBwX3N0cmluZyAocHAsICJmb3JjZV90byxub25jb250aWdfYXJyYXki KTsKKwkgIGJyZWFrOworCWNhc2UgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZ X0ZPUkNFX0ZST006CisJICBwcF9zdHJpbmcgKHBwLCAiZm9yY2VfZnJvbSxu b25jb250aWdfYXJyYXkiKTsKKwkgIGJyZWFrOworCWNhc2UgR09NUF9NQVBf Tk9OQ09OVElHX0FSUkFZX0ZPUkNFX1RPRlJPTToKKwkgIHBwX3N0cmluZyAo cHAsICJmb3JjZV90b2Zyb20sbm9uY29udGlnX2FycmF5Iik7CisJICBicmVh azsKKwljYXNlIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9BTExPQzoKKwkg IHBwX3N0cmluZyAocHAsICJhbGxvYyxub25jb250aWdfYXJyYXkiKTsKKwkg IGJyZWFrOworCWNhc2UgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZX0ZPUkNF X0FMTE9DOgorCSAgcHBfc3RyaW5nIChwcCwgImZvcmNlX2FsbG9jLG5vbmNv bnRpZ19hcnJheSIpOworCSAgYnJlYWs7CisJY2FzZSBHT01QX01BUF9OT05D T05USUdfQVJSQVlfRk9SQ0VfUFJFU0VOVDoKKwkgIHBwX3N0cmluZyAocHAs ICJmb3JjZV9wcmVzZW50LG5vbmNvbnRpZ19hcnJheSIpOworCSAgYnJlYWs7 CiAJZGVmYXVsdDoKIAkgIGdjY191bnJlYWNoYWJsZSAoKTsKIAl9CkBAIC04 NTksOCArODg2LDE1IEBAIGR1bXBfb21wX2NsYXVzZSAocHJldHR5X3ByaW50 ZXIgKnBwLCB0cmVlIGNsYXVzZSwKICAgICAgIGlmIChPTVBfQ0xBVVNFX1NJ WkUgKGNsYXVzZSkpCiAJewogCSAgc3dpdGNoIChPTVBfQ0xBVVNFX0NPREUg KGNsYXVzZSkgPT0gT01QX0NMQVVTRV9NQVAKLQkJICA/IE9NUF9DTEFVU0Vf TUFQX0tJTkQgKGNsYXVzZSkgOiBHT01QX01BUF9UTykKKwkJICA/IChHT01Q X01BUF9OT05DT05USUdfQVJSQVlfUCAoT01QX0NMQVVTRV9NQVBfS0lORCAo Y2xhdXNlKSkKKwkJICAgICA/IEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWQor CQkgICAgIDogT01QX0NMQVVTRV9NQVBfS0lORCAoY2xhdXNlKSkKKwkJICA6 IEdPTVBfTUFQX1RPKQogCSAgICB7CisJICAgIGNhc2UgR09NUF9NQVBfTk9O Q09OVElHX0FSUkFZOgorCSAgICAgIGdjY19hc3NlcnQgKFRSRUVfQ09ERSAo T01QX0NMQVVTRV9TSVpFIChjbGF1c2UpKSA9PSBUUkVFX0xJU1QpOworCSAg ICAgIHBwX3N0cmluZyAocHAsICIgW2RpbWVuc2lvbnM6ICIpOworCSAgICAg IGJyZWFrOwogCSAgICBjYXNlIEdPTVBfTUFQX1BPSU5URVI6CiAJICAgIGNh c2UgR09NUF9NQVBfRklSU1RQUklWQVRFX1BPSU5URVI6CiAJICAgIGNhc2Ug R09NUF9NQVBfRklSU1RQUklWQVRFX1JFRkVSRU5DRToKSW5kZXg6IGluY2x1 ZGUvZ29tcC1jb25zdGFudHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t LSBpbmNsdWRlL2dvbXAtY29uc3RhbnRzLmgJKHJldmlzaW9uIDI3NzgyNykK KysrIGluY2x1ZGUvZ29tcC1jb25zdGFudHMuaAkod29ya2luZyBjb3B5KQpA QCAtNDAsNiArNDAsNyBAQAogI2RlZmluZSBHT01QX01BUF9GTEFHX1NQRUNJ QUxfMAkJKDEgPDwgMikKICNkZWZpbmUgR09NUF9NQVBfRkxBR19TUEVDSUFM XzEJCSgxIDw8IDMpCiAjZGVmaW5lIEdPTVBfTUFQX0ZMQUdfU1BFQ0lBTF8y CQkoMSA8PCA0KQorI2RlZmluZSBHT01QX01BUF9GTEFHX1NQRUNJQUxfMwkJ KDEgPDwgNSkKICNkZWZpbmUgR09NUF9NQVBfRkxBR19TUEVDSUFMCQkoR09N UF9NQVBfRkxBR19TUEVDSUFMXzEgXAogCQkJCQkgfCBHT01QX01BUF9GTEFH X1NQRUNJQUxfMCkKIC8qIEZsYWcgdG8gZm9yY2UgYSBzcGVjaWZpYyBiZWhh dmlvciAob3IgZWxzZSwgdHJpZ2dlciBhIHJ1bi10aW1lIGVycm9yKS4gICov CkBAIC0xMjcsNiArMTI4LDI2IEBAIGVudW0gZ29tcF9tYXBfa2luZAogICAg IC8qIERlY3JlbWVudCB1c2FnZSBjb3VudCBhbmQgZGVhbGxvY2F0ZSBpZiB6 ZXJvLiAgKi8KICAgICBHT01QX01BUF9SRUxFQVNFID0JCQkoR09NUF9NQVBf RkxBR19TUEVDSUFMXzIKIAkJCQkJIHwgR09NUF9NQVBfREVMRVRFKSwKKyAg ICAvKiBNYXBwaW5nIGtpbmRzIGZvciBub24tY29udGlndW91cyBhcnJheXMu ICAqLworICAgIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWSA9CQkoR09NUF9N QVBfRkxBR19TUEVDSUFMXzMpLAorICAgIEdPTVBfTUFQX05PTkNPTlRJR19B UlJBWV9UTyA9CShHT01QX01BUF9OT05DT05USUdfQVJSQVkKKwkJCQkJIHwg R09NUF9NQVBfVE8pLAorICAgIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9G Uk9NID0JKEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWQorCQkJCQkgfCBHT01Q X01BUF9GUk9NKSwKKyAgICBHT01QX01BUF9OT05DT05USUdfQVJSQVlfVE9G Uk9NID0JKEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWQorCQkJCQkgfCBHT01Q X01BUF9UT0ZST00pLAorICAgIEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9G T1JDRV9UTyA9CShHT01QX01BUF9OT05DT05USUdfQVJSQVlfVE8KKwkJCQkJ IHwgR09NUF9NQVBfRkxBR19GT1JDRSksCisgICAgR09NUF9NQVBfTk9OQ09O VElHX0FSUkFZX0ZPUkNFX0ZST00gPQkoR09NUF9NQVBfTk9OQ09OVElHX0FS UkFZX0ZST00KKwkJCQkJCSB8IEdPTVBfTUFQX0ZMQUdfRk9SQ0UpLAorICAg IEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9GT1JDRV9UT0ZST00gPQkoR09N UF9NQVBfTk9OQ09OVElHX0FSUkFZX1RPRlJPTQorCQkJCQkJIHwgR09NUF9N QVBfRkxBR19GT1JDRSksCisgICAgR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZ X0FMTE9DID0JCShHT01QX01BUF9OT05DT05USUdfQVJSQVkKKwkJCQkJCSB8 IEdPTVBfTUFQX0FMTE9DKSwKKyAgICBHT01QX01BUF9OT05DT05USUdfQVJS QVlfRk9SQ0VfQUxMT0MgPQkoR09NUF9NQVBfTk9OQ09OVElHX0FSUkFZCisJ CQkJCQkgfCBHT01QX01BUF9GT1JDRV9BTExPQyksCisgICAgR09NUF9NQVBf Tk9OQ09OVElHX0FSUkFZX0ZPUkNFX1BSRVNFTlQgPQkoR09NUF9NQVBfTk9O Q09OVElHX0FSUkFZCisJCQkJCQkgfCBHT01QX01BUF9GT1JDRV9QUkVTRU5U KSwKIAogICAgIC8qIEludGVybmFsIHRvIEdDQywgbm90IHVzZWQgaW4gbGli Z29tcC4gICovCiAgICAgLyogRG8gbm90IG1hcCwgYnV0IHBvaW50ZXIgYXNz aWduIGEgcG9pbnRlciBpbnN0ZWFkLiAgKi8KQEAgLTE1NSw2ICsxNzYsOCBA QCBlbnVtIGdvbXBfbWFwX2tpbmQKICNkZWZpbmUgR09NUF9NQVBfQUxXQVlT X1AoWCkgXAogICAoR09NUF9NQVBfQUxXQVlTX1RPX1AgKFgpIHx8ICgoWCkg PT0gR09NUF9NQVBfQUxXQVlTX0ZST00pKQogCisjZGVmaW5lIEdPTVBfTUFQ X05PTkNPTlRJR19BUlJBWV9QKFgpIFwKKyAgKChYKSAmIEdPTVBfTUFQX05P TkNPTlRJR19BUlJBWSkKIAogLyogQXN5bmNocm9ub3VzIGJlaGF2aW9yLiAg S2VlcCBpbiBzeW5jIHdpdGgKICAgIGxpYmdvbXAve29wZW5hY2MuaCxvcGVu YWNjLmY5MCxvcGVuYWNjX2xpYi5ofTphY2NfYXN5bmNfdC4gICovCkluZGV4 OiBsaWJnb21wL29hY2MtcGFyYWxsZWwuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSBsaWJnb21wL29hY2MtcGFyYWxsZWwuYwkocmV2aXNpb24gMjc3 ODI3KQorKysgbGliZ29tcC9vYWNjLXBhcmFsbGVsLmMJKHdvcmtpbmcgY29w eSkKQEAgLTExMSw2ICsxMTEsMjEgQEAgaGFuZGxlX2Z0bl9wb2ludGVycyAo c2l6ZV90IG1hcG51bSwgdm9pZCAqKmhvc3RhZGQKICAgICB9CiB9CiAKK3N0 YXRpYyBpbmxpbmUgdm9pZAorcmV2ZXJ0X25vbmNvbnRpZ19hcnJheV9tYXBf cG9pbnRlcnMgKHNpemVfdCBtYXBudW0sIHZvaWQgKipob3N0YWRkcnMsCisJ CQkJICAgICB1bnNpZ25lZCBzaG9ydCAqa2luZHMpCit7CisgIGZvciAoaW50 IGkgPSAwOyBpIDwgbWFwbnVtOyBpKyspCisgICAgeworICAgICAgaWYgKEdP TVBfTUFQX05PTkNPTlRJR19BUlJBWV9QIChraW5kc1tpXSAmIDB4ZmYpKQor CWhvc3RhZGRyc1tpXSA9ICooKHZvaWQgKiopaG9zdGFkZHJzW2ldKTsKKyAg ICAgIGVsc2UKKwkvKiBXZSBhc3N1bWUgYWxsIG5vbi1jb250aWd1b3VzIGFy cmF5IG1hcCBlbnRyaWVzIGFyZSBwbGFjZWQgYXQgdGhlCisJICAgc3RhcnQ7 IGZpcnN0IG90aGVyIG1hcCBraW5kIG1lYW5zIHdlIGNhbiBleGl0LiAgKi8K KwlicmVhazsKKyAgICB9Cit9CisKIHN0YXRpYyB2b2lkIGdvYWNjX3dhaXQg KGludCBhc3luYywgaW50IG51bV93YWl0cywgdmFfbGlzdCAqYXApOwogCiAK QEAgLTIxMiw2ICsyMjcsNyBAQCBHT0FDQ19wYXJhbGxlbF9rZXllZCAoaW50 IGZsYWdzX20sIHZvaWQgKCpmbikgKHZvaQogICAgICAgcHJvZl9pbmZvLmRl dmljZV90eXBlID0gYWNjX2RldmljZV9ob3N0OwogICAgICAgYXBpX2luZm8u ZGV2aWNlX3R5cGUgPSBwcm9mX2luZm8uZGV2aWNlX3R5cGU7CiAgICAgICBn b2FjY19zYXZlX2FuZF9zZXRfYmluZCAoYWNjX2RldmljZV9ob3N0KTsKKyAg ICAgIHJldmVydF9ub25jb250aWdfYXJyYXlfbWFwX3BvaW50ZXJzIChtYXBu dW0sIGhvc3RhZGRycywga2luZHMpOwogICAgICAgZm4gKGhvc3RhZGRycyk7 CiAgICAgICBnb2FjY19yZXN0b3JlX2JpbmQgKCk7CiAgICAgICBnb3RvIG91 dF9wcm9mOwpAQCAtMjE4LDYgKzIzNCw3IEBAIEdPQUNDX3BhcmFsbGVsX2tl eWVkIChpbnQgZmxhZ3NfbSwgdm9pZCAoKmZuKSAodm9pCiAgICAgfQogICBl bHNlIGlmIChhY2NfZGV2aWNlX3R5cGUgKGFjY19kZXYtPnR5cGUpID09IGFj Y19kZXZpY2VfaG9zdCkKICAgICB7CisgICAgICByZXZlcnRfbm9uY29udGln X2FycmF5X21hcF9wb2ludGVycyAobWFwbnVtLCBob3N0YWRkcnMsIGtpbmRz KTsKICAgICAgIGZuIChob3N0YWRkcnMpOwogICAgICAgZ290byBvdXRfcHJv ZjsKICAgICB9CkluZGV4OiBsaWJnb21wL3RhcmdldC5jCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIGxpYmdvbXAvdGFyZ2V0LmMJKHJldmlzaW9uIDI3 NzgyNykKKysrIGxpYmdvbXAvdGFyZ2V0LmMJKHdvcmtpbmcgY29weSkKQEAg LTUyMCw2ICs1MjAsMTUyIEBAIGdvbXBfbWFwX3ZhbCAoc3RydWN0IHRhcmdl dF9tZW1fZGVzYyAqdGd0LCB2b2lkICoqCiAgICAgfQogfQogCisvKiBEZWZp bml0aW9ucyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGRlc2NyaWJpbmcgbm9uLWNv bnRpZ3VvdXMgYXJyYXlzCisgICAoTm90ZTogaW50ZXJmYWNlcyB3aXRoIGNv bXBpbGVyKQorCisgICBUaGUgY29tcGlsZXIgZ2VuZXJhdGVzIGEgZGVzY3Jp cHRvciBmb3IgZWFjaCBzdWNoIGFycmF5LCBwbGFjZXMgdGhlCisgICBkZXNj cmlwdG9yIG9uIHN0YWNrLCBhbmQgcGFzc2VzIHRoZSBhZGRyZXNzIG9mIHRo ZSBkZXNjcmlwdG9yIHRvIHRoZSBsaWJnb21wCisgICBydW50aW1lIGFzIGEg bm9ybWFsIG1hcCBhcmd1bWVudC4gVGhlIHJ1bnRpbWUgdGhlbiBwcm9jZXNz ZXMgdGhlIGFycmF5CisgICBkYXRhIHN0cnVjdHVyZSBzZXR1cCwgYW5kIHJl cGxhY2VzIHRoZSBhcmd1bWVudCB3aXRoIHRoZSBuZXcgYWN0dWFsCisgICBh cnJheSBhZGRyZXNzIGZvciB0aGUgY2hpbGQgZnVuY3Rpb24uCisKKyAgIENh cmUgbXVzdCBiZSB0YWtlbiBzdWNoIHRoYXQgdGhlIHN0cnVjdCBmaWVsZCBh bmQgbGF5b3V0IGFzc3VtcHRpb25zCisgICBvZiBzdHJ1Y3QgZ29tcF9uY2Fy cmF5X2RpbSwgZ29tcF9uY2FycmF5X2Rlc2NyX3R5cGUgaW5zaWRlIHRoZSBj b21waWxlcgorICAgYmUgY29uc2lzdGFudCB3aXRoIHRoZSBiZWxvdyBkZWNs YXJhdGlvbnMuICAqLworCitzdHJ1Y3QgZ29tcF9uY2FycmF5X2RpbSB7Cisg IHNpemVfdCBiYXNlOworICBzaXplX3QgbGVuZ3RoOworICBzaXplX3QgZWxl bV9zaXplOworICBzaXplX3QgaXNfYXJyYXk7Cit9OworCitzdHJ1Y3QgZ29t cF9uY2FycmF5X2Rlc2NyX3R5cGUgeworICB2b2lkICpwdHI7CisgIHNpemVf dCBuZGltczsKKyAgc3RydWN0IGdvbXBfbmNhcnJheV9kaW0gZGltc1tdOwor fTsKKworLyogSW50ZXJuYWwgbm9uLWNvbnRpZ3VvdXMgYXJyYXkgaW5mbyBz dHJ1Y3QsIHVzZWQgb25seSBoZXJlIGluc2lkZSB0aGUgcnVudGltZS4gKi8K Kworc3RydWN0IG5jYXJyYXlfaW5mbworeworICBzdHJ1Y3QgZ29tcF9uY2Fy cmF5X2Rlc2NyX3R5cGUgKmRlc2NyOworICBzaXplX3QgbWFwX2luZGV4Owor ICBzaXplX3QgcHRyYmxvY2tfc2l6ZTsKKyAgc2l6ZV90IGRhdGFfcm93X251 bTsKKyAgc2l6ZV90IGRhdGFfcm93X3NpemU7Cit9OworCitzdGF0aWMgc2l6 ZV90Citnb21wX25vbmNvbnRpZ19hcnJheV9jb3VudF9yb3dzIChzdHJ1Y3Qg Z29tcF9uY2FycmF5X2Rlc2NyX3R5cGUgKmRlc2NyKQoreworICBzaXplX3Qg bnJvd3MgPSAxOworICBmb3IgKHNpemVfdCBkID0gMDsgZCA8IGRlc2NyLT5u ZGltcyAtIDE7IGQrKykKKyAgICBucm93cyAqPSBkZXNjci0+ZGltc1tkXS5s ZW5ndGggLyBzaXplb2YgKHZvaWQgKik7CisgIHJldHVybiBucm93czsKK30K Kworc3RhdGljIHZvaWQKK2dvbXBfbm9uY29udGlnX2FycmF5X2NvbXB1dGVf aW5mbyAoc3RydWN0IG5jYXJyYXlfaW5mbyAqbmNhKQoreworICBzaXplX3Qg ZCwgbiA9IDE7CisgIHN0cnVjdCBnb21wX25jYXJyYXlfZGVzY3JfdHlwZSAq ZGVzY3IgPSBuY2EtPmRlc2NyOworCisgIG5jYS0+cHRyYmxvY2tfc2l6ZSA9 IDA7CisgIGZvciAoZCA9IDA7IGQgPCBkZXNjci0+bmRpbXMgLSAxOyBkKysp CisgICAgeworICAgICAgc2l6ZV90IGRpbV9jb3VudCA9IGRlc2NyLT5kaW1z W2RdLmxlbmd0aCAvIGRlc2NyLT5kaW1zW2RdLmVsZW1fc2l6ZTsKKyAgICAg IHNpemVfdCBkaW1fcHRyYmxvY2tfc2l6ZSA9IChkZXNjci0+ZGltc1tkICsg MV0uaXNfYXJyYXkKKwkJCQkgID8gMCA6IGRlc2NyLT5kaW1zW2RdLmxlbmd0 aCAqIG4pOworICAgICAgbmNhLT5wdHJibG9ja19zaXplICs9IGRpbV9wdHJi bG9ja19zaXplOworICAgICAgbiAqPSBkaW1fY291bnQ7CisgICAgfQorICBu Y2EtPmRhdGFfcm93X251bSA9IG47CisgIG5jYS0+ZGF0YV9yb3dfc2l6ZSA9 IGRlc2NyLT5kaW1zW2RdLmxlbmd0aDsKK30KKworc3RhdGljIHZvaWQKK2dv bXBfbm9uY29udGlnX2FycmF5X2ZpbGxfcm93c18xIChzdHJ1Y3QgZ29tcF9u Y2FycmF5X2Rlc2NyX3R5cGUgKmRlc2NyLCB2b2lkICpuY2EsCisJCQkJICBz aXplX3QgZCwgdm9pZCAqKipyb3dfcHRyLCBzaXplX3QgKmNvdW50KQorewor ICBpZiAoZCA8IGRlc2NyLT5uZGltcyAtIDEpCisgICAgeworICAgICAgc2l6 ZV90IGVsc2l6ZSA9IGRlc2NyLT5kaW1zW2RdLmVsZW1fc2l6ZTsKKyAgICAg IHNpemVfdCBuID0gZGVzY3ItPmRpbXNbZF0ubGVuZ3RoIC8gZWxzaXplOwor ICAgICAgdm9pZCAqcCA9IG5jYSArIGRlc2NyLT5kaW1zW2RdLmJhc2U7Cisg ICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykKKwl7CisJICB2 b2lkICpwdHIgPSBwICsgaSAqIGVsc2l6ZTsKKwkgIC8qIERlcmVmIGlmIG5l eHQgZGltZW5zaW9uIGlzIG5vdCBhcnJheS4gICovCisJICBpZiAoIWRlc2Ny LT5kaW1zW2QgKyAxXS5pc19hcnJheSkKKwkgICAgcHRyID0gKigodm9pZCAq KikgcHRyKTsKKwkgIGdvbXBfbm9uY29udGlnX2FycmF5X2ZpbGxfcm93c18x IChkZXNjciwgcHRyLCBkICsgMSwgcm93X3B0ciwgY291bnQpOworCX0KKyAg ICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqKnJvd19wdHIgPSBuY2EgKyBk ZXNjci0+ZGltc1tkXS5iYXNlOworICAgICAgKnJvd19wdHIgKz0gMTsKKyAg ICAgICpjb3VudCArPSAxOworICAgIH0KK30KKworc3RhdGljIHNpemVfdAor Z29tcF9ub25jb250aWdfYXJyYXlfZmlsbF9yb3dzIChzdHJ1Y3QgZ29tcF9u Y2FycmF5X2Rlc2NyX3R5cGUgKmRlc2NyLCB2b2lkICpyb3dzW10pCit7Cisg IHNpemVfdCBjb3VudCA9IDA7CisgIHZvaWQgKipwID0gcm93czsKKyAgZ29t cF9ub25jb250aWdfYXJyYXlfZmlsbF9yb3dzXzEgKGRlc2NyLCBkZXNjci0+ cHRyLCAwLCAmcCwgJmNvdW50KTsKKyAgcmV0dXJuIGNvdW50OworfQorCitz dGF0aWMgdm9pZCAqCitnb21wX25vbmNvbnRpZ19hcnJheV9jcmVhdGVfcHRy YmxvY2sgKHN0cnVjdCBuY2FycmF5X2luZm8gKm5jYSwKKwkJCQkgICAgICB2 b2lkICp0Z3RfYWRkciwgdm9pZCAqdGd0X2RhdGFfcm93c1tdKQoreworICBz dHJ1Y3QgZ29tcF9uY2FycmF5X2Rlc2NyX3R5cGUgKmRlc2NyID0gbmNhLT5k ZXNjcjsKKyAgdm9pZCAqcHRyYmxvY2sgPSBnb21wX21hbGxvYyAobmNhLT5w dHJibG9ja19zaXplKTsKKyAgdm9pZCAqKmN1cnJfZGltX3B0cmJsb2NrID0g KHZvaWQgKiopIHB0cmJsb2NrOworICBzaXplX3QgbiA9IDE7CisKKyAgZm9y IChzaXplX3QgZCA9IDA7IGQgPCBkZXNjci0+bmRpbXMgLSAxOyBkKyspCisg ICAgeworICAgICAgaW50IGN1cnJfZGltX2xlbiA9IGRlc2NyLT5kaW1zW2Rd Lmxlbmd0aDsKKyAgICAgIGludCBuZXh0X2RpbV9sZW4gPSBkZXNjci0+ZGlt c1tkICsgMV0ubGVuZ3RoOworICAgICAgaW50IGN1cnJfZGltX251bSA9IGN1 cnJfZGltX2xlbiAvIHNpemVvZiAodm9pZCAqKTsKKyAgICAgIHNpemVfdCBu ZXh0X2RpbV9iaWFzID0gZGVzY3ItPmRpbXNbZCArIDFdLmJhc2U7CisKKyAg ICAgIHZvaWQgKm5leHRfZGltX3B0cmJsb2NrCisJPSAodm9pZCAqKShjdXJy X2RpbV9wdHJibG9jayArIG4gKiBjdXJyX2RpbV9udW0pOworCisgICAgICBm b3IgKGludCBiID0gMDsgYiA8IG47IGIrKykKKyAgICAgICAgZm9yIChpbnQg aSA9IDA7IGkgPCBjdXJyX2RpbV9udW07IGkrKykKKwkgIHsKKwkgICAgaWYg KGQgPCBkZXNjci0+bmRpbXMgLSAyKQorCSAgICAgIHsKKwkJdm9pZCAqcHRy ID0gKG5leHRfZGltX3B0cmJsb2NrCisJCQkgICAgICsgYiAqIGN1cnJfZGlt X251bSAqIG5leHRfZGltX2xlbgorCQkJICAgICArIGkgKiBuZXh0X2RpbV9s ZW4pOworCQl2b2lkICp0Z3RfcHRyID0gdGd0X2FkZHIgKyAocHRyIC0gcHRy YmxvY2spIC0gbmV4dF9kaW1fYmlhczsKKwkJY3Vycl9kaW1fcHRyYmxvY2tb YiAqIGN1cnJfZGltX251bSArIGldID0gdGd0X3B0cjsKKwkgICAgICB9CisJ ICAgIGVsc2UKKwkgICAgICB7CisJCWN1cnJfZGltX3B0cmJsb2NrW2IgKiBj dXJyX2RpbV9udW0gKyBpXQorCQkgID0gdGd0X2RhdGFfcm93c1tiICogY3Vy cl9kaW1fbnVtICsgaV0gLSBuZXh0X2RpbV9iaWFzOworCSAgICAgIH0KKwkg ICAgdm9pZCAqYWRkciA9ICZjdXJyX2RpbV9wdHJibG9ja1tiICogY3Vycl9k aW1fbnVtICsgaV07CisJICAgIGFzc2VydCAocHRyYmxvY2sgPD0gYWRkciAm JiBhZGRyIDwgcHRyYmxvY2sgKyBuY2EtPnB0cmJsb2NrX3NpemUpOworCSAg fQorCisgICAgICBuICo9IGN1cnJfZGltX251bTsKKyAgICAgIGN1cnJfZGlt X3B0cmJsb2NrID0gbmV4dF9kaW1fcHRyYmxvY2s7CisgICAgfQorICBhc3Nl cnQgKG4gPT0gbmNhLT5kYXRhX3Jvd19udW0pOworICByZXR1cm4gcHRyYmxv Y2s7Cit9CisKIHN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlz X2lubGluZSkpIHN0cnVjdCB0YXJnZXRfbWVtX2Rlc2MgKgogZ29tcF9tYXBf dmFyc19pbnRlcm5hbCAoc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICpkZXZp Y2VwLAogCQkJc3RydWN0IGdvYWNjX2FzeW5jcXVldWUgKmFxLCBzaXplX3Qg bWFwbnVtLApAQCAtNTMzLDkgKzY3OSwzNyBAQCBnb21wX21hcF92YXJzX2lu dGVybmFsIChzdHJ1Y3QgZ29tcF9kZXZpY2VfZGVzY3IgKgogICBjb25zdCBp bnQgdHlwZW1hc2sgPSBzaG9ydF9tYXBraW5kID8gMHhmZiA6IDB4NzsKICAg c3RydWN0IHNwbGF5X3RyZWVfcyAqbWVtX21hcCA9ICZkZXZpY2VwLT5tZW1f bWFwOwogICBzdHJ1Y3Qgc3BsYXlfdHJlZV9rZXlfcyBjdXJfbm9kZTsKLSAg c3RydWN0IHRhcmdldF9tZW1fZGVzYyAqdGd0Ci0gICAgPSBnb21wX21hbGxv YyAoc2l6ZW9mICgqdGd0KSArIHNpemVvZiAodGd0LT5saXN0WzBdKSAqIG1h cG51bSk7Ci0gIHRndC0+bGlzdF9jb3VudCA9IG1hcG51bTsKKyAgc3RydWN0 IHRhcmdldF9tZW1fZGVzYyAqdGd0OworCisgIGJvb2wgcHJvY2Vzc19ub25j b250aWdfYXJyYXlzID0gZmFsc2U7CisgIHNpemVfdCBuY2FfZGF0YV9yb3df bnVtID0gMCwgcm93X3N0YXJ0ID0gMDsKKyAgc2l6ZV90IG5jYV9pbmZvX251 bSA9IDAsIG5jYV9pbmRleDsKKyAgc3RydWN0IG5jYXJyYXlfaW5mbyAqbmNh X2luZm8gPSBOVUxMOworICBzdHJ1Y3QgdGFyZ2V0X3Zhcl9kZXNjICpyb3df ZGVzYzsKKyAgdWludHB0cl90IHRhcmdldF9yb3dfYWRkcjsKKyAgdm9pZCAq Kmhvc3RfZGF0YV9yb3dzID0gTlVMTCwgKip0YXJnZXRfZGF0YV9yb3dzID0g TlVMTDsKKyAgdm9pZCAqcm93OworCisgIGlmIChtYXBudW0gPiAwKQorICAg IHsKKyAgICAgIGludCBraW5kID0gZ2V0X2tpbmQgKHNob3J0X21hcGtpbmQs IGtpbmRzLCAwKTsKKyAgICAgIHByb2Nlc3Nfbm9uY29udGlnX2FycmF5cyA9 IEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9QIChraW5kICYgdHlwZW1hc2sp OworICAgIH0KKworICBpZiAocHJvY2Vzc19ub25jb250aWdfYXJyYXlzKQor ICAgIGZvciAoaSA9IDA7IGkgPCBtYXBudW07IGkrKykKKyAgICAgIHsKKwlp bnQga2luZCA9IGdldF9raW5kIChzaG9ydF9tYXBraW5kLCBraW5kcywgaSk7 CisJaWYgKEdPTVBfTUFQX05PTkNPTlRJR19BUlJBWV9QIChraW5kICYgdHlw ZW1hc2spKQorCSAgeworCSAgICBuY2FfZGF0YV9yb3dfbnVtICs9IGdvbXBf bm9uY29udGlnX2FycmF5X2NvdW50X3Jvd3MgKGhvc3RhZGRyc1tpXSk7CisJ ICAgIG5jYV9pbmZvX251bSArPSAxOworCSAgfQorICAgICAgfQorCisgIHRn dCA9IGdvbXBfbWFsbG9jIChzaXplb2YgKCp0Z3QpCisJCSAgICAgKyBzaXpl b2YgKHRndC0+bGlzdFswXSkgKiAobWFwbnVtICsgbmNhX2RhdGFfcm93X251 bSkpOworICB0Z3QtPmxpc3RfY291bnQgPSBtYXBudW0gKyBuY2FfZGF0YV9y b3dfbnVtOwogICB0Z3QtPnJlZmNvdW50ID0gcHJhZ21hX2tpbmQgPT0gR09N UF9NQVBfVkFSU19FTlRFUl9EQVRBID8gMCA6IDE7CiAgIHRndC0+ZGV2aWNl X2Rlc2NyID0gZGV2aWNlcDsKICAgc3RydWN0IGdvbXBfY29hbGVzY2VfYnVm IGNidWYsICpjYnVmcCA9IE5VTEw7CkBAIC01NDcsNiArNzIxLDE0IEBAIGdv bXBfbWFwX3ZhcnNfaW50ZXJuYWwgKHN0cnVjdCBnb21wX2RldmljZV9kZXNj ciAqCiAgICAgICByZXR1cm4gdGd0OwogICAgIH0KIAorICBpZiAobmNhX2lu Zm9fbnVtKQorICAgIG5jYV9pbmZvID0gZ29tcF9hbGxvY2EgKHNpemVvZiAo c3RydWN0IG5jYXJyYXlfaW5mbykgKiBuY2FfaW5mb19udW0pOworICBpZiAo bmNhX2RhdGFfcm93X251bSkKKyAgICB7CisgICAgICBob3N0X2RhdGFfcm93 cyA9IGdvbXBfbWFsbG9jICgyICogc2l6ZW9mICh2b2lkICopICogbmNhX2Rh dGFfcm93X251bSk7CisgICAgICB0YXJnZXRfZGF0YV9yb3dzID0gJmhvc3Rf ZGF0YV9yb3dzW25jYV9kYXRhX3Jvd19udW1dOworICAgIH0KKwogICB0Z3Rf YWxpZ24gPSBzaXplb2YgKHZvaWQgKik7CiAgIHRndF9zaXplID0gMDsKICAg Y2J1Zi5jaHVua3MgPSBOVUxMOwpAQCAtNTc4LDcgKzc2MCw3IEBAIGdvbXBf bWFwX3ZhcnNfaW50ZXJuYWwgKHN0cnVjdCBnb21wX2RldmljZV9kZXNjciAq CiAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgZm9yIChpID0gMDsg aSA8IG1hcG51bTsgaSsrKQorICBmb3IgKGkgPSAwLCBuY2FfaW5kZXggPSAw OyBpIDwgbWFwbnVtOyBpKyspCiAgICAgewogICAgICAgaW50IGtpbmQgPSBn ZXRfa2luZCAoc2hvcnRfbWFwa2luZCwga2luZHMsIGkpOwogICAgICAgaWYg KGhvc3RhZGRyc1tpXSA9PSBOVUxMCkBAIC02NjcsNiArODQ5LDIwIEBAIGdv bXBfbWFwX3ZhcnNfaW50ZXJuYWwgKHN0cnVjdCBnb21wX2RldmljZV9kZXNj ciAqCiAJICBoYXNfZmlyc3Rwcml2YXRlID0gdHJ1ZTsKIAkgIGNvbnRpbnVl OwogCX0KKyAgICAgIGVsc2UgaWYgKEdPTVBfTUFQX05PTkNPTlRJR19BUlJB WV9QIChraW5kICYgdHlwZW1hc2spKQorCXsKKwkgIC8qIElnbm9yZSBub24t Y29udGlndW91cyBhcnJheXMgZm9yIG5vdywgd2UgcHJvY2VzcyB0aGVtIHRv Z2V0aGVyCisJICAgICBsYXRlci4gICovCisJICB0Z3QtPmxpc3RbaV0ua2V5 ID0gTlVMTDsKKwkgIHRndC0+bGlzdFtpXS5vZmZzZXQgPSAwOworCSAgbm90 X2ZvdW5kX2NudCsrOworCisJICBzdHJ1Y3QgbmNhcnJheV9pbmZvICpuY2Eg PSAmbmNhX2luZm9bbmNhX2luZGV4KytdOworCSAgbmNhLT5kZXNjciA9IChz dHJ1Y3QgZ29tcF9uY2FycmF5X2Rlc2NyX3R5cGUgKikgaG9zdGFkZHJzW2ld OworCSAgbmNhLT5tYXBfaW5kZXggPSBpOworCSAgY29udGludWU7CisJfQor CiAgICAgICBjdXJfbm9kZS5ob3N0X3N0YXJ0ID0gKHVpbnRwdHJfdCkgaG9z dGFkZHJzW2ldOwogICAgICAgaWYgKCFHT01QX01BUF9QT0lOVEVSX1AgKGtp bmQgJiB0eXBlbWFzaykpCiAJY3VyX25vZGUuaG9zdF9lbmQgPSBjdXJfbm9k ZS5ob3N0X3N0YXJ0ICsgc2l6ZXNbaV07CkBAIC03MzUsNiArOTMxLDU2IEBA IGdvbXBfbWFwX3ZhcnNfaW50ZXJuYWwgKHN0cnVjdCBnb21wX2RldmljZV9k ZXNjciAqCiAJfQogICAgIH0KIAorICAvKiBGb3Igbm9uLWNvbnRpZ3VvdXMg YXJyYXlzLiBFYWNoIGRhdGEgcm93IGlzIG9uZSB0YXJnZXQgaXRlbSwgc2Vw YXJhdGVkCisgICAgIGZyb20gdGhlIG5vcm1hbCBtYXAgY2xhdXNlIGl0ZW1z LCBoZW5jZSB3ZSBvcmRlciB0aGVtIGFmdGVyIG1hcG51bS4gICovCisgIGlm IChwcm9jZXNzX25vbmNvbnRpZ19hcnJheXMpCisgICAgZm9yIChpID0gMCwg bmNhX2luZGV4ID0gMCwgcm93X3N0YXJ0ID0gMDsgaSA8IG1hcG51bTsgaSsr KQorICAgICAgeworCWludCBraW5kID0gZ2V0X2tpbmQgKHNob3J0X21hcGtp bmQsIGtpbmRzLCBpKTsKKwlpZiAoIUdPTVBfTUFQX05PTkNPTlRJR19BUlJB WV9QIChraW5kICYgdHlwZW1hc2spKQorCSAgY29udGludWU7CisKKwlzdHJ1 Y3QgbmNhcnJheV9pbmZvICpuY2EgPSAmbmNhX2luZm9bbmNhX2luZGV4Kytd OworCXN0cnVjdCBnb21wX25jYXJyYXlfZGVzY3JfdHlwZSAqZGVzY3IgPSBu Y2EtPmRlc2NyOworCXNpemVfdCBucjsKKworCWdvbXBfbm9uY29udGlnX2Fy cmF5X2NvbXB1dGVfaW5mbyAobmNhKTsKKworCS8qIFdlIGhhdmUgYWxsb2Nh dGVkIHNwYWNlIGluIGhvc3QvdGFyZ2V0X2RhdGFfcm93cyB0byBwbGFjZSBh bGwgdGhlCisJICAgcm93IGRhdGEgYmxvY2sgcG9pbnRlcnMsIG5vdyB3ZSBj YW4gc3RhcnQgZmlsbGluZyB0aGVtIGluLiAgKi8KKwluciA9IGdvbXBfbm9u Y29udGlnX2FycmF5X2ZpbGxfcm93cyAoZGVzY3IsICZob3N0X2RhdGFfcm93 c1tyb3dfc3RhcnRdKTsKKwlhc3NlcnQgKG5yID09IG5jYS0+ZGF0YV9yb3df bnVtKTsKKworCXNpemVfdCBhbGlnbiA9IChzaXplX3QpIDEgPDwgKGtpbmQg Pj4gcnNoaWZ0KTsKKwlpZiAodGd0X2FsaWduIDwgYWxpZ24pCisJICB0Z3Rf YWxpZ24gPSBhbGlnbjsKKwl0Z3Rfc2l6ZSA9ICh0Z3Rfc2l6ZSArIGFsaWdu IC0gMSkgJiB+KGFsaWduIC0gMSk7CisJdGd0X3NpemUgKz0gbmNhLT5wdHJi bG9ja19zaXplOworCisJZm9yIChzaXplX3QgaiA9IDA7IGogPCBuY2EtPmRh dGFfcm93X251bTsgaisrKQorCSAgeworCSAgICByb3cgPSBob3N0X2RhdGFf cm93c1tyb3dfc3RhcnQgKyBqXTsKKwkgICAgcm93X2Rlc2MgPSAmdGd0LT5s aXN0W21hcG51bSArIHJvd19zdGFydCArIGpdOworCisJICAgIGN1cl9ub2Rl Lmhvc3Rfc3RhcnQgPSAodWludHB0cl90KSByb3c7CisJICAgIGN1cl9ub2Rl Lmhvc3RfZW5kID0gY3VyX25vZGUuaG9zdF9zdGFydCArIG5jYS0+ZGF0YV9y b3dfc2l6ZTsKKwkgICAgc3BsYXlfdHJlZV9rZXkgbiA9IHNwbGF5X3RyZWVf bG9va3VwIChtZW1fbWFwLCAmY3VyX25vZGUpOworCSAgICBpZiAobikKKwkg ICAgICB7CisJCWFzc2VydCAobi0+cmVmY291bnQgIT0gUkVGQ09VTlRfTElO Syk7CisJCWdvbXBfbWFwX3ZhcnNfZXhpc3RpbmcgKGRldmljZXAsIGFxLCBu LCAmY3VyX25vZGUsIHJvd19kZXNjLAorCQkJCQlraW5kICYgdHlwZW1hc2ss IC8qIFRPRE86IGNidWY/ICovIE5VTEwpOworCSAgICAgIH0KKwkgICAgZWxz ZQorCSAgICAgIHsKKwkJdGd0X3NpemUgPSAodGd0X3NpemUgKyBhbGlnbiAt IDEpICYgfihhbGlnbiAtIDEpOworCQl0Z3Rfc2l6ZSArPSBuY2EtPmRhdGFf cm93X3NpemU7CisJCW5vdF9mb3VuZF9jbnQrKzsKKwkgICAgICB9CisJICB9 CisJcm93X3N0YXJ0ICs9IG5jYS0+ZGF0YV9yb3dfbnVtOworICAgICAgfQor CiAgIGlmIChkZXZhZGRycykKICAgICB7CiAgICAgICBpZiAobWFwbnVtICE9 IDEpCkBAIC04OTUsNiArMTE0MSwxNSBAQCBnb21wX21hcF92YXJzX2ludGVy bmFsIChzdHJ1Y3QgZ29tcF9kZXZpY2VfZGVzY3IgKgogCSAgICAgIGRlZmF1 bHQ6CiAJCWJyZWFrOwogCSAgICAgIH0KKworCSAgICBpZiAoR09NUF9NQVBf Tk9OQ09OVElHX0FSUkFZX1AgKGtpbmQgJiB0eXBlbWFzaykpCisJICAgICAg eworCQl0Z3QtPmxpc3RbaV0ua2V5ID0gJmFycmF5LT5rZXk7CisJCXRndC0+ bGlzdFtpXS5rZXktPnRndCA9IHRndDsKKwkJYXJyYXkrKzsKKwkJY29udGlu dWU7CisJICAgICAgfQorCiAJICAgIHNwbGF5X3RyZWVfa2V5IGsgPSAmYXJy YXktPmtleTsKIAkgICAgay0+aG9zdF9zdGFydCA9ICh1aW50cHRyX3QpIGhv c3RhZGRyc1tpXTsKIAkgICAgaWYgKCFHT01QX01BUF9QT0lOVEVSX1AgKGtp bmQgJiB0eXBlbWFzaykpCkBAIC0xMDQ0LDggKzEyOTksMTEyIEBAIGdvbXBf bWFwX3ZhcnNfaW50ZXJuYWwgKHN0cnVjdCBnb21wX2RldmljZV9kZXNjciAq CiAJCWFycmF5Kys7CiAJICAgICAgfQogCSAgfQorCisgICAgICAvKiBQcm9j ZXNzaW5nIG9mIG5vbi1jb250aWd1b3VzIGFycmF5IHJvd3MuICAqLworICAg ICAgaWYgKHByb2Nlc3Nfbm9uY29udGlnX2FycmF5cykKKwl7CisJICBmb3Ig KGkgPSAwLCBuY2FfaW5kZXggPSAwLCByb3dfc3RhcnQgPSAwOyBpIDwgbWFw bnVtOyBpKyspCisJICAgIHsKKwkgICAgICBpbnQga2luZCA9IGdldF9raW5k IChzaG9ydF9tYXBraW5kLCBraW5kcywgaSk7CisJICAgICAgaWYgKCFHT01Q X01BUF9OT05DT05USUdfQVJSQVlfUCAoa2luZCAmIHR5cGVtYXNrKSkKKwkJ Y29udGludWU7CisKKwkgICAgICBzdHJ1Y3QgbmNhcnJheV9pbmZvICpuY2Eg PSAmbmNhX2luZm9bbmNhX2luZGV4KytdOworCSAgICAgIGFzc2VydCAobmNh LT5kZXNjciA9PSBob3N0YWRkcnNbaV0pOworCisJICAgICAgLyogVGhlIG1h cCBmb3IgdGhlIG5vbi1jb250aWd1b3VzIGFycmF5IGl0c2VsZiBpcyBuZXZl ciBjb3BpZWQgZnJvbQorCQkgZHVyaW5nIHVubWFwcGluZywgaXRzIHRoZSBk YXRhIHJvd3MgdGhhdCBjb3VudC4gU2V0IGNvcHktZnJvbQorCQkgZmxhZ3Mg dG8gZmFsc2UgaGVyZS4gICovCisJICAgICAgdGd0LT5saXN0W2ldLmNvcHlf ZnJvbSA9IGZhbHNlOworCSAgICAgIHRndC0+bGlzdFtpXS5hbHdheXNfY29w eV9mcm9tID0gZmFsc2U7CisKKwkgICAgICBzaXplX3QgYWxpZ24gPSAoc2l6 ZV90KSAxIDw8IChraW5kID4+IHJzaGlmdCk7CisJICAgICAgdGd0X3NpemUg PSAodGd0X3NpemUgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOworCisJ ICAgICAgLyogRm9yIHRoZSBtYXAgb2YgdGhlIG5vbi1jb250aWd1b3VzIGFy cmF5IGl0c2VsZiwgYWRqdXN0IHNvIHRoYXQKKwkJIHRoZSBwYXNzZWQgZGV2 aWNlIGFkZHJlc3MgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJ CSBwdHJibG9jay4gUmVtZW1iZXIgdG8gYWRqdXN0IHRoZSBmaXJzdC1kaW1l bnNpb24ncyBiaWFzIGhlcmUuICAgKi8KKwkgICAgICB0Z3QtPmxpc3RbaV0u a2V5LT50Z3Rfb2Zmc2V0ID0gdGd0X3NpemUgLSBuY2EtPmRlc2NyLT5kaW1z WzBdLmJhc2U7CisKKwkgICAgICB2b2lkICp0YXJnZXRfcHRyYmxvY2sgPSAo dm9pZCopIHRndC0+dGd0X3N0YXJ0ICsgdGd0X3NpemU7CisJICAgICAgdGd0 X3NpemUgKz0gbmNhLT5wdHJibG9ja19zaXplOworCisJICAgICAgLyogQWRk IHNwbGF5IGtleSBmb3IgZWFjaCBkYXRhIHJvdyBpbiBjdXJyZW50IG5vbi1j b250aWd1b3VzCisJCSBhcnJheS4gICovCisJICAgICAgZm9yIChzaXplX3Qg aiA9IDA7IGogPCBuY2EtPmRhdGFfcm93X251bTsgaisrKQorCQl7CisJCSAg cm93ID0gaG9zdF9kYXRhX3Jvd3Nbcm93X3N0YXJ0ICsgal07CisJCSAgcm93 X2Rlc2MgPSAmdGd0LT5saXN0W21hcG51bSArIHJvd19zdGFydCArIGpdOwor CisJCSAgY3VyX25vZGUuaG9zdF9zdGFydCA9ICh1aW50cHRyX3QpIHJvdzsK KwkJICBjdXJfbm9kZS5ob3N0X2VuZCA9IGN1cl9ub2RlLmhvc3Rfc3RhcnQg KyBuY2EtPmRhdGFfcm93X3NpemU7CisJCSAgc3BsYXlfdHJlZV9rZXkgbiA9 IHNwbGF5X3RyZWVfbG9va3VwIChtZW1fbWFwLCAmY3VyX25vZGUpOworCQkg IGlmIChuKQorCQkgICAgeworCQkgICAgICBhc3NlcnQgKG4tPnJlZmNvdW50 ICE9IFJFRkNPVU5UX0xJTkspOworCQkgICAgICBnb21wX21hcF92YXJzX2V4 aXN0aW5nIChkZXZpY2VwLCBhcSwgbiwgJmN1cl9ub2RlLCByb3dfZGVzYywK KwkJCQkJICAgICAga2luZCAmIHR5cGVtYXNrLCBjYnVmcCk7CisJCSAgICAg IHRhcmdldF9yb3dfYWRkciA9IG4tPnRndC0+dGd0X3N0YXJ0ICsgbi0+dGd0 X29mZnNldDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAg IHRndC0+cmVmY291bnQrKzsKKworCQkgICAgICBzcGxheV90cmVlX2tleSBr ID0gJmFycmF5LT5rZXk7CisJCSAgICAgIGstPmhvc3Rfc3RhcnQgPSAodWlu dHB0cl90KSByb3c7CisJCSAgICAgIGstPmhvc3RfZW5kID0gay0+aG9zdF9z dGFydCArIG5jYS0+ZGF0YV9yb3dfc2l6ZTsKKworCQkgICAgICBrLT50Z3Qg PSB0Z3Q7CisJCSAgICAgIGstPnJlZmNvdW50ID0gMTsKKwkJICAgICAgay0+ bGlua19rZXkgPSBOVUxMOworCQkgICAgICB0Z3Rfc2l6ZSA9ICh0Z3Rfc2l6 ZSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7CisJCSAgICAgIHRhcmdl dF9yb3dfYWRkciA9IHRndC0+dGd0X3N0YXJ0ICsgdGd0X3NpemU7CisJCSAg ICAgIGstPnRndF9vZmZzZXQgPSB0Z3Rfc2l6ZTsKKwkJICAgICAgdGd0X3Np emUgKz0gbmNhLT5kYXRhX3Jvd19zaXplOworCisJCSAgICAgIHJvd19kZXNj LT5rZXkgPSBrOworCQkgICAgICByb3dfZGVzYy0+Y29weV9mcm9tCisJCQk9 IEdPTVBfTUFQX0NPUFlfRlJPTV9QIChraW5kICYgdHlwZW1hc2spOworCQkg ICAgICByb3dfZGVzYy0+YWx3YXlzX2NvcHlfZnJvbQorCQkJPSBHT01QX01B UF9DT1BZX0ZST01fUCAoa2luZCAmIHR5cGVtYXNrKTsKKwkJICAgICAgcm93 X2Rlc2MtPm9mZnNldCA9IDA7CisJCSAgICAgIHJvd19kZXNjLT5sZW5ndGgg PSBuY2EtPmRhdGFfcm93X3NpemU7CisKKwkJICAgICAgYXJyYXktPmxlZnQg PSBOVUxMOworCQkgICAgICBhcnJheS0+cmlnaHQgPSBOVUxMOworCQkgICAg ICBzcGxheV90cmVlX2luc2VydCAobWVtX21hcCwgYXJyYXkpOworCisJCSAg ICAgIGlmIChHT01QX01BUF9DT1BZX1RPX1AgKGtpbmQgJiB0eXBlbWFzaykp CisJCQlnb21wX2NvcHlfaG9zdDJkZXYgKGRldmljZXAsIGFxLAorCQkJCQkg ICAgKHZvaWQgKikgdGd0LT50Z3Rfc3RhcnQgKyBrLT50Z3Rfb2Zmc2V0LAor CQkJCQkgICAgKHZvaWQgKikgay0+aG9zdF9zdGFydCwKKwkJCQkJICAgIG5j YS0+ZGF0YV9yb3dfc2l6ZSwgY2J1ZnApOworCQkgICAgICBhcnJheSsrOwor CQkgICAgfQorCQkgIHRhcmdldF9kYXRhX3Jvd3Nbcm93X3N0YXJ0ICsgal0g PSAodm9pZCAqKSB0YXJnZXRfcm93X2FkZHI7CisJCX0KKworCSAgICAgIC8q IE5vdyB3ZSBoYXZlIHRoZSB0YXJnZXQgbWVtb3J5IGFsbG9jYXRlZCwgYW5k IHRhcmdldCBvZmZzZXRzIG9mIGFsbAorCQkgcm93IGJsb2NrcyBhc3NpZ25l ZCBhbmQgY2FsY3VsYXRlZCwgd2UgY2FuIGNvbnN0cnVjdCB0aGUKKwkJIGFj Y2VsZXJhdG9yIHNpZGUgcHRyYmxvY2sgYW5kIGNvcHkgaXQgaW4uICAqLwor CSAgICAgIGlmIChuY2EtPnB0cmJsb2NrX3NpemUpCisJCXsKKwkJICB2b2lk ICpwdHJibG9jayA9IGdvbXBfbm9uY29udGlnX2FycmF5X2NyZWF0ZV9wdHJi bG9jaworCQkgICAgKG5jYSwgdGFyZ2V0X3B0cmJsb2NrLCB0YXJnZXRfZGF0 YV9yb3dzICsgcm93X3N0YXJ0KTsKKwkJICBnb21wX2NvcHlfaG9zdDJkZXYg KGRldmljZXAsIGFxLCB0YXJnZXRfcHRyYmxvY2ssIHB0cmJsb2NrLAorCQkJ CSAgICAgIG5jYS0+cHRyYmxvY2tfc2l6ZSwgY2J1ZnApOworCQkgIGZyZWUg KHB0cmJsb2NrKTsKKwkJfQorCisJICAgICAgcm93X3N0YXJ0ICs9IG5jYS0+ ZGF0YV9yb3dfbnVtOworCSAgICB9CisJICBhc3NlcnQgKHJvd19zdGFydCA9 PSBuY2FfZGF0YV9yb3dfbnVtICYmIG5jYV9pbmRleCA9PSBuY2FfaW5mb19u dW0pOworCX0KICAgICB9CiAKKyAgaWYgKG5jYV9kYXRhX3Jvd19udW0pCisg ICAgZnJlZSAoaG9zdF9kYXRhX3Jvd3MpOworCiAgIGlmIChwcmFnbWFfa2lu ZCA9PSBHT01QX01BUF9WQVJTX1RBUkdFVCkKICAgICB7CiAgICAgICBmb3Ig KGkgPSAwOyBpIDwgbWFwbnVtOyBpKyspCkluZGV4OiBsaWJnb21wL3Rlc3Rz dWl0ZS9saWJnb21wLm9hY2MtYy1jKystY29tbW9uL25vbmNvbnRpZ19hcnJh eS0xLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbGliZ29tcC90ZXN0 c3VpdGUvbGliZ29tcC5vYWNjLWMtYysrLWNvbW1vbi9ub25jb250aWdfYXJy YXktMS5jCShub25leGlzdGVudCkKKysrIGxpYmdvbXAvdGVzdHN1aXRlL2xp YmdvbXAub2FjYy1jLWMrKy1jb21tb24vbm9uY29udGlnX2FycmF5LTEuYwko d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwMyBAQAorLyogeyBkZy1kbyBy dW4gfSAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNz ZXJ0Lmg+CisKKyNkZWZpbmUgbiAxMDAKKyNkZWZpbmUgbSAxMDAKKworaW50 IGJbbl1bbV07CisKK3ZvaWQKK3Rlc3QxICh2b2lkKQoreworICBpbnQgaSwg aiwgKmFbMTAwXTsKKworICAvKiBBcnJheSBvZiBwb2ludGVycyBmb3JtIHRl c3QuICAqLworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAg ICAgIGFbaV0gPSAoaW50ICopbWFsbG9jIChzaXplb2YgKGludCkgKiBtKTsK KyAgICAgIGZvciAoaiA9IDA7IGogPCBtOyBqKyspCisJYltpXVtqXSA9IGog LSBpOworICAgIH0KKworICAjcHJhZ21hIGFjYyBwYXJhbGxlbCBsb29wIGNv cHlvdXQoYVswOm5dWzA6bV0pIGNvcHlpbihiKQorICBmb3IgKGkgPSAwOyBp IDwgbjsgaSsrKQorICAgICNwcmFnbWEgYWNjIGxvb3AKKyAgICBmb3IgKGog PSAwOyBqIDwgbTsgaisrKQorICAgICAgYVtpXVtqXSA9IGJbaV1bal07CisK KyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBmb3Ig KGogPSAwOyBqIDwgbTsgaisrKQorCWFzc2VydCAoYVtpXVtqXSA9PSBiW2ld W2pdKTsKKyAgICAgIC8qIENsZWFuIHVwLiAgKi8KKyAgICAgIGZyZWUgKGFb aV0pOworICAgIH0KK30KKwordm9pZAordGVzdDIgKHZvaWQpCit7CisgIGlu dCBpLCBqLCAqKmEgPSAoaW50ICoqKSBtYWxsb2MgKHNpemVvZiAoaW50ICop ICogbik7CisKKyAgLyogU2VwYXJhdGVseSBhbGxvY2F0ZWQgYmxvY2tzLiAg Ki8KKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBh W2ldID0gKGludCAqKW1hbGxvYyAoc2l6ZW9mIChpbnQpICogbSk7CisgICAg ICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKQorCWJbaV1bal0gPSBqIC0gaTsK KyAgICB9CisKKyAgI3ByYWdtYSBhY2MgcGFyYWxsZWwgbG9vcCBjb3B5b3V0 KGFbMDpuXVswOm1dKSBjb3B5aW4oYikKKyAgZm9yIChpID0gMDsgaSA8IG47 IGkrKykKKyAgICAjcHJhZ21hIGFjYyBsb29wCisgICAgZm9yIChqID0gMDsg aiA8IG07IGorKykKKyAgICAgIGFbaV1bal0gPSBiW2ldW2pdOworCisgIGZv ciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgZm9yIChqID0g MDsgaiA8IG07IGorKykKKwlhc3NlcnQgKGFbaV1bal0gPT0gYltpXVtqXSk7 CisgICAgICAvKiBDbGVhbiB1cC4gICovCisgICAgICBmcmVlIChhW2ldKTsK KyAgICB9CisgIGZyZWUgKGEpOworfQorCit2b2lkCit0ZXN0MyAodm9pZCkK K3sKKyAgaW50IGksIGosICoqYSA9IChpbnQgKiopIG1hbGxvYyAoc2l6ZW9m IChpbnQgKikgKiBuKTsKKyAgYVswXSA9IChpbnQgKikgbWFsbG9jIChzaXpl b2YgKGludCkgKiBuICogbSk7CisKKyAgLyogUm93cyBhbGxvY2F0ZWQgaW4g b25lIGNvbnRpZ3VvdXMgYmxvY2suICAqLworICBmb3IgKGkgPSAwOyBpIDwg bjsgaSsrKQorICAgIHsKKyAgICAgIGFbaV0gPSAqYSArIGkgKiBtOworICAg ICAgZm9yIChqID0gMDsgaiA8IG07IGorKykKKwliW2ldW2pdID0gaiAtIGk7 CisgICAgfQorCisgICNwcmFnbWEgYWNjIHBhcmFsbGVsIGxvb3AgY29weW91 dChhWzA6bl1bMDptXSkgY29weWluKGIpCisgIGZvciAoaSA9IDA7IGkgPCBu OyBpKyspCisgICAgI3ByYWdtYSBhY2MgbG9vcAorICAgIGZvciAoaiA9IDA7 IGogPCBtOyBqKyspCisgICAgICBhW2ldW2pdID0gYltpXVtqXTsKKworICBm b3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIGZvciAoaiA9IDA7IGogPCBt OyBqKyspCisgICAgICBhc3NlcnQgKGFbaV1bal0gPT0gYltpXVtqXSk7CisK KyAgZnJlZSAoYVswXSk7CisgIGZyZWUgKGEpOworfQorCitpbnQKK21haW4g KHZvaWQpCit7CisgIHRlc3QxICgpOworICB0ZXN0MiAoKTsKKyAgdGVzdDMg KCk7CisgIHJldHVybiAwOworfQpJbmRleDogbGliZ29tcC90ZXN0c3VpdGUv bGliZ29tcC5vYWNjLWMtYysrLWNvbW1vbi9ub25jb250aWdfYXJyYXktMi5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGxpYmdvbXAvdGVzdHN1aXRl L2xpYmdvbXAub2FjYy1jLWMrKy1jb21tb24vbm9uY29udGlnX2FycmF5LTIu Ywkobm9uZXhpc3RlbnQpCisrKyBsaWJnb21wL3Rlc3RzdWl0ZS9saWJnb21w Lm9hY2MtYy1jKystY29tbW9uL25vbmNvbnRpZ19hcnJheS0yLmMJKHdvcmtp bmcgY29weSkKQEAgLTAsMCArMSwzNyBAQAorLyogeyBkZy1kbyBydW4gfSAq LworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAibm9uY29udGln X2FycmF5LXV0aWxzLmgiCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgaW50 IG4gPSAxMDsKKyAgaW50ICoqKmEgPSAoaW50ICoqKikgY3JlYXRlX25jYXJy YXkgKHNpemVvZiAoaW50KSwgbiwgMyk7CisgIGludCAqKipiID0gKGludCAq KiopIGNyZWF0ZV9uY2FycmF5IChzaXplb2YgKGludCksIG4sIDMpOworICBp bnQgKioqYyA9IChpbnQgKioqKSBjcmVhdGVfbmNhcnJheSAoc2l6ZW9mIChp bnQpLCBuLCAzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykK KyAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykKKyAgICAgIGZvciAo aW50IGsgPSAwOyBrIDwgbjsgaysrKQorCXsKKwkgIGFbaV1bal1ba10gPSBp ICsgaiAqIGsgKyBrOworCSAgYltpXVtqXVtrXSA9IGogKyBrICogaSArIGkg KiBqOworCSAgY1tpXVtqXVtrXSA9IGFbaV1bal1ba107CisJfQorCisgICNw cmFnbWEgYWNjIHBhcmFsbGVsIGNvcHkgKGFbMDpuXVswOm5dWzA6bl0pIGNv cHlpbiAoYlswOm5dWzA6bl1bMDpuXSkKKyAgeworICAgIGZvciAoaW50IGkg PSAwOyBpIDwgbjsgaSsrKQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBu OyBqKyspCisJZm9yIChpbnQgayA9IDA7IGsgPCBuOyBrKyspCisJICBhW2ld W2pdW2tdICs9IGJba11bal1baV0gKyBpICsgaiArIGs7CisgIH0KKworICBm b3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICBmb3IgKGludCBqID0g MDsgaiA8IG47IGorKykKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbjsg aysrKQorCWFzc2VydCAoYVtpXVtqXVtrXSA9PSBjW2ldW2pdW2tdICsgYltr XVtqXVtpXSArIGkgKyBqICsgayk7CisKKyAgcmV0dXJuIDA7Cit9CkluZGV4 OiBsaWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLm9hY2MtYy1jKystY29tbW9u L25vbmNvbnRpZ19hcnJheS0zLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5vYWNjLWMtYysrLWNvbW1v bi9ub25jb250aWdfYXJyYXktMy5jCShub25leGlzdGVudCkKKysrIGxpYmdv bXAvdGVzdHN1aXRlL2xpYmdvbXAub2FjYy1jLWMrKy1jb21tb24vbm9uY29u dGlnX2FycmF5LTMuYwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ1IEBA CisvKiB7IGRnLWRvIHJ1biB9ICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4K KyNpbmNsdWRlICJub25jb250aWdfYXJyYXktdXRpbHMuaCIKKworaW50IG1h aW4gKHZvaWQpCit7CisgIGludCBuID0gMjAsIHggPSA1LCB5ID0gMTI7Cisg IGludCAqKioqKmEgPSAoaW50ICoqKioqKSBjcmVhdGVfbmNhcnJheSAoc2l6 ZW9mIChpbnQpLCBuLCA1KTsKKworICBpbnQgc3VtMSA9IDAsIHN1bTIgPSAw LCBzdW0zID0gMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykK KyAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykKKyAgICAgIGZvciAo aW50IGsgPSAwOyBrIDwgbjsgaysrKQorCWZvciAoaW50IGwgPSAwOyBsIDwg bjsgbCsrKQorCSAgZm9yIChpbnQgbSA9IDA7IG0gPCBuOyBtKyspCisJICAg IHsKKwkgICAgICBhW2ldW2pdW2tdW2xdW21dID0gMTsKKwkgICAgICBzdW0x Kys7CisJICAgIH0KKworICAjcHJhZ21hIGFjYyBwYXJhbGxlbCBjb3B5IChh W3g6eV1beDp5XVt4OnldW3g6eV1beDp5XSkgY29weShzdW0yKQorICB7Cisg ICAgZm9yIChpbnQgaSA9IHg7IGkgPCB4ICsgeTsgaSsrKQorICAgICAgZm9y IChpbnQgaiA9IHg7IGogPCB4ICsgeTsgaisrKQorCWZvciAoaW50IGsgPSB4 OyBrIDwgeCArIHk7IGsrKykKKwkgIGZvciAoaW50IGwgPSB4OyBsIDwgeCAr IHk7IGwrKykKKwkgICAgZm9yIChpbnQgbSA9IHg7IG0gPCB4ICsgeTsgbSsr KQorCSAgICAgIHsKKwkJYVtpXVtqXVtrXVtsXVttXSA9IDA7CisJCXN1bTIr KzsKKwkgICAgICB9CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG47 IGkrKykKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykKKyAgICAg IGZvciAoaW50IGsgPSAwOyBrIDwgbjsgaysrKQorCWZvciAoaW50IGwgPSAw OyBsIDwgbjsgbCsrKQorCSAgZm9yIChpbnQgbSA9IDA7IG0gPCBuOyBtKysp CisJICAgIHN1bTMgKz0gYVtpXVtqXVtrXVtsXVttXTsKKworICBhc3NlcnQg KHN1bTEgPT0gc3VtMiArIHN1bTMpOworICByZXR1cm4gMDsKK30KSW5kZXg6 IGxpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAub2FjYy1jLWMrKy1jb21tb24v bm9uY29udGlnX2FycmF5LTQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t LSBsaWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLm9hY2MtYy1jKystY29tbW9u L25vbmNvbnRpZ19hcnJheS00LmMJKG5vbmV4aXN0ZW50KQorKysgbGliZ29t cC90ZXN0c3VpdGUvbGliZ29tcC5vYWNjLWMtYysrLWNvbW1vbi9ub25jb250 aWdfYXJyYXktNC5jCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzYgQEAK Ky8qIHsgZGctZG8gcnVuIH0gKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgor I2luY2x1ZGUgIm5vbmNvbnRpZ19hcnJheS11dGlscy5oIgorCitpbnQgbWFp biAodm9pZCkKK3sKKyAgaW50IG4gPSAxMjg7CisgIGRvdWJsZSAqKiphID0g KGRvdWJsZSAqKiopIGNyZWF0ZV9uY2FycmF5IChzaXplb2YgKGRvdWJsZSks IG4sIDMpOworICBkb3VibGUgKioqYiA9IChkb3VibGUgKioqKSBjcmVhdGVf bmNhcnJheSAoc2l6ZW9mIChkb3VibGUpLCBuLCAzKTsKKworICBmb3IgKGlu dCBpID0gMDsgaSA8IG47IGkrKykKKyAgICBmb3IgKGludCBqID0gMDsgaiA8 IG47IGorKykKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbjsgaysrKQor CWFbaV1bal1ba10gPSBpICsgaiArIGsgKyBpICogaiAqIGs7CisKKyAgLyog VGhpcyB0ZXN0IGV4ZXJjaXNlcyBhc3luYyBjb3B5b3V0IG9mIG5vbi1jb250 aWd1b3VzIGFycmF5IHJvd3MuICAqLworICAjcHJhZ21hIGFjYyBwYXJhbGxl bCBjb3B5aW4oYVswOm5dWzA6bl1bMDpuXSkgY29weW91dChiWzA6bl1bMDpu XVswOm5dKSBhc3luYyg1KQorICB7CisgICAgI3ByYWdtYSBhY2MgbG9vcCBn YW5nCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAj cHJhZ21hIGFjYyBsb29wIHZlY3RvcgorICAgICAgZm9yIChpbnQgaiA9IDA7 IGogPCBuOyBqKyspCisJZm9yIChpbnQgayA9IDA7IGsgPCBuOyBrKyspCisJ ICBiW2ldW2pdW2tdID0gYVtpXVtqXVtrXSAqIDIuMDsKKyAgfQorCisgICNw cmFnbWEgYWNjIHdhaXQgKDUpCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBu OyBpKyspCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspCisgICAg ICBmb3IgKGludCBrID0gMDsgayA8IG47IGsrKykKKwlhc3NlcnQgKGJbaV1b al1ba10gPT0gYVtpXVtqXVtrXSAqIDIuMCk7CisKKyAgcmV0dXJuIDA7Cit9 CkluZGV4OiBsaWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLm9hY2MtYy1jKyst Y29tbW9uL25vbmNvbnRpZ19hcnJheS11dGlscy5oCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KLS0tIGxpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAub2FjYy1j LWMrKy1jb21tb24vbm9uY29udGlnX2FycmF5LXV0aWxzLmgJKG5vbmV4aXN0 ZW50KQorKysgbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5vYWNjLWMtYysr LWNvbW1vbi9ub25jb250aWdfYXJyYXktdXRpbHMuaAkod29ya2luZyBjb3B5 KQpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5j bHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVk ZSA8c3RkaW50Lmg+CisKKy8qIEFsbG9jYXRlIGFuZCBjcmVhdGUgYSBwb2lu dGVyIGJhc2VkIE5ESU1TLWRpbWVuc2lvbmFsIGFycmF5LAorICAgZWFjaCBk aW1lbnNpb24gRElNTEVOIGxvbmcsIHdpdGggRUxTSVpFIHNpemVkIGRhdGEg ZWxlbWVudHMuICAqLwordm9pZCAqCitjcmVhdGVfbmNhcnJheSAoc2l6ZV90 IGVsc2l6ZSwgaW50IGRpbWxlbiwgaW50IG5kaW1zKQoreworICBzaXplX3Qg YmxrX3NpemUgPSAwOworICBzaXplX3QgbiA9IDE7CisKKyAgZm9yIChpbnQg aSA9IDA7IGkgPCBuZGltcyAtIDE7IGkrKykKKyAgICB7CisgICAgICBuICo9 IGRpbWxlbjsKKyAgICAgIGJsa19zaXplICs9IHNpemVvZiAodm9pZCAqKSAq IG47CisgICAgfQorICBzaXplX3QgZGF0YV9yb3dzX251bSA9IG47CisgIHNp emVfdCBkYXRhX3Jvd3Nfb2Zmc2V0ID0gYmxrX3NpemU7CisgIGJsa19zaXpl ICs9IGVsc2l6ZSAqIG4gKiBkaW1sZW47CisKKyAgdm9pZCAqYmxrID0gKHZv aWQgKikgbWFsbG9jIChibGtfc2l6ZSk7CisgIG1lbXNldCAoYmxrLCAwLCBi bGtfc2l6ZSk7CisgIHZvaWQgKipjdXJyX2RpbSA9ICh2b2lkICoqKSBibGs7 CisgIG4gPSAxOworCisgIGZvciAoaW50IGQgPSAwOyBkIDwgbmRpbXMgLSAx OyBkKyspCisgICAgeworICAgICAgdWludHB0cl90IG5leHRfZGltID0gKHVp bnRwdHJfdCkgKGN1cnJfZGltICsgbiAqIGRpbWxlbik7CisgICAgICBzaXpl X3QgbmV4dF9kaW1sZW4gPSBkaW1sZW4gKiAoZCA8IG5kaW1zIC0gMiA/IHNp emVvZiAodm9pZCAqKSA6IGVsc2l6ZSk7CisKKyAgICAgIGZvciAoaW50IGIg PSAwOyBiIDwgbjsgYisrKQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8 IGRpbWxlbjsgaSsrKQorCSAgaWYgKGQgPCBuZGltcyAtIDEpCisJICAgIGN1 cnJfZGltW2IgKiBkaW1sZW4gKyBpXQorCSAgICAgID0gKHZvaWQqKSAobmV4 dF9kaW0gKyBiICogZGltbGVuICogbmV4dF9kaW1sZW4gKyBpICogbmV4dF9k aW1sZW4pOworCisgICAgICBuICo9IGRpbWxlbjsKKyAgICAgIGN1cnJfZGlt ID0gKHZvaWQqKikgbmV4dF9kaW07CisgICAgfQorICBhc3NlcnQgKG4gPT0g ZGF0YV9yb3dzX251bSk7CisgIHJldHVybiBibGs7Cit9Cg== --------------5965C2E5AD025572BB199F06--