Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vGzOy-00AOn3-E8 for pgsql-hackers@arkaria.postgresql.org; Thu, 06 Nov 2025 12:47:43 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1vGzOx-007syM-6v for pgsql-hackers@arkaria.postgresql.org; Thu, 06 Nov 2025 12:47:42 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vGzOw-007sxs-Pc for pgsql-hackers@lists.postgresql.org; Thu, 06 Nov 2025 12:47:41 +0000 Received: from mail-lf1-x12f.google.com ([2a00:1450:4864:20::12f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vGzOu-005ioc-00 for pgsql-hackers@lists.postgresql.org; Thu, 06 Nov 2025 12:47:40 +0000 Received: by mail-lf1-x12f.google.com with SMTP id 2adb3069b0e04-594330147efso924487e87.2 for ; Thu, 06 Nov 2025 04:47:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762433257; x=1763038057; darn=lists.postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=GF34SEhjc60F03Si9zWD9Uuhjld11fq5HmpcBhKK2ww=; b=a+bMIIoL95M6Nf3dXdOM0WCMYmUkf7JjU76P+iyTybx/qrut0YlffHqBQ8drNXs1Y1 5/p8pt9yKTNhmb8UKIQ4dQ7pBksHN3S0Ao7ablHWbOpp+mz+n+SWmCKBH+dvLChPKjY7 LbfyRCvUYRrcG6WM0JkmlZQ+f8YlaGdR4dn82NoLOTdUIR8E2FKjk4sxnpz5QTNJU1ma aLXLqU2khUtORFFr+rSPR+SqeYJK3IhEMMgX3j2gGHu1ma9TEi2pgkhUdEXMZgrxtsO9 SX+UzS/CQlRii7u0rtJorEmDHFY0ulJB/mj6fO6lOKd6kBgHE17QNXuYKJvkCN45l3L3 jFhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762433257; x=1763038057; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=GF34SEhjc60F03Si9zWD9Uuhjld11fq5HmpcBhKK2ww=; b=D7JzG//0iSs8BkFpdd+RIPJfhUW2Q7hk9uBXE7iTmX1WXG36tSzrBW3ieipizBxBCr sQDefwQ+JYqUFc08qKia0YTXtIAaiPoHpPfJsgTn2h+fbxByA4foZO8ve8ngU4wa2u2M lqH1G0a0Seu5NnVX/QgTt25f6pAEiiGySYRjm1bkixz0OSBZdHb0f1Ct3MHAM4hII4E+ xKNqj1vcWQrEY+knWIzUzFI+qD8y+dQhXerJjG+92xLrHTEMg1oqgZm7g1NNgcCScnxV I8zsOifktIyFjvYgTJNe3uvZVftEypGGAVf7Nb8kq1MDeXSUCYtrIepcBCE9XaS5NjjB 4eiw== X-Gm-Message-State: AOJu0Yw6aPuM6exwo2liWp24N1X0oNITJgYXP+qB4SEFg9iiZKEI8rUF 9vGVKu5N1byaAt38HN/BoLObOFDUfOjrSeFNdplDH58ulugliq04q4Sh X-Gm-Gg: ASbGncsjUskgBkujKxSzD67TVyEh8sZHzltW1vFU9PoEKiCaglqLzMY3J865f4RyvUC sPe3x82BTQnfl7leC4YmD4L/5YV0FqRRSPl/KkPOEEketTwS8rME5srnbxc2oxf/yxrlDzOoMnv 8Bwfnuhgmqqf3v45xW8aE2HZnI5ui4w9JpZRcI/V3zK5h7sjJa7foaHcfdVM6k/WI79f1nSoO3r DJ+vi/qZDsXUcTsxsYfh/GO85/+RWwQmAsy4ZYCM5WkaihGR9lu0jgQaHQwhV5g7Hp9D6rvJjqO oQVYmhrVq27c51lDy0K0oB4Dmaw3RmGjGJjsP6DjPZI92Db7hBoGH9Kx8Ddgns8V8W9WeN8vaWq Opdei1yvxX6HD921zNyR13Zo7K1DOps9RenrAmRycErvCs8kZ1OsIBybDStOsvPCTw410ZscA95 qnn2q+Su7vIQKh1+UVOylSLATqdOlM22mVWvHbe9j02ABxLVJ+oy4= X-Google-Smtp-Source: AGHT+IE1qqSTyLJVEJHNEnkN262Top63LlBr8u4XuTpiExH0lal3s5yZn3I1ZTL0jSt7iWEw5hsdvw== X-Received: by 2002:a05:6512:39cf:b0:594:2f25:d488 with SMTP id 2adb3069b0e04-5943d75b865mr2175235e87.21.1762433256971; Thu, 06 Nov 2025 04:47:36 -0800 (PST) Received: from ?IPV6:2a02:aa1:114a:fa1c:3dec:5470:17c7:4bb7? ([2a02:aa1:114a:fa1c:3dec:5470:17c7:4bb7]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5944a58ed40sm708936e87.88.2025.11.06.04.47.36 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Nov 2025 04:47:36 -0800 (PST) Content-Type: multipart/mixed; boundary="------------IxWEQReRGMBN0CAHHQdKrTyX" Message-ID: <222afb8b-40da-493a-8a61-1b9cbc72138a@gmail.com> Date: Thu, 6 Nov 2025 13:47:35 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Refactor StringInfo usage in subscriptioncmds.c To: =?UTF-8?Q?=C3=81lvaro_Herrera?= Cc: pgsql-hackers@lists.postgresql.org, David Rowley References: <202511061224.qwx6pqiyiwku@alvherre.pgsql> Content-Language: en-US From: Mats Kindahl In-Reply-To: <202511061224.qwx6pqiyiwku@alvherre.pgsql> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------IxWEQReRGMBN0CAHHQdKrTyX Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 11/6/25 13:40, Álvaro Herrera wrote: > On 2025-Nov-06, Mats Kindahl wrote: > >> Attached is a proposal that instead of building error message and hints >> dynamically, it will use ereport() directly and as a result does not have to >> allocate the error message strings and error message hints dynamically and >> these can be removed. > LGTM, thanks. > > I agree with Amit that there doesn't seem to be a need to free > pubnames.data. We're already leaking publist, for instance. This is > okay since we only call these functions during DDL, which in general is > not sensitive to leaks. Seems reasonable. Here is an updated version that removes the pfree() calls. Best wishes, Mats Kindahl --------------IxWEQReRGMBN0CAHHQdKrTyX Content-Type: text/x-patch; charset=UTF-8; name="0001-Refactor-StringInfo-usage-in-subscriptioncmds.c.v2.patch" Content-Disposition: attachment; filename*0="0001-Refactor-StringInfo-usage-in-subscriptioncmds.c.v2.patc"; filename*1="h" Content-Transfer-Encoding: base64 RnJvbSBlYmY4OWE4MmJhNDYzZTAxOWU4ZGJhODQwZGRiMDE5MDVhMzJiM2U3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRzIEtpbmRhaGwgPG1hdHNAa2luZGFobC5uZXQ+ CkRhdGU6IFRodSwgNiBOb3YgMjAyNSAxMTo0Nzo1MCArMDEwMApTdWJqZWN0OiBbUEFUQ0hd IFJlZmFjdG9yIFN0cmluZ0luZm8gdXNhZ2UgaW4gc3Vic2NyaXB0aW9uY21kcy5jCgpUaGlz IGNvbW1pdCByZW1vdmVzIHNvbWUgdXNlcyBvZiBTdHJpbmdJbmZvIHRoYXQgd2FzIG5vdCBu ZWNlc3NhcnkgYW5kIHdhcyBvbmx5CnRoZXJlIHRvIGF2b2lkIGhhdmluZyB0byB3cml0ZSB0 d28gY2FsbHMgb2YgZXJlcG9ydCgpIGFzIHdlbGwgYXMgcmVwbGFjaW5nCmR5bmFtaWMgYWxs b2NhdGlvbiBvZiBTdHJpbmdJbmZvIHdpdGggYSBTdHJpbmdJbmZvRGF0YSB1c2FnZSBpbnN0 ZWFkLgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL3N1YnNjcmlwdGlvbmNtZHMuYyB8IDU4 ICsrKysrKysrKysrLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAyNSBpbnNlcnRp b25zKCspLCAzMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21t YW5kcy9zdWJzY3JpcHRpb25jbWRzLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9zdWJzY3Jp cHRpb25jbWRzLmMKaW5kZXggM2QyOTgxOGJhZGQuLjU3Mjk4NjMyYWQzIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9jb21tYW5kcy9zdWJzY3JpcHRpb25jbWRzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvc3Vic2NyaXB0aW9uY21kcy5jCkBAIC0yNTk5LDMzICsyNTk5LDMw IEBAIGNoZWNrX3B1YmxpY2F0aW9uc19vcmlnaW5fdGFibGVzKFdhbFJlY2VpdmVyQ29ubiAq d3Jjb25uLCBMaXN0ICpwdWJsaWNhdGlvbnMsCiAJICovCiAJaWYgKHB1Ymxpc3QpCiAJewot CQlTdHJpbmdJbmZvCXB1Ym5hbWVzID0gbWFrZVN0cmluZ0luZm8oKTsKLQkJU3RyaW5nSW5m bwllcnJfbXNnID0gbWFrZVN0cmluZ0luZm8oKTsKLQkJU3RyaW5nSW5mbwllcnJfaGludCA9 IG1ha2VTdHJpbmdJbmZvKCk7CisJCVN0cmluZ0luZm9EYXRhIHB1Ym5hbWVzOwogCiAJCS8q IFByZXBhcmUgdGhlIGxpc3Qgb2YgcHVibGljYXRpb24ocykgZm9yIHdhcm5pbmcgbWVzc2Fn ZS4gKi8KLQkJR2V0UHVibGljYXRpb25zU3RyKHB1Ymxpc3QsIHB1Ym5hbWVzLCBmYWxzZSk7 CisJCWluaXRTdHJpbmdJbmZvKCZwdWJuYW1lcyk7CisJCUdldFB1YmxpY2F0aW9uc1N0cihw dWJsaXN0LCAmcHVibmFtZXMsIGZhbHNlKTsKIAogCQlpZiAoY2hlY2tfdGFibGVfc3luYykK LQkJewotCQkJYXBwZW5kU3RyaW5nSW5mbyhlcnJfbXNnLCBfKCJzdWJzY3JpcHRpb24gXCIl c1wiIHJlcXVlc3RlZCBjb3B5X2RhdGEgd2l0aCBvcmlnaW4gPSBOT05FIGJ1dCBtaWdodCBj b3B5IGRhdGEgdGhhdCBoYWQgYSBkaWZmZXJlbnQgb3JpZ2luIiksCi0JCQkJCQkJIHN1Ym5h bWUpOwotCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhlcnJfaGludCwgXygiVmVyaWZ5IHRo YXQgaW5pdGlhbCBkYXRhIGNvcGllZCBmcm9tIHRoZSBwdWJsaXNoZXIgdGFibGVzIGRpZCBu b3QgY29tZSBmcm9tIG90aGVyIG9yaWdpbnMuIikpOwotCQl9CisJCQllcmVwb3J0KFdBUk5J TkcsCisJCQkJCWVycmNvZGUoRVJSQ09ERV9PQkpFQ1RfTk9UX0lOX1BSRVJFUVVJU0lURV9T VEFURSksCisJCQkJCWVycm1zZygic3Vic2NyaXB0aW9uIFwiJXNcIiByZXF1ZXN0ZWQgY29w eV9kYXRhIHdpdGggb3JpZ2luID0gTk9ORSBidXQgbWlnaHQgY29weSBkYXRhIHRoYXQgaGFk IGEgZGlmZmVyZW50IG9yaWdpbiIsCisJCQkJCQkgICBzdWJuYW1lKSwKKwkJCQkJZXJyZGV0 YWlsX3BsdXJhbCgiVGhlIHN1YnNjcmlwdGlvbiBzdWJzY3JpYmVzIHRvIGEgcHVibGljYXRp b24gKCVzKSB0aGF0IGNvbnRhaW5zIHRhYmxlcyB0aGF0IGFyZSB3cml0dGVuIHRvIGJ5IG90 aGVyIHN1YnNjcmlwdGlvbnMuIiwKKwkJCQkJCQkJCSAiVGhlIHN1YnNjcmlwdGlvbiBzdWJz Y3JpYmVzIHRvIHB1YmxpY2F0aW9ucyAoJXMpIHRoYXQgY29udGFpbiB0YWJsZXMgdGhhdCBh cmUgd3JpdHRlbiB0byBieSBvdGhlciBzdWJzY3JpcHRpb25zLiIsCisJCQkJCQkJCQkgbGlz dF9sZW5ndGgocHVibGlzdCksIHB1Ym5hbWVzLmRhdGEpLAorCQkJCQllcnJoaW50KCJWZXJp ZnkgdGhhdCBpbml0aWFsIGRhdGEgY29waWVkIGZyb20gdGhlIHB1Ymxpc2hlciB0YWJsZXMg ZGlkIG5vdCBjb21lIGZyb20gb3RoZXIgb3JpZ2lucy4iKSk7CiAJCWVsc2UKLQkJewotCQkJ YXBwZW5kU3RyaW5nSW5mbyhlcnJfbXNnLCBfKCJzdWJzY3JpcHRpb24gXCIlc1wiIGVuYWJs ZWQgcmV0YWluX2RlYWRfdHVwbGVzIGJ1dCBtaWdodCBub3QgcmVsaWFibHkgZGV0ZWN0IGNv bmZsaWN0cyBmb3IgY2hhbmdlcyBmcm9tIGRpZmZlcmVudCBvcmlnaW5zIiksCi0JCQkJCQkJ IHN1Ym5hbWUpOwotCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhlcnJfaGludCwgXygiQ29u c2lkZXIgdXNpbmcgb3JpZ2luID0gTk9ORSBvciBkaXNhYmxpbmcgcmV0YWluX2RlYWRfdHVw bGVzLiIpKTsKLQkJfQotCi0JCWVyZXBvcnQoV0FSTklORywKLQkJCQllcnJjb2RlKEVSUkNP REVfT0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAotCQkJCWVycm1zZ19pbnRl cm5hbCgiJXMiLCBlcnJfbXNnLT5kYXRhKSwKLQkJCQllcnJkZXRhaWxfcGx1cmFsKCJUaGUg c3Vic2NyaXB0aW9uIHN1YnNjcmliZXMgdG8gYSBwdWJsaWNhdGlvbiAoJXMpIHRoYXQgY29u dGFpbnMgdGFibGVzIHRoYXQgYXJlIHdyaXR0ZW4gdG8gYnkgb3RoZXIgc3Vic2NyaXB0aW9u cy4iLAotCQkJCQkJCQkgIlRoZSBzdWJzY3JpcHRpb24gc3Vic2NyaWJlcyB0byBwdWJsaWNh dGlvbnMgKCVzKSB0aGF0IGNvbnRhaW4gdGFibGVzIHRoYXQgYXJlIHdyaXR0ZW4gdG8gYnkg b3RoZXIgc3Vic2NyaXB0aW9ucy4iLAotCQkJCQkJCQkgbGlzdF9sZW5ndGgocHVibGlzdCks IHB1Ym5hbWVzLT5kYXRhKSwKLQkJCQllcnJoaW50X2ludGVybmFsKCIlcyIsIGVycl9oaW50 LT5kYXRhKSk7CisJCQllcmVwb3J0KFdBUk5JTkcsCisJCQkJCWVycmNvZGUoRVJSQ09ERV9P QkpFQ1RfTk9UX0lOX1BSRVJFUVVJU0lURV9TVEFURSksCisJCQkJCWVycm1zZygic3Vic2Ny aXB0aW9uIFwiJXNcIiBlbmFibGVkIHJldGFpbl9kZWFkX3R1cGxlcyBidXQgbWlnaHQgbm90 IHJlbGlhYmx5IGRldGVjdCBjb25mbGljdHMgZm9yIGNoYW5nZXMgZnJvbSBkaWZmZXJlbnQg b3JpZ2lucyIsCisJCQkJCQkgICBzdWJuYW1lKSwKKwkJCQkJZXJyZGV0YWlsX3BsdXJhbCgi VGhlIHN1YnNjcmlwdGlvbiBzdWJzY3JpYmVzIHRvIGEgcHVibGljYXRpb24gKCVzKSB0aGF0 IGNvbnRhaW5zIHRhYmxlcyB0aGF0IGFyZSB3cml0dGVuIHRvIGJ5IG90aGVyIHN1YnNjcmlw dGlvbnMuIiwKKwkJCQkJCQkJCSAiVGhlIHN1YnNjcmlwdGlvbiBzdWJzY3JpYmVzIHRvIHB1 YmxpY2F0aW9ucyAoJXMpIHRoYXQgY29udGFpbiB0YWJsZXMgdGhhdCBhcmUgd3JpdHRlbiB0 byBieSBvdGhlciBzdWJzY3JpcHRpb25zLiIsCisJCQkJCQkJCQkgbGlzdF9sZW5ndGgocHVi bGlzdCksIHB1Ym5hbWVzLmRhdGEpLAorCQkJCQllcnJoaW50KCJDb25zaWRlciB1c2luZyBv cmlnaW4gPSBOT05FIG9yIGRpc2FibGluZyByZXRhaW5fZGVhZF90dXBsZXMuIikpOwogCX0K IAogCUV4ZWNEcm9wU2luZ2xlVHVwbGVUYWJsZVNsb3Qoc2xvdCk7CkBAIC0yNzE2LDI0ICsy NzEzLDE5IEBAIGNoZWNrX3B1YmxpY2F0aW9uc19vcmlnaW5fc2VxdWVuY2VzKFdhbFJlY2Vp dmVyQ29ubiAqd3Jjb25uLCBMaXN0ICpwdWJsaWNhdGlvbnMsCiAJICovCiAJaWYgKHB1Ymxp c3QpCiAJewotCQlTdHJpbmdJbmZvCXB1Ym5hbWVzID0gbWFrZVN0cmluZ0luZm8oKTsKLQkJ U3RyaW5nSW5mbwllcnJfbXNnID0gbWFrZVN0cmluZ0luZm8oKTsKLQkJU3RyaW5nSW5mbwll cnJfaGludCA9IG1ha2VTdHJpbmdJbmZvKCk7CisJCVN0cmluZ0luZm9EYXRhIHB1Ym5hbWVz OwogCiAJCS8qIFByZXBhcmUgdGhlIGxpc3Qgb2YgcHVibGljYXRpb24ocykgZm9yIHdhcm5p bmcgbWVzc2FnZS4gKi8KLQkJR2V0UHVibGljYXRpb25zU3RyKHB1Ymxpc3QsIHB1Ym5hbWVz LCBmYWxzZSk7Ci0KLQkJYXBwZW5kU3RyaW5nSW5mbyhlcnJfbXNnLCBfKCJzdWJzY3JpcHRp b24gXCIlc1wiIHJlcXVlc3RlZCBjb3B5X2RhdGEgd2l0aCBvcmlnaW4gPSBOT05FIGJ1dCBt aWdodCBjb3B5IGRhdGEgdGhhdCBoYWQgYSBkaWZmZXJlbnQgb3JpZ2luIiksCi0JCQkJCQkg c3VibmFtZSk7Ci0JCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoZXJyX2hpbnQsIF8oIlZlcmlm eSB0aGF0IGluaXRpYWwgZGF0YSBjb3BpZWQgZnJvbSB0aGUgcHVibGlzaGVyIHNlcXVlbmNl cyBkaWQgbm90IGNvbWUgZnJvbSBvdGhlciBvcmlnaW5zLiIpKTsKKwkJaW5pdFN0cmluZ0lu Zm8oJnB1Ym5hbWVzKTsKKwkJR2V0UHVibGljYXRpb25zU3RyKHB1Ymxpc3QsICZwdWJuYW1l cywgZmFsc2UpOwogCiAJCWVyZXBvcnQoV0FSTklORywKIAkJCQllcnJjb2RlKEVSUkNPREVf T0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAotCQkJCWVycm1zZ19pbnRlcm5h bCgiJXMiLCBlcnJfbXNnLT5kYXRhKSwKKwkJCQllcnJtc2coInN1YnNjcmlwdGlvbiBcIiVz XCIgcmVxdWVzdGVkIGNvcHlfZGF0YSB3aXRoIG9yaWdpbiA9IE5PTkUgYnV0IG1pZ2h0IGNv cHkgZGF0YSB0aGF0IGhhZCBhIGRpZmZlcmVudCBvcmlnaW4iLCBzdWJuYW1lKSwKIAkJCQll cnJkZXRhaWxfcGx1cmFsKCJUaGUgc3Vic2NyaXB0aW9uIHN1YnNjcmliZXMgdG8gYSBwdWJs aWNhdGlvbiAoJXMpIHRoYXQgY29udGFpbnMgc2VxdWVuY2VzIHRoYXQgYXJlIHdyaXR0ZW4g dG8gYnkgb3RoZXIgc3Vic2NyaXB0aW9ucy4iLAogCQkJCQkJCQkgIlRoZSBzdWJzY3JpcHRp b24gc3Vic2NyaWJlcyB0byBwdWJsaWNhdGlvbnMgKCVzKSB0aGF0IGNvbnRhaW4gc2VxdWVu Y2VzIHRoYXQgYXJlIHdyaXR0ZW4gdG8gYnkgb3RoZXIgc3Vic2NyaXB0aW9ucy4iLAotCQkJ CQkJCQkgbGlzdF9sZW5ndGgocHVibGlzdCksIHB1Ym5hbWVzLT5kYXRhKSwKLQkJCQllcnJo aW50X2ludGVybmFsKCIlcyIsIGVycl9oaW50LT5kYXRhKSk7CisJCQkJCQkJCSBsaXN0X2xl bmd0aChwdWJsaXN0KSwgcHVibmFtZXMuZGF0YSksCisJCQkJZXJyaGludCgiVmVyaWZ5IHRo YXQgaW5pdGlhbCBkYXRhIGNvcGllZCBmcm9tIHRoZSBwdWJsaXNoZXIgc2VxdWVuY2VzIGRp ZCBub3QgY29tZSBmcm9tIG90aGVyIG9yaWdpbnMuIikpOwogCX0KIAogCUV4ZWNEcm9wU2lu Z2xlVHVwbGVUYWJsZVNsb3Qoc2xvdCk7Ci0tIAoyLjQzLjAKCg== --------------IxWEQReRGMBN0CAHHQdKrTyX--