From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oa1-x2c.google.com (mail-oa1-x2c.google.com [IPv6:2001:4860:4864:20::2c]) by sourceware.org (Postfix) with ESMTPS id 9269C385783E for ; Mon, 20 Nov 2023 00:47:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9269C385783E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=ventanamicro.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 9269C385783E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:4860:4864:20::2c ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700441284; cv=none; b=DELdZVhzoIjkCly8wlVoMX5T7ElKMXdQTJCt6InaEttt3+7hrARPiLmiSnriwzJ2hLsSBz4f0Fp5CRmjsutishw9/rMnFdDBCI/XwVcdSsl2nZuCiPFJ4RJCuRmEA0QxCcLEj5KpFdwqJwnhM1QYEcBBqpwNzkHHIzreQfOnEzY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700441284; c=relaxed/simple; bh=oS8C1Owt5RBy0/W15VTUN36YX1JKBpa4xymJv2BShcY=; h=DKIM-Signature:Message-ID:Date:MIME-Version:From:Subject:To; b=hZZ7GahgoSx1/X9r9uiFYcyzuoXPUUIZSEXxCBZiuFEif62b+2ph2MMU/pLPifPUw5ZYcnJPQEHdkgT0s26d+TCnTnOsXNCZbokXTraKnvrAQyQc2i4mUaxzuR/Ce7BNZk5gf2Oa07eT1aYNgXSdbXeDJH5/nL3Q4neUMmboLNo= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-oa1-x2c.google.com with SMTP id 586e51a60fabf-1f0f94a08a0so2346430fac.2 for ; Sun, 19 Nov 2023 16:47:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1700441278; x=1701046078; darn=gcc.gnu.org; h=cc:to:subject:from:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=e4ZGI1MLewMhh67Dx4+L89F2K5Yx3CkOcoa8Ewo1ToM=; b=Im0yws9T/R7YCSgLPhRDqUx1M8nLCDkDgHw5ywIs/lme5DLrglDCs2wKI+m4WYF5ZL loKpTBuNi2UsduS2J7bIv7hBLhHewqDGU4RS37tVKMEoFOQE3GahCCuWMjF77vHqEiwZ O/XrbNQhqA429drUNi6cLgHSsRKke54SnimL4OD4wn8XVtwkiku1AQAt+5HC4hdHMV82 v6p0aA3t8+BDXwEQ4WPl67NJpwmHzgG6DFn33iWi9Hvyyf7+Eo4lsegF/lzoF6t6cwya aOyoVaFX/xn1kUdmIz9Zml0hxTyXcQl12nE5rH4/7QGIlNNjA5YQ8gVITKQYpOvl1mDd oYBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700441278; x=1701046078; h=cc:to:subject:from:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=e4ZGI1MLewMhh67Dx4+L89F2K5Yx3CkOcoa8Ewo1ToM=; b=LQROH90zwZ9xuVQrPf/iZqpuW8HSrUhk39kPEG04Gr8gPCFe9x6CANylKnuXzJnVYo 7z70vCm9fR0EUpWfwPYRKKUJxdidZjFlisq1tVKfRj6afEpX8WzFuU3RrCyBwuxAEVhN P9pGbau+2qtmVTdrfOYxxNp+ASi4nbRuTIs13nq/nvKdVTk7UEDrBB8c2xydJOBOnDXv cPeskISSgZzd05JZn1sFJDCdJkZIm53fhdHC/vR72DX/QKDz3NKB02LrqfYyNsX7TqEp 9G/LstMO+vXjaCtqOJTU2plwfMTtgwxEZXQIwSzJV/tw6YIBoFODpwr4kAf/uv4H99qP tapQ== X-Gm-Message-State: AOJu0YzLSpObvrUkOPZsoph2LZ8hv5zf0Lfmdh4lThwvv0fRZkprXKYP igbKIoxSr+6SrN2yCCWP43Un4zr46dPb3Mh0CAo= X-Google-Smtp-Source: AGHT+IHUqIuI6Hn0YIynCN+5fiOv6I/TyvfoOjCjxs28rgWw2O+GvmdjMBNbmKdvJWct5qzi7zsakg== X-Received: by 2002:a05:6871:152:b0:1f4:ae6e:a4e1 with SMTP id z18-20020a056871015200b001f4ae6ea4e1mr7746617oab.56.1700441277879; Sun, 19 Nov 2023 16:47:57 -0800 (PST) Received: from [172.31.0.109] ([136.36.130.248]) by smtp.gmail.com with ESMTPSA id v25-20020a0568301bd900b006ce2e1a6cb2sm1024366ota.44.2023.11.19.16.47.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 19 Nov 2023 16:47:57 -0800 (PST) Content-Type: multipart/mixed; boundary="------------8EYK0adBY2ZPuLkJy2Zcn30e" Message-ID: <6d5f8ba7-0c60-4789-87ae-68617ce6ac2c@ventanamicro.com> Date: Sun, 19 Nov 2023 17:47:56 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Jeff Law Subject: [RFA] New pass for sign/zero extension elimination To: "gcc-patches@gcc.gnu.org" Cc: Jivan Hakobyan X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPAM_BODY,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------8EYK0adBY2ZPuLkJy2Zcn30e Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit This is work originally started by Joern @ Embecosm. There's been a long standing sense that we're generating too many sign/zero extensions on the RISC-V port. REE is useful, but it's really focused on a relatively narrow part of the extension problem. What Joern's patch does is introduce a new pass which tracks liveness of chunks of pseudo regs. Specifically it tracks bits 0..7, 8..15, 16..31 and 32..63. If it encounters a sign/zero extend that sets bits that are never read, then it replaces the sign/zero extension with a narrowing subreg. The narrowing subreg usually gets eliminated by subsequent passes (it's just a copy after all). Jivan has done some analysis and found that it eliminates roughly 1% of the dynamic instruction stream for x264 as well as some redundant extensions in the coremark benchmark (both on rv64). In my own testing as I worked through issues on other architectures I clearly saw it helping in various places within GCC itself or in the testsuite. The basic structure is to first do a fairly standard liveness analysis on the chunks, seeding original state with the liveness data from DF. Once that's stable, we do a final pass to identify the useless extensions and transform them into narrowing subregs. A few key points to remember. For destination processing it is always safe to ignore a destination. Ignoring a destination merely means that whatever was live after the given insn will continue to be live before the insn. What is not safe is to clear a bit in the LIVENOW bitmap for a destination chunk that is not set. This comes into play with things like STRICT_LOW_PART. For source processing the safe thing to do is to set all the chunks in a register as live. It is never safe to fail to process a source operand. When a destination object is not fully live, we try to transfer that limited liveness to the source operands. So for example if bits 16..63 are dead in a destination of a PLUS, we need not mark bits 16..63 as live for the source operands. We have to be careful -- consider a shift count on a target without SHIFT_COUNT_TRUNCATED set. So we have both a list of RTL codes where we can transfer liveness and a few codes where one of the operands may need to be fully live (ex, a shift count) while the other input may not need to be fully live (value left shifted). Locally we have had this enabled at -O1 and above to encourage testing, but I'm thinking that for the trunk enabling at -O2 and above is the right thing to do. This has (of course) been tested on rv64. It's also been bootstrapped and regression tested on x86. Bootstrap and regression tested (C only) for m68k, sh4, sh4eb, alpha. Earlier versions were also bootstrapped and regression tested on ppc, hppa and s390x (C only for those as well). It's also been tested on the various crosses in my tester. So we've got reasonable coverage of 16, 32 and 64 bit targets, big and little endian, with and without SHIFT_COUNT_TRUNCATED and all kinds of other oddities. The included tests are for RISC-V only because not all targets are going to have extraneous extensions. There's tests from coremark, x264 and GCC's bz database. It probably wouldn't be hard to add aarch64 testscases. The BZs listed are improved by this patch for aarch64. Given the amount of work Jivan and I have done, I'm not comfortable self-approving at this time. I'd much rather have another set of eyes on the code. Hopefully the code is documented well enough for that to be useful exercise. So, no need to work from Pago Pago for this patch. I may make another attempt at the eswin conditional move work while working virtually in Pago Pago though. Thoughts, comments, recommendations? Jeff --------------8EYK0adBY2ZPuLkJy2Zcn30e Content-Type: text/plain; charset=UTF-8; name="0006-extdce.save" Content-Disposition: attachment; filename="0006-extdce.save" Content-Transfer-Encoding: base64 CVBSIHRhcmdldC85NTY1MAoJUFIgcnRsLW9wdGltaXphdGlvbi85NjAzMQoJUFIgcnRsLW9w dGltaXphdGlvbi8xMDQzODcKCVBSIHJ0bC1vcHRpbWl6YXRpb24vMTExMzg0CgpnY2MvCgkq IE1ha2VmaWxlLmluIChPQkpTKTogQWRkIGV4dC1kY2Uuby4KCSogY29tbW9uLm9wdCAoZXh0 LWRjZSk6IEFkZCBuZXcgb3B0aW9uLgoJKiBkZi1zY2FuLmNjIChkZl9nZXRfZXhpdF9ibG9j a191c2Vfc2V0KTogTm8gbG9uZ2VyIHN0YXRpYy4KCSogZGYuaCAoZGZfZ2V0X2V4aXRfYmxv Y2tfdXNlX3NldCk6IFByb3RvdHlwZS4KCSogZXh0LWRjZS5jYzogTmV3IGZpbGUuCgkqIHBh c3Nlcy5kZWY6IEFkZCBleHQtZGNlIGJlZm9yZSBjb21iaW5lLgoJKiB0cmVlLXBhc3MuaCAo bWFrZV9wYXNzX2V4dF9kY2UpOiBQcm90b3R5cGUuLgoKZ2NjL3Rlc3RzdWl0ZQoJKiBnY2Mu dGFyZ2V0L3Jpc2N2L2NvcmVfYmVuY2hfbGlzdC5jOiBOZXcgdGVzdC4KCSogZ2NjLnRhcmdl dC9yaXNjdi9jb3JlX2luaXRfbWF0cml4LmM6IE5ldyB0ZXN0LgoJKiBnY2MudGFyZ2V0L3Jp c2N2L2NvcmVfbGlzdF9pbml0LmM6IE5ldyB0ZXN0LgoJKiBnY2MudGFyZ2V0L3Jpc2N2L21h dHJpeF9hZGRfY29uc3QuYzogTmV3IHRlc3QuCgkqIGdjYy50YXJnZXQvcmlzY3YvbWVtLWV4 dGVuZC5jOiBOZXcgdGVzdC4KCSogZ2NjLnRhcmdldC9yaXNjdi9wcjExMTM4NC5jOiBOZXcg dGVzdC4KCmRpZmYgLS1naXQgYS9nY2MvTWFrZWZpbGUuaW4gYi9nY2MvTWFrZWZpbGUuaW4K aW5kZXggNzUzZjJmMzY2MTguLmFmNmYxNDE1NTA3IDEwMDY0NAotLS0gYS9nY2MvTWFrZWZp bGUuaW4KKysrIGIvZ2NjL01ha2VmaWxlLmluCkBAIC0xNDUxLDYgKzE0NTEsNyBAQCBPQkpT ID0gXAogCWV4cGxvdy5vIFwKIAlleHBtZWQubyBcCiAJZXhwci5vIFwKKwlleHQtZGNlLm8g XAogCWZpYm9uYWNjaV9oZWFwLm8gXAogCWZpbGUtcHJlZml4LW1hcC5vIFwKIAlmaW5hbC5v IFwKZGlmZiAtLWdpdCBhL2djYy9jb21tb24ub3B0IGIvZ2NjL2NvbW1vbi5vcHQKaW5kZXgg ZDIxZGI1ZDRhMjAuLjE0MWRmZGYxNGZkIDEwMDY0NAotLS0gYS9nY2MvY29tbW9uLm9wdAor KysgYi9nY2MvY29tbW9uLm9wdApAQCAtMzc2Niw0ICszNzY2LDggQEAgZmlwYS1yYQogQ29t bW9uIFZhcihmbGFnX2lwYV9yYSkgT3B0aW1pemF0aW9uCiBVc2UgY2FsbGVyIHNhdmUgcmVn aXN0ZXIgYWNyb3NzIGNhbGxzIGlmIHBvc3NpYmxlLgogCitmZXh0LWRjZQorQ29tbW9uIFZh cihmbGFnX2V4dF9kY2UsIDEpIE9wdGltaXphdGlvbiBJbml0KDApCitQZXJmb3JtIGRlYWQg Y29kZSBlbGltaW5hdGlvbiBvbiB6ZXJvIGFuZCBzaWduIGV4dGVuc2lvbnMgd2l0aCBzcGVj aWFsIGRhdGFmbG93IGFuYWx5c2lzLgorCiA7IFRoaXMgY29tbWVudCBpcyB0byBlbnN1cmUg d2UgcmV0YWluIHRoZSBibGFuayBsaW5lIGFib3ZlLgpkaWZmIC0tZ2l0IGEvZ2NjL2RmLXNj YW4uY2MgYi9nY2MvZGYtc2Nhbi5jYwppbmRleCA5NTE1NzQwNzI4Yy4uODc3MjlhYjBmNDQg MTAwNjQ0Ci0tLSBhL2djYy9kZi1zY2FuLmNjCisrKyBiL2djYy9kZi1zY2FuLmNjCkBAIC03 OCw3ICs3OCw2IEBAIHN0YXRpYyB2b2lkIGRmX2dldF9laF9ibG9ja19hcnRpZmljaWFsX3Vz ZXMgKGJpdG1hcCk7CiAKIHN0YXRpYyB2b2lkIGRmX3JlY29yZF9lbnRyeV9ibG9ja19kZWZz IChiaXRtYXApOwogc3RhdGljIHZvaWQgZGZfcmVjb3JkX2V4aXRfYmxvY2tfdXNlcyAoYml0 bWFwKTsKLXN0YXRpYyB2b2lkIGRmX2dldF9leGl0X2Jsb2NrX3VzZV9zZXQgKGJpdG1hcCk7 CiBzdGF0aWMgdm9pZCBkZl9nZXRfZW50cnlfYmxvY2tfZGVmX3NldCAoYml0bWFwKTsKIHN0 YXRpYyB2b2lkIGRmX2dyb3dfcmVmX2luZm8gKHN0cnVjdCBkZl9yZWZfaW5mbyAqLCB1bnNp Z25lZCBpbnQpOwogc3RhdGljIHZvaWQgZGZfcmVmX2NoYWluX2RlbGV0ZV9kdV9jaGFpbiAo ZGZfcmVmKTsKQEAgLTM2NDIsNyArMzY0MSw3IEBAIGRmX2VwaWxvZ3VlX3VzZXNfcCAodW5z aWduZWQgaW50IHJlZ25vKQogCiAvKiBTZXQgdGhlIGJpdCBmb3IgcmVncyB0aGF0IGFyZSBj b25zaWRlcmVkIGJlaW5nIHVzZWQgYXQgdGhlIGV4aXQuICovCiAKLXN0YXRpYyB2b2lkCit2 b2lkCiBkZl9nZXRfZXhpdF9ibG9ja191c2Vfc2V0IChiaXRtYXAgZXhpdF9ibG9ja191c2Vz KQogewogICB1bnNpZ25lZCBpbnQgaTsKZGlmZiAtLWdpdCBhL2djYy9kZi5oIGIvZ2NjL2Rm LmgKaW5kZXggNDAyNjU3YTcwNzYuLmFiY2JiMDk3NzM0IDEwMDY0NAotLS0gYS9nY2MvZGYu aAorKysgYi9nY2MvZGYuaApAQCAtMTA5MSw2ICsxMDkxLDcgQEAgZXh0ZXJuIGJvb2wgZGZf ZXBpbG9ndWVfdXNlc19wICh1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgZGZfc2V0X3Jl Z3NfZXZlcl9saXZlICh1bnNpZ25lZCBpbnQsIGJvb2wpOwogZXh0ZXJuIHZvaWQgZGZfY29t cHV0ZV9yZWdzX2V2ZXJfbGl2ZSAoYm9vbCk7CiBleHRlcm4gdm9pZCBkZl9zY2FuX3Zlcmlm eSAodm9pZCk7CitleHRlcm4gdm9pZCBkZl9nZXRfZXhpdF9ibG9ja191c2Vfc2V0IChiaXRt YXApOwogCiAMCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2djYy9l eHQtZGNlLmNjIGIvZ2NjL2V4dC1kY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAuLmE2ZmUyNjgzZGNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2V4dC1k Y2UuY2MKQEAgLTAsMCArMSw4ODAgQEAKKy8qIFJUTCBkZWFkIHplcm8vc2lnbiBleHRlbnNp b24gKGNvZGUpIGVsaW1pbmF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMjIgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdD Qy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgor dmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0ND OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCis8aHR0cDovL3d3dy5nbnUu b3JnL2xpY2Vuc2VzLz4uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi c3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZXR5cGVzLmgiCisjaW5jbHVkZSAiYmFja2VuZC5o IgorI2luY2x1ZGUgInJ0bC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJtZW1t b2RlbC5oIgorI2luY2x1ZGUgImluc24tY29uZmlnLmgiCisjaW5jbHVkZSAiZW1pdC1ydGwu aCIKKyNpbmNsdWRlICJyZWNvZy5oIgorI2luY2x1ZGUgImNmZ2FuYWwuaCIKKyNpbmNsdWRl ICJ0cmVlLXBhc3MuaCIKKyNpbmNsdWRlICJjZmdydGwuaCIKKyNpbmNsdWRlICJydGwtaXRl ci5oIgorI2luY2x1ZGUgImRmLmgiCisjaW5jbHVkZSAicHJpbnQtcnRsLmgiCisKKy8qIFdl IGNvbnNpZGVyIGZvdXIgYml0IGdyb3VwcyBmb3IgbGl2ZW5lc3M6CisgICBiaXQgMC4uNyAg IChsZWFzdCBzaWduaWZpY2FudCBieXRlKQorICAgYml0IDguLjE1ICAoc2Vjb25kIGxlYXN0 IHNpZ25pZmljYW50IGJ5dGUpCisgICBiaXQgMTYuLjMxCisgICBiaXQgMzIuLkJJVFNfUEVS X1dPUkQtMSAgKi8KKworLyogTm90ZSB0aGlzIHBhc3MgY291bGQgYmUgdXNlZCB0byBuYXJy b3cgbWVtb3J5IGxvYWRzIHRvby4gIEl0J3MKKyAgIG5vdCBjbGVhciBpZiB0aGF0J3MgcHJv Zml0YWJsZSBvciBub3QgaW4gZ2VuZXJhbC4gICovCisKKyNkZWZpbmUgVU5TUEVDX1AoWCkg KEdFVF9DT0RFIChYKSA9PSBVTlNQRUMgfHwgR0VUX0NPREUgKFgpID09IFVOU1BFQ19WT0xB VElMRSkKKworLyogSWYgd2Uga25vdyB0aGUgZGVzdGluYXRpb24gb2YgQ09ERSBvbmx5IHVz ZXMgc29tZSBsb3cgYml0cworICAgKHNheSBqdXN0IHRoZSBRSSBiaXRzIG9mIGFuIFNJIG9w ZXJhdGlvbiksIHRoZW4gcmV0dXJuIHRydWUKKyAgIGlmIHdlIGNhbiBwcm9wYWdhdGUgdGhl IG5lZWQgZm9yIGp1c3QgdGhlIHN1YnNldCBvZiBiaXRzCisgICBmcm9tIHRoZSBkZXN0aW5h dGlvbiB0byB0aGUgc291cmNlcy4gICovCisKK3N0YXRpYyBib29sCitzYWZlX2Zvcl9saXZl X3Byb3BhZ2F0aW9uIChydHhfY29kZSBjb2RlKQoreworICAvKiBGaXJzdCBoYW5kbGUgcnR4 IGNsYXNzZXMgd2hpY2ggYXMgYSB3aG9sZSBhcmUga25vd24gdG8KKyAgICAgYmUgZWl0aGVy IHNhZmUgb3IgdW5zYWZlLiAgKi8KKyAgc3dpdGNoIChHRVRfUlRYX0NMQVNTIChjb2RlKSkK KyAgICB7CisgICAgICBjYXNlIFJUWF9PQko6CisJcmV0dXJuIHRydWU7CisKKyAgICAgIGNh c2UgUlRYX0NPTVBBUkU6CisgICAgICBjYXNlIFJUWF9DT01NX0NPTVBBUkU6CisgICAgICBj YXNlIFJUWF9URVJOQVJZOgorCXJldHVybiBmYWxzZTsKKworICAgICAgZGVmYXVsdDoKKwli cmVhazsKKyAgICB9CisKKyAgLyogV2hhdCdzIGxlZnQgYXJlIHNwZWNpZmljIGNvZGVzLiAg V2Ugb25seSBuZWVkIHRvIGlkZW50aWZ5IHRob3NlCisgICAgIHdoaWNoIGFyZSBzYWZlLiAg ICovCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgLyogVGhlc2UgYXJlIHRyaXZpYWxs eSBzYWZlLiAgKi8KKyAgICBjYXNlIFNVQlJFRzoKKyAgICBjYXNlIE5PVDoKKyAgICBjYXNl IFpFUk9fRVhURU5EOgorICAgIGNhc2UgU0lHTl9FWFRFTkQ6CisgICAgY2FzZSBUUlVOQ0FU RToKKyAgICBjYXNlIFNTX1RSVU5DQVRFOgorICAgIGNhc2UgVVNfVFJVTkNBVEU6CisgICAg Y2FzZSBQTFVTOgorICAgIGNhc2UgTVVMVDoKKyAgICBjYXNlIFNTX01VTFQ6CisgICAgY2Fz ZSBVU19NVUxUOgorICAgIGNhc2UgU01VTF9ISUdIUEFSVDoKKyAgICBjYXNlIFVNVUxfSElH SFBBUlQ6CisgICAgY2FzZSBBTkQ6CisgICAgY2FzZSBJT1I6CisgICAgY2FzZSBYT1I6Cisg ICAgY2FzZSBTU19QTFVTOgorICAgIGNhc2UgVVNfUExVUzoKKyAgICAgIHJldHVybiB0cnVl OworCisgICAgLyogV2UgY2FuIHByb3BhZ2F0ZSBmb3IgdGhlIHNoaWZ0ZWQgb3BlcmFuZCwg YnV0IG5vdCB0aGUgc2hpZnQKKyAgICAgICBjb3VudC4gIFRoZSBjb3VudCBpcyBoYW5kbGVk IHNwZWNpYWxseS4gICovCisgICAgY2FzZSBTU19BU0hJRlQ6CisgICAgY2FzZSBVU19BU0hJ RlQ6CisgICAgY2FzZSBBU0hJRlQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8qIFRo ZXJlIG1heSBiZSBvdGhlciBzYWZlIGNvZGVzLiAgSWYgc28gdGhleSBjYW4gYmUgYWRkZWQK KyAgICAgICBpbmRpdmlkdWFsbHkgd2hlbiBkaXNjb3ZlcmVkLiAgKi8KKyAgICBkZWZhdWx0 OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLyogQ2xlYXIgYml0cyBpbiBM SVZFTk9XIGFuZCBzZXQgYml0cyBpbiBMSVZFX1RNUCBmb3Igb2JqZWN0cworICAgc2V0L2Ns b2JiZXJlZCBieSBJTlNOLgorCisgICBDb25jZXB0dWFsbHkgaXQgaXMgYWx3YXlzIHNhZmUg dG8gaWdub3JlIGEgcGFydGljdWxhciBkZXN0aW5hdGlvbgorICAgaGVyZSBhcyB0aGF0IHdp bGwgcmVzdWx0IGluIG1vcmUgY2h1bmtzIG9mIGRhdGEgYmVpbmcgY29uc2lkZXJlZAorICAg bGl2ZS4gIFRoYXQncyB3aGF0IGhhcHBlbnMgd2hlbiB3ZSAiY29udGludWUiIHRoZSBtYWlu IGxvb3Agd2hlbgorICAgd2Ugc2VlIHNvbWV0aGluZyB3ZSBkb24ndCBrbm93IGhvdyB0byBo YW5kbGUgc3VjaCBhcyBhIHZlY3RvcgorICAgbW9kZSBkZXN0aW5hdGlvbi4KKworICAgVGhl IG1vcmUgYWNjdXJhdGUgd2UgYXJlIGluIGlkZW50aWZ5aW5nIHdoYXQgb2JqZWN0cyAoYW5k IGNodW5rcworICAgd2l0aGluIGFuIG9iamVjdCkgYXJlIHNldCBieSBJTlNOLCB0aGUgbW9y ZSBhZ2dyZXNzaXZlIHRoZQorICAgb3B0aW16aWF0aW9uIHBoYXNlIGR1cmluZyB1c2UgaGFu ZGxpbmcgd2lsbCBiZS4gICovCisKK3N0YXRpYyB2b2lkCitleHRfZGNlX3Byb2Nlc3Nfc2V0 cyAocnR4IGluc24sIGJpdG1hcCBsaXZlbm93LCBiaXRtYXAgbGl2ZV90bXApCit7CisgIHN1 YnJ0eF9pdGVyYXRvcjo6YXJyYXlfdHlwZSBhcnJheTsKKyAgcnR4IHBhdCA9IFBBVFRFUk4g KGluc24pOworICBGT1JfRUFDSF9TVUJSVFggKGl0ZXIsIGFycmF5LCBwYXQsIE5PTkNPTlNU KQorICAgIHsKKyAgICAgIGNvbnN0X3J0eCB4ID0gKml0ZXI7CisKKyAgICAgIC8qIEFuIEVY UFJfTElTVCAoZnJvbSBjYWxsIGZ1c2FnZSkgZW5kcyBpbiBOVUxMX1JUWC4gICovCisgICAg ICBpZiAoeCA9PSBOVUxMX1JUWCkKKwljb250aW51ZTsKKworICAgICAgaWYgKFVOU1BFQ19Q ICh4KSkKKwljb250aW51ZTsKKworICAgICAgaWYgKEdFVF9DT0RFICh4KSA9PSBTRVQgfHwg R0VUX0NPREUgKHgpID09IENMT0JCRVIpCisJeworCSAgdW5zaWduZWQgYml0ID0gMDsKKwkg IHggPSBTRVRfREVTVCAoeCk7CisKKwkgIC8qIFdlIGRvbid0IHN1cHBvcnQgdmVjdG9yIGRl c3RpbmF0aW9ucyBvciBkZXN0aW5hdGlvbnMKKwkgICAgIHdpZGVyIHRoYW4gREltb2RlLiAg IEl0IGlzIHNhZmUgdG8gY29udGludWUgdGhpcyBsb29wLgorCSAgICAgQXQgd29yc3QsIGl0 IHdpbGwgbGVhdmUgdGhpbmdzIGxpdmUgd2hpY2ggY291bGQgaGF2ZQorCSAgICAgYmVlbiBt YWRlIGRlYWQuICAqLworCSAgaWYgKFZFQ1RPUl9NT0RFX1AgKEdFVF9NT0RFICh4KSkgfHwg R0VUX01PREUgKHgpID4gRV9ESW1vZGUpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBXZSBj b3VsZCBoYXZlIChzdHJpY3RfbG93X3BhcnQgKHN1YnJlZyAuLi4pKS4gIFdlIGNhbiBub3Qg anVzdAorCSAgICAgc3RyaXAgdGhlIFNUUklDVF9MT1dfUEFSVCBhcyB0aGF0IHdvdWxkIHJl c3VsdCBpbiBjbGVhcmluZworCSAgICAgc29tZSBiaXRzIGluIExJVkVOT1cgdGhhdCBhcmUg c3RpbGwgbGl2ZS4gIFNvIHByb2Nlc3MgdGhlCisJICAgICBTVFJJQ1RfTE9XX1BBUlQgc3Bl Y2lhbGx5LiAgKi8KKwkgIGlmIChHRVRfQ09ERSAoeCkgPT0gU1RSSUNUX0xPV19QQVJUKQor CSAgICB7CisJICAgICAgeCA9IFhFWFAgKHgsIDApOworCisJICAgICAgLyogVGhlIG9ubHkg dmFsaWQgb3BlcmFuZCBvZiBhIFNUUklDVF9MT1dfUEFSVCBpcyBhIG5vbgorCQkgcGFyYWRv eGljYWwgU1VCUkVHLiAgKi8KKwkgICAgICBnY2NfYXNzZXJ0IChTVUJSRUdfUCAoeCkKKwkJ CSAgJiYgIXBhcmFkb3hpY2FsX3N1YnJlZ19wICh4KQorCQkJICAmJiBTVUJSRUdfQllURSAo eCkuaXNfY29uc3RhbnQgKCkpOworCisJICAgICAgLyogSSB0aGluayB3ZSBzaG91bGQgYWx3 YXlzIHNlZSBhIFJFRyBoZXJlLiAgQnV0IGxldCdzCisJCSBiZSBzdXJlLiAgKi8KKwkgICAg ICBnY2NfYXNzZXJ0IChSRUdfUCAoU1VCUkVHX1JFRyAoeCkpKTsKKworCSAgICAgIC8qIFdl IGRvbid0IHRyYWNrIHZhbHVlcyBsYXJnZXIgdGhhbiBESW1vZGUuICAqLworCSAgICAgIGdj Y19hc3NlcnQgKEdFVF9NT0RFICh4KSA8PSBFX0RJbW9kZSk7CisKKwkgICAgICAvKiBCdXQg dGhlIGlubmVyIG1vZGUgbWlnaHQgYmUgbGFyZ2VyLCBqdXN0IHB1bnQgZm9yCisJCSB0aGF0 IGNhc2UuICBSZW1lbWJlciwgd2UgY2FuIG5vdCBqdXN0IGNvbnRpbnVlIHRvIHByb2Nlc3MK KwkJIHRoZSBpbm5lciBSVFhzIGR1ZSB0byB0aGUgU1RSSUNUX0xPV19QQVJULiAgKi8KKwkg ICAgICBpZiAoR0VUX01PREUgKFNVQlJFR19SRUcgKHgpKSA+IEVfREltb2RlKQorCQl7CisJ CSAgLyogU2tpcCB0aGUgc3VicnR4cyBvZiB0aGUgU1RSSUNUX0xPV19QQVJULiAgV2UgY2Fu J3QKKwkJICAgICBwcm9jZXNzIHRoZW0gYmVjYXVzZSBpdCdsbCBzZXQgb2JqZWN0cyBhcyBu byBsb25nZXIKKwkJICAgICBsaXZlIHdoZW4gdGhleSBhcmUgaW4gZmFjdCBzdGlsbCBsaXZl LiAgKi8KKwkJICBpdGVyLnNraXBfc3VicnR4ZXMgKCk7CisJCSAgY29udGludWU7CisJCX0K KworCSAgICAgIC8qIFRyYW5zZmVyIGFsbCB0aGUgTElWRU5PVyBiaXRzIGZvciBYIGludG8g TElWRV9UTVAuICAqLworCSAgICAgIEhPU1RfV0lERV9JTlQgcm4gPSBSRUdOTyAoU1VCUkVH X1JFRyAoeCkpOworCSAgICAgIGZvciAoSE9TVF9XSURFX0lOVCBpID0gNCAqIHJuOyBpIDwg NCAqIHJuICsgNDsgaSsrKQorCQlpZiAoYml0bWFwX2JpdF9wIChsaXZlbm93LCBpKSkKKwkJ ICBiaXRtYXBfc2V0X2JpdCAobGl2ZV90bXAsIGkpOworCisJICAgICAgLyogVGhlIG1vZGUg b2YgdGhlIFNVQlJFRyB0ZWxscyB1cyBob3cgbWFueSBiaXRzIHdlIGNhbgorCQkgY2xlYXIu ICAqLworCSAgICAgIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKHgpOworCSAgICAg IEhPU1RfV0lERV9JTlQgc2l6ZSA9IEdFVF9NT0RFX1NJWkUgKG1vZGUpLnRvX2NvbnN0YW50 ICgpOworCSAgICAgIGJpdG1hcF9jbGVhcl9yYW5nZSAobGl2ZW5vdywgNCAqIHJuLCBzaXpl KTsKKworCSAgICAgIC8qIFdlIGhhdmUgZnVsbHkgcHJvY2Vzc2VkIHRoaXMgZGVzdGluYXRp b24uICAqLworCSAgICAgIGl0ZXIuc2tpcF9zdWJydHhlcyAoKTsKKwkgICAgICBjb250aW51 ZTsKKwkgICAgfQorCisJICAvKiBXZSBjYW4gc2FmZWx5IHN0cmlwIGEgcGFyYWRveGljYWwg c3VicmVnLiAgVGhlIGlubmVyIG1vZGUgd2lsbAorCSAgICAgYmUgbmFycm93ZXIgdGhhbiB0 aGUgb3V0ZXIgbW9kZS4gIFdlJ2xsIGNsZWFyIGZld2VyIGJpdHMgaW4KKwkgICAgIExJVkVO T1cgdGhhbiB3ZSdkIGxpa2UsIGJ1dCB0aGF0J3MgYWx3YXlzIHNhZmUuICAqLworCSAgaWYg KHBhcmFkb3hpY2FsX3N1YnJlZ19wICh4KSkKKwkgICAgeCA9IFhFWFAgKHgsIDApOworCisJ ICAvKiBJZiB3ZSBoYXZlIGEgU1VCUkVHIHRoYXQgaXMgdG9vIHdpZGUsIGp1c3QgY29udGlu dWUgdGhlIGxvb3AKKwkgICAgIGFuZCBsZXQgdGhlIGl0ZXJhdG9yIGdvIGRvd24gaW50byBT VUJSRUdfUkVHLiAgKi8KKwkgIGlmIChTVUJSRUdfUCAoeCkgJiYgR0VUX01PREUgKFNVQlJF R19SRUcgKHgpKSA+IEVfREltb2RlKQorCSAgICBjb250aW51ZTsKKworCSAgLyogUGhhc2Ug b25lIG9mIGRlc3RpbmF0aW9uIGhhbmRsaW5nLiAgRmlyc3QgcmVtb3ZlIGFueSB3cmFwcGVy CisJICAgICBzdWNoIGFzIFNVQlJFRyBvciBaRVJPX0VYVFJBQ1QuICAqLworCSAgdW5zaWdu ZWQgSE9TVF9XSURFX0lOVCBtYXNrID0gR0VUX01PREVfTUFTSyAoR0VUX01PREUgKHgpKTsK KwkgIGlmIChTVUJSRUdfUCAoeCkKKwkgICAgICAmJiAhcGFyYWRveGljYWxfc3VicmVnX3Ag KHgpCisJICAgICAgJiYgU1VCUkVHX0JZVEUgKHgpLmlzX2NvbnN0YW50ICgpKQorCSAgICB7 CisJICAgICAgYml0ID0gU1VCUkVHX0JZVEUgKHgpLnRvX2NvbnN0YW50ICgpICogQklUU19Q RVJfVU5JVDsKKwkgICAgICBpZiAoV09SRFNfQklHX0VORElBTikKKwkJYml0ID0gKEdFVF9N T0RFX0JJVFNJWkUgKEdFVF9NT0RFIChTVUJSRUdfUkVHICh4KSkpLnRvX2NvbnN0YW50ICgp CisJCSAgICAgICAtIEdFVF9NT0RFX0JJVFNJWkUgKEdFVF9NT0RFICh4KSkudG9fY29uc3Rh bnQgKCkgLSBiaXQpOworCisJICAgICAgLyogQ2F0Y2ggYmlnIGVuZGlhbiBjb3JyZWN0bmVz cyBpc3N1ZXMgcmF0aGVyIHRoYW4gdHJpZ2dlcmluZworCQkgdW5kZWZpbmVkIGJlaGF2aW9y LiAgKi8KKwkgICAgICBnY2NfYXNzZXJ0IChiaXQgPCBzaXplb2YgKEhPU1RfV0lERV9JTlQp ICogOCk7CisKKwkgICAgICBtYXNrID0gR0VUX01PREVfTUFTSyAoR0VUX01PREUgKFNVQlJF R19SRUcgKHgpKSkgPDwgYml0OworCSAgICAgIGlmICghbWFzaykKKwkJbWFzayA9IC0weDEw MDAwMDAwMFVMTDsKKwkgICAgICB4ID0gU1VCUkVHX1JFRyAoeCk7CisJICAgIH0KKworCSAg aWYgKEdFVF9DT0RFICh4KSA9PSBaRVJPX0VYVFJBQ1QpCisJICAgIHsKKwkgICAgICAvKiBJ ZiBlaXRoZXIgdGhlIHNpemUgb3IgdGhlIHN0YXJ0IHBvc2l0aW9uIGlzIHVua25vd24sCisJ CSB0aGVuIGFzc3VtZSB3ZSBrbm93IG5vdGhpbmcgYWJvdXQgd2hhdCBpcyBvdmVyd3JpdHRl bi4KKwkJIFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZSwgYnV0IHNhZmUuICAqLworCSAg ICAgIGlmICghQ09OU1RfSU5UX1AgKFhFWFAgKHgsIDEpKSB8fCAhQ09OU1RfSU5UX1AgKFhF WFAgKHgsIDIpKSkKKwkJY29udGludWU7CisJICAgICAgbWFzayA9ICgxVUxMIDw8IElOVFZB TCAoWEVYUCAoeCwgMSkpKSAtIDE7CisJICAgICAgYml0ID0gSU5UVkFMIChYRVhQICh4LCAy KSk7CisJICAgICAgaWYgKEJJVFNfQklHX0VORElBTikKKwkJYml0ID0gKEdFVF9NT0RFX0JJ VFNJWkUgKEdFVF9NT0RFICh4KSkKKwkJICAgICAgIC0gSU5UVkFMIChYRVhQICh4LCAxKSkg LSBiaXQpLnRvX2NvbnN0YW50ICgpOworCSAgICAgIHggPSBYRVhQICh4LCAwKTsKKworCSAg ICAgIC8qIFdlIGNhbiBjZXJ0YWlubHkgZ2V0ICh6ZXJvX2V4dHJhY3QgKHN1YnJlZyAuLi4p KS4gIFRoZQorCQkgbW9kZSBvZiB0aGUgemVyb19leHRyYWN0IGFuZCBsb2NhdGlvbiBzaG91 bGQgYmUgc3VmZmljaWVudAorCQkgYW5kIHdlIGNhbiBqdXN0IHN0cmlwIHRoZSBTVUJSRUcu ICAqLworCSAgICAgIGlmIChHRVRfQ09ERSAoeCkgPT0gU1VCUkVHKQorCQl4ID0gU1VCUkVH X1JFRyAoeCk7CisJICAgIH0KKworCSAgLyogQklUID49IDY0IGluZGljYXRlcyBzb21ldGhp bmcgd2VudCBob3JyaWJseSB3cm9uZy4gICovCisJICBnY2NfYXNzZXJ0IChiaXQgPD0gNjMp OworCisJICAvKiBOb3cgaGFuZGxlIHRoZSBhY3R1YWwgb2JqZWN0IHRoYXQgd2FzIGNoYW5n ZWQuICAqLworCSAgaWYgKFJFR19QICh4KSkKKwkgICAgeworCSAgICAgIC8qIFRyYW5zZmVy IHRoZSBhcHByb3ByaWF0ZSBiaXRzIGZyb20gTElWRU5PVyBpbnRvCisJCSBMSVZFX1RNUC4g ICovCisJICAgICAgSE9TVF9XSURFX0lOVCBybiA9IFJFR05PICh4KTsKKwkgICAgICBmb3Ig KEhPU1RfV0lERV9JTlQgaSA9IDQgKiBybjsgaSA8IDQgKiBybiArIDQ7IGkrKykKKwkJaWYg KGJpdG1hcF9iaXRfcCAobGl2ZW5vdywgaSkpCisJCSAgYml0bWFwX3NldF9iaXQgKGxpdmVf dG1wLCBpKTsKKworCSAgICAgIC8qIE5vdyBjbGVhciB0aGUgYml0cyBrbm93biB3cml0dGVu IGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uCisJCSBOb3RlIHRoYXQgQklUIG5lZWQgbm90IGJlIGEg cG93ZXIgb2YgdHdvLCBjb25zaWRlciBhCisJCSBaRVJPX0VYVFJBQ1QgZGVzdGluYXRpb24u ICAqLworCSAgICAgIGludCBzdGFydCA9IChiaXQgPCA4ID8gMCA6IGJpdCA8IDE2ID8gMSA6 IGJpdCA8IDMyID8gMiA6IDMpOworCSAgICAgIGludCBlbmQgPSAoKG1hc2sgJiB+MHhmZmZm ZmZmZlVMTCkgPyA0CisJCQkgOiAobWFzayAmIDB4ZmZmZjAwMDBVTEwpID8gMworCQkJIDog KG1hc2sgJiAweGZmMDApID8gMiA6IDEpOworCSAgICAgIGJpdG1hcF9jbGVhcl9yYW5nZSAo bGl2ZW5vdywgNCAqIHJuICsgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKwkgICAgfQorCSAgLyog U29tZSBwb3J0cyBnZW5lcmF0ZSAoY2xvYmJlciAoY29uc3RfaW50KSkuICAqLworCSAgZWxz ZSBpZiAoQ09OU1RfSU5UX1AgKHgpKQorCSAgICBjb250aW51ZTsKKwkgIGVsc2UKKwkgICAg Z2NjX2Fzc2VydCAoQ0FMTF9QIChpbnNuKQorCQkJfHwgTUVNX1AgKHgpCisJCQl8fCB4ID09 IHBjX3J0eAorCQkJfHwgR0VUX0NPREUgKHgpID09IFNDUkFUQ0gpOworCisJICBpdGVyLnNr aXBfc3VicnR4ZXMgKCk7CisJfQorICAgICAgZWxzZSBpZiAoR0VUX0NPREUgKHgpID09IENP TkRfRVhFQykKKwl7CisJICAvKiBUaGlzIGlzbid0IGlkZWFsLCBidXQgbWF5IG5vdCBiZSBz byBiYWQgaW4gcHJhY3RpY2UuICAqLworCSAgaXRlci5za2lwX3N1YnJ0eGVzICgpOworCX0K KyAgICB9Cit9CisKKy8qIElOU04gaGFzIGEgc2lnbi96ZXJvIGV4dGVuZGVkIHNvdXJjZSBp bnNpZGUgU0VUIHRoYXQgd2Ugd2lsbAorICAgdHJ5IHRvIHR1cm4gaW50byBhIFNVQlJFRy4g ICovCitzdGF0aWMgdm9pZAorZXh0X2RjZV90cnlfb3B0aW1pemVfaW5zbiAocnR4X2luc24g Kmluc24sIHJ0eCBzZXQsIGJpdG1hcCBjaGFuZ2VkX3BzZXVkb3MpCit7CisgIHJ0eCBzcmMg PSBTRVRfU1JDIChzZXQpOworICBydHggaW5uZXIgPSBYRVhQIChzcmMsIDApOworCisgIC8q IEF2b2lkIChzdWJyZWcgKG1lbSkpIGFuZCBvdGhlciBjb25zdHJ1Y3RzIHdoaWNoIG1heSBh cmUgdmFsaWQgUlRMLCBidXQKKyAgICAgbm90IHVzZWZ1bCBmb3IgdGhpcyBvcHRpbWl6YXRp b24uICAqLworICBpZiAoIVJFR19QIChpbm5lcikgJiYgIVNVQlJFR19QIChpbm5lcikpCisg ICAgcmV0dXJuOworCisgIHJ0eCBuZXdfcGF0dGVybjsKKyAgaWYgKGR1bXBfZmlsZSkKKyAg ICB7CisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJQcm9jZXNzaW5nIGluc246XG4iKTsK KyAgICAgIGR1bXBfaW5zbl9zbGltIChkdW1wX2ZpbGUsIGluc24pOworICAgICAgZnByaW50 ZiAoZHVtcF9maWxlLCAiVHJ5aW5nIHRvIHNpbXBsaWZ5IHBhdHRlcm46XG4iKTsKKyAgICAg IHByaW50X3J0bF9zaW5nbGUgKGR1bXBfZmlsZSwgU0VUX1NSQyAoc2V0KSk7CisgICAgfQor CisgIG5ld19wYXR0ZXJuID0gc2ltcGxpZnlfZ2VuX3N1YnJlZyAoR0VUX01PREUgKHNyYyks IGlubmVyLAorCQkJCSAgICAgR0VUX01PREUgKGlubmVyKSwgMCk7CisgIC8qIHNpbXBsaWZ5 X2dlbl9zdWJyZWcgbWF5IGZhaWwgaW4gd2hpY2ggY2FzZSBORVdfUEFUVEVSTiB3aWxsIGJl IE5VTEwuCisgICAgIFdlIG11c3Qgbm90IHBhc3MgdGhhdCBhcyBhIHJlcGxhY2VtZW50IHBh dHRlcm4gdG8gdmFsaWRhdGVfY2hhbmdlLiAgKi8KKyAgaWYgKG5ld19wYXR0ZXJuKQorICAg IHsKKyAgICAgIGludCBvayA9IHZhbGlkYXRlX2NoYW5nZSAoaW5zbiwgJlNFVF9TUkMgKHNl dCksIG5ld19wYXR0ZXJuLCBmYWxzZSk7CisKKyAgICAgIGlmIChvaykKKwliaXRtYXBfc2V0 X2JpdCAoY2hhbmdlZF9wc2V1ZG9zLCBSRUdOTyAoU0VUX0RFU1QgKHNldCkpKTsKKworICAg ICAgaWYgKGR1bXBfZmlsZSkKKwl7CisJICBpZiAob2spCisJICAgIGZwcmludGYgKGR1bXBf ZmlsZSwgIlN1Y2Nlc3NmdWxseSB0cmFuc2Zvcm1lZCB0bzpcbiIpOworCSAgZWxzZQorCSAg ICBmcHJpbnRmIChkdW1wX2ZpbGUsICJGYWlsZWQgdHJhbnNmb3JtYXRpb24gdG86XG4iKTsK KworCSAgcHJpbnRfcnRsX3NpbmdsZSAoZHVtcF9maWxlLCBuZXdfcGF0dGVybik7CisJICBm cHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7Cisg ICAgICBpZiAoZHVtcF9maWxlKQorCWZwcmludGYgKGR1bXBfZmlsZSwgIlVuYWJsZSB0byBn ZW5lcmF0ZSB2YWxpZCBTVUJSRUcgZXhwcmVzc2lvbi5cbiIpOworICAgIH0KK30KKworLyog U29tZSBvcGVyYXRvcnMgaW1wbHkgdGhhdCB0aGVpciBzZWNvbmQgb3BlcmFuZCBpcyBmdWxs eSBsaXZlLAorICAgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBiaXRzIGluIHRoZSBvdXRwdXQg YXJlIGxpdmUuICBBbiBleGFtcGxlCisgICB3b3VsZCBiZSB0aGUgc2hpZnQgY291bnQgb24g YSB0YXJnZXQgd2l0aG91dCBTSElGVF9DT1VOVF9UUlVDQVRFRAorICAgZGVmaW5lZC4KKwor ICAgUmV0dXJuIFRSVUUgaWYgQ09ERSBpcyBzdWNoIGFuIG9wZXJhdG9yLiAgRkFMU0Ugb3Ro ZXJ3aXNlLiAgKi8KKworc3RhdGljIGJvb2wKK2Jpbm9wX2ltcGxpZXNfb3AyX2Z1bGx5X2xp dmUgKHJ0eF9jb2RlIGNvZGUpCit7CisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICBj YXNlIEFTSElGVDoKKyAgICAgIGNhc2UgTFNISUZUUlQ6CisgICAgICBjYXNlIEFTSElGVFJU OgorICAgICAgY2FzZSBST1RBVEU6CisgICAgICBjYXNlIFJPVEFURVJUOgorCXJldHVybiAh U0hJRlRfQ09VTlRfVFJVTkNBVEVEOworCisgICAgICBkZWZhdWx0OgorCXJldHVybiBmYWxz ZTsKKyAgICB9Cit9CisKKy8qIFByb2Nlc3MgdXNlcyBpbiBJTlNOLiAgU2V0IGFwcHJvcHJp YXRlIGJpdHMgaW4gTElWRU5PVyBmb3IgYW55IGNodW5rcyBvZgorICAgcHNldWRvcyB0aGF0 IGJlY29tZSBsaXZlLCBwb3RlbnRpYWxseSBmaWx0ZXJpbmcgdXNpbmcgYml0cyBmcm9tIExJ VkVfVE1QLgorCisgICBJZiBNT0RJRklFRCBpcyB0cnVlLCB0aGVuIG9wdGltaXplIHNpZ24v emVybyBleHRlbnNpb25zIHRvIFNVQlJFR3Mgd2hlbgorICAgdGhlIGV4dGVuZGVkIGJpdHMg YXJlIG5ldmVyIHJlYWQgYW5kIG1hcmsgcHNldWRvcyB3aGljaCBoYWQgZXh0ZW5zaW9ucwor ICAgZWxpbWluYXRlZCBpbiBDSEFOR0VEX1BTRVVET1MuICAqLworCitzdGF0aWMgdm9pZAor ZXh0X2RjZV9wcm9jZXNzX3VzZXMgKHJ0eCBpbnNuLCBiaXRtYXAgbGl2ZW5vdywgYml0bWFw IGxpdmVfdG1wLAorCQkgICAgICBib29sIG1vZGlmeSwgYml0bWFwIGNoYW5nZWRfcHNldWRv cykKK3sKKyAgLyogQSBub25sb2NhbCBnb3RvIGltcGxpY2l0bHkgdXNlcyB0aGUgZnJhbWUg cG9pbnRlci4gICovCisgIGlmIChKVU1QX1AgKGluc24pICYmIGZpbmRfcmVnX25vdGUgKGlu c24sIFJFR19OT05fTE9DQUxfR09UTywgTlVMTF9SVFgpKQorICAgIHsKKyAgICAgIGJpdG1h cF9zZXRfcmFuZ2UgKGxpdmVub3csIEZSQU1FX1BPSU5URVJfUkVHTlVNICogNCwgNCk7Cisg ICAgICBpZiAoIUhBUkRfRlJBTUVfUE9JTlRFUl9JU19GUkFNRV9QT0lOVEVSKQorCWJpdG1h cF9zZXRfcmFuZ2UgKGxpdmVub3csIEhBUkRfRlJBTUVfUE9JTlRFUl9SRUdOVU0gKiA0LCA0 KTsKKyAgICB9CisKKyAgc3VicnR4X3Zhcl9pdGVyYXRvcjo6YXJyYXlfdHlwZSBhcnJheV92 YXI7CisgIHJ0eCBwYXQgPSBQQVRURVJOIChpbnNuKTsKKyAgRk9SX0VBQ0hfU1VCUlRYX1ZB UiAoaXRlciwgYXJyYXlfdmFyLCBwYXQsIE5PTkNPTlNUKQorICAgIHsKKyAgICAgIC8qIEFu IEVYUFJfTElTVCAoZnJvbSBjYWxsIGZ1c2FnZSkgZW5kcyBpbiBOVUxMX1JUWC4gICovCisg ICAgICBydHggeCA9ICppdGVyOworICAgICAgaWYgKHggPT0gTlVMTF9SVFgpCisJY29udGlu dWU7CisKKyAgICAgIC8qIFNvIHRoZSBiYXNpYyBpZGVhIGluIHRoaXMgRk9SX0VBQ0hfU1VC UlRYX1ZBUiBsb29wIGlzIHRvCisJIGhhbmRsZSBTRVRzIGV4cGxpY2l0bHksIHBvc3NpYmx5 IHByb3BhZ2F0aW5nIGxpdmUgaW5mb3JtYXRpb24KKwkgaW50byB0aGUgdXNlcy4KKworCSBX ZSBtYXkgY29udGludWUgdGhlIGxvb3AgYXQgdmFyaW91cyBwb2ludHMgd2hpY2ggd2lsbCBj YXVzZQorCSBpdGVyYXRpb24gaW50byB0aGUgbmV4dCBsZXZlbCBvZiBSVEwuICBCcmVha2lu ZyBmcm9tIHRoZSBsb29wCisJIGlzIG5ldmVyIHNhZmUgYXMgaXQgY2FuIGxlYWQgdXMgdG8g ZmFpbCB0byBwcm9jZXNzIHNvbWUgb2YgdGhlCisJIFJUTCBhbmQgdGh1cyBub3QgbWFrZSBv YmplY3RzIGxpdmUgd2hlbiBuZWNlc3NhcnkuICAqLworICAgICAgZW51bSBydHhfY29kZSB4 Y29kZSA9IEdFVF9DT0RFICh4KTsKKyAgICAgIGlmICh4Y29kZSA9PSBTRVQpCisJeworCSAg Y29uc3RfcnR4IGRzdCA9IFNFVF9ERVNUICh4KTsKKwkgIHJ0eCBzcmMgPSBTRVRfU1JDICh4 KTsKKwkgIGNvbnN0X3J0eCB5OworCSAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBiaXQgPSAw OworCisJICAvKiBUaGUgY29kZSBvZiB0aGUgUkhTIG9mIGEgU0VULiAgKi8KKwkgIGVudW0g cnR4X2NvZGUgY29kZSA9IEdFVF9DT0RFIChzcmMpOworCisJICAvKiA/IT8gSG93IG11Y2gg b2YgdGhpcyBzaG91bGQgbWlycm9yIFNFVCBoYW5kbGluZywgcG90ZW50aWFsbHkKKwkgICAg IGJlaW5nIHNoYXJlZD8gICAqLworCSAgaWYgKFNVQlJFR19CWVRFIChkc3QpLmlzX2NvbnN0 YW50ICgpICYmIFNVQlJFR19QIChkc3QpKQorCSAgICB7CisJICAgICAgYml0ID0gU1VCUkVH X0JZVEUgKGRzdCkudG9fY29uc3RhbnQgKCkgKiBCSVRTX1BFUl9VTklUOworCSAgICAgIGlm IChXT1JEU19CSUdfRU5ESUFOKQorCQliaXQgPSAoR0VUX01PREVfQklUU0laRSAoR0VUX01P REUgKFNVQlJFR19SRUcgKGRzdCkpKS50b19jb25zdGFudCAoKQorCQkgICAgICAgLSBHRVRf TU9ERV9CSVRTSVpFIChHRVRfTU9ERSAoZHN0KSkudG9fY29uc3RhbnQgKCkgLSBiaXQpOwor CSAgICAgIGlmIChiaXQgPj0gSE9TVF9CSVRTX1BFUl9XSURFX0lOVCkKKwkJYml0ID0gSE9T VF9CSVRTX1BFUl9XSURFX0lOVCAtIDE7CisJICAgICAgZHN0ID0gU1VCUkVHX1JFRyAoZHN0 KTsKKwkgICAgfQorCSAgZWxzZSBpZiAoR0VUX0NPREUgKGRzdCkgPT0gWkVST19FWFRSQUNU CisJCSAgIHx8IEdFVF9DT0RFIChkc3QpID09IFNUUklDVF9MT1dfUEFSVCkKKwkgICAgZHN0 ID0gWEVYUCAoZHN0LCAwKTsKKworCSAgLyogTWFpbiBwcm9jZXNzaW5nIG9mIHRoZSB1c2Vz LiAgVHdvIG1ham9yIGdvYWxzIGhlcmUuCisKKwkgICAgIEZpcnN0LCB3ZSB3YW50IHRvIHRy eSBhbmQgcHJvcGFnYXRlIGxpdmVuZXNzIChvciB0aGUgbGFjaworCSAgICAgdGhlcmVvZikg ZnJvbSB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgdG8gdGhlIHNvdXJjZQorCSAgICAgcmVn aXN0ZXIocykuCisKKwkgICAgIFNlY29uZCwgaWYgdGhlIHNvdXJjZSBpcyBhbiBleHRlbnNp b24sIHRyeSB0byBvcHRpbWl6ZQorCSAgICAgaXQgaW50byBhIFNVQlJFRy4gIFRoZSBTVUJS RUcgZm9ybSBpbmRpY2F0ZXMgd2UgZG9uJ3QKKwkgICAgIGNhcmUgYWJvdXQgdGhlIHVwcGVy IGJpdHMgYW5kIHdpbGwgdXN1YWxseSBiZSBjb3B5CisJICAgICBwcm9wYWdhdGVkIGF3YXku CisKKwkgICAgIElmIHdlIGZhaWwgdG8gaGFuZGxlIHNvbWV0aGluZyBpbiBoZXJlLCB0aGUg ZXhwZWN0YXRpb24KKwkgICAgIGlzIHRoZSBpdGVyYXRvciB3aWxsIGRpdmUgaW50byB0aGUg c3ViLWNvbXBvbmVudHMgYW5kCisJICAgICBtYXJrIGFsbCB0aGUgY2h1bmtzIGluIGFueSBm b3VuZCBSRUdzIGFzIGxpdmUuICAqLworCSAgaWYgKFJFR19QIChkc3QpICYmIHNhZmVfZm9y X2xpdmVfcHJvcGFnYXRpb24gKGNvZGUpKQorCSAgICB7CisJICAgICAgLyogQ3JlYXRlIGEg bWFzayByZXByZXNlbnRpbmcgdGhlIGJpdHMgb2YgdGhpcyBvdXRwdXQKKwkJIG9wZXJhbmQg dGhhdCBhcmUgbGl2ZSBhZnRlciB0aGlzIGluc24uICBXZSBjYW4gdXNlCisJCSB0aGlzIGlu Zm9ybWF0aW9uIHRvIHJlZmluZSB0aGUgbGl2ZSBpbiBzdGF0ZSBvZgorCQkgaW5wdXRzIHRv IHRoaXMgaW5zbiBpbiBtYW55IGNhc2VzLgorCisJCSBXZSBoYXZlIHRvIGRvIHRoaXMgb24g YSBwZXIgU0VUIGJhc2lzLCB3ZSBtaWdodCBoYXZlCisJCSBhbiBJTlNOIHdpdGggbXVsdGlw bGUgU0VUUywgc29tZSBvZiB3aGljaCBjYW4gbmFycm93CisJCSB0aGUgc291cmNlIG9wZXJh bmQgbGl2ZW5lc3MsIHNvbWUgb2Ygd2hpY2ggbWF5IG5vdC4gICovCisJICAgICAgdW5zaWdu ZWQgSE9TVF9XSURFX0lOVCBkc3RfbWFzayA9IDA7CisJICAgICAgSE9TVF9XSURFX0lOVCBy biA9IFJFR05PIChkc3QpOworCSAgICAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbWFza19h cnJheVtdCisJCT0geyAweGZmLCAweGZmMDAsIDB4ZmZmZjAwMDBVTEwsIC0weDEwMDAwMDAw MFVMTCB9OworCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQorCQlpZiAoYml0 bWFwX2JpdF9wIChsaXZlX3RtcCwgNCAqIHJuICsgaSkpCisJCSAgZHN0X21hc2sgfD0gbWFz a19hcnJheVtpXTsKKwkgICAgICBkc3RfbWFzayA+Pj0gYml0OworCisJICAgICAgLyogPz8/ IENvdWxkIGFsc28gaGFuZGxlIFpFUk9fRVhUUkFDVCAvIFNJR05fRVhUUkFDVAorCQkgb2Yg dGhlIHNvdXJjZSBzcGVjaWFsbHkgdG8gaW1wcm92ZSBvcHRpbWl6YXRpb24uICAqLworCSAg ICAgIGlmIChjb2RlID09IFNJR05fRVhURU5EIHx8IGNvZGUgPT0gWkVST19FWFRFTkQpCisJ CXsKKwkJICBydHggaW5uZXIgPSBYRVhQIChzcmMsIDApOworCQkgIHVuc2lnbmVkIEhPU1Rf V0lERV9JTlQgc3JjX21hc2sKKwkJICAgID0gR0VUX01PREVfTUFTSyAoR0VUX01PREUgKGlu bmVyKSk7CisKKwkJICAvKiBEU1RfTUFTSyBjb3VsZCBiZSB6ZXJvIGlmIHdlIGhhZCBzb21l dGhpbmcgaW4gdGhlIFNFVAorCQkgICAgIHRoYXQgd2UgY291bGRuJ3QgaGFuZGxlLiAgKi8K KwkJICBpZiAobW9kaWZ5ICYmIGRzdF9tYXNrICYmIChkc3RfbWFzayAmIH5zcmNfbWFzaykg PT0gMCkKKwkJICAgIGV4dF9kY2VfdHJ5X29wdGltaXplX2luc24gKGFzX2EgPHJ0eF9pbnNu ICo+IChpbnNuKSwKKwkJCQkJICAgICAgIHgsIGNoYW5nZWRfcHNldWRvcyk7CisKKwkJICBk c3RfbWFzayAmPSBzcmNfbWFzazsKKwkJICBzcmMgPSBYRVhQIChzcmMsIDApOworCQkgIGNv ZGUgPSBHRVRfQ09ERSAoc3JjKTsKKwkJfQorCisJICAgICAgLyogT3B0aW1pemF0aW9uIGlz IGRvbmUgYXQgdGhpcyBwb2ludC4gIFdlIGp1c3Qgd2FudCB0byBtYWtlCisJCSBzdXJlIGV2 ZXJ5dGhpbmcgdGhhdCBzaG91bGQgZ2V0IG1hcmtlZCBhcyBsaXZlIGlzIG1hcmtlZAorCQkg ZnJvbSBoZXJlIG9ud2FyZC4gICovCisKKwkgICAgICAvKiA/IT8gV2hhdCBpcyB0aGUgcG9p bnQgb2YgdGhpcyBhZGp1c3RtZW50IHRvIERTVF9NQVNLPyAgKi8KKwkgICAgICBpZiAoY29k ZSA9PSBQTFVTIHx8IGNvZGUgPT0gTUlOVVMKKwkJICB8fCBjb2RlID09IE1VTFQgfHwgY29k ZSA9PSBBU0hJRlQpCisJCWRzdF9tYXNrCisJCSAgPSBkc3RfbWFzayA/ICgoMlVMTCA8PCBm bG9vcl9sb2cyIChkc3RfbWFzaykpIC0gMSkgOiAwOworCisJICAgICAgLyogV2Ugd2lsbCBo YW5kbGUgdGhlIG90aGVyIG9wZXJhbmQgb2YgYSBiaW5hcnkgb3BlcmF0b3IKKwkJIGF0IHRo ZSBib3R0b20gb2YgdGhlIGxvb3AgYnkgcmVzZXR0aW5nIFkuICAqLworCSAgICAgIGlmIChC SU5BUllfUCAoc3JjKSkKKwkJeSA9IFhFWFAgKHNyYywgMCk7CisJICAgICAgZWxzZQorCQl5 ID0gc3JjOworCisJICAgICAgLyogV2UncmUgaW5zaWRlIGEgU0VUIGFuZCB3YW50IHRvIHBy b2Nlc3MgdGhlIHNvdXJjZSBvcGVyYW5kcworCQkgbWFraW5nIHRoaW5ncyBsaXZlLiAgQnJl YWtpbmcgZnJvbSB0aGlzIGxvb3Agd2lsbCBjYXVzZQorCQkgdGhlIGl0ZXJhdG9yIHRvIHdv cmsgb24gc3ViLXJ0eHMsIHNvIGl0IGlzIHNhZmUgdG8gYnJlYWsKKwkJIGlmIHdlIHNlZSBz b21ldGhpbmcgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAgKi8KKwkgICAgICBmb3Ig KDs7KQorCQl7CisJCSAgLyogU3RyaXAgYW4gb3V0ZXIgU1RSSUNUX0xPV19QQVJUIG9yIHBh cmFkb3hpY2FsIHN1YnJlZy4KKwkJICAgICBUaGF0IGhhcyB0aGUgZWZmZWN0IG9mIG1ha2lu ZyB0aGUgd2hvbGUgcmVmZXJlbmNlZAorCQkgICAgIHJlZ2lzdGVyIGxpdmUuICBXZSBtaWdo dCBiZSBhYmxlIHRvIGF2b2lkIHRoYXQgZm9yCisJCSAgICAgU1RSSUNUX0xPV19QQVJUIGF0 IHNvbWUgcG9pbnQuICAqLworCQkgIGlmIChHRVRfQ09ERSAoeCkgPT0gU1RSSUNUX0xPV19Q QVJUCisJCSAgICAgIHx8IHBhcmFkb3hpY2FsX3N1YnJlZ19wICh4KSkKKwkJICAgIHggPSBY RVhQICh4LCAwKTsKKwkJICBlbHNlIGlmIChTVUJSRUdfUCAoeSkgJiYgU1VCUkVHX0JZVEUg KHkpLmlzX2NvbnN0YW50ICgpKQorCQkgICAgeworCQkgICAgICAvKiBGb3IgYW55dGhpbmcg YnV0IChzdWJyZWcgKHJlZykpLCBicmVhayB0aGUgaW5uZXIgbG9vcAorCQkJIGFuZCBwcm9j ZXNzIG5vcm1hbGx5IChjb25zZXJ2YXRpdmVseSkuICAqLworCQkgICAgICBpZiAoIVJFR19Q IChTVUJSRUdfUkVHICh5KSkpCisJCQlicmVhazsKKwkJICAgICAgYml0ID0gKFNVQlJFR19C WVRFICh5KS50b19jb25zdGFudCAoKSAqIEJJVFNfUEVSX1VOSVQpOworCQkgICAgICBpZiAo V09SRFNfQklHX0VORElBTikKKwkJCWJpdCA9IChHRVRfTU9ERV9CSVRTSVpFCisJCQkgICAg ICAgKEdFVF9NT0RFIChTVUJSRUdfUkVHICh5KSkpLnRvX2NvbnN0YW50ICgpCisJCQkJLSBH RVRfTU9ERV9CSVRTSVpFIChHRVRfTU9ERSAoeSkpLnRvX2NvbnN0YW50ICgpIC0gYml0KTsK KwkJICAgICAgaWYgKGRzdF9tYXNrKQorCQkJeworCQkJICBkc3RfbWFzayA8PD0gYml0Owor CQkJICBpZiAoIWRzdF9tYXNrKQorCQkJICAgIGRzdF9tYXNrID0gLTB4MTAwMDAwMDAwVUxM OworCQkJfQorCQkgICAgICB5ID0gU1VCUkVHX1JFRyAoeSk7CisJCSAgICB9CisKKwkJICBp ZiAoUkVHX1AgKHkpKQorCQkgICAgeworCQkgICAgICAvKiBXZSBoYXZlIGZvdW5kIHRoZSB1 c2Ugb2YgYSByZWdpc3Rlci4gIFdlIG5lZWQgdG8gbWFyaworCQkJIHRoZSBhcHByb3ByaWF0 ZSBjaHVua3Mgb2YgdGhlIHJlZ2lzdGVyIGxpdmUuICBUaGUgbW9kZQorCQkJIG9mIHRoZSBS RUcgaXMgYSBzdGFydGluZyBwb2ludC4gIFdlIG1heSByZWZpbmUgdGhhdAorCQkJIGJhc2Vk IG9uIHdoYXQgY2h1bmtzIGluIHRoZSBvdXRwdXQgd2VyZSBsaXZlLiAgKi8KKwkJICAgICAg cm4gPSA0ICogUkVHTk8gKHkpOworCQkgICAgICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHRt cF9tYXNrID0gZHN0X21hc2s7CisKKwkJICAgICAgLyogSWYgdGhlIFJUWCBjb2RlIGZvciB0 aGUgU0VUX1NSQyBpcyBub3Qgb25lIHdlIGNhbgorCQkJIHByb3BhZ2F0ZSBkZXN0aW5hdGlv biBsaXZlbmVzcyB0aHJvdWdoLCB0aGVuIGp1c3QKKwkJCSBzZXQgdGhlIG1hc2sgdG8gdGhl IG1vZGUncyBtYXNrLiAgKi8KKwkJICAgICAgaWYgKCFzYWZlX2Zvcl9saXZlX3Byb3BhZ2F0 aW9uIChjb2RlKSkKKwkJCXRtcF9tYXNrID0gR0VUX01PREVfTUFTSyAoR0VUX01PREUgKHkp KTsKKworCQkgICAgICBpZiAodG1wX21hc2sgJiAweGZmKQorCQkJYml0bWFwX3NldF9iaXQg KGxpdmVub3csIHJuKTsKKwkJICAgICAgaWYgKHRtcF9tYXNrICYgMHhmZjAwKQorCQkJYml0 bWFwX3NldF9iaXQgKGxpdmVub3csIHJuICsgMSk7CisJCSAgICAgIGlmICh0bXBfbWFzayAm IDB4ZmZmZjAwMDBVTEwpCisJCQliaXRtYXBfc2V0X2JpdCAobGl2ZW5vdywgcm4gKyAyKTsK KwkJICAgICAgaWYgKHRtcF9tYXNrICYgLTB4MTAwMDAwMDAwVUxMKQorCQkJYml0bWFwX3Nl dF9iaXQgKGxpdmVub3csIHJuICsgMyk7CisKKwkJICAgICAgLyogU29tZSBvcGVyYXRvcnMg aW1wbHkgdGhlaXIgc2Vjb25kIG9wZXJhbmQKKwkJCSBpcyBmdWxseSBsaXZlLCBicmVhayB0 aGlzIGlubmVyIGxvb3Agd2hpY2gKKwkJCSB3aWxsIGNhdXNlIHRoZSBpdGVyYXRvciB0byBk ZXNjZW50IGludG8gdGhlCisJCQkgc3ViLXJ0eHMgb3V0c2lkZSB0aGUgU0VUIHByb2Nlc3Np bmcuICAqLworCQkgICAgICBpZiAoYmlub3BfaW1wbGllc19vcDJfZnVsbHlfbGl2ZSAoY29k ZSkpCisJCQlicmVhazsKKwkJICAgIH0KKwkJICBlbHNlIGlmICghQ09OU1RBTlRfUCAoeSkp CisJCSAgICBicmVhazsKKwkJICAvKiBXZSBtaWdodCBoYXZlIChhc2hpZnQgKGNvbnN0X2lu dCAxKSAocmVnLi4uKSkgKi8KKwkJICBlbHNlIGlmIChDT05TVEFOVF9QICh5KQorCQkJICAg JiYgYmlub3BfaW1wbGllc19vcDJfZnVsbHlfbGl2ZSAoR0VUX0NPREUgKHNyYykpKQorCQkg ICAgYnJlYWs7CisKKwkJICAvKiBJZiB0aGlzIHdhcyBhbnl0aGluZyBidXQgYSBiaW5hcnkg b3BlcmFuZCwgYnJlYWsgdGhlIGlubmVyCisJCSAgICAgbG9vcC4gIFRoaXMgaXMgY29uc2Vy dmF0aXZlbHkgY29ycmVjdCBhcyBpdCB3aWxsIGNhdXNlIHRoZQorCQkgICAgIGl0ZXJhdG9y IHRvIGxvb2sgYXQgdGhlIHN1Yi1ydHhzIG91dHNpZGUgdGhlIFNFVCBjb250ZXh0LiAgKi8K KwkJICBpZiAoIUJJTkFSWV9QIChzcmMpKQorCQkgICAgYnJlYWs7CisKKwkJICAvKiBXZSBw cm9jZXNzZWQgdGhlIGZpcnN0IG9wZXJhbmQgb2YgYSBiaW5hcnkgb3BlcmF0b3IuICBOb3cK KwkJICAgICBoYW5kbGUgdGhlIHNlY29uZC4gICovCisJCSAgeSA9IFhFWFAgKHNyYywgMSks IHNyYyA9IHBjX3J0eDsKKwkJfQorCisJICAgICAgLyogVGhlc2UgYXJlIGxlYWYgbm9kZXMs IG5vIG5lZWQgdG8gaXRlcmF0ZSBkb3duIGludG8gdGhlbS4gICovCisJICAgICAgaWYgKFJF R19QICh5KSB8fCBDT05TVEFOVF9QICh5KSkKKwkJaXRlci5za2lwX3N1YnJ0eGVzICgpOwor CSAgICB9CisJfQorICAgICAgLyogSWYgd2UgYXJlIHJlYWRpbmcgdGhlIGxvdyBwYXJ0IG9m IGEgU1VCUkVHLCB0aGVuIHdlIGNhbgorCSByZWZpbmUgbGl2ZW5lc3Mgb2YgdGhlIGlucHV0 IHJlZ2lzdGVyLCBvdGhlcndpc2UgbGV0IHRoZQorCSBpdGVyYXRvciBjb250aW51ZSBpbnRv IFNVQlJFR19SRUcuICAqLworICAgICAgZWxzZSBpZiAoeGNvZGUgPT0gU1VCUkVHCisJICAg ICAgICYmIFJFR19QIChTVUJSRUdfUkVHICh4KSkKKwkgICAgICAgJiYgc3VicmVnX2xvd3Bh cnRfcCAoeCkKKwkgICAgICAgJiYgR0VUX01PREVfQklUU0laRSAoR0VUX01PREUgKHgpKS5p c19jb25zdGFudCAoKQorCSAgICAgICAmJiBHRVRfTU9ERV9CSVRTSVpFIChHRVRfTU9ERSAo eCkpLnRvX2NvbnN0YW50ICgpIDw9IDMyKQorCXsKKwkgIEhPU1RfV0lERV9JTlQgc2l6ZSA9 IEdFVF9NT0RFX0JJVFNJWkUgKEdFVF9NT0RFICAoeCkpLnRvX2NvbnN0YW50ICgpOworCSAg SE9TVF9XSURFX0lOVCBybiA9IDQgKiBSRUdOTyAoU1VCUkVHX1JFRyAoeCkpOworCisJICBi aXRtYXBfc2V0X2JpdCAobGl2ZW5vdywgcm4pOworCSAgaWYgKHNpemUgPiA4KQorCSAgICBi aXRtYXBfc2V0X2JpdCAobGl2ZW5vdywgcm4gKyAxKTsKKwkgIGlmIChzaXplID4gMTYpCisJ ICAgIGJpdG1hcF9zZXRfYml0IChsaXZlbm93LCBybiArIDIpOworCSAgaWYgKHNpemUgPiAz MikKKwkgICAgYml0bWFwX3NldF9iaXQgKGxpdmVub3csIHJuICsgMyk7CisJICBpdGVyLnNr aXBfc3VicnR4ZXMgKCk7CisJfQorICAgICAgLyogSWYgd2UgaGF2ZSBhIHJlZ2lzdGVyIHJl ZmVyZW5jZSB0aGF0IGlzIG5vdCBvdGhlcndpc2UgaGFuZGxlZCwKKwkganVzdCBhc3N1bWUg YWxsIHRoZSBjaHVua3MgYXJlIGxpdmUuICAqLworICAgICAgZWxzZSBpZiAoUkVHX1AgKHgp KQorCWJpdG1hcF9zZXRfcmFuZ2UgKGxpdmVub3csIFJFR05PICh4KSAqIDQsIDQpOworICAg IH0KK30KKworLyogUHJvY2VzcyBhIHNpbmdsZSBiYXNpYyBibG9jayBCQiB3aXRoIGN1cnJl bnQgbGl2ZW5lc3MgaW5mb3JtYXRpb24KKyAgIGluIExJVkVOT1csIHJldHVybmluZyB1cGRh dGVkIGxpdmVuZXNzIGluZm9ybWF0aW9uLgorCisgICBJZiBNT0RJRlkgaXMgdHJ1ZSwgdGhl biB0aGlzIGlzIHRoZSBsYXN0IHBhc3MgYW5kIHVubmVjZXNzYXJ5CisgICBleHRlbnNpb25z IHNob3VsZCBiZSBlbGltaW5hdGVkIHdoZW4gcG9zc2libGUuICBJZiBhbiBleHRlbnNpb24K KyAgIGlzIHJlbW92ZWQsIHRoZSBzb3VyY2UgcHNldWRvIGlzIG1hcmtlZCBpbiBDSEFOR0VE X1BTRVVET1MuICAqLworCitzdGF0aWMgYml0bWFwCitleHRfZGNlX3Byb2Nlc3NfYmIgKGJh c2ljX2Jsb2NrIGJiLCBiaXRtYXAgbGl2ZW5vdywKKwkJICAgIGJvb2wgbW9kaWZ5LCBiaXRt YXAgY2hhbmdlZF9wc2V1ZG9zKQoreworICBydHhfaW5zbiAqaW5zbjsKKworICBGT1JfQkJf SU5TTlNfUkVWRVJTRSAoYmIsIGluc24pCisgICAgeworICAgICAgaWYgKCFOT05ERUJVR19J TlNOX1AgKGluc24pKQorCWNvbnRpbnVlOworCisgICAgICAvKiBMaXZlLW91dCBzdGF0ZSBv ZiB0aGUgZGVzdGluYXRpb24gb2YgdGhpcyBpbnNuLiAgV2UgY2FuCisJIHVzZSB0aGlzIHRv IHJlZmluZSB0aGUgbGl2ZS1pbiBzdGF0ZSBvZiB0aGUgc291cmNlcyBvZgorCSB0aGlzIGlu c24gaW4gbWFueSBjYXNlcy4gICovCisgICAgICBiaXRtYXAgbGl2ZV90bXAgPSBCSVRNQVBf QUxMT0MgKE5VTEwpOworCisgICAgICAvKiBGaXJzdCBwcm9jZXNzIGFueSBzZXRzL2Nsb2Ji ZXJzIGluIElOU04uICAqLworICAgICAgZXh0X2RjZV9wcm9jZXNzX3NldHMgKGluc24sIGxp dmVub3csIGxpdmVfdG1wKTsKKworICAgICAgLyogQ0FMTF9JTlNOcyBuZWVkIHByb2Nlc3Np bmcgdGhlaXIgZnVzYWdlIGRhdGEuICAqLworICAgICAgaWYgKEdFVF9DT0RFIChpbnNuKSA9 PSBDQUxMX0lOU04pCisJZXh0X2RjZV9wcm9jZXNzX3NldHMgKENBTExfSU5TTl9GVU5DVElP Tl9VU0FHRSAoaW5zbiksCisJCQkgICAgICBsaXZlbm93LCBsaXZlX3RtcCk7CisKKyAgICAg IC8qIEFuZCBub3cgdXNlcywgb3B0aW1pemluZyBhd2F5IFNJR04vWkVSTyBleHRlbnNpb25z IGFzIHdlIGdvLiAgKi8KKyAgICAgIGV4dF9kY2VfcHJvY2Vzc191c2VzIChpbnNuLCBsaXZl bm93LCBsaXZlX3RtcCwgbW9kaWZ5LCBjaGFuZ2VkX3BzZXVkb3MpOworCisgICAgICAvKiBB bmQgcHJvY2VzcyBmdXNhZ2UgZGF0YSBmb3IgdGhlIHVzZSBhcyB3ZWxsLiAgKi8KKyAgICAg IGlmIChHRVRfQ09ERSAoaW5zbikgPT0gQ0FMTF9JTlNOKQorCXsKKwkgIGlmICghRkFLRV9D QUxMX1AgKGluc24pKQorCSAgICBiaXRtYXBfc2V0X3JhbmdlIChsaXZlbm93LCBTVEFDS19Q T0lOVEVSX1JFR05VTSAqIDQsIDQpOworCisJICAvKiBJZiB0aGlzIGlzIG5vdCBhIGNhbGwg dG8gYSBjb25zdCBmdWNudGlvbiwgdGhlbiBhc3N1bWUgaXQKKwkgICAgIGNhbiByZWFkIGFu eSBnbG9iYWwgcmVnaXN0ZXIuICAqLworCSAgaWYgKCFSVExfQ09OU1RfQ0FMTF9QIChpbnNu KSkKKwkgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEZJUlNUX1BTRVVET19SRUdJU1RF UjsgaSsrKQorCSAgICAgIGlmIChnbG9iYWxfcmVnc1tpXSkKKwkJYml0bWFwX3NldF9yYW5n ZSAobGl2ZW5vdywgaSAqIDQsIDQpOworCisJICBleHRfZGNlX3Byb2Nlc3NfdXNlcyAoQ0FM TF9JTlNOX0ZVTkNUSU9OX1VTQUdFIChpbnNuKSwKKwkJCQlsaXZlbm93LCBsaXZlX3RtcCwg bW9kaWZ5LCBjaGFuZ2VkX3BzZXVkb3MpOworCX0KKworICAgICAgQklUTUFQX0ZSRUUgKGxp dmVfdG1wKTsKKyAgICB9CisgIHJldHVybiBsaXZlbm93OworfQorCisvKiBXZSBvcHRpbWl6 ZSBhd2F5IHNpZ24vemVybyBleHRlbnNpb25zIGluIHRoaXMgcGFzcyBhbmQgcmVwbGFjZQor ICAgdGhlbSB3aXRoIFNVQlJFR3MgaW5kaWNhdGluZyBjZXJ0YWluIGJpdHMgYXJlIGRvbid0 IGNhcmVzLgorCisgICBUaGlzIGNoYW5nZXMgdGhlIFNVQlJFR19QUk9NT1RFRF9WQVJfUCBz dGF0ZSBvZiB0aGUgb2JqZWN0LgorICAgSXQgaXMgZmFpcmx5IHBhaW5mdWwgdG8gZml4IHRo aXMgb24gdGhlIGZseSwgc28gd2UgaGF2ZQorICAgcmVjb3JkZWQgd2hpY2ggcHNldWRvcyBh cmUgYWZmZWN0ZWQgYW5kIHdlIGxvb2sgZm9yIFNVQlJFR3MKKyAgIG9mIHRob3NlIHBzZXVk b3MgYW5kIGZpeCB0aGVtIHVwLiAgKi8KKworc3RhdGljIHZvaWQKK3Jlc2V0X3N1YnJlZ19w cm9tb3RlZF9wIChiaXRtYXAgY2hhbmdlZF9wc2V1ZG9zKQoreworICAvKiBJZiB3ZSByZW1v dmVkIGFuIGV4dGVuc2lvbiwgdGhhdCBjaGFuZ2VkIHRoZSBwcm9tb3RlZCBzdGF0ZQorICAg ICBvZiB0aGUgZGVzdGluYXRpb24gb2YgdGhhdCBleHRlbnNpb24uICBUaHVzIHdlIG5lZWQg dG8gZ28KKyAgICAgZmluZCBhbnkgU1VCUkVHcyB0aGF0IHJlZmVyZW5jZSB0aGF0IHBzZXVk byBhbmQgYWRqdXN0IHRoZWlyCisgICAgIFNVQlJFR19QUk9NT1RFRF9QIHN0YXRlLiAgKi8K KyAgZm9yIChydHhfaW5zbiAqaW5zbiA9IGdldF9pbnNucygpOyBpbnNuOyBpbnNuID0gTkVY VF9JTlNOIChpbnNuKSkKKyAgICB7CisgICAgICBpZiAoIU5PTkRFQlVHX0lOU05fUCAoaW5z bikpCisJY29udGludWU7CisKKyAgICAgIHJ0eCBwYXQgPSBQQVRURVJOIChpbnNuKTsKKyAg ICAgIHN1YnJ0eF92YXJfaXRlcmF0b3I6OmFycmF5X3R5cGUgYXJyYXk7CisgICAgICBGT1Jf RUFDSF9TVUJSVFhfVkFSIChpdGVyLCBhcnJheSwgcGF0LCBOT05DT05TVCkKKwl7CisJICBy dHggc3ViID0gKml0ZXI7CisKKwkgIC8qIFdlIG9ubHkgY2FyZSBhYm91dCBTVUJSRUdzLiAg Ki8KKwkgIGlmIChHRVRfQ09ERSAoc3ViKSAhPSBTVUJSRUcpCisJICAgIGNvbnRpbnVlOwor CisJICBjb25zdF9ydHggeCA9IFNVQlJFR19SRUcgKHN1Yik7CisKKwkgIC8qIFdlIG9ubHkg Y2FyZSBpZiB0aGUgaW5uZXIgb2JqZWN0IGlzIGEgUkVHLiAgKi8KKwkgIGlmICghUkVHX1Ag KHgpKQorCSAgICBjb250aW51ZTsKKworCSAgLyogQW5kIG9ubHkgaWYgdGhlIFNVQlJFRyBp cyBhIHByb21vdGVkIHZhci4gICovCisJICBpZiAoIVNVQlJFR19QUk9NT1RFRF9WQVJfUCAo c3ViKSkKKwkgICAgY29udGludWU7CisKKwkgIGlmIChiaXRtYXBfYml0X3AgKGNoYW5nZWRf cHNldWRvcywgUkVHTk8gKHgpKSkKKwkgICAgU1VCUkVHX1BST01PVEVEX1ZBUl9QIChzdWIp ID0gMDsKKwl9CisgICAgfQorfQorCisvKiBVc2UgbGlmZXRpbWUgYW5hbHlpcyB0byBpZGVu dGlmeSBleHRlbnNpb25zIHRoYXQgc2V0IGJpdHMgdGhhdAorICAgYXJlIG5ldmVyIHJlYWQu ICBUdXJuIHN1Y2ggZXh0ZW5zaW9ucyBpbnRvIFNVQlJFR3MgaW5zdGVhZCB3aGljaAorICAg Y2FuIG9mdGVuIGJlIHByb3BhZ2F0ZWQgYXdheS4gICovCisKK3N0YXRpYyB2b2lkCitleHRf ZGNlICh2b2lkKQoreworICBiYXNpY19ibG9jayBiYiwgKndvcmtsaXN0LCAqcWluLCAqcW91 dCwgKnFlbmQ7CisgIHVuc2lnbmVkIGludCBxbGVuOworICB2ZWM8Yml0bWFwX2hlYWQ+IGxp dmVpbjsKKyAgYml0bWFwIGxpdmVub3c7CisgIGJpdG1hcCBjaGFuZ2VkX3BzZXVkb3M7CisK KyAgbGl2ZWluLmNyZWF0ZSAobGFzdF9iYXNpY19ibG9ja19mb3JfZm4gKGNmdW4pKTsKKyAg bGl2ZWluLnF1aWNrX2dyb3dfY2xlYXJlZCAobGFzdF9iYXNpY19ibG9ja19mb3JfZm4gKGNm dW4pKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXN0X2Jhc2ljX2Jsb2NrX2Zvcl9mbiAo Y2Z1bik7IGkrKykKKyAgICBiaXRtYXBfaW5pdGlhbGl6ZSAoJmxpdmVpbltpXSwgJmJpdG1h cF9kZWZhdWx0X29ic3RhY2spOworCisgIGF1dG9fYml0bWFwIHJlZnMgKCZiaXRtYXBfZGVm YXVsdF9vYnN0YWNrKTsKKyAgZGZfZ2V0X2V4aXRfYmxvY2tfdXNlX3NldCAocmVmcyk7CisK KyAgdW5zaWduZWQgaTsKKyAgYml0bWFwX2l0ZXJhdG9yIGJpOworICBFWEVDVVRFX0lGX1NF VF9JTl9CSVRNQVAgKHJlZnMsIDAsIGksIGJpKQorICAgIHsKKyAgICAgIGZvciAoaW50IGog PSAwOyBqIDwgNDsgaisrKQorCWJpdG1hcF9zZXRfYml0ICgmbGl2ZWluW0VYSVRfQkxPQ0td LCBpICogNCArIGopOworICAgIH0KKworICBsaXZlbm93ID0gQklUTUFQX0FMTE9DIChOVUxM KTsKKyAgY2hhbmdlZF9wc2V1ZG9zID0gQklUTUFQX0FMTE9DIChOVUxMKTsKKworICB3b3Jr bGlzdAorICAgID0gWE5FV1ZFQyAoYmFzaWNfYmxvY2ssIG5fYmFzaWNfYmxvY2tzX2Zvcl9m biAoY2Z1bikgLSBOVU1fRklYRURfQkxPQ0tTKTsKKworICBpbnQgbW9kaWZ5ID0gMDsKKwor ICBkbworICAgIHsKKyAgICAgIHFpbiA9IHFvdXQgPSB3b3JrbGlzdDsKKworICAgICAgLyog UHV0IGV2ZXJ5IGJsb2NrIG9uIHRoZSB3b3JrbGlzdC4gICovCisgICAgICBpbnQgKnJwbyA9 IFhORVdWRUMgKGludCwgbl9iYXNpY19ibG9ja3NfZm9yX2ZuIChjZnVuKSk7CisgICAgICBp bnQgbiA9IGludmVydGVkX3Jldl9wb3N0X29yZGVyX2NvbXB1dGUgKGNmdW4sIHJwbyk7Cisg ICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKKwl7CisJICBiYiA9IEJBU0lDX0JM T0NLX0ZPUl9GTiAoY2Z1biwgcnBvW2ldKTsKKwkgIGlmIChiYiA9PSBFWElUX0JMT0NLX1BU Ul9GT1JfRk4gKGNmdW4pCisJICAgICAgfHwgYmIgPT0gRU5UUllfQkxPQ0tfUFRSX0ZPUl9G TiAoY2Z1bikpCisJICAgIGNvbnRpbnVlOworCSAgKnFpbisrID0gYmI7CisJICBiYi0+YXV4 ID0gYmI7CisJfQorICAgICAgZnJlZSAocnBvKTsKKworICAgICAgcWluID0gd29ya2xpc3Q7 CisgICAgICBxZW5kID0gJndvcmtsaXN0W25fYmFzaWNfYmxvY2tzX2Zvcl9mbiAoY2Z1bikg LSBOVU1fRklYRURfQkxPQ0tTXTsKKyAgICAgIHFsZW4gPSBuX2Jhc2ljX2Jsb2Nrc19mb3Jf Zm4gKGNmdW4pIC0gTlVNX0ZJWEVEX0JMT0NLUzsKKworICAgICAgLyogSXRlcmF0ZSB1bnRp bCB0aGUgd29ya2xpc3QgaXMgZW1wdHkuICAqLworICAgICAgd2hpbGUgKHFsZW4pCisJewor CSAgLyogVGFrZSB0aGUgZmlyc3QgZW50cnkgb2ZmIHRoZSB3b3JrbGlzdC4gICovCisJICBi YiA9ICpxb3V0Kys7CisJICBxbGVuLS07CisKKwkgIGlmIChxb3V0ID49IHFlbmQpCisJICAg IHFvdXQgPSB3b3JrbGlzdDsKKworCSAgLyogQ2xlYXIgdGhlIGF1eCBmaWVsZCBvZiB0aGlz IGJsb2NrIHNvIHRoYXQgaXQgY2FuIGJlIGFkZGVkIHRvCisJICAgICB0aGUgd29ya2xpc3Qg YWdhaW4gaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIGJiLT5hdXggPSBOVUxMOworCisJICBiaXRt YXBfY2xlYXIgKGxpdmVub3cpOworCSAgLyogTWFrZSBldmVyeXRoaW5nIGxpdmUgdGhhdCdz IGxpdmUgaW4gdGhlIHN1Y2Nlc3NvcnMuICAqLworCSAgZWRnZV9pdGVyYXRvciBlaTsKKwkg IGVkZ2UgZTsKKworCSAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGJiLT5zdWNjcykKKwkgICAg Yml0bWFwX2lvcl9pbnRvIChsaXZlbm93LCAmbGl2ZWluW2UtPmRlc3QtPmluZGV4XSk7CisK KwkgIGxpdmVub3cgPSBleHRfZGNlX3Byb2Nlc3NfYmIgKGJiLCBsaXZlbm93LAorCQkJCQlt b2RpZnkgPiAwLCBjaGFuZ2VkX3BzZXVkb3MpOworCisJICBpZiAoIWJpdG1hcF9lcXVhbF9w ICgmbGl2ZWluW2JiLT5pbmRleF0sIGxpdmVub3cpKQorCSAgICB7CisJICAgICAgZ2NjX2Fz c2VydCAoIW1vZGlmeSk7CisJICAgICAgYml0bWFwIHRtcCA9IEJJVE1BUF9BTExPQyAoTlVM TCk7CisJICAgICAgZ2NjX2Fzc2VydCAoIWJpdG1hcF9hbmRfY29tcGwgKHRtcCwgJmxpdmVp bltiYi0+aW5kZXhdLCBsaXZlbm93KSk7CisKKwkgICAgICBiaXRtYXBfY29weSAoJmxpdmVp bltiYi0+aW5kZXhdLCBsaXZlbm93KTsKKworCSAgICAgIGVkZ2VfaXRlcmF0b3IgZWk7CisJ ICAgICAgZWRnZSBlOworCisJICAgICAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGJiLT5wcmVk cykKKwkJaWYgKCFlLT5zcmMtPmF1eCAmJiBlLT5zcmMgIT0gRU5UUllfQkxPQ0tfUFRSX0ZP Ul9GTiAoY2Z1bikpCisJCSAgeworCQkgICAgKnFpbisrID0gZS0+c3JjOworCQkgICAgZS0+ c3JjLT5hdXggPSBlOworCQkgICAgcWxlbisrOworCQkgICAgaWYgKHFpbiA+PSBxZW5kKQor CQkgICAgICBxaW4gPSB3b3JrbGlzdDsKKwkJICB9CisJICAgIH0KKwl9CisgICAgfSB3aGls ZSAoIW1vZGlmeSsrKTsKKworICByZXNldF9zdWJyZWdfcHJvbW90ZWRfcCAoY2hhbmdlZF9w c2V1ZG9zKTsKKworICAvKiBDbGVhbiB1cC4gICovCisgIEJJVE1BUF9GUkVFIChjaGFuZ2Vk X3BzZXVkb3MpOworICBCSVRNQVBfRlJFRSAobGl2ZW5vdyk7CisgIHVuc2lnbmVkIGxlbiA9 IGxpdmVpbi5sZW5ndGggKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkr KykKKyAgICBiaXRtYXBfY2xlYXIgKCZsaXZlaW5baV0pOworICBsaXZlaW4ucmVsZWFzZSAo KTsKKyAgY2xlYXJfYXV4X2Zvcl9ibG9ja3MgKCk7CisgIGZyZWUgKHdvcmtsaXN0KTsKK30K KworbmFtZXNwYWNlIHsKKworY29uc3QgcGFzc19kYXRhIHBhc3NfZGF0YV9leHRfZGNlID0K K3sKKyAgUlRMX1BBU1MsIC8qIHR5cGUgKi8KKyAgImV4dF9kY2UiLCAvKiBuYW1lICovCisg IE9QVEdST1VQX05PTkUsIC8qIG9wdGluZm9fZmxhZ3MgKi8KKyAgVFZfTk9ORSwgLyogdHZf aWQgKi8KKyAgUFJPUF9jZmdsYXlvdXQsIC8qIHByb3BlcnRpZXNfcmVxdWlyZWQgKi8KKyAg MCwgLyogcHJvcGVydGllc19wcm92aWRlZCAqLworICAwLCAvKiBwcm9wZXJ0aWVzX2Rlc3Ry b3llZCAqLworICAwLCAvKiB0b2RvX2ZsYWdzX3N0YXJ0ICovCisgIFRPRE9fZGZfZmluaXNo LCAvKiB0b2RvX2ZsYWdzX2ZpbmlzaCAqLworfTsKKworY2xhc3MgcGFzc19leHRfZGNlIDog cHVibGljIHJ0bF9vcHRfcGFzcworeworcHVibGljOgorICBwYXNzX2V4dF9kY2UgKGdjYzo6 Y29udGV4dCAqY3R4dCkKKyAgICA6IHJ0bF9vcHRfcGFzcyAocGFzc19kYXRhX2V4dF9kY2Us IGN0eHQpCisgIHt9CisKKyAgLyogb3B0X3Bhc3MgbWV0aG9kczogKi8KKyAgdmlydHVhbCBi b29sIGdhdGUgKGZ1bmN0aW9uICopIHsgcmV0dXJuIG9wdGltaXplID4gMDsgfQorICB2aXJ0 dWFsIHVuc2lnbmVkIGludCBleGVjdXRlIChmdW5jdGlvbiAqKQorICAgIHsKKyAgICAgIGV4 dF9kY2UgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKK307IC8vIGNsYXNzIHBhc3Nf Y29tYmluZQorCit9IC8vIGFub24gbmFtZXNwYWNlCisKK3J0bF9vcHRfcGFzcyAqCittYWtl X3Bhc3NfZXh0X2RjZSAoZ2NjOjpjb250ZXh0ICpjdHh0KQoreworICByZXR1cm4gbmV3IHBh c3NfZXh0X2RjZSAoY3R4dCk7Cit9CmRpZmYgLS1naXQgYS9nY2MvcGFzc2VzLmRlZiBiL2dj Yy9wYXNzZXMuZGVmCmluZGV4IDFlMTk1MGJkYjM5Li5jMDc1YzcwZDQyYyAxMDA2NDQKLS0t IGEvZ2NjL3Bhc3Nlcy5kZWYKKysrIGIvZ2NjL3Bhc3Nlcy5kZWYKQEAgLTQ4Nyw2ICs0ODcs NyBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNl ZQogICAgICAgTkVYVF9QQVNTIChwYXNzX2luY19kZWMpOwogICAgICAgTkVYVF9QQVNTIChw YXNzX2luaXRpYWxpemVfcmVncyk7CiAgICAgICBORVhUX1BBU1MgKHBhc3NfdWRfcnRsX2Rj ZSk7CisgICAgICBORVhUX1BBU1MgKHBhc3NfZXh0X2RjZSk7CiAgICAgICBORVhUX1BBU1Mg KHBhc3NfY29tYmluZSk7CiAgICAgICBORVhUX1BBU1MgKHBhc3NfaWZfYWZ0ZXJfY29tYmlu ZSk7CiAgICAgICBORVhUX1BBU1MgKHBhc3NfanVtcF9hZnRlcl9jb21iaW5lKTsKZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9yaXNjdi9jb3JlX2JlbmNoX2xpc3Qu YyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9yaXNjdi9jb3JlX2JlbmNoX2xpc3QuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOTU3ZTljODQxZWQKLS0t IC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvcmlzY3YvY29yZV9i ZW5jaF9saXN0LmMKQEAgLTAsMCArMSwxNSBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8K Ky8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC1ydGwtZXh0X2RjZSIgfSAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tcnRsLWR1bXAge1N1Y2Nlc3NmdWxseSB0cmFuc2Zvcm1lZH0gImV4 dF9kY2UiIH0gfSAqLworCitzaG9ydAorY29yZV9iZW5jaF9saXN0IChpbnQgTikgeworCisg IHNob3J0IGEgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGlm IChpID4gTikgeworICAgICAgYSsrOworICAgIH0KKyAgfQorICByZXR1cm4gYSAqIDQ7Cit9 CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvcmlzY3YvY29yZV9pbml0 X21hdHJpeC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L3Jpc2N2L2NvcmVfaW5pdF9t YXRyaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOTI4OTI0 NGM3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvcmlz Y3YvY29yZV9pbml0X21hdHJpeC5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHsgZGctZG8gY29t cGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMSAtZmR1bXAtcnRsLWV4dF9kY2UiIH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXJ0bC1kdW1wIHtTdWNjZXNzZnVsbHkgdHJhbnNm b3JtZWR9ICJleHRfZGNlIiB9IH0gKi8KKwordm9pZAorY29yZV9pbml0X21hdHJpeChzaG9y dCogQSwgc2hvcnQqIEIsIGludCBzZWVkKSB7CisgIGludCAgb3JkZXIgPSAxOworCisgIGZv ciAoaW50IGkgPSAwOyBpIDwgc2VlZDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGog PCBzZWVkOyBqKyspIHsKKyAgICAgIHNob3J0IHZhbCA9IHNlZWQgKyBvcmRlcjsKKyAgICAg IEJbaV0gPSB2YWw7CisgICAgICBBW2ldID0gdmFsOworICAgICAgb3JkZXIrKzsKKyAgICB9 CisgIH0KK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9yaXNjdi9j b3JlX2xpc3RfaW5pdC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L3Jpc2N2L2NvcmVf bGlzdF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjJm MzZkYWU4NWFhCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L3Jpc2N2L2NvcmVfbGlzdF9pbml0LmMKQEAgLTAsMCArMSwxOCBAQAorLyogeyBkZy1kbyBj b21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8xIC1mZHVtcC1ydGwtZXh0X2RjZSIg fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tcnRsLWR1bXAge1N1Y2Nlc3NmdWxseSB0cmFu c2Zvcm1lZH0gImV4dF9kY2UiIH0gfSAqLworCit1bnNpZ25lZCBzaG9ydAorY29yZV9saXN0 X2luaXQgKGludCBzaXplLCBzaG9ydCBzZWVkKSB7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkg PCBzaXplOyBpKyspIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBkYXRwYXQgPSAoKHVuc2lnbmVk IHNob3J0KShzZWVkIF4gaSkgJiAweGYpOworICAgIHVuc2lnbmVkIHNob3J0IGRhdCA9IChk YXRwYXQgPDwgMykgfCAoaSAmIDB4Nyk7CisgICAgaWYgKGkgPiBzZWVkKSB7CisgICAgICBy ZXR1cm4gZGF0OworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworCit9CmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvcmlzY3YvbWF0cml4X2FkZF9jb25zdC5jIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L3Jpc2N2L21hdHJpeF9hZGRfY29uc3QuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOWEyZGQ1M2IxN2EKLS0tIC9k ZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvcmlzY3YvbWF0cml4X2Fk ZF9jb25zdC5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAtcnRsLWV4dF9kY2UiIH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLXJ0bC1kdW1wIHtTdWNjZXNzZnVsbHkgdHJhbnNmb3JtZWR9ICJleHRf ZGNlIiB9IH0gKi8KKwordm9pZAorbWF0cml4X2FkZF9jb25zdChpbnQgTiwgc2hvcnQgKkEs IHNob3J0IHZhbCkKK3sKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworICAg ICAgQVtqXSArPSB2YWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L3Jpc2N2L21lbS1leHRlbmQuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9yaXNjdi9tZW0tZXh0ZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAuLmM2N2YxMmRmYzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L3Jpc2N2L21lbS1leHRlbmQuYwpAQCAtMCwwICsxLDEzIEBACisvKiB7IGRn LWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItbWFyY2g9cnY2NGdjX3piYiIg fSAqLworLyogeyBkZy1za2lwLWlmICIiIHsgKi0qLSogfSB7ICItTzAiIH0gfSAqLworCit2 b2lkCitmb28oc2hvcnQgKmQsIHNob3J0ICp0bXApIHsKKyAgICBpbnQgeCA9IGRbMF0gKyBk WzFdOworICAgIGludCB5ID0gZFsyXSArIGRbM107CisgICAgdG1wWzBdID0geCArIHk7Cisg ICAgdG1wWzFdID0geCAtIHk7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci1ub3Qge1xtemV4dFwuaFxNfSB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9yaXNjdi9wcjExMTM4NC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L3Jpc2N2L3ByMTExMzg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAuLmE0ZTc3ZDRhZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L3Jpc2N2L3ByMTExMzg0LmMKQEAgLTAsMCArMSwxMSBAQAorLyogeyBkZy1kbyBj b21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8xIC1mZHVtcC1ydGwtZXh0X2RjZSIg fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tcnRsLWR1bXAge1N1Y2Nlc3NmdWxseSB0cmFu c2Zvcm1lZH0gImV4dF9kY2UiIH0gfSAqLworCit2b2lkCitmb28odW5zaWduZWQgaW50IHNy YywgdW5zaWduZWQgc2hvcnQgKmRzdDEsIHVuc2lnbmVkIHNob3J0ICpkc3QyKQoreworICAg ICpkc3QxID0gc3JjOworICAgICpkc3QyID0gc3JjOworfQorCmRpZmYgLS1naXQgYS9nY2Mv dHJlZS1wYXNzLmggYi9nY2MvdHJlZS1wYXNzLmgKaW5kZXggMDllNmFkYTViMmYuLjc3MzMw MWQ3MzFmIDEwMDY0NAotLS0gYS9nY2MvdHJlZS1wYXNzLmgKKysrIGIvZ2NjL3RyZWUtcGFz cy5oCkBAIC01OTEsNiArNTkxLDcgQEAgZXh0ZXJuIHJ0bF9vcHRfcGFzcyAqbWFrZV9wYXNz X3JlZ2luZm9faW5pdCAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVybiBydGxfb3B0X3Bh c3MgKm1ha2VfcGFzc19pbmNfZGVjIChnY2M6OmNvbnRleHQgKmN0eHQpOwogZXh0ZXJuIHJ0 bF9vcHRfcGFzcyAqbWFrZV9wYXNzX3N0YWNrX3B0cl9tb2QgKGdjYzo6Y29udGV4dCAqY3R4 dCk7CiBleHRlcm4gcnRsX29wdF9wYXNzICptYWtlX3Bhc3NfaW5pdGlhbGl6ZV9yZWdzIChn Y2M6OmNvbnRleHQgKmN0eHQpOworZXh0ZXJuIHJ0bF9vcHRfcGFzcyAqbWFrZV9wYXNzX2V4 dF9kY2UgKGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gcnRsX29wdF9wYXNzICptYWtl X3Bhc3NfY29tYmluZSAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVybiBydGxfb3B0X3Bh c3MgKm1ha2VfcGFzc19pZl9hZnRlcl9jb21iaW5lIChnY2M6OmNvbnRleHQgKmN0eHQpOwog ZXh0ZXJuIHJ0bF9vcHRfcGFzcyAqbWFrZV9wYXNzX2p1bXBfYWZ0ZXJfY29tYmluZSAoZ2Nj Ojpjb250ZXh0ICpjdHh0KTsK --------------8EYK0adBY2ZPuLkJy2Zcn30e--