From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B734CC48BD6 for ; Thu, 27 Jun 2019 05:29:24 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 80B90208E3 for ; Thu, 27 Jun 2019 05:29:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fD/lgO1q"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="vOV4sF2/"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=cs.washington.edu header.i=@cs.washington.edu header.b="lXNxs6eC" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 80B90208E3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=cs.washington.edu Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To :From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=aeQPjUSkbohMKT8rgwXiRB3/avSQpjCim6zOwtVzkn0=; b=fD/lgO1qwP4FA6 QsR4AwPKU+RdoJPllFoutRCl40Lmv5RW6eAwut7X25xiBWlio1IcAcoADg1XP2hIzyHUPHb0D1G28 8iZBpOP7h8WtUHvSAJp7I7hlYYr+gLQFMlMDiPne719OfOsZcLpJhIf/Ci/kovEzC4dLiz/X+JTUB qyVZEkP11oT6QMhDSicxJ935jUFef4e1j/FyGXy/7IMFL/3Y8TwZBZ/Xts4QrESiK10JprzxJdD7j 2d7b7DC+fK+v+AiIKDgxi8M6eH6Fh7xd7ZJcMifzpVcmnQohGEmYRSRmJrm5mJF6Kaa3Li7+GVHAE t4NmEtPxGZ0FsJ4WDpOg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hgMyD-0000IR-KK; Thu, 27 Jun 2019 05:29:17 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hgMsZ-00033C-7A for linux-riscv@bombadil.infradead.org; Thu, 27 Jun 2019 05:23:27 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:Content-Type: MIME-Version:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=kMEKWmswR++MwaeOYE9+Bhs9jvrbUPAaV8iYyG7/DgA=; b=vOV4sF2/rWfSWTqkYXIGvQ41yJ LdVb/YrSrAWsIETSlnpNXYJzfYFhYLbMsxFqGvYbeMBba5goW8jbPzZkFA9osqE6hCc9FYDqltmo9 2LjkGBv9HZJTTHn2t0f/KgaifsW3KSzXI0MwZK8rfdNaequw1NuniQVSBblD+RbS86jKoblKd/DnG YcHKZn0iZkk0aM87kCeO+75idocWaJEUv4uKFijAT3vkvaPaf/1FRnEr+Vx8RD0ELynwzJqp/RBsW 5usmyQ4Slf2ZE/ouSBYhYxpXlR23uguO/o33ngN+eQC3+a1O3CNmkio1Xbc2eLdw9jEkQIGPGdX/a 8s6omgbQ==; Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]) by casper.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hgH8J-0008Ji-UK for linux-riscv@lists.infradead.org; Wed, 26 Jun 2019 23:15:24 +0000 Received: by mail-pf1-x442.google.com with SMTP id i189so194193pfg.10 for ; Wed, 26 Jun 2019 16:15:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cs.washington.edu; s=goo201206; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=kMEKWmswR++MwaeOYE9+Bhs9jvrbUPAaV8iYyG7/DgA=; b=lXNxs6eCGpF5qdJIdUOCYM63JNibU7sLs4bC2pAnttfE5CvncE//oSu2ZC5pENJmnZ si4Qf/tGa6hi05H1LnEn1XjECeOWOPzw1DbT3YEcGQNNFxhJPBeP5loA4AXwZwFDinO8 VBfuxtkJshcRtxDbjOTvJ76pQPPHlVDlVT20g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=kMEKWmswR++MwaeOYE9+Bhs9jvrbUPAaV8iYyG7/DgA=; b=hGNn+b9i+MdnsDnhkCiSySqhzQ1Z1J+NFuaCRlQ9JLd2t54/+arejSTwAnDtwJFUVN wd/x1EtU1Ct7ij8WbylbPFxg/83mqjKFJjpxQJxewKuv3L5fjrazCj5K3dGwgLDUU3Jw 8Xr1X3E6qQbmrlHECasQvjcQjTac/RoPplaJa3y5v4tB1eRQL6ANxpHHmYwLIEMn8fls 0GrDHcZSEajmq1LoC4/vH6LQnwC+as0NkWYoMLrekoogVYwtGVilifDbfBeu0k5J5ZO3 cm8CFdgsvwRfErz2H2cXd4ZbpB5z28lZdnrJZl/eaTO1e0d2xNnOi/eK0QfFCcIcry46 /s0w== X-Gm-Message-State: APjAAAVSY0j3SbKQZxd22H0un3NIeykLwsV0z3L3bU4gcZj14kFEG0pD sXvZRupdoKeJk9RpTcU1UoAovQ== X-Google-Smtp-Source: APXvYqwE2C4am7aTXCD5iE2Ln1m4nZk/36HTjE8Q3HuiqQeNjcjy3rexeiCnrbI4jXqiJz9DzBsSVg== X-Received: by 2002:a63:5048:: with SMTP id q8mr462925pgl.446.1561590785750; Wed, 26 Jun 2019 16:13:05 -0700 (PDT) Received: from ryzen.cs.washington.edu ([2607:4000:200:11:e44e:e51a:f834:6d25]) by smtp.gmail.com with ESMTPSA id y22sm351588pfo.39.2019.06.26.16.13.04 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Wed, 26 Jun 2019 16:13:05 -0700 (PDT) From: Luke Nelson To: linux-kernel@vger.kernel.org Subject: [PATCH v2 bpf-next] RV32G eBPF JIT Date: Wed, 26 Jun 2019 16:12:50 -0700 Message-Id: <20190626231257.14495-1-lukenels@cs.washington.edu> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190627_001520_085253_63859970 X-CRM114-Status: GOOD ( 24.20 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Song Liu , Albert Ou , bpf@vger.kernel.org, Daniel Borkmann , Luke Nelson , =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= , Palmer Dabbelt , Alexei Starovoitov , netdev@vger.kernel.org, Yonghong Song , linux-riscv@lists.infradead.org, Martin KaFai Lau , Xi Wang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org RnJvbTogTHVrZSBOZWxzb24gPGx1a2Uuci5uZWxzQGdtYWlsLmNvbT4KClRoaXMgaXMgYW4gZUJQ RiBKSVQgZm9yIFJWMzJHLCBhZGFwdGVkIGZyb20gdGhlIEpJVCBmb3IgUlY2NEcuCgpUaGVyZSBh cmUgdHdvIG1haW4gY2hhbmdlcyByZXF1aXJlZCBmb3IgdGhpcyB0byB3b3JrIGNvbXBhcmVkIHRv IHRoZQpSVjY0IEpJVC4KCkZpcnN0LCBlQlBGIHJlZ2lzdGVycyBhcmUgNjQtYml0LCB3aGlsZSBS VjMyRyByZWdpc3RlcnMgYXJlIDMyLWJpdC4KQlBGIHJlZ2lzdGVycyBlaXRoZXIgbWFwIGRpcmVj dGx5IHRvIDIgUklTQy1WIHJlZ2lzdGVycywgb3IgcmVzaWRlCmluIHN0YWNrIHNjcmF0Y2ggc3Bh Y2UgYW5kIGFyZSBzYXZlZCBhbmQgcmVzdG9yZWQgd2hlbiB1c2VkLgoKU2Vjb25kLCBtYW55IDY0 LWJpdCBBTFUgb3BlcmF0aW9ucyBkbyBub3QgdHJpdmlhbGx5IG1hcCB0byAzMi1iaXQKb3BlcmF0 aW9ucy4gT3BlcmF0aW9ucyB0aGF0IG1vdmUgYml0cyBiZXR3ZWVuIGhpZ2ggYW5kIGxvdyB3b3Jk cywgc3VjaAphcyBBREQsIExTSCwgTVVMLCBhbmQgb3RoZXJzIG11c3QgZW11bGF0ZSB0aGUgNjQt Yml0IGJlaGF2aW9yIGluIHRlcm1zCm9mIDMyLWJpdCBpbnN0cnVjdGlvbnMuCgpJdCBwYXNzZXMg MzYwIG91dCBvZiAzNzggdGVzdHMgaW4gdGVzdF9icGYua28uIFRoZSBmYWlsaW5nIHRlc3RzIGFy ZQpmZWF0dXJlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkLgogICogQUxVNjQgRElWL01PRAogICog QlBGX1hBREQgfCBCUEZfRFcKICAqIFRhaWwgY2FsbHMKCnYxIC0+IHYyOgogICogQWRkZWQgc3Vw cG9ydCBmb3IgZmFyIGNvbmRpdGlvbmFsIGJyYW5jaGVzLgogICogQWRkZWQgdGhlIHplcm8tZXh0 ZW5zaW9uIG9wdGltaXphdGlvbiBwb2ludGVkIG91dCBieSBKaW9uZyBXYW5nLgogICogQWRkZWQg bW9yZSBvcHRpbWl6YXRpb25zIGZvciBvcGVyYXRpb25zIHdpdGggYW4gaW1tZWRpYXRlIG9wZXJh bmQuCgpDby1kZXZlbG9wZWQtYnk6IFhpIFdhbmcgPHhpLndhbmdAZ21haWwuY29tPgpTaWduZWQt b2ZmLWJ5OiBYaSBXYW5nIDx4aS53YW5nQGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1ieTogTHVrZSBO ZWxzb24gPGx1a2Uuci5uZWxzQGdtYWlsLmNvbT4KLS0tCiBhcmNoL3Jpc2N2L0tjb25maWcgICAg ICAgICAgICAgIHwgICAgMiArLQogYXJjaC9yaXNjdi9uZXQvTWFrZWZpbGUgICAgICAgICB8ICAg IDcgKy0KIGFyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcDMyLmMgfCAxNjU1ICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMTY2MiBpbnNlcnRpb25zKCsp LCAyIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gvcmlzY3YvbmV0L2JwZl9q aXRfY29tcDMyLmMKCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L0tjb25maWcgYi9hcmNoL3Jpc2N2 L0tjb25maWcKaW5kZXggMGM0YjEyMjA1NjMyLi4xNTNmZjllZTZlNmMgMTAwNjQ0Ci0tLSBhL2Fy Y2gvcmlzY3YvS2NvbmZpZworKysgYi9hcmNoL3Jpc2N2L0tjb25maWcKQEAgLTQ5LDcgKzQ5LDcg QEAgY29uZmlnIFJJU0NWCiAJc2VsZWN0IEdFTkVSSUNfSVJRX01VTFRJX0hBTkRMRVIKIAlzZWxl Y3QgQVJDSF9IQVNfUFRFX1NQRUNJQUwKIAlzZWxlY3QgQVJDSF9IQVNfTU1JT1dCCi0Jc2VsZWN0 IEhBVkVfRUJQRl9KSVQgaWYgNjRCSVQKKwlzZWxlY3QgSEFWRV9FQlBGX0pJVAogCiBjb25maWcg TU1VCiAJZGVmX2Jvb2wgeQpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9uZXQvTWFrZWZpbGUgYi9h cmNoL3Jpc2N2L25ldC9NYWtlZmlsZQppbmRleCBlYzViMTQ3NjMzMTYuLjU1MTFmYjFkZDQwZSAx MDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9uZXQvTWFrZWZpbGUKKysrIGIvYXJjaC9yaXNjdi9uZXQv TWFrZWZpbGUKQEAgLTEsMiArMSw3IEBACiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wLW9ubHkKLW9iai0kKENPTkZJR19CUEZfSklUKSArPSBicGZfaml0X2NvbXAubworCitpZmVx ICgkKENPTkZJR19BUkNIX1JWNjRJKSx5KQorCW9iai0kKENPTkZJR19CUEZfSklUKSArPSBicGZf aml0X2NvbXAubworZWxzZQorCW9iai0kKENPTkZJR19CUEZfSklUKSArPSBicGZfaml0X2NvbXAz Mi5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wMzIuYyBi L2FyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAwLi4xNzlmZjQ2ZTJiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Jp c2N2L25ldC9icGZfaml0X2NvbXAzMi5jCkBAIC0wLDAgKzEsMTY1NSBAQAorLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qIEJQRiBKSVQgY29tcGlsZXIgZm9yIFJWMzJHCisg KgorICogQ29weXJpZ2h0IChjKSAyMDE5IEx1a2UgTmVsc29uIDxsdWtlLnIubmVsc0BnbWFpbC5j b20+CisgKgorICogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBjb2RlIGFuZCBpZGVhcyBmcm9t CisgKiBCasO2cm4gVMO2cGVsIDxiam9ybi50b3BlbEBnbWFpbC5jb20+LCB3aG8gd3JvdGUgdGhl IHJ2NjRnIEJQRiBKSVQsIGFuZAorICogU2h1YmhhbSBCYW5zYWwgPGlsbHVzaW9uaXN0Lm5lb0Bn bWFpbC5jb20+IGFuZCBNaXJjZWEgR2hlcnphbiA8bWdoZXJ6YW5AZ21haWwuY29tPiwKKyAqIHdo byB3cm90ZSB0aGUgMzItYml0IEFSTSBCUEYgSklULgorICovCisKKyNpbmNsdWRlIDxsaW51eC9i cGYuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVz aC5oPgorCitlbnVtIHsKKwlSVl9SRUdfWkVSTyA9CTAsCS8qIFRoZSBjb25zdGFudCB2YWx1ZSAw ICovCisJUlZfUkVHX1JBID0JMSwJLyogUmV0dXJuIGFkZHJlc3MgKi8KKwlSVl9SRUdfU1AgPQky LAkvKiBTdGFjayBwb2ludGVyICovCisJUlZfUkVHX0dQID0JMywJLyogR2xvYmFsIHBvaW50ZXIg Ki8KKwlSVl9SRUdfVFAgPQk0LAkvKiBUaHJlYWQgcG9pbnRlciAqLworCVJWX1JFR19UMCA9CTUs CS8qIFRlbXBvcmFyaWVzICovCisJUlZfUkVHX1QxID0JNiwKKwlSVl9SRUdfVDIgPQk3LAorCVJW X1JFR19GUCA9CTgsCisJUlZfUkVHX1MxID0JOSwJLyogU2F2ZWQgcmVnaXN0ZXJzICovCisJUlZf UkVHX0EwID0JMTAsCS8qIEZ1bmN0aW9uIGFyZ3VtZW50L3JldHVybiB2YWx1ZXMgKi8KKwlSVl9S RUdfQTEgPQkxMSwJLyogRnVuY3Rpb24gYXJndW1lbnRzICovCisJUlZfUkVHX0EyID0JMTIsCisJ UlZfUkVHX0EzID0JMTMsCisJUlZfUkVHX0E0ID0JMTQsCisJUlZfUkVHX0E1ID0JMTUsCisJUlZf UkVHX0E2ID0JMTYsCisJUlZfUkVHX0E3ID0JMTcsCisJUlZfUkVHX1MyID0JMTgsCS8qIFNhdmVk IHJlZ2lzdGVycyAqLworCVJWX1JFR19TMyA9CTE5LAorCVJWX1JFR19TNCA9CTIwLAorCVJWX1JF R19TNSA9CTIxLAorCVJWX1JFR19TNiA9CTIyLAorCVJWX1JFR19TNyA9CTIzLAorCVJWX1JFR19T OCA9CTI0LAorCVJWX1JFR19TOSA9CTI1LAorCVJWX1JFR19TMTAgPQkyNiwKKwlSVl9SRUdfUzEx ID0JMjcsCisJUlZfUkVHX1QzID0JMjgsCS8qIFRlbXBvcmFyaWVzICovCisJUlZfUkVHX1Q0ID0J MjksCisJUlZfUkVHX1Q1ID0JMzAsCisJUlZfUkVHX1Q2ID0JMzEsCit9OworCitlbnVtIHsKKwkv KiBTdGFjayBsYXlvdXQgLSB0aGVzZSBhcmUgb2Zmc2V0cyBmcm9tICh0b3Agb2Ygc3RhY2sgLSA0 KSAqLworCUJQRl9SNl9ISSwKKwlCUEZfUjZfTE8sCisJQlBGX1I3X0hJLAorCUJQRl9SN19MTywK KwlCUEZfUjhfSEksCisJQlBGX1I4X0xPLAorCUJQRl9SOV9ISSwKKwlCUEZfUjlfTE8sCisJQlBG X1RDX0hJLAorCUJQRl9UQ19MTywKKwlCUEZfQVhfSEksCisJQlBGX0FYX0xPLAorCS8qIFN0YWNr IHNwYWNlIGZvciBCUEZfUkVHXzYsIEJQRl9SRUdfNywgQlBGX1JFR184LCBCUEZfUkVHXzksCisJ ICogQlBGX1JFR19BWCBhbmQgdGFpbCBjYWxsIGNvdW50cy4KKwkgKi8KKwlCUEZfSklUX1NDUkFU Q0hfUkVHUywKK307CisKKyNkZWZpbmUgU1RBQ0tfT0ZGU0VUKGspICgtNCAtICgoaykgKiA0KSkK KworI2RlZmluZSBUTVBfUkVHXzEJKE1BWF9CUEZfSklUX1JFRyArIDApCS8qIFRFTVAgUmVnaXN0 ZXIgMSAqLworI2RlZmluZSBUTVBfUkVHXzIJKE1BWF9CUEZfSklUX1JFRyArIDEpCS8qIFRFTVAg UmVnaXN0ZXIgMiAqLworI2RlZmluZSBUQ0FMTF9DTlQJKE1BWF9CUEZfSklUX1JFRyArIDIpCS8q IFRhaWwgQ2FsbCBDb3VudCAqLworCitzdGF0aWMgY29uc3QgczggYnBmMnJ2MzJbXVsyXSA9IHsK KwkvKiBSZXR1cm4gdmFsdWUgZnJvbSBpbi1rZXJuZWwgZnVuY3Rpb24sIGFuZCBleGl0IHZhbHVl IGZyb20gZUJQRiAqLworCVtCUEZfUkVHXzBdID0ge1JWX1JFR19TMiwgUlZfUkVHX1MxfSwKKwkv KiBBcmd1bWVudHMgZnJvbSBlQlBGIHByb2dyYW0gdG8gaW4ta2VybmVsIGZ1bmN0aW9uICovCisJ W0JQRl9SRUdfMV0gPSB7UlZfUkVHX0ExLCBSVl9SRUdfQTB9LAorCVtCUEZfUkVHXzJdID0ge1JW X1JFR19BMywgUlZfUkVHX0EyfSwKKwlbQlBGX1JFR18zXSA9IHtSVl9SRUdfQTUsIFJWX1JFR19B NH0sCisJW0JQRl9SRUdfNF0gPSB7UlZfUkVHX0E3LCBSVl9SRUdfQTZ9LAorCVtCUEZfUkVHXzVd ID0ge1JWX1JFR19TNCwgUlZfUkVHX1MzfSwKKwkvKiBDYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIHRo YXQgaW4ta2VybmVsIGZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgKi8KKwkvKiBTdG9yZWQgb24gc3Rh Y2sgc2NyYXRjaCBzcGFjZSAqLworCVtCUEZfUkVHXzZdID0ge1NUQUNLX09GRlNFVChCUEZfUjZf SEkpLCBTVEFDS19PRkZTRVQoQlBGX1I2X0xPKX0sCisJW0JQRl9SRUdfN10gPSB7U1RBQ0tfT0ZG U0VUKEJQRl9SN19ISSksIFNUQUNLX09GRlNFVChCUEZfUjdfTE8pfSwKKwlbQlBGX1JFR184XSA9 IHtTVEFDS19PRkZTRVQoQlBGX1I4X0hJKSwgU1RBQ0tfT0ZGU0VUKEJQRl9SOF9MTyl9LAorCVtC UEZfUkVHXzldID0ge1NUQUNLX09GRlNFVChCUEZfUjlfSEkpLCBTVEFDS19PRkZTRVQoQlBGX1I5 X0xPKX0sCisJLyogUmVhZCBvbmx5IEZyYW1lIFBvaW50ZXIgdG8gYWNjZXNzIFN0YWNrICovCisJ W0JQRl9SRUdfRlBdID0ge1JWX1JFR19TNiwgUlZfUkVHX1M1fSwKKwkvKiBUZW1wb3JhcnkgUmVn aXN0ZXIgZm9yIGludGVybmFsIEJQRiBKSVQsIGNhbiBiZSB1c2VkCisJICogZm9yIGNvbnN0YW50 IGJsaW5kaW5ncyBhbmQgb3RoZXJzLiBTYXZlIFQwIGFuZCBUMQorCSAqIGZvciB1c2UgaW50ZXJu YWwgdG8gb25lIGluc3RydWN0aW9uLgorCSAqLworCVtUTVBfUkVHXzFdID0ge1JWX1JFR19UMywg UlZfUkVHX1QyfSwKKwlbVE1QX1JFR18yXSA9IHtSVl9SRUdfVDUsIFJWX1JFR19UNH0sCisJLyog VGFpbCBjYWxsIGNvdW50LiBTdG9yZWQgb24gc3RhY2sgc2NyYXRjaCBzcGFjZS4gKi8KKwlbVENB TExfQ05UXSA9IHtTVEFDS19PRkZTRVQoQlBGX1RDX0hJKSwgU1RBQ0tfT0ZGU0VUKEJQRl9UQ19M Tyl9LAorCS8qIFRlbXBvcmFyeSByZWdpc3RlciBmb3IgYmxpbmRpbmcgY29uc3RhbnRzLgorCSAq IFN0b3JlZCBvbiBzdGFjayBzY3JhdGNoIHNwYWNlLgorCSAqLworCVtCUEZfUkVHX0FYXSA9IHtT VEFDS19PRkZTRVQoQlBGX0FYX0hJKSwgU1RBQ0tfT0ZGU0VUKEJQRl9BWF9MTyl9LAorfTsKKwor c3RhdGljIHM4IGhpKGNvbnN0IHM4ICpyKQoreworCXJldHVybiByWzBdOworfQorCitzdGF0aWMg czggbG8oY29uc3QgczggKnIpCit7CisJcmV0dXJuIHJbMV07Cit9CisKK3N0cnVjdCBydl9qaXRf Y29udGV4dCB7CisJc3RydWN0IGJwZl9wcm9nICpwcm9nOworCXUzMiAqaW5zbnM7IC8qIFJWIGlu c25zICovCisJaW50IG5pbnNuczsKKwlpbnQgZXBpbG9ndWVfb2Zmc2V0OworCWludCAqb2Zmc2V0 OyAvKiBCUEYgdG8gUlYgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGFja19zaXpl OworfTsKKworc3RydWN0IHJ2X2ppdF9kYXRhIHsKKwlzdHJ1Y3QgYnBmX2JpbmFyeV9oZWFkZXIg KmhlYWRlcjsKKwl1OCAqaW1hZ2U7CisJc3RydWN0IHJ2X2ppdF9jb250ZXh0IGN0eDsKK307CisK K3N0YXRpYyB2b2lkIGVtaXQoY29uc3QgdTMyIGluc24sIHN0cnVjdCBydl9qaXRfY29udGV4dCAq Y3R4KQoreworCWlmIChjdHgtPmluc25zKQorCQljdHgtPmluc25zW2N0eC0+bmluc25zXSA9IGlu c247CisKKwljdHgtPm5pbnNucysrOworfQorCitzdGF0aWMgdTMyIHJ2X3JfaW5zbih1OCBmdW5j dDcsIHU4IHJzMiwgdTggcnMxLCB1OCBmdW5jdDMsIHU4IHJkLCB1OCBvcGNvZGUpCit7CisJcmV0 dXJuIChmdW5jdDcgPDwgMjUpIHwgKHJzMiA8PCAyMCkgfCAocnMxIDw8IDE1KSB8IChmdW5jdDMg PDwgMTIpIHwKKwkJKHJkIDw8IDcpIHwgb3Bjb2RlOworfQorCitzdGF0aWMgdTMyIHJ2X2lfaW5z bih1MTYgaW1tMTFfMCwgdTggcnMxLCB1OCBmdW5jdDMsIHU4IHJkLCB1OCBvcGNvZGUpCit7CisJ cmV0dXJuIChpbW0xMV8wIDw8IDIwKSB8IChyczEgPDwgMTUpIHwgKGZ1bmN0MyA8PCAxMikgfCAo cmQgPDwgNykgfAorCQlvcGNvZGU7Cit9CisKK3N0YXRpYyB1MzIgcnZfc19pbnNuKHUxNiBpbW0x MV8wLCB1OCByczIsIHU4IHJzMSwgdTggZnVuY3QzLCB1OCBvcGNvZGUpCit7CisJdTggaW1tMTFf NSA9IGltbTExXzAgPj4gNSwgaW1tNF8wID0gaW1tMTFfMCAmIDB4MWY7CisKKwlyZXR1cm4gKGlt bTExXzUgPDwgMjUpIHwgKHJzMiA8PCAyMCkgfCAocnMxIDw8IDE1KSB8IChmdW5jdDMgPDwgMTIp IHwKKwkJKGltbTRfMCA8PCA3KSB8IG9wY29kZTsKK30KKworc3RhdGljIHUzMiBydl9zYl9pbnNu KHUxNiBpbW0xMl8xLCB1OCByczIsIHU4IHJzMSwgdTggZnVuY3QzLCB1OCBvcGNvZGUpCit7CisJ dTggaW1tMTIgPSAoKGltbTEyXzEgJiAweDgwMCkgPj4gNSkgfCAoKGltbTEyXzEgJiAweDNmMCkg Pj4gNCk7CisJdTggaW1tNF8xID0gKChpbW0xMl8xICYgMHhmKSA8PCAxKSB8ICgoaW1tMTJfMSAm IDB4NDAwKSA+PiAxMCk7CisKKwlyZXR1cm4gKGltbTEyIDw8IDI1KSB8IChyczIgPDwgMjApIHwg KHJzMSA8PCAxNSkgfCAoZnVuY3QzIDw8IDEyKSB8CisJCShpbW00XzEgPDwgNykgfCBvcGNvZGU7 Cit9CisKK3N0YXRpYyB1MzIgcnZfdV9pbnNuKHUzMiBpbW0zMV8xMiwgdTggcmQsIHU4IG9wY29k ZSkKK3sKKwlyZXR1cm4gKGltbTMxXzEyIDw8IDEyKSB8IChyZCA8PCA3KSB8IG9wY29kZTsKK30K Kworc3RhdGljIHUzMiBydl91al9pbnNuKHUzMiBpbW0yMF8xLCB1OCByZCwgdTggb3Bjb2RlKQor eworCXUzMiBpbW07CisKKwlpbW0gPSAoaW1tMjBfMSAmIDB4ODAwMDApIHwgICgoaW1tMjBfMSAm IDB4M2ZmKSA8PCA5KSB8CisJCSAgKChpbW0yMF8xICYgMHg0MDApID4+IDIpIHwgKChpbW0yMF8x ICYgMHg3ZjgwMCkgPj4gMTEpOworCisJcmV0dXJuIChpbW0gPDwgMTIpIHwgKHJkIDw8IDcpIHwg b3Bjb2RlOworfQorCitzdGF0aWMgdTMyIHJ2X2Ftb19pbnNuKHU4IGZ1bmN0NSwgdTggYXEsIHU4 IHJsLCB1OCByczIsIHU4IHJzMSwKKwkJCSAgIHU4IGZ1bmN0MywgdTggcmQsIHU4IG9wY29kZSkK K3sKKwl1OCBmdW5jdDcgPSAoZnVuY3Q1IDw8IDIpIHwgKGFxIDw8IDEpIHwgcmw7CisKKwlyZXR1 cm4gcnZfcl9pbnNuKGZ1bmN0NywgcnMyLCByczEsIGZ1bmN0MywgcmQsIG9wY29kZSk7Cit9CisK K3N0YXRpYyB1MzIgcnZfYWRkaSh1OCByZCwgdTggcnMxLCB1MTYgaW1tMTFfMCkKK3sKKwlyZXR1 cm4gcnZfaV9pbnNuKGltbTExXzAsIHJzMSwgMCwgcmQsIDB4MTMpOworfQorCitzdGF0aWMgdTMy IHJ2X2FkZCh1OCByZCwgdTggcnMxLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigwLCBy czIsIHJzMSwgMCwgcmQsIDB4MzMpOworfQorCitzdGF0aWMgdTMyIHJ2X3N1Yih1OCByZCwgdTgg cnMxLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigweDIwLCByczIsIHJzMSwgMCwgcmQs IDB4MzMpOworfQorCitzdGF0aWMgdTMyIHJ2X2FuZCh1OCByZCwgdTggcnMxLCB1OCByczIpCit7 CisJcmV0dXJuIHJ2X3JfaW5zbigwLCByczIsIHJzMSwgNywgcmQsIDB4MzMpOworfQorCitzdGF0 aWMgdTMyIHJ2X29yKHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNu KDAsIHJzMiwgcnMxLCA2LCByZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfeG9yKHU4IHJk LCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDAsIHJzMiwgcnMxLCA0LCBy ZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfbXVsKHU4IHJkLCB1OCByczEsIHU4IHJzMikK K3sKKwlyZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMxLCAwLCByZCwgMHgzMyk7Cit9CisKK3N0 YXRpYyB1MzIgcnZfbXVsaHUodTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBydl9y X2luc24oMSwgcnMyLCByczEsIDMsIHJkLCAweDMzKTsKK30KKworc3RhdGljIHUzMiBydl9kaXZ1 KHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMx LCA1LCByZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfcmVtdSh1OCByZCwgdTggcnMxLCB1 OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigxLCByczIsIHJzMSwgNywgcmQsIDB4MzMpOwor fQorCitzdGF0aWMgdTMyIHJ2X3NsbCh1OCByZCwgdTggcnMxLCB1OCByczIpCit7CisJcmV0dXJu IHJ2X3JfaW5zbigwLCByczIsIHJzMSwgMSwgcmQsIDB4MzMpOworfQorCitzdGF0aWMgdTMyIHJ2 X3NybCh1OCByZCwgdTggcnMxLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigwLCByczIs IHJzMSwgNSwgcmQsIDB4MzMpOworfQorCitzdGF0aWMgdTMyIHJ2X3NyYSh1OCByZCwgdTggcnMx LCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigweDIwLCByczIsIHJzMSwgNSwgcmQsIDB4 MzMpOworfQorCitzdGF0aWMgdTMyIHJ2X3NsdHUodTggcmQsIHU4IHJzMSwgdTggcnMyKQorewor CXJldHVybiBydl9yX2luc24oMCwgcnMyLCByczEsIDMsIHJkLCAweDMzKTsKK30KKworc3RhdGlj IHUzMiBydl9sdWkodTggcmQsIHUzMiBpbW0zMV8xMikKK3sKKwlyZXR1cm4gcnZfdV9pbnNuKGlt bTMxXzEyLCByZCwgMHgzNyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfc2xsaSh1OCByZCwgdTggcnMx LCB1MTYgaW1tMTFfMCkKK3sKKwlyZXR1cm4gcnZfaV9pbnNuKGltbTExXzAsIHJzMSwgMSwgcmQs IDB4MTMpOworfQorCitzdGF0aWMgdTMyIHJ2X3NybGkodTggcmQsIHU4IHJzMSwgdTE2IGltbTEx XzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0xMV8wLCByczEsIDUsIHJkLCAweDEzKTsKK30K Kworc3RhdGljIHUzMiBydl9zcmFpKHU4IHJkLCB1OCByczEsIHUxNiBpbW0xMV8wKQoreworCXJl dHVybiBydl9pX2luc24oMHg0MDAgfCBpbW0xMV8wLCByczEsIDUsIHJkLCAweDEzKTsKK30KKwor c3RhdGljIHUzMiBydl9hbmRpKHU4IHJkLCB1OCByczEsIHUxNiBpbW0xMV8wKQoreworCXJldHVy biBydl9pX2luc24oaW1tMTFfMCwgcnMxLCA3LCByZCwgMHgxMyk7Cit9CisKK3N0YXRpYyB1MzIg cnZfb3JpKHU4IHJkLCB1OCByczEsIHUxNiBpbW0xMV8wKQoreworCXJldHVybiBydl9pX2luc24o aW1tMTFfMCwgcnMxLCA2LCByZCwgMHgxMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfeG9yaSh1OCBy ZCwgdTggcnMxLCB1MTYgaW1tMTFfMCkKK3sKKwlyZXR1cm4gcnZfaV9pbnNuKGltbTExXzAsIHJz MSwgNCwgcmQsIDB4MTMpOworfQorCitzdGF0aWMgdTMyIHJ2X2phbCh1OCByZCwgdTMyIGltbTIw XzEpCit7CisJcmV0dXJuIHJ2X3VqX2luc24oaW1tMjBfMSwgcmQsIDB4NmYpOworfQorCitzdGF0 aWMgdTMyIHJ2X2phbHIodTggcmQsIHU4IHJzMSwgdTE2IGltbTExXzApCit7CisJcmV0dXJuIHJ2 X2lfaW5zbihpbW0xMV8wLCByczEsIDAsIHJkLCAweDY3KTsKK30KKworc3RhdGljIHUzMiBydl9i ZXEodTggcnMxLCB1OCByczIsIHUxNiBpbW0xMl8xKQoreworCXJldHVybiBydl9zYl9pbnNuKGlt bTEyXzEsIHJzMiwgcnMxLCAwLCAweDYzKTsKK30KKworc3RhdGljIHUzMiBydl9ibHR1KHU4IHJz MSwgdTggcnMyLCB1MTYgaW1tMTJfMSkKK3sKKwlyZXR1cm4gcnZfc2JfaW5zbihpbW0xMl8xLCBy czIsIHJzMSwgNiwgMHg2Myk7Cit9CisKK3N0YXRpYyB1MzIgcnZfYmdldSh1OCByczEsIHU4IHJz MiwgdTE2IGltbTEyXzEpCit7CisJcmV0dXJuIHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEs IDcsIDB4NjMpOworfQorCitzdGF0aWMgdTMyIHJ2X2JuZSh1OCByczEsIHU4IHJzMiwgdTE2IGlt bTEyXzEpCit7CisJcmV0dXJuIHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDEsIDB4NjMp OworfQorCitzdGF0aWMgdTMyIHJ2X2JsdCh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEyXzEpCit7 CisJcmV0dXJuIHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDQsIDB4NjMpOworfQorCitz dGF0aWMgdTMyIHJ2X2JnZSh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEyXzEpCit7CisJcmV0dXJu IHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDUsIDB4NjMpOworfQorCitzdGF0aWMgdTMy IHJ2X3NiKHU4IHJzMSwgdTE2IGltbTExXzAsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfc19pbnNu KGltbTExXzAsIHJzMiwgcnMxLCAwLCAweDIzKTsKK30KKworc3RhdGljIHUzMiBydl9zaCh1OCBy czEsIHUxNiBpbW0xMV8wLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3NfaW5zbihpbW0xMV8wLCBy czIsIHJzMSwgMSwgMHgyMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3codTggcnMxLCB1MTYgaW1t MTFfMCwgdTggcnMyKQoreworCXJldHVybiBydl9zX2luc24oaW1tMTFfMCwgcnMyLCByczEsIDIs IDB4MjMpOworfQorCitzdGF0aWMgdTMyIHJ2X2xidSh1OCByZCwgdTE2IGltbTExXzAsIHU4IHJz MSkKK3sKKwlyZXR1cm4gcnZfaV9pbnNuKGltbTExXzAsIHJzMSwgNCwgcmQsIDB4MDMpOworfQor CitzdGF0aWMgdTMyIHJ2X2xodSh1OCByZCwgdTE2IGltbTExXzAsIHU4IHJzMSkKK3sKKwlyZXR1 cm4gcnZfaV9pbnNuKGltbTExXzAsIHJzMSwgNSwgcmQsIDB4MDMpOworfQorCitzdGF0aWMgdTMy IHJ2X2x3KHU4IHJkLCB1MTYgaW1tMTFfMCwgdTggcnMxKQoreworCXJldHVybiBydl9pX2luc24o aW1tMTFfMCwgcnMxLCAyLCByZCwgMHgwMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfYW1vYWRkX3co dTggcmQsIHU4IHJzMiwgdTggcnMxLCB1OCBhcSwgdTggcmwpCit7CisJcmV0dXJuIHJ2X2Ftb19p bnNuKDAsIGFxLCBybCwgcnMyLCByczEsIDIsIHJkLCAweDJmKTsKK30KKworc3RhdGljIGJvb2wg aXNfMTJiX2ludChzMzIgdmFsKQoreworCXJldHVybiAtKDEgPDwgMTEpIDw9IHZhbCAmJiB2YWwg PCAoMSA8PCAxMSk7Cit9CisKK3N0YXRpYyBib29sIGlzXzEzYl9pbnQoczMyIHZhbCkKK3sKKwly ZXR1cm4gLSgxIDw8IDEyKSA8PSB2YWwgJiYgdmFsIDwgKDEgPDwgMTIpOworfQorCitzdGF0aWMg Ym9vbCBpc18yMWJfaW50KHMzMiB2YWwpCit7CisJcmV0dXJuIC0oMUwgPDwgMjApIDw9IHZhbCAm JiB2YWwgPCAoMUwgPDwgMjApOworfQorCitzdGF0aWMgaW50IGlzXzIxYl9jaGVjayhpbnQgb2Zm LCBpbnQgaW5zbikKK3sKKwlpZiAoIWlzXzIxYl9pbnQob2ZmKSkgeworCQlwcl9lcnIoImJwZi1q aXQ6IGluc249JWQgb2Zmc2V0PSVkIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIiwKKwkJICAgICAgIGlu c24sIG9mZik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk IGVtaXRfaW1tKGNvbnN0IHM4IHJkLCBzMzIgaW1tLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0 eCkKK3sKKwl1MzIgdXBwZXIgPSAoaW1tICsgKDEgPDwgMTEpKSA+PiAxMjsKKwl1MzIgbG93ZXIg PSBpbW0gJiAweGZmZjsKKworCWlmICh1cHBlcikgeworCQllbWl0KHJ2X2x1aShyZCwgdXBwZXIp LCBjdHgpOworCQllbWl0KHJ2X2FkZGkocmQsIHJkLCBsb3dlciksIGN0eCk7CisJfSBlbHNlIHsK KwkJZW1pdChydl9hZGRpKHJkLCBSVl9SRUdfWkVSTywgbG93ZXIpLCBjdHgpOworCX0KK30KKwor c3RhdGljIHZvaWQgZW1pdF9pbW0zMihjb25zdCBzOCAqcmQsIHMzMiBpbW0sIHN0cnVjdCBydl9q aXRfY29udGV4dCAqY3R4KQoreworCS8qIEVtaXQgaW1tZWRpYXRlIGludG8gbG93ZXIgYml0cyAq LworCWVtaXRfaW1tKGxvKHJkKSwgaW1tLCBjdHgpOworCisJLyogU2lnbi1leHRlbmQgaW50byB1 cHBlciBiaXRzICovCisJaWYgKGltbSA+PSAwKQorCQllbWl0KHJ2X2FkZGkoaGkocmQpLCBSVl9S RUdfWkVSTywgMCksIGN0eCk7CisJZWxzZQorCQllbWl0KHJ2X2FkZGkoaGkocmQpLCBSVl9SRUdf WkVSTywgLTEpLCBjdHgpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2ltbTY0KGNvbnN0IHM4ICpy ZCwgczMyIGltbV9oaSwgczMyIGltbV9sbywKKwkJICAgICAgIHN0cnVjdCBydl9qaXRfY29udGV4 dCAqY3R4KQoreworCWVtaXRfaW1tKGxvKHJkKSwgaW1tX2xvLCBjdHgpOworCWVtaXRfaW1tKGhp KHJkKSwgaW1tX2hpLCBjdHgpOworfQorCitzdGF0aWMgaW50IHJ2X29mZnNldChpbnQgYnBmX3Rv LCBpbnQgYnBmX2Zyb20sIHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCWludCBmcm9t ID0gY3R4LT5vZmZzZXRbYnBmX2Zyb21dIC0gMSwgdG8gPSBjdHgtPm9mZnNldFticGZfdG9dOwor CisJcmV0dXJuICh0byAtIGZyb20pIDw8IDI7Cit9CisKK3N0YXRpYyBpbnQgZXBpbG9ndWVfb2Zm c2V0KHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCWludCB0byA9IGN0eC0+ZXBpbG9n dWVfb2Zmc2V0LCBmcm9tID0gY3R4LT5uaW5zbnM7CisKKwlyZXR1cm4gKHRvIC0gZnJvbSkgPDwg MjsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfZXBpbG9ndWUoc3RydWN0IHJ2X2ppdF9jb250ZXh0 ICpjdHgpCit7CisJaW50IHN0YWNrX2FkanVzdCA9IGN0eC0+c3RhY2tfc2l6ZSwgc3RvcmVfb2Zm c2V0ID0gc3RhY2tfYWRqdXN0IC0gODsKKwljb25zdCBzOCAqcjAgPSBicGYycnYzMltCUEZfUkVH XzBdOworCisJc3RvcmVfb2Zmc2V0IC09IDQgKiBCUEZfSklUX1NDUkFUQ0hfUkVHUzsKKworCS8q IFNldCByZXR1cm4gdmFsdWUuICovCisJZW1pdChydl9hZGRpKFJWX1JFR19BMCwgbG8ocjApLCAw KSwgY3R4KTsKKwllbWl0KHJ2X2FkZGkoUlZfUkVHX0ExLCBoaShyMCksIDApLCBjdHgpOworCisJ LyogUmVzdG9yZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLiAqLworCWVtaXQocnZfbHcoUlZfUkVH X1JBLCBzdG9yZV9vZmZzZXQgLSAwLCBSVl9SRUdfU1ApLCBjdHgpOworCWVtaXQocnZfbHcoUlZf UkVHX0ZQLCBzdG9yZV9vZmZzZXQgLSA0LCBSVl9SRUdfU1ApLCBjdHgpOworCWVtaXQocnZfbHco UlZfUkVHX1MxLCBzdG9yZV9vZmZzZXQgLSA4LCBSVl9SRUdfU1ApLCBjdHgpOworCWVtaXQocnZf bHcoUlZfUkVHX1MyLCBzdG9yZV9vZmZzZXQgLSAxMiwgUlZfUkVHX1NQKSwgY3R4KTsKKwllbWl0 KHJ2X2x3KFJWX1JFR19TMywgc3RvcmVfb2Zmc2V0IC0gMTYsIFJWX1JFR19TUCksIGN0eCk7CisJ ZW1pdChydl9sdyhSVl9SRUdfUzQsIHN0b3JlX29mZnNldCAtIDIwLCBSVl9SRUdfU1ApLCBjdHgp OworCWVtaXQocnZfbHcoUlZfUkVHX1M1LCBzdG9yZV9vZmZzZXQgLSAyNCwgUlZfUkVHX1NQKSwg Y3R4KTsKKwllbWl0KHJ2X2x3KFJWX1JFR19TNiwgc3RvcmVfb2Zmc2V0IC0gMjgsIFJWX1JFR19T UCksIGN0eCk7CisKKwllbWl0KHJ2X2FkZGkoUlZfUkVHX1NQLCBSVl9SRUdfU1AsIHN0YWNrX2Fk anVzdCksIGN0eCk7CisJZW1pdChydl9qYWxyKFJWX1JFR19aRVJPLCBSVl9SRUdfUkEsIDApLCBj dHgpOworfQorCitzdGF0aWMgYm9vbCBpc19zdGFja2VkKHM4IHJlZykKK3sKKwlyZXR1cm4gcmVn IDwgMDsKK30KKworc3RhdGljIGNvbnN0IHM4ICpydjMyX2JwZl9nZXRfcmVnNjQoY29uc3Qgczgg KnJlZywgY29uc3QgczggKnRtcCwKKwkJCQkgICAgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgp Cit7CisJaWYgKGlzX3N0YWNrZWQoaGkocmVnKSkpIHsKKwkJZW1pdChydl9sdyhoaSh0bXApLCBo aShyZWcpLCBSVl9SRUdfRlApLCBjdHgpOworCQllbWl0KHJ2X2x3KGxvKHRtcCksIGxvKHJlZyks IFJWX1JFR19GUCksIGN0eCk7CisJCXJlZyA9IHRtcDsKKwl9CisJcmV0dXJuIHJlZzsKK30KKwor c3RhdGljIHZvaWQgcnYzMl9icGZfcHV0X3JlZzY0KGNvbnN0IHM4ICpyZWcsIGNvbnN0IHM4ICpz cmMsCisJCQkgICAgICAgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7CisJaWYgKGlzX3N0 YWNrZWQoaGkocmVnKSkpIHsKKwkJZW1pdChydl9zdyhSVl9SRUdfRlAsIGhpKHJlZyksIGhpKHNy YykpLCBjdHgpOworCQllbWl0KHJ2X3N3KFJWX1JFR19GUCwgbG8ocmVnKSwgbG8oc3JjKSksIGN0 eCk7CisJfQorfQorCitzdGF0aWMgY29uc3QgczggKnJ2MzJfYnBmX2dldF9yZWczMihjb25zdCBz OCAqcmVnLCBjb25zdCBzOCAqdG1wLAorCQkJCSAgICBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0 eCkKK3sKKwlpZiAoaXNfc3RhY2tlZChsbyhyZWcpKSkgeworCQllbWl0KHJ2X2x3KGxvKHRtcCks IGxvKHJlZyksIFJWX1JFR19GUCksIGN0eCk7CisJCXJlZyA9IHRtcDsKKwl9CisJcmV0dXJuIHJl ZzsKK30KKworc3RhdGljIHZvaWQgcnYzMl9icGZfcHV0X3JlZzMyKGNvbnN0IHM4ICpyZWcsIGNv bnN0IHM4ICpzcmMsCisJCQkgICAgICAgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7CisJ aWYgKGlzX3N0YWNrZWQobG8ocmVnKSkpIHsKKwkJZW1pdChydl9zdyhSVl9SRUdfRlAsIGxvKHJl ZyksIGxvKHNyYykpLCBjdHgpOworCQlpZiAoIWN0eC0+cHJvZy0+YXV4LT52ZXJpZmllcl96ZXh0 KQorCQkJZW1pdChydl9zdyhSVl9SRUdfRlAsIGhpKHJlZyksIFJWX1JFR19aRVJPKSwgY3R4KTsK Kwl9IGVsc2UgaWYgKCFjdHgtPnByb2ctPmF1eC0+dmVyaWZpZXJfemV4dCkgeworCQllbWl0KHJ2 X2FkZGkoaGkocmVnKSwgUlZfUkVHX1pFUk8sIDApLCBjdHgpOworCX0KK30KKworc3RhdGljIHZv aWQgZW1pdF9ydjMyX2FsdV9pNjQoY29uc3QgczggZHN0W10sIHMzMiBpbW0sCisJCQkgICAgICBz dHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIGNvbnN0IHU4IG9wKQoreworCWNv bnN0IHM4ICp0bXAxID0gYnBmMnJ2MzJbVE1QX1JFR18xXTsKKwljb25zdCBzOCAqcmQgPSBydjMy X2JwZl9nZXRfcmVnNjQoZHN0LCB0bXAxLCBjdHgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2Ug QlBGX01PVjoKKwkJZW1pdF9pbW0zMihyZCwgaW1tLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQ Rl9BTkQ6CisJCWlmIChpc18xMmJfaW50KGltbSkpIHsKKwkJCWVtaXQocnZfYW5kaShsbyhyZCks IGxvKHJkKSwgaW1tKSwgY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWVtaXRfaW1tKFJWX1JFR19UMCwg aW1tLCBjdHgpOworCQkJZW1pdChydl9hbmQobG8ocmQpLCBsbyhyZCksIFJWX1JFR19UMCksIGN0 eCk7CisJCX0KKwkJaWYgKGltbSA+PSAwKQorCQkJZW1pdChydl9hZGRpKGhpKHJkKSwgUlZfUkVH X1pFUk8sIDApLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9PUjoKKwkJaWYgKGlzXzEyYl9p bnQoaW1tKSkgeworCQkJZW1pdChydl9vcmkobG8ocmQpLCBsbyhyZCksIGltbSksIGN0eCk7CisJ CX0gZWxzZSB7CisJCQllbWl0X2ltbShSVl9SRUdfVDAsIGltbSwgY3R4KTsKKwkJCWVtaXQocnZf b3IobG8ocmQpLCBsbyhyZCksIFJWX1JFR19UMCksIGN0eCk7CisJCX0KKwkJaWYgKGltbSA8IDAp CisJCQllbWl0KHJ2X29yaShoaShyZCksIFJWX1JFR19aRVJPLCAtMSksIGN0eCk7CisJCWJyZWFr OworCWNhc2UgQlBGX1hPUjoKKwkJaWYgKGlzXzEyYl9pbnQoaW1tKSkgeworCQkJZW1pdChydl94 b3JpKGxvKHJkKSwgbG8ocmQpLCBpbW0pLCBjdHgpOworCQl9IGVsc2UgeworCQkJZW1pdF9pbW0o UlZfUkVHX1QwLCBpbW0sIGN0eCk7CisJCQllbWl0KHJ2X3hvcihsbyhyZCksIGxvKHJkKSwgUlZf UkVHX1QwKSwgY3R4KTsKKwkJfQorCQlpZiAoaW1tIDwgMCkKKwkJCWVtaXQocnZfeG9yaShoaShy ZCksIGhpKHJkKSwgLTEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9MU0g6CisJCWlmIChp bW0gPj0gMzIpIHsKKwkJCWVtaXQocnZfc2xsaShoaShyZCksIGxvKHJkKSwgaW1tIC0gMzIpLCBj dHgpOworCQkJZW1pdChydl9hZGRpKGxvKHJkKSwgUlZfUkVHX1pFUk8sIDApLCBjdHgpOworCQl9 IGVsc2UgaWYgKGltbSA9PSAwKSB7CisJCQkvKiBub3AgKi8KKwkJfSBlbHNlIHsKKwkJCWVtaXQo cnZfc3JsaShSVl9SRUdfVDAsIGxvKHJkKSwgMzIgLSBpbW0pLCBjdHgpOworCQkJZW1pdChydl9z bGxpKGhpKHJkKSwgaGkocmQpLCBpbW0pLCBjdHgpOworCQkJZW1pdChydl9vcihoaShyZCksIFJW X1JFR19UMCwgaGkocmQpKSwgY3R4KTsKKwkJCWVtaXQocnZfc2xsaShsbyhyZCksIGxvKHJkKSwg aW1tKSwgY3R4KTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJQRl9SU0g6CisJCWlmIChpbW0gPj0g MzIpIHsKKwkJCWVtaXQocnZfc3JsaShsbyhyZCksIGhpKHJkKSwgaW1tIC0gMzIpLCBjdHgpOwor CQkJZW1pdChydl9hZGRpKGhpKHJkKSwgUlZfUkVHX1pFUk8sIDApLCBjdHgpOworCQl9IGVsc2Ug aWYgKGltbSA9PSAwKSB7CisJCQkvKiBub3AgKi8KKwkJfSBlbHNlIHsKKwkJCWVtaXQocnZfc2xs aShSVl9SRUdfVDAsIGhpKHJkKSwgMzIgLSBpbW0pLCBjdHgpOworCQkJZW1pdChydl9zcmxpKGxv KHJkKSwgbG8ocmQpLCBpbW0pLCBjdHgpOworCQkJZW1pdChydl9vcihsbyhyZCksIFJWX1JFR19U MCwgbG8ocmQpKSwgY3R4KTsKKwkJCWVtaXQocnZfc3JsaShoaShyZCksIGhpKHJkKSwgaW1tKSwg Y3R4KTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJQRl9BUlNIOgorCQlpZiAoaW1tID49IDMyKSB7 CisJCQllbWl0KHJ2X3NyYWkobG8ocmQpLCBoaShyZCksIGltbSAtIDMyKSwgY3R4KTsKKwkJCWVt aXQocnZfc3JhaShoaShyZCksIGhpKHJkKSwgMzEpLCBjdHgpOworCQl9IGVsc2UgaWYgKGltbSA9 PSAwKSB7CisJCQkvKiBub3AgKi8KKwkJfSBlbHNlIHsKKwkJCWVtaXQocnZfc2xsaShSVl9SRUdf VDAsIGhpKHJkKSwgMzIgLSBpbW0pLCBjdHgpOworCQkJZW1pdChydl9zcmxpKGxvKHJkKSwgbG8o cmQpLCBpbW0pLCBjdHgpOworCQkJZW1pdChydl9vcihsbyhyZCksIFJWX1JFR19UMCwgbG8ocmQp KSwgY3R4KTsKKwkJCWVtaXQocnZfc3JhaShoaShyZCksIGhpKHJkKSwgaW1tKSwgY3R4KTsKKwkJ fQorCQlicmVhazsKKwl9CisKKwlydjMyX2JwZl9wdXRfcmVnNjQoZHN0LCByZCwgY3R4KTsKK30K Kworc3RhdGljIHZvaWQgZW1pdF9ydjMyX2FsdV9pMzIoY29uc3QgczggZHN0W10sIHMzMiBpbW0s CisJCQkgICAgICBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIGNvbnN0IHU4 IG9wKQoreworCWNvbnN0IHM4ICp0bXAxID0gYnBmMnJ2MzJbVE1QX1JFR18xXTsKKwljb25zdCBz OCAqcmQgPSBydjMyX2JwZl9nZXRfcmVnMzIoZHN0LCB0bXAxLCBjdHgpOworCisJc3dpdGNoIChv cCkgeworCWNhc2UgQlBGX01PVjoKKwkJZW1pdF9pbW0zMihyZCwgaW1tLCBjdHgpOworCQlicmVh azsKKwljYXNlIEJQRl9BREQ6CisJCWlmIChpc18xMmJfaW50KGltbSkpIHsKKwkJCWVtaXQocnZf YWRkaShsbyhyZCksIGxvKHJkKSwgaW1tKSwgY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWVtaXRfaW1t KFJWX1JFR19UMCwgaW1tLCBjdHgpOworCQkJZW1pdChydl9hZGQobG8ocmQpLCBsbyhyZCksIFJW X1JFR19UMCksIGN0eCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUEZfU1VCOgorCQlpZiAoaXNf MTJiX2ludCgtaW1tKSkgeworCQkJZW1pdChydl9hZGRpKGxvKHJkKSwgbG8ocmQpLCAtaW1tKSwg Y3R4KTsKKwkJfSBlbHNlIHsKKwkJCWVtaXRfaW1tKFJWX1JFR19UMCwgaW1tLCBjdHgpOworCQkJ ZW1pdChydl9zdWIobG8ocmQpLCBsbyhyZCksIFJWX1JFR19UMCksIGN0eCk7CisJCX0KKwkJYnJl YWs7CisJY2FzZSBCUEZfQU5EOgorCQlpZiAoaXNfMTJiX2ludChpbW0pKSB7CisJCQllbWl0KHJ2 X2FuZGkobG8ocmQpLCBsbyhyZCksIGltbSksIGN0eCk7CisJCX0gZWxzZSB7CisJCQllbWl0X2lt bShSVl9SRUdfVDAsIGltbSwgY3R4KTsKKwkJCWVtaXQocnZfYW5kKGxvKHJkKSwgbG8ocmQpLCBS Vl9SRUdfVDApLCBjdHgpOworCQl9CisJCWJyZWFrOworCWNhc2UgQlBGX09SOgorCQlpZiAoaXNf MTJiX2ludChpbW0pKSB7CisJCQllbWl0KHJ2X29yaShsbyhyZCksIGxvKHJkKSwgaW1tKSwgY3R4 KTsKKwkJfSBlbHNlIHsKKwkJCWVtaXRfaW1tKFJWX1JFR19UMCwgaW1tLCBjdHgpOworCQkJZW1p dChydl9vcihsbyhyZCksIGxvKHJkKSwgUlZfUkVHX1QwKSwgY3R4KTsKKwkJfQorCQlicmVhazsK KwljYXNlIEJQRl9YT1I6CisJCWlmIChpc18xMmJfaW50KGltbSkpIHsKKwkJCWVtaXQocnZfeG9y aShsbyhyZCksIGxvKHJkKSwgaW1tKSwgY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWVtaXRfaW1tKFJW X1JFR19UMCwgaW1tLCBjdHgpOworCQkJZW1pdChydl94b3IobG8ocmQpLCBsbyhyZCksIFJWX1JF R19UMCksIGN0eCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUEZfTFNIOgorCQlpZiAoaXNfMTJi X2ludChpbW0pKSB7CisJCQllbWl0KHJ2X3NsbGkobG8ocmQpLCBsbyhyZCksIGltbSksIGN0eCk7 CisJCX0gZWxzZSB7CisJCQllbWl0X2ltbShSVl9SRUdfVDAsIGltbSwgY3R4KTsKKwkJCWVtaXQo cnZfc2xsKGxvKHJkKSwgbG8ocmQpLCBSVl9SRUdfVDApLCBjdHgpOworCQl9CisJCWJyZWFrOwor CWNhc2UgQlBGX1JTSDoKKwkJaWYgKGlzXzEyYl9pbnQoaW1tKSkgeworCQkJZW1pdChydl9zcmxp KGxvKHJkKSwgbG8ocmQpLCBpbW0pLCBjdHgpOworCQl9IGVsc2UgeworCQkJZW1pdF9pbW0oUlZf UkVHX1QwLCBpbW0sIGN0eCk7CisJCQllbWl0KHJ2X3NybChsbyhyZCksIGxvKHJkKSwgUlZfUkVH X1QwKSwgY3R4KTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJQRl9BUlNIOgorCQlpZiAoaXNfMTJi X2ludChpbW0pKSB7CisJCQllbWl0KHJ2X3NyYWkobG8ocmQpLCBsbyhyZCksIGltbSksIGN0eCk7 CisJCX0gZWxzZSB7CisJCQllbWl0X2ltbShSVl9SRUdfVDAsIGltbSwgY3R4KTsKKwkJCWVtaXQo cnZfc3JhKGxvKHJkKSwgbG8ocmQpLCBSVl9SRUdfVDApLCBjdHgpOworCQl9CisJCWJyZWFrOwor CX0KKworCXJ2MzJfYnBmX3B1dF9yZWczMihkc3QsIHJkLCBjdHgpOworfQorCitzdGF0aWMgdm9p ZCBlbWl0X3J2MzJfYWx1X3I2NChjb25zdCBzOCBkc3RbXSwgY29uc3Qgczggc3JjW10sCisJCQkg ICAgICBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIGNvbnN0IHU4IG9wKQor eworCWNvbnN0IHM4ICp0bXAxID0gYnBmMnJ2MzJbVE1QX1JFR18xXTsKKwljb25zdCBzOCAqdG1w MiA9IGJwZjJydjMyW1RNUF9SRUdfMl07CisJY29uc3QgczggKnJkID0gcnYzMl9icGZfZ2V0X3Jl ZzY0KGRzdCwgdG1wMSwgY3R4KTsKKwljb25zdCBzOCAqcnMgPSBydjMyX2JwZl9nZXRfcmVnNjQo c3JjLCB0bXAyLCBjdHgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgQlBGX01PVjoKKwkJZW1p dChydl9hZGRpKGhpKHJkKSwgaGkocnMpLCAwKSwgY3R4KTsKKwkJZW1pdChydl9hZGRpKGxvKHJk KSwgbG8ocnMpLCAwKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUREOgorCQllbWl0KHJ2 X2FkZGkoUlZfUkVHX1QwLCBsbyhyZCksIDApLCBjdHgpOworCQllbWl0KHJ2X2FkZChsbyhyZCks IGxvKHJkKSwgbG8ocnMpKSwgY3R4KTsKKwkJZW1pdChydl9zbHR1KFJWX1JFR19UMCwgbG8ocmQp LCBSVl9SRUdfVDApLCBjdHgpOworCQllbWl0KHJ2X2FkZChoaShyZCksIGhpKHJkKSwgaGkocnMp KSwgY3R4KTsKKwkJZW1pdChydl9hZGQoaGkocmQpLCBoaShyZCksIFJWX1JFR19UMCksIGN0eCk7 CisJCWJyZWFrOworCWNhc2UgQlBGX1NVQjoKKwkJZW1pdChydl9hZGRpKFJWX1JFR19UMCwgbG8o cmQpLCAwKSwgY3R4KTsKKwkJZW1pdChydl9zdWIobG8ocmQpLCBsbyhyZCksIGxvKHJzKSksIGN0 eCk7CisJCWVtaXQocnZfc2x0dShSVl9SRUdfVDAsIFJWX1JFR19UMCwgbG8ocmQpKSwgY3R4KTsK KwkJZW1pdChydl9zdWIoaGkocmQpLCBoaShyZCksIGhpKHJzKSksIGN0eCk7CisJCWVtaXQocnZf c3ViKGhpKHJkKSwgaGkocmQpLCBSVl9SRUdfVDApLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQ Rl9BTkQ6CisJCWVtaXQocnZfYW5kKGhpKHJkKSwgaGkocmQpLCBoaShycykpLCBjdHgpOworCQll bWl0KHJ2X2FuZChsbyhyZCksIGxvKHJkKSwgbG8ocnMpKSwgY3R4KTsKKwkJYnJlYWs7CisJY2Fz ZSBCUEZfT1I6CisJCWVtaXQocnZfb3IoaGkocmQpLCBoaShyZCksIGhpKHJzKSksIGN0eCk7CisJ CWVtaXQocnZfb3IobG8ocmQpLCBsbyhyZCksIGxvKHJzKSksIGN0eCk7CisJCWJyZWFrOworCWNh c2UgQlBGX1hPUjoKKwkJZW1pdChydl94b3IoaGkocmQpLCBoaShyZCksIGhpKHJzKSksIGN0eCk7 CisJCWVtaXQocnZfeG9yKGxvKHJkKSwgbG8ocmQpLCBsbyhycykpLCBjdHgpOworCQlicmVhazsK KwljYXNlIEJQRl9NVUw6CisJCWVtaXQocnZfbXVsKFJWX1JFR19UMCwgaGkocnMpLCBsbyhyZCkp LCBjdHgpOworCQllbWl0KHJ2X211bChoaShyZCksIGhpKHJkKSwgbG8ocnMpKSwgY3R4KTsKKwkJ ZW1pdChydl9tdWxodShSVl9SRUdfVDEsIGxvKHJkKSwgbG8ocnMpKSwgY3R4KTsKKwkJZW1pdChy dl9hZGQoaGkocmQpLCBoaShyZCksIFJWX1JFR19UMCksIGN0eCk7CisJCWVtaXQocnZfbXVsKGxv KHJkKSwgbG8ocmQpLCBsbyhycykpLCBjdHgpOworCQllbWl0KHJ2X2FkZChoaShyZCksIGhpKHJk KSwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfTFNIOgorCQllbWl0KHJ2 X2FkZGkoUlZfUkVHX1QwLCBsbyhycyksIC0zMiksIGN0eCk7CisJCWVtaXQocnZfYmx0KFJWX1JF R19UMCwgUlZfUkVHX1pFUk8sIDE2ID4+IDEpLCBjdHgpOworCisJCWVtaXQocnZfc2xsKGhpKHJk KSwgbG8ocmQpLCBSVl9SRUdfVDApLCBjdHgpOworCQllbWl0KHJ2X2FkZGkobG8ocmQpLCBSVl9S RUdfWkVSTywgMCksIGN0eCk7CisJCWVtaXQocnZfamFsKFJWX1JFR19aRVJPLCAzMiA+PiAxKSwg Y3R4KTsKKworCQllbWl0KHJ2X2FkZGkoUlZfUkVHX1QxLCBSVl9SRUdfWkVSTywgMzEpLCBjdHgp OworCQllbWl0KHJ2X3NybGkoUlZfUkVHX1QwLCBsbyhyZCksIDEpLCBjdHgpOworCQllbWl0KHJ2 X3N1YihSVl9SRUdfVDEsIFJWX1JFR19UMSwgbG8ocnMpKSwgY3R4KTsKKwkJZW1pdChydl9zcmwo UlZfUkVHX1QwLCBSVl9SRUdfVDAsIFJWX1JFR19UMSksIGN0eCk7CisJCWVtaXQocnZfc2xsKGhp KHJkKSwgaGkocmQpLCBsbyhycykpLCBjdHgpOworCQllbWl0KHJ2X29yKGhpKHJkKSwgUlZfUkVH X1QwLCBoaShyZCkpLCBjdHgpOworCQllbWl0KHJ2X3NsbChsbyhyZCksIGxvKHJkKSwgbG8ocnMp KSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfUlNIOgorCQllbWl0KHJ2X2FkZGkoUlZfUkVH X1QwLCBsbyhycyksIC0zMiksIGN0eCk7CisJCWVtaXQocnZfYmx0KFJWX1JFR19UMCwgUlZfUkVH X1pFUk8sIDE2ID4+IDEpLCBjdHgpOworCisJCWVtaXQocnZfc3JsKGxvKHJkKSwgaGkocmQpLCBS Vl9SRUdfVDApLCBjdHgpOworCQllbWl0KHJ2X2FkZGkoaGkocmQpLCBSVl9SRUdfWkVSTywgMCks IGN0eCk7CisJCWVtaXQocnZfamFsKFJWX1JFR19aRVJPLCAzMiA+PiAxKSwgY3R4KTsKKworCQll bWl0KHJ2X2FkZGkoUlZfUkVHX1QxLCBSVl9SRUdfWkVSTywgMzEpLCBjdHgpOworCQllbWl0KHJ2 X3NsbGkoUlZfUkVHX1QwLCBoaShyZCksIDEpLCBjdHgpOworCQllbWl0KHJ2X3N1YihSVl9SRUdf VDEsIFJWX1JFR19UMSwgbG8ocnMpKSwgY3R4KTsKKwkJZW1pdChydl9zbGwoUlZfUkVHX1QwLCBS Vl9SRUdfVDAsIFJWX1JFR19UMSksIGN0eCk7CisJCWVtaXQocnZfc3JsKGxvKHJkKSwgbG8ocmQp LCBsbyhycykpLCBjdHgpOworCQllbWl0KHJ2X29yKGxvKHJkKSwgUlZfUkVHX1QwLCBsbyhyZCkp LCBjdHgpOworCQllbWl0KHJ2X3NybChoaShyZCksIGhpKHJkKSwgbG8ocnMpKSwgY3R4KTsKKwkJ YnJlYWs7CisJY2FzZSBCUEZfQVJTSDoKKwkJZW1pdChydl9hZGRpKFJWX1JFR19UMCwgbG8ocnMp LCAtMzIpLCBjdHgpOworCQllbWl0KHJ2X2JsdChSVl9SRUdfVDAsIFJWX1JFR19aRVJPLCAxNiA+ PiAxKSwgY3R4KTsKKworCQllbWl0KHJ2X3NyYShsbyhyZCksIGhpKHJkKSwgUlZfUkVHX1QwKSwg Y3R4KTsKKwkJZW1pdChydl9zcmFpKGhpKHJkKSwgaGkocmQpLCAweDFmKSwgY3R4KTsKKwkJZW1p dChydl9qYWwoUlZfUkVHX1pFUk8sIDMyID4+IDEpLCBjdHgpOworCisJCWVtaXQocnZfYWRkaShS Vl9SRUdfVDEsIFJWX1JFR19aRVJPLCAzMSksIGN0eCk7CisJCWVtaXQocnZfc2xsaShSVl9SRUdf VDAsIGhpKHJkKSwgMSksIGN0eCk7CisJCWVtaXQocnZfc3ViKFJWX1JFR19UMSwgUlZfUkVHX1Qx LCBsbyhycykpLCBjdHgpOworCQllbWl0KHJ2X3NsbChSVl9SRUdfVDAsIFJWX1JFR19UMCwgUlZf UkVHX1QxKSwgY3R4KTsKKwkJZW1pdChydl9zcmwobG8ocmQpLCBsbyhyZCksIGxvKHJzKSksIGN0 eCk7CisJCWVtaXQocnZfb3IobG8ocmQpLCBSVl9SRUdfVDAsIGxvKHJkKSksIGN0eCk7CisJCWVt aXQocnZfc3JhKGhpKHJkKSwgaGkocmQpLCBsbyhycykpLCBjdHgpOworCQlicmVhazsKKwljYXNl IEJQRl9ORUc6CisJCWVtaXQocnZfc3ViKGxvKHJkKSwgUlZfUkVHX1pFUk8sIGxvKHJkKSksIGN0 eCk7CisJCWVtaXQocnZfc2x0dShSVl9SRUdfVDAsIFJWX1JFR19aRVJPLCBsbyhyZCkpLCBjdHgp OworCQllbWl0KHJ2X3N1YihoaShyZCksIFJWX1JFR19aRVJPLCBoaShyZCkpLCBjdHgpOworCQll bWl0KHJ2X3N1YihoaShyZCksIGhpKHJkKSwgUlZfUkVHX1QwKSwgY3R4KTsKKwkJYnJlYWs7CisJ fQorCisJcnYzMl9icGZfcHV0X3JlZzY0KGRzdCwgcmQsIGN0eCk7Cit9CisKK3N0YXRpYyB2b2lk IGVtaXRfcnYzMl9hbHVfcjMyKGNvbnN0IHM4IGRzdFtdLCBjb25zdCBzOCBzcmNbXSwKKwkJCSAg ICAgIHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4LAorCQkJICAgICAgY29uc3QgdTggb3ApCit7 CisJY29uc3QgczggKnRtcDEgPSBicGYycnYzMltUTVBfUkVHXzFdOworCWNvbnN0IHM4ICp0bXAy ID0gYnBmMnJ2MzJbVE1QX1JFR18yXTsKKwljb25zdCBzOCAqcmQgPSBydjMyX2JwZl9nZXRfcmVn MzIoZHN0LCB0bXAxLCBjdHgpOworCWNvbnN0IHM4ICpycyA9IHJ2MzJfYnBmX2dldF9yZWczMihz cmMsIHRtcDIsIGN0eCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBCUEZfTU9WOgorCQllbWl0 KHJ2X2FkZGkobG8ocmQpLCBsbyhycyksIDApLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9B REQ6CisJCWVtaXQocnZfYWRkKGxvKHJkKSwgbG8ocmQpLCBsbyhycykpLCBjdHgpOworCQlicmVh azsKKwljYXNlIEJQRl9TVUI6CisJCWVtaXQocnZfc3ViKGxvKHJkKSwgbG8ocmQpLCBsbyhycykp LCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTkQ6CisJCWVtaXQocnZfYW5kKGxvKHJkKSwg bG8ocmQpLCBsbyhycykpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9PUjoKKwkJZW1pdChy dl9vcihsbyhyZCksIGxvKHJkKSwgbG8ocnMpKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZf WE9SOgorCQllbWl0KHJ2X3hvcihsbyhyZCksIGxvKHJkKSwgbG8ocnMpKSwgY3R4KTsKKwkJYnJl YWs7CisJY2FzZSBCUEZfTVVMOgorCQllbWl0KHJ2X211bChsbyhyZCksIGxvKHJkKSwgbG8ocnMp KSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfRElWOgorCQllbWl0KHJ2X2RpdnUobG8ocmQp LCBsbyhyZCksIGxvKHJzKSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX01PRDoKKwkJZW1p dChydl9yZW11KGxvKHJkKSwgbG8ocmQpLCBsbyhycykpLCBjdHgpOworCQlicmVhazsKKwljYXNl IEJQRl9MU0g6CisJCWVtaXQocnZfc2xsKGxvKHJkKSwgbG8ocmQpLCBsbyhycykpLCBjdHgpOwor CQlicmVhazsKKwljYXNlIEJQRl9SU0g6CisJCWVtaXQocnZfc3JsKGxvKHJkKSwgbG8ocmQpLCBs byhycykpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BUlNIOgorCQllbWl0KHJ2X3NyYShs byhyZCksIGxvKHJkKSwgbG8ocnMpKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfTkVHOgor CQllbWl0KHJ2X3N1YihsbyhyZCksIFJWX1JFR19aRVJPLCBsbyhyZCkpLCBjdHgpOworCQlicmVh azsKKwl9CisKKwlydjMyX2JwZl9wdXRfcmVnMzIoZHN0LCByZCwgY3R4KTsKK30KKworc3RhdGlj IGludCBlbWl0X3J2MzJfanVtcF9yNjQoY29uc3Qgczggc3JjMVtdLCBjb25zdCBzOCBzcmMyW10s CisJCQkgICAgICBzMTYgb2ZmLCBpbnQgaW5zbiwKKwkJCSAgICAgIHN0cnVjdCBydl9qaXRfY29u dGV4dCAqY3R4LAorCQkJICAgICAgY29uc3QgdTggb3ApCit7CisJaW50IHJ2b2ZmOworCWNvbnN0 IHM4ICp0bXAxID0gYnBmMnJ2MzJbVE1QX1JFR18xXTsKKwljb25zdCBzOCAqdG1wMiA9IGJwZjJy djMyW1RNUF9SRUdfMl07CisJY29uc3QgczggKnJzMSA9IHJ2MzJfYnBmX2dldF9yZWc2NChzcmMx LCB0bXAxLCBjdHgpOworCWNvbnN0IHM4ICpyczIgPSBydjMyX2JwZl9nZXRfcmVnNjQoc3JjMiwg dG1wMiwgY3R4KTsKKworCXJ2b2ZmID0gcnZfb2Zmc2V0KGluc24gKyBvZmYsIGluc24sIGN0eCkg KyA4OworCS8qIFRlc3QgaWYgZmFyIGJyYW5jaC4gKi8KKwlpZiAoIWlzXzEzYl9pbnQocnZvZmYg KyA4KSkKKwkJcnZvZmYgPSA4OworCisJc3dpdGNoIChvcCkgeworCWNhc2UgQlBGX0pFUToKKwkJ ZW1pdChydl9ibmUoaGkocnMxKSwgaGkocnMyKSwgOCA+PiAxKSwgY3R4KTsKKwkJZW1pdChydl9i ZXEobG8ocnMxKSwgbG8ocnMyKSwgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2Ug QlBGX0pORToKKwkJZW1pdChydl9ibmUoaGkocnMxKSwgaGkocnMyKSwgKHJ2b2ZmICsgNCkgPj4g MSksIGN0eCk7CisJCWVtaXQocnZfYm5lKGxvKHJzMSksIGxvKHJzMiksIHJ2b2ZmID4+IDEpLCBj dHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTEU6CisJCWVtaXQocnZfYmx0dShoaShyczEpLCBo aShyczIpLCAocnZvZmYgKyA4KSA+PiAxKSwgY3R4KTsKKwkJZW1pdChydl9ibHR1KGhpKHJzMiks IGhpKHJzMSksIDggPj4gMSksIGN0eCk7CisJCWVtaXQocnZfYmdldShsbyhyczIpLCBsbyhyczEp LCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSkxUOgorCQllbWl0KHJ2 X2JsdHUoaGkocnMxKSwgaGkocnMyKSwgKHJ2b2ZmICsgOCkgPj4gMSksIGN0eCk7CisJCWVtaXQo cnZfYmx0dShoaShyczIpLCBoaShyczEpLCA4ID4+IDEpLCBjdHgpOworCQllbWl0KHJ2X2JsdHUo bG8ocnMxKSwgbG8ocnMyKSwgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBG X0pHRToKKwkJZW1pdChydl9ibHR1KGhpKHJzMiksIGhpKHJzMSksIChydm9mZiArIDgpID4+IDEp LCBjdHgpOworCQllbWl0KHJ2X2JsdHUoaGkocnMxKSwgaGkocnMyKSwgOCA+PiAxKSwgY3R4KTsK KwkJZW1pdChydl9iZ2V1KGxvKHJzMSksIGxvKHJzMiksIHJ2b2ZmID4+IDEpLCBjdHgpOworCQli cmVhazsKKwljYXNlIEJQRl9KR1Q6CisJCWVtaXQocnZfYmx0dShoaShyczIpLCBoaShyczEpLCAo cnZvZmYgKyA4KSA+PiAxKSwgY3R4KTsKKwkJZW1pdChydl9ibHR1KGhpKHJzMSksIGhpKHJzMiks IDggPj4gMSksIGN0eCk7CisJCWVtaXQocnZfYmx0dShsbyhyczIpLCBsbyhyczEpLCBydm9mZiA+ PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSlNMRToKKwkJZW1pdChydl9ibHQoaGko cnMxKSwgaGkocnMyKSwgKHJ2b2ZmICsgOCkgPj4gMSksIGN0eCk7CisJCWVtaXQocnZfYm5lKGhp KHJzMiksIGhpKHJzMSksIDggPj4gMSksIGN0eCk7CisJCWVtaXQocnZfYmdldShsbyhyczIpLCBs byhyczEpLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSlNMVDoKKwkJ ZW1pdChydl9ibHQoaGkocnMxKSwgaGkocnMyKSwgKHJ2b2ZmICsgOCkgPj4gMSksIGN0eCk7CisJ CWVtaXQocnZfYm5lKGhpKHJzMiksIGhpKHJzMSksIDggPj4gMSksIGN0eCk7CisJCWVtaXQocnZf Ymx0dShsbyhyczEpLCBsbyhyczIpLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2Fz ZSBCUEZfSlNHRToKKwkJZW1pdChydl9ibHQoaGkocnMyKSwgaGkocnMxKSwgKHJ2b2ZmICsgOCkg Pj4gMSksIGN0eCk7CisJCWVtaXQocnZfYm5lKGhpKHJzMSksIGhpKHJzMiksIDggPj4gMSksIGN0 eCk7CisJCWVtaXQocnZfYmdldShsbyhyczEpLCBsbyhyczIpLCBydm9mZiA+PiAxKSwgY3R4KTsK KwkJYnJlYWs7CisJY2FzZSBCUEZfSlNHVDoKKwkJZW1pdChydl9ibHQoaGkocnMyKSwgaGkocnMx KSwgKHJ2b2ZmICsgOCkgPj4gMSksIGN0eCk7CisJCWVtaXQocnZfYm5lKGhpKHJzMSksIGhpKHJz MiksIDggPj4gMSksIGN0eCk7CisJCWVtaXQocnZfYmx0dShsbyhyczIpLCBsbyhyczEpLCBydm9m ZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSlNFVDoKKwkJZW1pdChydl9hbmQo UlZfUkVHX1QwLCBoaShyczEpLCBoaShyczIpKSwgY3R4KTsKKwkJZW1pdChydl9ibmUoUlZfUkVH X1QwLCBSVl9SRUdfWkVSTywgKHJ2b2ZmICsgOCkgPj4gMSksIGN0eCk7CisJCWVtaXQocnZfYW5k KFJWX1JFR19UMCwgbG8ocnMxKSwgbG8ocnMyKSksIGN0eCk7CisJCWVtaXQocnZfYm5lKFJWX1JF R19UMCwgUlZfUkVHX1pFUk8sIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwl9CisKKwkv KiBFbWl0IGNvZGUgZm9yIGZhciBicmFuY2hpbmcuIFRoaXMgaXMgc2tpcHBlZCBmb3Igc2hvcnQg YnJhbmNoZXMsCisJICogYnV0IG11c3QgcmVtYWluIGluIEpJVGVkIGNvZGUgdG8ga2VlcCBvZmZz ZXRzIHNhbWUgYWNyb3NzIHJ1bnMuCisJICovCisJcnZvZmYgPSBydl9vZmZzZXQoaW5zbiArIG9m ZiwgaW5zbiwgY3R4KTsKKwlpZiAoIWlzXzIxYl9pbnQocnZvZmYpKSB7CisJCXByX2VycigiYnBm LWppdDogaW5zbj0lZCBvZmZzZXQ9JWQgbm90IHN1cHBvcnRlZCB5ZXQhXG4iLAorCQkJaW5zbiwg cnZvZmYpOworCQlyZXR1cm4gLTE7CisJfQorCisJZW1pdChydl9qYWwoUlZfUkVHX1pFUk8sIDgg Pj4gMSksIGN0eCk7CisJZW1pdChydl9qYWwoUlZfUkVHX1pFUk8sIHJ2b2ZmID4+IDEpLCBjdHgp OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW1pdF9ydjMyX2p1bXBfcjMyKGNvbnN0 IHM4IHNyYzFbXSwgY29uc3Qgczggc3JjMltdLAorCQkJICAgICAgczE2IG9mZiwgaW50IGluc24s CisJCQkgICAgICBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIGNvbnN0IHU4 IG9wKQoreworCWludCBydm9mZjsKKwljb25zdCBzOCAqdG1wMSA9IGJwZjJydjMyW1RNUF9SRUdf MV07CisJY29uc3QgczggKnRtcDIgPSBicGYycnYzMltUTVBfUkVHXzJdOworCWNvbnN0IHM4ICpy czEgPSBydjMyX2JwZl9nZXRfcmVnMzIoc3JjMSwgdG1wMSwgY3R4KTsKKwljb25zdCBzOCAqcnMy ID0gcnYzMl9icGZfZ2V0X3JlZzMyKHNyYzIsIHRtcDIsIGN0eCk7CisKKwlydm9mZiA9IHJ2X29m ZnNldChpbnNuICsgb2ZmLCBpbnNuLCBjdHgpICsgODsKKwkvKiBUZXN0IGlmIGZhciBicmFuY2gu ICovCisJaWYgKCFpc18xM2JfaW50KHJ2b2ZmKSkKKwkJcnZvZmYgPSA4OworCisJc3dpdGNoIChv cCkgeworCWNhc2UgQlBGX0pFUToKKwkJZW1pdChydl9iZXEobG8ocnMxKSwgbG8ocnMyKSwgcnZv ZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0pORToKKwkJZW1pdChydl9ibmUo bG8ocnMxKSwgbG8ocnMyKSwgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBG X0pMRToKKwkJZW1pdChydl9iZ2V1KGxvKHJzMiksIGxvKHJzMSksIHJ2b2ZmID4+IDEpLCBjdHgp OworCQlicmVhazsKKwljYXNlIEJQRl9KTFQ6CisJCWVtaXQocnZfYmx0dShsbyhyczEpLCBsbyhy czIpLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSkdFOgorCQllbWl0 KHJ2X2JnZXUobG8ocnMxKSwgbG8ocnMyKSwgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOwor CWNhc2UgQlBGX0pHVDoKKwkJZW1pdChydl9ibHR1KGxvKHJzMiksIGxvKHJzMSksIHJ2b2ZmID4+ IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KU0xFOgorCQllbWl0KHJ2X2JnZShsbyhy czIpLCBsbyhyczEpLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSlNM VDoKKwkJZW1pdChydl9ibHQobG8ocnMxKSwgbG8ocnMyKSwgcnZvZmYgPj4gMSksIGN0eCk7CisJ CWJyZWFrOworCWNhc2UgQlBGX0pTR0U6CisJCWVtaXQocnZfYmdlKGxvKHJzMSksIGxvKHJzMiks IHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KU0dUOgorCQllbWl0KHJ2 X2JsdChsbyhyczIpLCBsbyhyczEpLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2Fz ZSBCUEZfSlNFVDoKKwkJZW1pdChydl9hbmQoUlZfUkVHX1QwLCBsbyhyczEpLCBsbyhyczIpKSwg Y3R4KTsKKwkJZW1pdChydl9ibmUoUlZfUkVHX1QwLCBSVl9SRUdfWkVSTywgcnZvZmYgPj4gMSks IGN0eCk7CisJCWJyZWFrOworCX0KKworCXJ2b2ZmID0gcnZfb2Zmc2V0KGluc24gKyBvZmYsIGlu c24sIGN0eCk7CisJaWYgKCFpc18yMWJfaW50KHJ2b2ZmKSkgeworCQlwcl9lcnIoImJwZi1qaXQ6 IGluc249JWQgb2Zmc2V0PSVkIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIiwKKwkJCWluc24sIHJ2b2Zm KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVtaXQocnZfamFsKFJWX1JFR19aRVJPLCA4ID4+IDEp LCBjdHgpOworCWVtaXQocnZfamFsKFJWX1JFR19aRVJPLCBydm9mZiA+PiAxKSwgY3R4KTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtaXRfcnYzMl9sb2FkX3I2NChjb25zdCBzOCBk c3RbXSwgY29uc3Qgczggc3JjW10sCisJCQkgICAgICBzMTYgb2ZmLAorCQkJICAgICAgc3RydWN0 IHJ2X2ppdF9jb250ZXh0ICpjdHgsCisJCQkgICAgICBjb25zdCB1OCBzaXplKQoreworCWNvbnN0 IHM4ICp0bXAxID0gYnBmMnJ2MzJbVE1QX1JFR18xXTsKKwljb25zdCBzOCAqdG1wMiA9IGJwZjJy djMyW1RNUF9SRUdfMl07CisJY29uc3QgczggKnJkID0gcnYzMl9icGZfZ2V0X3JlZzY0KGRzdCwg dG1wMSwgY3R4KTsKKwljb25zdCBzOCAqcnMgPSBydjMyX2JwZl9nZXRfcmVnNjQoc3JjLCB0bXAy LCBjdHgpOworCisJZW1pdF9pbW0oUlZfUkVHX1QwLCBvZmYsIGN0eCk7CisJZW1pdChydl9hZGQo UlZfUkVHX1QwLCBSVl9SRUdfVDAsIGxvKHJzKSksIGN0eCk7CisKKwlzd2l0Y2ggKHNpemUpIHsK KwljYXNlIEJQRl9COgorCQllbWl0KHJ2X2xidShsbyhyZCksIDAsIFJWX1JFR19UMCksIGN0eCk7 CisJCWlmICghY3R4LT5wcm9nLT5hdXgtPnZlcmlmaWVyX3pleHQpCisJCQllbWl0KHJ2X2FkZGko aGkocmQpLCBSVl9SRUdfWkVSTywgMCksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0g6CisJ CWVtaXQocnZfbGh1KGxvKHJkKSwgMCwgUlZfUkVHX1QwKSwgY3R4KTsKKwkJaWYgKCFjdHgtPnBy b2ctPmF1eC0+dmVyaWZpZXJfemV4dCkKKwkJCWVtaXQocnZfYWRkaShoaShyZCksIFJWX1JFR19a RVJPLCAwKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfVzoKKwkJZW1pdChydl9sdyhsbyhy ZCksIDAsIFJWX1JFR19UMCksIGN0eCk7CisJCWlmICghY3R4LT5wcm9nLT5hdXgtPnZlcmlmaWVy X3pleHQpCisJCQllbWl0KHJ2X2FkZGkoaGkocmQpLCBSVl9SRUdfWkVSTywgMCksIGN0eCk7CisJ CWJyZWFrOworCWNhc2UgQlBGX0RXOgorCQllbWl0KHJ2X2x3KGxvKHJkKSwgMCwgUlZfUkVHX1Qw KSwgY3R4KTsKKwkJZW1pdChydl9sdyhoaShyZCksIDQsIFJWX1JFR19UMCksIGN0eCk7CisJCWJy ZWFrOworCX0KKworCXJ2MzJfYnBmX3B1dF9yZWc2NChkc3QsIHJkLCBjdHgpOworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGVtaXRfcnYzMl9zdG9yZV9yNjQoY29uc3QgczggZHN0W10sIGNv bnN0IHM4IHNyY1tdLAorCQkJICAgICAgIHMxNiBvZmYsCisJCQkgICAgICAgc3RydWN0IHJ2X2pp dF9jb250ZXh0ICpjdHgsCisJCQkgICAgICAgY29uc3QgdTggc2l6ZSwgY29uc3QgdTggbW9kZSkK K3sKKwljb25zdCBzOCAqdG1wMSA9IGJwZjJydjMyW1RNUF9SRUdfMV07CisJY29uc3QgczggKnRt cDIgPSBicGYycnYzMltUTVBfUkVHXzJdOworCWNvbnN0IHM4ICpyZCA9IHJ2MzJfYnBmX2dldF9y ZWc2NChkc3QsIHRtcDEsIGN0eCk7CisJY29uc3QgczggKnJzID0gcnYzMl9icGZfZ2V0X3JlZzY0 KHNyYywgdG1wMiwgY3R4KTsKKworCWlmIChtb2RlID09IEJQRl9YQUREICYmIHNpemUgIT0gQlBG X1cpCisJCXJldHVybiAtMTsKKworCWVtaXRfaW1tKFJWX1JFR19UMCwgb2ZmLCBjdHgpOworCWVt aXQocnZfYWRkKFJWX1JFR19UMCwgUlZfUkVHX1QwLCBsbyhyZCkpLCBjdHgpOworCisJc3dpdGNo IChzaXplKSB7CisJY2FzZSBCUEZfQjoKKwkJZW1pdChydl9zYihSVl9SRUdfVDAsIDAsIGxvKHJz KSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0g6CisJCWVtaXQocnZfc2goUlZfUkVHX1Qw LCAwLCBsbyhycykpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9XOgorCQlzd2l0Y2ggKG1v ZGUpIHsKKwkJY2FzZSBCUEZfTUVNOgorCQkJZW1pdChydl9zdyhSVl9SRUdfVDAsIDAsIGxvKHJz KSksIGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfWEFERDoKKwkJCWVtaXQocnZfYW1vYWRk X3coUlZfUkVHX1pFUk8sIGxvKHJzKSwgUlZfUkVHX1QwLCAwLCAwKSwgY3R4KTsKKwkJCWJyZWFr OworCQl9CisJCWJyZWFrOworCWNhc2UgQlBGX0RXOgorCQllbWl0KHJ2X3N3KFJWX1JFR19UMCwg MCwgbG8ocnMpKSwgY3R4KTsKKwkJZW1pdChydl9zdyhSVl9SRUdfVDAsIDQsIGhpKHJzKSksIGN0 eCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3J2 MzJfcmV2MTYoY29uc3QgczggcmQsIHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCWVt aXQocnZfYWRkaShSVl9SRUdfVDEsIFJWX1JFR19aRVJPLCAwKSwgY3R4KTsKKworCWVtaXQocnZf YW5kaShSVl9SRUdfVDAsIHJkLCAweGZmKSwgY3R4KTsKKwllbWl0KHJ2X2FkZChSVl9SRUdfVDEs IFJWX1JFR19UMSwgUlZfUkVHX1QwKSwgY3R4KTsKKwllbWl0KHJ2X3NsbGkoUlZfUkVHX1QxLCBS Vl9SRUdfVDEsIDgpLCBjdHgpOworCWVtaXQocnZfc3JsaShyZCwgcmQsIDgpLCBjdHgpOworCisJ ZW1pdChydl9hbmRpKFJWX1JFR19UMCwgcmQsIDB4ZmYpLCBjdHgpOworCWVtaXQocnZfYWRkKFJW X1JFR19UMSwgUlZfUkVHX1QxLCBSVl9SRUdfVDApLCBjdHgpOworCisJZW1pdChydl9hZGRpKHJk LCBSVl9SRUdfVDEsIDApLCBjdHgpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3J2MzJfcmV2MzIo Y29uc3QgczggcmQsIHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCWVtaXQocnZfYWRk aShSVl9SRUdfVDEsIFJWX1JFR19aRVJPLCAwKSwgY3R4KTsKKworCWVtaXQocnZfYW5kaShSVl9S RUdfVDAsIHJkLCAweGZmKSwgY3R4KTsKKwllbWl0KHJ2X2FkZChSVl9SRUdfVDEsIFJWX1JFR19U MSwgUlZfUkVHX1QwKSwgY3R4KTsKKwllbWl0KHJ2X3NsbGkoUlZfUkVHX1QxLCBSVl9SRUdfVDEs IDgpLCBjdHgpOworCWVtaXQocnZfc3JsaShyZCwgcmQsIDgpLCBjdHgpOworCisJZW1pdChydl9h bmRpKFJWX1JFR19UMCwgcmQsIDB4ZmYpLCBjdHgpOworCWVtaXQocnZfYWRkKFJWX1JFR19UMSwg UlZfUkVHX1QxLCBSVl9SRUdfVDApLCBjdHgpOworCWVtaXQocnZfc2xsaShSVl9SRUdfVDEsIFJW X1JFR19UMSwgOCksIGN0eCk7CisJZW1pdChydl9zcmxpKHJkLCByZCwgOCksIGN0eCk7CisKKwll bWl0KHJ2X2FuZGkoUlZfUkVHX1QwLCByZCwgMHhmZiksIGN0eCk7CisJZW1pdChydl9hZGQoUlZf UkVHX1QxLCBSVl9SRUdfVDEsIFJWX1JFR19UMCksIGN0eCk7CisJZW1pdChydl9zbGxpKFJWX1JF R19UMSwgUlZfUkVHX1QxLCA4KSwgY3R4KTsKKwllbWl0KHJ2X3NybGkocmQsIHJkLCA4KSwgY3R4 KTsKKwllbWl0KHJ2X2FuZGkoUlZfUkVHX1QwLCByZCwgMHhmZiksIGN0eCk7CisJZW1pdChydl9h ZGQoUlZfUkVHX1QxLCBSVl9SRUdfVDEsIFJWX1JFR19UMCksIGN0eCk7CisKKwllbWl0KHJ2X2Fk ZGkocmQsIFJWX1JFR19UMSwgMCksIGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfcnYzMl96 ZXh0NjQoY29uc3QgczggKmRzdCwgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7CisJY29u c3QgczggKnJkOworCWNvbnN0IHM4ICp0bXAxID0gYnBmMnJ2MzJbVE1QX1JFR18xXTsKKworCXJk ID0gcnYzMl9icGZfZ2V0X3JlZzY0KGRzdCwgdG1wMSwgY3R4KTsKKwllbWl0KHJ2X2FkZGkoaGko cmQpLCBSVl9SRUdfWkVSTywgMCksIGN0eCk7CisJcnYzMl9icGZfcHV0X3JlZzY0KGRzdCwgcmQs IGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgZW1pdF9pbnNuKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAq aW5zbiwKKwkJICAgICBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCwKKwkJICAgICBib29sIGV4 dHJhX3Bhc3MpCit7CisJaW50IHJ2b2ZmLCBpID0gaW5zbiAtIGN0eC0+cHJvZy0+aW5zbnNpOwor CXU4IGNvZGUgPSBpbnNuLT5jb2RlOworCXMxNiBvZmYgPSBpbnNuLT5vZmY7CisJczMyIGltbSA9 IGluc24tPmltbTsKKworCWNvbnN0IHM4ICpkc3QgPSBicGYycnYzMltpbnNuLT5kc3RfcmVnXTsK Kwljb25zdCBzOCAqc3JjID0gYnBmMnJ2MzJbaW5zbi0+c3JjX3JlZ107CisJY29uc3QgczggKnRt cDEgPSBicGYycnYzMltUTVBfUkVHXzFdOworCWNvbnN0IHM4ICp0bXAyID0gYnBmMnJ2MzJbVE1Q X1JFR18yXTsKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01PViB8 IEJQRl9YOgorCQlpZiAoaW1tID09IDEpIHsKKwkJCS8qIFNwZWNpYWwgbW92MzIgZm9yIHpleHQg Ki8KKwkJCWVtaXRfcnYzMl96ZXh0NjQoZHN0LCBjdHgpOworCQkJYnJlYWs7CisJCX0KKworCWNh c2UgQlBGX0FMVTY0IHwgQlBGX0FERCB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FE RCB8IEJQRl9LOgorCisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfU1VCIHwgQlBGX1g6CisJY2FzZSBC UEZfQUxVNjQgfCBCUEZfU1VCIHwgQlBGX0s6CisKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9BTkQg fCBCUEZfWDoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9PUiB8IEJQRl9YOgorCWNhc2UgQlBGX0FM VTY0IHwgQlBGX1hPUiB8IEJQRl9YOgorCisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfTVVMIHwgQlBG X1g6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfTVVMIHwgQlBGX0s6CisKKwljYXNlIEJQRl9BTFU2 NCB8IEJQRl9MU0ggfCBCUEZfWDoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9SU0ggfCBCUEZfWDoK KwljYXNlIEJQRl9BTFU2NCB8IEJQRl9BUlNIIHwgQlBGX1g6CisJCWlmIChCUEZfU1JDKGNvZGUp ID09IEJQRl9LKSB7CisJCQllbWl0X2ltbTMyKHRtcDIsIGltbSwgY3R4KTsKKwkJCXNyYyA9IHRt cDI7CisJCX0KKwkJZW1pdF9ydjMyX2FsdV9yNjQoZHN0LCBzcmMsIGN0eCwgQlBGX09QKGNvZGUp KTsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9ORUc6CisJCWVtaXRfcnYzMl9h bHVfcjY0KGRzdCwgdG1wMiwgY3R4LCBCUEZfT1AoY29kZSkpOworCQlicmVhazsKKworCWNhc2Ug QlBGX0FMVTY0IHwgQlBGX0RJViB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0RJViB8 IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01PRCB8IEJQRl9YOgorCWNhc2UgQlBGX0FM VTY0IHwgQlBGX01PRCB8IEJQRl9LOgorCQlnb3RvIG5vdHN1cHBvcnRlZDsKKworCWNhc2UgQlBG X0FMVTY0IHwgQlBGX01PViB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FORCB8IEJQ Rl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX09SIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVNjQg fCBCUEZfWE9SIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfTFNIIHwgQlBGX0s6CisJ Y2FzZSBCUEZfQUxVNjQgfCBCUEZfUlNIIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZf QVJTSCB8IEJQRl9LOgorCQllbWl0X3J2MzJfYWx1X2k2NChkc3QsIGltbSwgY3R4LCBCUEZfT1Ao Y29kZSkpOworCQlicmVhazsKKworCWNhc2UgQlBGX0FMVSB8IEJQRl9NT1YgfCBCUEZfWDoKKwkJ aWYgKGltbSA9PSAxKSB7CisJCQkvKiBTcGVjaWFsIG1vdjMyIGZvciB6ZXh0ICovCisJCQllbWl0 X3J2MzJfemV4dDY0KGRzdCwgY3R4KTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEJQRl9BTFUg fCBCUEZfQUREIHwgQlBGX1g6CisJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YOgorCWNh c2UgQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfWDoKKwljYXNlIEJQRl9BTFUgfCBCUEZfT1IgfCBC UEZfWDoKKwljYXNlIEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1g6CisKKwljYXNlIEJQRl9BTFUg fCBCUEZfTVVMIHwgQlBGX1g6CisJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9LOgorCisJ Y2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVSB8IEJQRl9ESVYg fCBCUEZfSzoKKworCWNhc2UgQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfWDoKKwljYXNlIEJQRl9B TFUgfCBCUEZfTU9EIHwgQlBGX0s6CisKKwljYXNlIEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX1g6 CisJY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVSB8IEJQRl9B UlNIIHwgQlBGX1g6CisJCWlmIChCUEZfU1JDKGNvZGUpID09IEJQRl9LKSB7CisJCQllbWl0X2lt bTMyKHRtcDIsIGltbSwgY3R4KTsKKwkJCXNyYyA9IHRtcDI7CisJCX0KKwkJZW1pdF9ydjMyX2Fs dV9yMzIoZHN0LCBzcmMsIGN0eCwgQlBGX09QKGNvZGUpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJQ Rl9BTFUgfCBCUEZfTU9WIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9L OgorCWNhc2UgQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfSzoKKwljYXNlIEJQRl9BTFUgfCBCUEZf QU5EIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVIHwgQlBGX09SIHwgQlBGX0s6CisJY2FzZSBCUEZf QUxVIHwgQlBGX1hPUiB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVSB8IEJQRl9MU0ggfCBCUEZfSzoK KwljYXNlIEJQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVIHwgQlBGX0FS U0ggfCBCUEZfSzoKKwkJZW1pdF9ydjMyX2FsdV9pMzIoZHN0LCBpbW0sIGN0eCwgQlBGX09QKGNv ZGUpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9BTFUgfCBCUEZfTkVHOgorCQkvKiBzcmMgaXMg aWdub3JlZC0tLWNob29zZSBhIHJlZ2lzdGVyIGtub3duIG5vdCB0byBiZSBzdGFja2VkICovCisJ CWVtaXRfcnYzMl9hbHVfcjMyKGRzdCwgdG1wMiwgY3R4LCBCUEZfT1AoY29kZSkpOworCQlicmVh azsKKworCWNhc2UgQlBGX0FMVSB8IEJQRl9FTkQgfCBCUEZfRlJPTV9MRToKKwl7CisJCWNvbnN0 IHM4ICpyZCA9IHJ2MzJfYnBmX2dldF9yZWc2NChkc3QsIHRtcDEsIGN0eCk7CisKKwkJc3dpdGNo IChpbW0pIHsKKwkJY2FzZSAxNjoKKwkJCWVtaXQocnZfc2xsaShsbyhyZCksIGxvKHJkKSwgMTYp LCBjdHgpOworCQkJZW1pdChydl9zcmxpKGxvKHJkKSwgbG8ocmQpLCAxNiksIGN0eCk7CisJCQkv KiBGYWxsdGhyb3VnaCB0byBjbGVhciBoaWdoIGJpdHMuICovCisJCWNhc2UgMzI6CisJCQlpZiAo IWN0eC0+cHJvZy0+YXV4LT52ZXJpZmllcl96ZXh0KQorCQkJCWVtaXQocnZfYWRkaShoaShyZCks IFJWX1JFR19aRVJPLCAwKSwgY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIDY0OgorCQkJLyogRG8g bm90aGluZy4gKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCJicGYtaml0OiBC UEZfRU5EIGltbSAlZCBpbnZhbGlkXG4iLCBpbW0pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJ cnYzMl9icGZfcHV0X3JlZzY0KGRzdCwgcmQsIGN0eCk7CisJCWJyZWFrOworCX0KKworCWNhc2Ug QlBGX0FMVSB8IEJQRl9FTkQgfCBCUEZfRlJPTV9CRToKKwl7CisJCWNvbnN0IHM4ICpyZCA9IHJ2 MzJfYnBmX2dldF9yZWc2NChkc3QsIHRtcDEsIGN0eCk7CisKKwkJc3dpdGNoIChpbW0pIHsKKwkJ Y2FzZSAxNjoKKwkJCWVtaXRfcnYzMl9yZXYxNihsbyhyZCksIGN0eCk7CisJCQlpZiAoIWN0eC0+ cHJvZy0+YXV4LT52ZXJpZmllcl96ZXh0KQorCQkJCWVtaXQocnZfYWRkaShoaShyZCksIFJWX1JF R19aRVJPLCAwKSwgY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJZW1pdF9ydjMyX3Jl djMyKGxvKHJkKSwgY3R4KTsKKwkJCWlmICghY3R4LT5wcm9nLT5hdXgtPnZlcmlmaWVyX3pleHQp CisJCQkJZW1pdChydl9hZGRpKGhpKHJkKSwgUlZfUkVHX1pFUk8sIDApLCBjdHgpOworCQkJYnJl YWs7CisJCWNhc2UgNjQ6CisJCQkvKiBTd2FwIHVwcGVyIGFuZCBsb3dlciBoYWx2ZXMuICovCisJ CQllbWl0KHJ2X2FkZGkoUlZfUkVHX1QwLCBsbyhyZCksIDApLCBjdHgpOworCQkJZW1pdChydl9h ZGRpKGxvKHJkKSwgaGkocmQpLCAwKSwgY3R4KTsKKwkJCWVtaXQocnZfYWRkaShoaShyZCksIFJW X1JFR19UMCwgMCksIGN0eCk7CisKKwkJCS8qIFN3YXAgZWFjaCBoYWxmLiAqLworCQkJZW1pdF9y djMyX3JldjMyKGxvKHJkKSwgY3R4KTsKKwkJCWVtaXRfcnYzMl9yZXYzMihoaShyZCksIGN0eCk7 CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiYnBmLWppdDogQlBGX0VORCBpbW0g JWQgaW52YWxpZFxuIiwgaW1tKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXJ2MzJfYnBmX3B1 dF9yZWc2NChkc3QsIHJkLCBjdHgpOworCQlicmVhazsKKwl9CisKKwljYXNlIEJQRl9KTVAgfCBC UEZfSkE6CisJCXJ2b2ZmID0gcnZfb2Zmc2V0KGkgKyBvZmYsIGksIGN0eCk7CisJCWlmICghaXNf MjFiX2ludChydm9mZikpIHsKKwkJCXByX2VycigiYnBmLWppdDogaW5zbj0lZCBvZmZzZXQ9JWQg bm90IHN1cHBvcnRlZCB5ZXQhXG4iLAorCQkJICAgICAgIGksIHJ2b2ZmKTsKKwkJCXJldHVybiAt MTsKKwkJfQorCQllbWl0KHJ2X2phbChSVl9SRUdfWkVSTywgcnZvZmYgPj4gMSksIGN0eCk7CisJ CWJyZWFrOworCisJY2FzZSBCUEZfSk1QIHwgQlBGX0NBTEw6CisJeworCQlib29sIGZpeGVkOwor CQlpbnQgcmV0OworCQl1NjQgYWRkcjsKKwkJY29uc3QgczggKnIwID0gYnBmMnJ2MzJbQlBGX1JF R18wXTsKKwkJY29uc3QgczggKnI1ID0gYnBmMnJ2MzJbQlBGX1JFR181XTsKKworCQlyZXQgPSBi cGZfaml0X2dldF9mdW5jX2FkZHIoY3R4LT5wcm9nLCBpbnNuLCBleHRyYV9wYXNzLCAmYWRkciwK KwkJCQkJICAgICZmaXhlZCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYg KGZpeGVkKSB7CisJCQllbWl0X2ltbShSVl9SRUdfVDAsICh1MzIpYWRkciwgY3R4KTsKKwkJfSBl bHNlIHsKKwkJCWkgPSBjdHgtPm5pbnNuczsKKwkJCWVtaXRfaW1tKFJWX1JFR19UMCwgKHUzMilh ZGRyLCBjdHgpOworCQkJZm9yIChpID0gY3R4LT5uaW5zbnMgLSBpOyBpIDwgODsgaSsrKSB7CisJ CQkJLyogbm9wICovCisJCQkJZW1pdChydl9hZGRpKFJWX1JFR19aRVJPLCBSVl9SRUdfWkVSTywg MCksIGN0eCk7CisJCQl9CisJCX0KKworCQkvKiBSMS1SNCBhbHJlYWR5IGluIGNvcnJlY3QgcmVp Z3N0ZXJzLS0tbmVlZCB0byBwdXNoIFI1IHRvIHN0YWNrICovCisJCWVtaXQocnZfYWRkaShSVl9S RUdfU1AsIFJWX1JFR19TUCwgLTgpLCBjdHgpOworCQllbWl0KHJ2X3N3KFJWX1JFR19TUCwgMCwg bG8ocjUpKSwgY3R4KTsKKwkJZW1pdChydl9zdyhSVl9SRUdfU1AsIDQsIGhpKHI1KSksIGN0eCk7 CisKKwkJZW1pdChydl9qYWxyKFJWX1JFR19SQSwgUlZfUkVHX1QwLCAwKSwgY3R4KTsKKworCQkv KiBTZXQgcmV0dXJuIHZhbHVlICovCisJCWVtaXQocnZfYWRkaShsbyhyMCksIFJWX1JFR19BMCwg MCksIGN0eCk7CisJCWVtaXQocnZfYWRkaShoaShyMCksIFJWX1JFR19BMSwgMCksIGN0eCk7CisJ CWVtaXQocnZfYWRkaShSVl9SRUdfU1AsIFJWX1JFR19TUCwgOCksIGN0eCk7CisJCWJyZWFrOwor CX0KKworCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWDoKKwljYXNlIEJQRl9KTVAgfCBC UEZfSkVRIHwgQlBGX0s6CisJY2FzZSBCUEZfSk1QMzIgfCBCUEZfSkVRIHwgQlBGX1g6CisJY2Fz ZSBCUEZfSk1QMzIgfCBCUEZfSkVRIHwgQlBGX0s6CisKKwljYXNlIEJQRl9KTVAgfCBCUEZfSk5F IHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9LOgorCWNhc2UgQlBGX0pN UDMyIHwgQlBGX0pORSB8IEJQRl9YOgorCWNhc2UgQlBGX0pNUDMyIHwgQlBGX0pORSB8IEJQRl9L OgorCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pMRSB8IEJQRl9YOgorCWNhc2UgQlBGX0pNUCB8IEJQ Rl9KTEUgfCBCUEZfSzoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KTEUgfCBCUEZfWDoKKwljYXNl IEJQRl9KTVAzMiB8IEJQRl9KTEUgfCBCUEZfSzoKKworCWNhc2UgQlBGX0pNUCB8IEJQRl9KTFQg fCBCUEZfWDoKKwljYXNlIEJQRl9KTVAgfCBCUEZfSkxUIHwgQlBGX0s6CisJY2FzZSBCUEZfSk1Q MzIgfCBCUEZfSkxUIHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QMzIgfCBCUEZfSkxUIHwgQlBGX0s6 CisKKwljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QIHwgQlBG X0pHRSB8IEJQRl9LOgorCWNhc2UgQlBGX0pNUDMyIHwgQlBGX0pHRSB8IEJQRl9YOgorCWNhc2Ug QlBGX0pNUDMyIHwgQlBGX0pHRSB8IEJQRl9LOgorCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8 IEJQRl9YOgorCWNhc2UgQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSzoKKwljYXNlIEJQRl9KTVAz MiB8IEJQRl9KR1QgfCBCUEZfWDoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KR1QgfCBCUEZfSzoK KworCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0xFIHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QIHwgQlBG X0pTTEUgfCBCUEZfSzoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KU0xFIHwgQlBGX1g6CisJY2Fz ZSBCUEZfSk1QMzIgfCBCUEZfSlNMRSB8IEJQRl9LOgorCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pT TFQgfCBCUEZfWDoKKwljYXNlIEJQRl9KTVAgfCBCUEZfSlNMVCB8IEJQRl9LOgorCWNhc2UgQlBG X0pNUDMyIHwgQlBGX0pTTFQgfCBCUEZfWDoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KU0xUIHwg QlBGX0s6CisKKwljYXNlIEJQRl9KTVAgfCBCUEZfSlNHRSB8IEJQRl9YOgorCWNhc2UgQlBGX0pN UCB8IEJQRl9KU0dFIHwgQlBGX0s6CisJY2FzZSBCUEZfSk1QMzIgfCBCUEZfSlNHRSB8IEJQRl9Y OgorCWNhc2UgQlBGX0pNUDMyIHwgQlBGX0pTR0UgfCBCUEZfSzoKKworCWNhc2UgQlBGX0pNUCB8 IEJQRl9KU0dUIHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTR1QgfCBCUEZfSzoKKwlj YXNlIEJQRl9KTVAzMiB8IEJQRl9KU0dUIHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QMzIgfCBCUEZf SlNHVCB8IEJQRl9LOgorCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfWDoKKwljYXNl IEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LOgorCWNhc2UgQlBGX0pNUDMyIHwgQlBGX0pTRVQg fCBCUEZfWDoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KU0VUIHwgQlBGX0s6CisJCWlmIChCUEZf U1JDKGNvZGUpID09IEJQRl9LKSB7CisJCQllbWl0X2ltbTMyKHRtcDIsIGltbSwgY3R4KTsKKwkJ CXNyYyA9IHRtcDI7CisJCX0KKwkJc3dpdGNoIChCUEZfQ0xBU1MoY29kZSkpIHsKKwkJY2FzZSBC UEZfSk1QOgorCQkJaWYgKGVtaXRfcnYzMl9qdW1wX3I2NChkc3QsIHNyYywgb2ZmLCBpLCBjdHgs IEJQRl9PUChjb2RlKSkpCisJCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX0pN UDMyOgorCQkJaWYgKGVtaXRfcnYzMl9qdW1wX3IzMihkc3QsIHNyYywgb2ZmLCBpLCBjdHgsIEJQ Rl9PUChjb2RlKSkpCisJCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisK KwljYXNlIEJQRl9KTVAgfCBCUEZfRVhJVDoKKwkJaWYgKGkgPT0gY3R4LT5wcm9nLT5sZW4gLSAx KQorCQkJYnJlYWs7CisKKwkJcnZvZmYgPSBlcGlsb2d1ZV9vZmZzZXQoY3R4KTsKKwkJaWYgKGlz XzIxYl9jaGVjayhydm9mZiwgaSkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXQocnZfamFsKFJWX1JF R19aRVJPLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRCB8IEJQ Rl9JTU0gfCBCUEZfRFc6CisJeworCQlzdHJ1Y3QgYnBmX2luc24gaW5zbjEgPSBpbnNuWzFdOwor CQlzMzIgaW1tX2xvID0gaW1tOworCQlzMzIgaW1tX2hpID0gaW5zbjEuaW1tOworCQljb25zdCBz OCAqcmQgPSBydjMyX2JwZl9nZXRfcmVnNjQoZHN0LCB0bXAxLCBjdHgpOworCisJCWVtaXRfaW1t NjQocmQsIGltbV9oaSwgaW1tX2xvLCBjdHgpOworCQlydjMyX2JwZl9wdXRfcmVnNjQoZHN0LCBy ZCwgY3R4KTsKKwkJcmV0dXJuIDE7CisJfQorCisJY2FzZSBCUEZfTERYIHwgQlBGX01FTSB8IEJQ Rl9COgorCWNhc2UgQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfSDoKKwljYXNlIEJQRl9MRFggfCBC UEZfTUVNIHwgQlBGX1c6CisJY2FzZSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9EVzoKKwkJaWYg KGVtaXRfcnYzMl9sb2FkX3I2NChkc3QsIHNyYywgb2ZmLCBjdHgsIEJQRl9TSVpFKGNvZGUpKSkK KwkJCXJldHVybiAtMTsKKwkJYnJlYWs7CisKKworCWNhc2UgQlBGX1NUIHwgQlBGX01FTSB8IEJQ Rl9COgorCWNhc2UgQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfQjoKKwljYXNlIEJQRl9TVCB8IEJQ Rl9NRU0gfCBCUEZfSDoKKwljYXNlIEJQRl9TVFggfCBCUEZfTUVNIHwgQlBGX0g6CisJY2FzZSBC UEZfU1QgfCBCUEZfTUVNIHwgQlBGX1c6CisJY2FzZSBCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9X OgorCWNhc2UgQlBGX1NUIHwgQlBGX01FTSB8IEJQRl9EVzoKKwljYXNlIEJQRl9TVFggfCBCUEZf TUVNIHwgQlBGX0RXOgorCisJY2FzZSBCUEZfU1RYIHwgQlBGX1hBREQgfCBCUEZfVzoKKwkJaWYg KEJQRl9DTEFTUyhjb2RlKSA9PSBCUEZfU1QpIHsKKwkJCWVtaXRfaW1tMzIodG1wMiwgaW1tLCBj dHgpOworCQkJc3JjID0gdG1wMjsKKwkJfQorCisJCWlmIChlbWl0X3J2MzJfc3RvcmVfcjY0KGRz dCwgc3JjLCBvZmYsIGN0eCwgQlBGX1NJWkUoY29kZSksIEJQRl9NT0RFKGNvZGUpKSkKKwkJCXJl dHVybiAtMTsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9TVFggfCBCUEZfWEFERCB8IEJQRl9EVzoK KwkJZ290byBub3RzdXBwb3J0ZWQ7CisKK25vdHN1cHBvcnRlZDoKKwkJcHJfaW5mb19vbmNlKCIq KiogTk9UIFNVUFBPUlRFRDogb3Bjb2RlICUwMnggKioqXG4iLCBjb2RlKTsKKwkJcmV0dXJuIC1F RkFVTFQ7CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoImJwZi1qaXQ6IHVua25vd24gb3Bjb2RlICUw MnhcbiIsIGNvZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgYnVpbGRfcHJvbG9ndWUoc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7 CisJaW50IHN0YWNrX2FkanVzdCA9IDMyLCBzdG9yZV9vZmZzZXQsIGJwZl9zdGFja19hZGp1c3Q7 CisKKwlzdGFja19hZGp1c3QgPSByb3VuZF91cChzdGFja19hZGp1c3QsIDE2KTsKKwlicGZfc3Rh Y2tfYWRqdXN0ID0gcm91bmRfdXAoY3R4LT5wcm9nLT5hdXgtPnN0YWNrX2RlcHRoLCAxNik7CisJ c3RhY2tfYWRqdXN0ICs9IGJwZl9zdGFja19hZGp1c3Q7CisKKwlzdG9yZV9vZmZzZXQgPSBzdGFj a19hZGp1c3QgLSA4OworCisJc3RhY2tfYWRqdXN0ICs9IDQgKiBCUEZfSklUX1NDUkFUQ0hfUkVH UzsKKworCWVtaXQocnZfYWRkaShSVl9SRUdfU1AsIFJWX1JFR19TUCwgLXN0YWNrX2FkanVzdCks IGN0eCk7CisKKwkvKiBTYXZlIGNhbGxlZS1zYXZlIHJlZ2lzdGVycyAqLworCWVtaXQocnZfc3co UlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQgLSAwLCBSVl9SRUdfUkEpLCBjdHgpOworCWVtaXQocnZf c3coUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQgLSA0LCBSVl9SRUdfRlApLCBjdHgpOworCWVtaXQo cnZfc3coUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQgLSA4LCBSVl9SRUdfUzEpLCBjdHgpOworCWVt aXQocnZfc3coUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQgLSAxMiwgUlZfUkVHX1MyKSwgY3R4KTsK KwllbWl0KHJ2X3N3KFJWX1JFR19TUCwgc3RvcmVfb2Zmc2V0IC0gMTYsIFJWX1JFR19TMyksIGN0 eCk7CisJZW1pdChydl9zdyhSVl9SRUdfU1AsIHN0b3JlX29mZnNldCAtIDIwLCBSVl9SRUdfUzQp LCBjdHgpOworCWVtaXQocnZfc3coUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQgLSAyNCwgUlZfUkVH X1M1KSwgY3R4KTsKKwllbWl0KHJ2X3N3KFJWX1JFR19TUCwgc3RvcmVfb2Zmc2V0IC0gMjgsIFJW X1JFR19TNiksIGN0eCk7CisKKwllbWl0KHJ2X2FkZGkoUlZfUkVHX0ZQLCBSVl9SRUdfU1AsIHN0 YWNrX2FkanVzdCksIGN0eCk7CisKKwkvKiBTZXQgdXAgQlBGIHN0YWNrIHBvaW50ZXIgKi8KKwll bWl0KHJ2X2FkZGkobG8oYnBmMnJ2MzJbQlBGX1JFR19GUF0pLCBSVl9SRUdfU1AsIGJwZl9zdGFj a19hZGp1c3QpLCBjdHgpOworCWVtaXQocnZfYWRkaShoaShicGYycnYzMltCUEZfUkVHX0ZQXSks IFJWX1JFR19aRVJPLCAwKSwgY3R4KTsKKworCS8qIFNldCB1cCBjb250ZXh0IHBvaW50ZXIgKi8K KwllbWl0KHJ2X2FkZGkobG8oYnBmMnJ2MzJbQlBGX1JFR18xXSksIFJWX1JFR19BMCwgMCksIGN0 eCk7CisJZW1pdChydl9hZGRpKGhpKGJwZjJydjMyW0JQRl9SRUdfMV0pLCBSVl9SRUdfWkVSTywg MCksIGN0eCk7CisKKwljdHgtPnN0YWNrX3NpemUgPSBzdGFja19hZGp1c3Q7Cit9CisKK3N0YXRp YyBpbnQgYnVpbGRfYm9keShzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCwgYm9vbCBleHRyYV9w YXNzKQoreworCWNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IGN0eC0+cHJvZzsKKwlpbnQg aTsKKworCWZvciAoaSA9IDA7IGkgPCBwcm9nLT5sZW47IGkrKykgeworCQljb25zdCBzdHJ1Y3Qg YnBmX2luc24gKmluc24gPSAmcHJvZy0+aW5zbnNpW2ldOworCQlpbnQgcmV0OworCisJCXJldCA9 IGVtaXRfaW5zbihpbnNuLCBjdHgsIGV4dHJhX3Bhc3MpOworCQlpZiAocmV0ID4gMCkgeworCQkJ aSsrOworCQkJaWYgKGN0eC0+aW5zbnMgPT0gTlVMTCkKKwkJCQljdHgtPm9mZnNldFtpXSA9IGN0 eC0+bmluc25zOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGN0eC0+aW5zbnMgPT0gTlVMTCkK KwkJCWN0eC0+b2Zmc2V0W2ldID0gY3R4LT5uaW5zbnM7CisJCWlmIChyZXQpCisJCQlyZXR1cm4g cmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnBmX2ZpbGxfaWxsX2luc25z KHZvaWQgKmFyZWEsIHVuc2lnbmVkIGludCBzaXplKQoreworCW1lbXNldChhcmVhLCAwLCBzaXpl KTsKK30KKworc3RhdGljIHZvaWQgYnBmX2ZsdXNoX2ljYWNoZSh2b2lkICpzdGFydCwgdm9pZCAq ZW5kKQoreworCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylzdGFydCwgKHVuc2ln bmVkIGxvbmcpZW5kKTsKK30KKworYm9vbCBicGZfaml0X25lZWRzX3pleHQodm9pZCkKK3sKKwly ZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IGJwZl9wcm9nICpicGZfaW50X2ppdF9jb21waWxlKHN0 cnVjdCBicGZfcHJvZyAqcHJvZykKK3sKKwlib29sIHRtcF9ibGluZGVkID0gZmFsc2UsIGV4dHJh X3Bhc3MgPSBmYWxzZTsKKwlzdHJ1Y3QgYnBmX3Byb2cgKnRtcCwgKm9yaWdfcHJvZyA9IHByb2c7 CisJc3RydWN0IHJ2X2ppdF9kYXRhICpqaXRfZGF0YTsKKwlzdHJ1Y3QgcnZfaml0X2NvbnRleHQg KmN0eDsKKwl1bnNpZ25lZCBpbnQgaW1hZ2Vfc2l6ZTsKKworCWlmICghcHJvZy0+aml0X3JlcXVl c3RlZCkKKwkJcmV0dXJuIG9yaWdfcHJvZzsKKworCXRtcCA9IGJwZl9qaXRfYmxpbmRfY29uc3Rh bnRzKHByb2cpOworCWlmIChJU19FUlIodG1wKSkKKwkJcmV0dXJuIG9yaWdfcHJvZzsKKwlpZiAo dG1wICE9IHByb2cpIHsKKwkJdG1wX2JsaW5kZWQgPSB0cnVlOworCQlwcm9nID0gdG1wOworCX0K KworCWppdF9kYXRhID0gcHJvZy0+YXV4LT5qaXRfZGF0YTsKKwlpZiAoIWppdF9kYXRhKSB7CisJ CWppdF9kYXRhID0ga3phbGxvYyhzaXplb2YoKmppdF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJCWlm ICghaml0X2RhdGEpIHsKKwkJCXByb2cgPSBvcmlnX3Byb2c7CisJCQlnb3RvIG91dDsKKwkJfQor CQlwcm9nLT5hdXgtPmppdF9kYXRhID0gaml0X2RhdGE7CisJfQorCisJY3R4ID0gJmppdF9kYXRh LT5jdHg7CisKKwlpZiAoY3R4LT5vZmZzZXQpIHsKKwkJZXh0cmFfcGFzcyA9IHRydWU7CisJCWlt YWdlX3NpemUgPSBzaXplb2YodTMyKSAqIGN0eC0+bmluc25zOworCQlnb3RvIHNraXBfaW5pdF9j dHg7CisJfQorCisJY3R4LT5wcm9nID0gcHJvZzsKKwljdHgtPm9mZnNldCA9IGtjYWxsb2MocHJv Zy0+bGVuLCBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgtPm9mZnNldCkgewor CQlwcm9nID0gb3JpZ19wcm9nOworCQlnb3RvIG91dF9vZmZzZXQ7CisJfQorCisJLyogRmlyc3Qg cGFzcyBnZW5lcmF0ZXMgdGhlIGN0eC0+b2Zmc2V0LCBidXQgZG9lcyBub3QgZW1pdCBhbiBpbWFn ZS4gKi8KKwlpZiAoYnVpbGRfYm9keShjdHgsIGV4dHJhX3Bhc3MpKSB7CisJCXByb2cgPSBvcmln X3Byb2c7CisJCWdvdG8gb3V0X29mZnNldDsKKwl9CisJYnVpbGRfcHJvbG9ndWUoY3R4KTsKKwlj dHgtPmVwaWxvZ3VlX29mZnNldCA9IGN0eC0+bmluc25zOworCWJ1aWxkX2VwaWxvZ3VlKGN0eCk7 CisKKwkvKiBBbGxvY2F0ZSBpbWFnZSwgbm93IHRoYXQgd2Uga25vdyB0aGUgc2l6ZS4gKi8KKwlp bWFnZV9zaXplID0gc2l6ZW9mKHUzMikgKiBjdHgtPm5pbnNuczsKKwlqaXRfZGF0YS0+aGVhZGVy ID0gYnBmX2ppdF9iaW5hcnlfYWxsb2MoaW1hZ2Vfc2l6ZSwgJmppdF9kYXRhLT5pbWFnZSwKKwkJ CQkJCXNpemVvZih1MzIpLAorCQkJCQkJYnBmX2ZpbGxfaWxsX2luc25zKTsKKwlpZiAoIWppdF9k YXRhLT5oZWFkZXIpIHsKKwkJcHJvZyA9IG9yaWdfcHJvZzsKKwkJZ290byBvdXRfb2Zmc2V0Owor CX0KKworCS8qIFNlY29uZCwgcmVhbCBwYXNzLCB0aGF0IGFjdXRhbGx5IGVtaXRzIHRoZSBpbWFn ZS4gKi8KKwljdHgtPmluc25zID0gKHUzMiAqKWppdF9kYXRhLT5pbWFnZTsKK3NraXBfaW5pdF9j dHg6CisJY3R4LT5uaW5zbnMgPSAwOworCisJYnVpbGRfcHJvbG9ndWUoY3R4KTsKKwlpZiAoYnVp bGRfYm9keShjdHgsIGV4dHJhX3Bhc3MpKSB7CisJCWJwZl9qaXRfYmluYXJ5X2ZyZWUoaml0X2Rh dGEtPmhlYWRlcik7CisJCXByb2cgPSBvcmlnX3Byb2c7CisJCWdvdG8gb3V0X29mZnNldDsKKwl9 CisJYnVpbGRfZXBpbG9ndWUoY3R4KTsKKworCWlmIChicGZfaml0X2VuYWJsZSA+IDEpCisJCWJw Zl9qaXRfZHVtcChwcm9nLT5sZW4sIGltYWdlX3NpemUsIDIsIGN0eC0+aW5zbnMpOworCisJcHJv Zy0+YnBmX2Z1bmMgPSAodm9pZCAqKWN0eC0+aW5zbnM7CisJcHJvZy0+aml0ZWQgPSAxOworCXBy b2ctPmppdGVkX2xlbiA9IGltYWdlX3NpemU7CisKKwlicGZfZmx1c2hfaWNhY2hlKGppdF9kYXRh LT5oZWFkZXIsIGN0eC0+aW5zbnMgKyBjdHgtPm5pbnNucyk7CisKKwlpZiAoIXByb2ctPmlzX2Z1 bmMgfHwgZXh0cmFfcGFzcykgeworb3V0X29mZnNldDoKKwkJa2ZyZWUoY3R4LT5vZmZzZXQpOwor CQlrZnJlZShqaXRfZGF0YSk7CisJCXByb2ctPmF1eC0+aml0X2RhdGEgPSBOVUxMOworCX0KK291 dDoKKwlpZiAodG1wX2JsaW5kZWQpCisJCWJwZl9qaXRfcHJvZ19yZWxlYXNlX290aGVyKHByb2cs IHByb2cgPT0gb3JpZ19wcm9nID8KKwkJCQkJICAgdG1wIDogb3JpZ19wcm9nKTsKKwlyZXR1cm4g cHJvZzsKK30KLS0gCjIuMjAuMQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtcmlzY3YK