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 1sI8am-00DNZQ-N4 for pgsql-hackers@arkaria.postgresql.org; Fri, 14 Jun 2024 15:11:52 +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 1sI8ak-002DeV-9s for pgsql-hackers@arkaria.postgresql.org; Fri, 14 Jun 2024 15:11:51 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sI8aj-002DeM-TY for pgsql-hackers@lists.postgresql.org; Fri, 14 Jun 2024 15:11:50 +0000 Received: from mail-qk1-x729.google.com ([2607:f8b0:4864:20::729]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sI8ad-001ePk-6Q for pgsql-hackers@lists.postgresql.org; Fri, 14 Jun 2024 15:11:50 +0000 Received: by mail-qk1-x729.google.com with SMTP id af79cd13be357-7955dfce860so146579785a.2 for ; Fri, 14 Jun 2024 08:11:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dunslane-net.20230601.gappssmtp.com; s=20230601; t=1718377900; x=1718982700; darn=lists.postgresql.org; h=in-reply-to:autocrypt:content-language:references:to:from:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=wYI+scFWgiY4GbW9uA29H93HKV5G6uzOBSbv4GuBiyU=; b=cZ2493/V8N4Cbx/MAncLuEdzwC3uioab0ajqU5fSE+/0H4BgO8pAbRMh2meoQtpnR4 DCupPY9sb4IzousLIPp/1Gy1oro3hkV2QWd5hPTmyC0yfiwT7UQfywhcclJFPT+9KprJ bBE6+778WO1bFpqKngDWQklMte1UbJWZm1ErWGWgvnwnH8cWW+v6yt0EYUN1ih8qBVUp q4fkaKRPuJ0UNTgDDRD1/giv8l7u4WfIK8ou2XfOpK79pdM034BRnVpxdHJCtjVnm44j 4Mv8T4KJz158E05mhoUag9WGEbpZsZUt2sVnzgEKOFaNl7jBaIJJLo3EN3+OmvSujctx AM/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718377900; x=1718982700; h=in-reply-to:autocrypt:content-language:references:to:from:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=wYI+scFWgiY4GbW9uA29H93HKV5G6uzOBSbv4GuBiyU=; b=DqiKtMsUeQXR8LtKwNCrGextPqrMunIld/IQXa02IX46v+Eq63LV+YWkq7YWLqKpg9 VOd0/7CGWBVtlb8+VvYJuJHHU93yTinx00AsPDdyMAXSAFAXtws+nbluy/bWPBpXtsdp 2go/2/x7ffIWfs9gaPz/P+dABAInMfy9ZbsJ9iIZY1iEAiwiaGI/pzfZ7ysLkbJOM0SF hBPbMMVzy+Z4GHDRgVLN7Qi4pBwZ5PjuHkuROv1GJkLNqjOm6mKYXk5DQGCJAGiZPTkw XU4KB77LUQhR6BlGqbVJ5+y2iopWoW9jwIareFMWfwysEzzyNos+QP2eLM8KICOVyRcF MeyQ== X-Gm-Message-State: AOJu0YwL++5WN7Svxo57TVPwC1k7TOSMBF5ACX71wUdaKs9RFOn32BnG zDyXL9YoxQVBwG3YQKQlJLPOdJBDIaqbh7Wccyek05Zgvuj85HhPeGNHA7E2+dmGu6DcOXkhhGS e X-Google-Smtp-Source: AGHT+IETUtzqvDIbH7y5ia9gngYHJX3I+mTOxNY7Swd9BA5Nvf16mqefX2737yLtwYsCOPWfQ7IiOA== X-Received: by 2002:a05:620a:4554:b0:797:db7a:bc2 with SMTP id af79cd13be357-798d25922c1mr309858285a.57.1718377899526; Fri, 14 Jun 2024 08:11:39 -0700 (PDT) Received: from ?IPV6:2605:a601:9180:9800::2bb? ([2605:a601:9180:9800::2bb]) by smtp.googlemail.com with ESMTPSA id af79cd13be357-798ab6aba50sm151156585a.70.2024.06.14.08.11.38 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 14 Jun 2024 08:11:38 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------Zq000vvVPS29KWUBYb4LgEyW" Message-ID: <997f67ac-cc02-4076-9fda-db465e89c622@dunslane.net> Date: Fri, 14 Jun 2024 11:11:38 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Using LibPq in TAP tests via FFI From: Andrew Dunstan To: PostgreSQL Hackers References: <1150bf89-55ab-475a-9275-62e035c06633@dunslane.net> Content-Language: en-US Autocrypt: addr=andrew@dunslane.net; keydata= xsBNBE7KWFkBCAClridxur2AIc7eW2AR7izbfp3EnNefie2HbLF0izW5Ik5UjX2HBXBx4syI gY6b0ugohXrr274+baoAlvSbq6cAoQuEVrk5IZFzt20b1Xkx65FwGSEj526yiKLocqkJceSq Xr9xcA5SGY+FZv441chh5SU92v4q6z+6LPpoHOh97ptAVXZYNTtU0LevyvD5lja0TzbvJm6C eFXitJfnm1pLEr0DGJCR/iUOl/N62Kh4855zZC7NHIjQHPOvV5Stz/l5ilDhvGVk+xkXFPys SjZoUr1rXhYLpiyi5sR0X9FHXT0KnGuz1F5ERO7ZTLSSQ6fJwPj6gOk9K+vvoKvoeql5ABEB AAHNJEFuZHJldyBEdW5zdGFuIDxhbmRyZXdAZHVuc2xhbmUubmV0PsLAmwQTAQgARQIbAwIX gAIZAQULCQgHAgMiAgEGFQoJCAsCBBYCAwECHgcWIQTkPlhGHfx8v0RpFaWZ+n/LWfw7gQUC ZFlxxwUJGVGAbgAKCRCZ+n/LWfw7gXikB/9ZdcUy6CTBFIIuL/bVsc1eLEW/gJBjJBF6HxNY xgEkAgXAp4Lg4A5U+QB9GouFr7+GYxF0BU4hzoGhNPUWltxnHdMWP8nC/38LAqgMi8L/bbsm HW5YPBdWYaAZAPJQVfOAgjTbRUb26KSprpyrrJKW0ZmrZfjhNPcQ72jpWzoPLQqx2X6B0fru 1jq+cBh8lb6r1mJTim1T3JIn+F/v5VpdQS+EL8xqsHkfzKjIPsW3CIXpkypSk6saA55Rkkbl 26AW8ftPVB0Q6Lnn6FLt9CP0MGNixBQ55yq8r1K+nCBvCCjvQjM8RDm0UUum0WNl+ifQgTLO E8TWEnwVtkBf+3QWzsBNBE7KWFkBCADRnOM0FCzsYW6jtncg+dWIagjUZpvaClmqn/sJluLa Q3v1VXMQJzYs3eC1gh386W+XBwLRpDj3jzH81lX+p73Re3d3oJW7X+ffsxuzu5ZVdMUkqBYo nkAbKxr6gyJ12F/+JkUVzLcoTN+d/7YsQvUVi7NaKH8mJgjz112O4fUe3p9wfAaFa0RXHc5S GPzRTYRRlv/XZBIho4J2tkZOnteZJZ+GbxQVlINt6fd8P6al3MWOvpP/ExJPguEfjOsO6Njy xjo3WfpD4lHMOR/Oc3/8mScEF84rF2jXbsFgelWnbPWAvXY+pD0dXOFRkagGmC/viwBDqq5b 5tk76kKmUbZxABEBAAHCwHwEGAEIACYCGwwWIQTkPlhGHfx8v0RpFaWZ+n/LWfw7gQUCZFlx 5wUJGVGAjgAKCRCZ+n/LWfw7gf+iB/4g8CPY5jihf5r/8EsoIGe2H+dpVmpPF8YGBzTIvCz/ fQoOq8AX/pE76QEuFnFZWfjw+wgBXgCVmkox2Eflkk6z4ND3pcwGZ6CfCxTQCDk/dij+2DQ4 6bmDCy/sBgcbz9mTpoLC11HLoPae6YN9nBNQRZDcEFEu54OaVOqlIdbA6m+POIBCXZdHOFc0 WoDTgxHRzC1jgQNidyd6tKqcsVJs0dzF0oKTmFFmUAqTdJO12LBuNA1rlqrR3EtpYk8B/wtS 5dIMD7Q8hwQpL+4C6GNpb6ZKnPkLi47pDOLhz2qBrqN+rqUEsT3YnExYpzj5yOBi+FlmV1Hw 49QYe1sn2ZPs In-Reply-To: <1150bf89-55ab-475a-9275-62e035c06633@dunslane.net> 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. --------------Zq000vvVPS29KWUBYb4LgEyW Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 2024-06-14 Fr 11:09, Andrew Dunstan wrote: > Over at [1] Andres expressed enthusiasm for enabling TAP tests to call > LibPQ directly via FFI, and there was some support from others as > well. Attached is a very rough POC for just that.There are two perl > modules, one which wraps libpq (or almost all of it) in perl, and > another which uses that module to create a session object that can be > used to run SQL. Also in the patch is a modification of one TAP test > (arbitrarily chosen as src/bin/pg_amcheck/t/004_verify_heapam.p) to > use the new interface, so it doesn't use psql at all. > > There's a bunch of work to do here, but for a morning's work it's not > too bad :-) Luckily I had most of the first file already to hand. > > Next I plan to look at some of the recovery tests and other uses of > background_psql, which might be more challenging,a dn require > extension of the session API. Also there's a lot of error checking and > documentation that need to be added. > > > cheers > > > andrew > > > [1] > https://postgr.es/m/20240612152812.ixz3eiz2p475gose@awork3.anarazel.de > > And here's the patch cheers andrew -- Andrew Dunstan EDB: https://www.enterprisedb.com --------------Zq000vvVPS29KWUBYb4LgEyW Content-Type: text/x-patch; charset=UTF-8; name="pqffi-poc.patch" Content-Disposition: attachment; filename="pqffi-poc.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfYW1jaGVjay90LzAwNF92ZXJpZnlfaGVhcGFtLnBs IGIvc3JjL2Jpbi9wZ19hbWNoZWNrL3QvMDA0X3ZlcmlmeV9oZWFwYW0ucGwKaW5kZXggZjZk MmM1Zjc4Ny4uYzQ3ZmYzZjkzOSAxMDA2NDQKLS0tIGEvc3JjL2Jpbi9wZ19hbWNoZWNrL3Qv MDA0X3ZlcmlmeV9oZWFwYW0ucGwKKysrIGIvc3JjL2Jpbi9wZ19hbWNoZWNrL3QvMDA0X3Zl cmlmeV9oZWFwYW0ucGwKQEAgLTUsNiArNSw3IEBAIHVzZSBzdHJpY3Q7CiB1c2Ugd2Fybmlu Z3MgRkFUQUwgPT4gJ2FsbCc7CiAKIHVzZSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOwor dXNlIFBvc3RncmVTUUw6OlRlc3Q6OlNlc3Npb247CiB1c2UgUG9zdGdyZVNRTDo6VGVzdDo6 VXRpbHM7CiAKIHVzZSBUZXN0OjpNb3JlOwpAQCAtMTkwLDE2ICsxOTEsMTcgQEAgJG5vZGUt PmFwcGVuZF9jb25mKCdwb3N0Z3Jlc3FsLmNvbmYnLCAnbWF4X3ByZXBhcmVkX3RyYW5zYWN0 aW9ucz0xMCcpOwogJG5vZGUtPnN0YXJ0OwogbXkgJHBvcnQgPSAkbm9kZS0+cG9ydDsKIG15 ICRwZ2RhdGEgPSAkbm9kZS0+ZGF0YV9kaXI7Ci0kbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jl cycsICJDUkVBVEUgRVhURU5TSU9OIGFtY2hlY2siKTsKLSRub2RlLT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgIkNSRUFURSBFWFRFTlNJT04gcGFnZWluc3BlY3QiKTsKK215ICRzZXNzaW9u ID0gUG9zdGdyZVNRTDo6VGVzdDo6U2Vzc2lvbi0+bmV3KG5vZGUgPT4gJG5vZGUpOworJHNl c3Npb24tPmRvKCJDUkVBVEUgRVhURU5TSU9OIGFtY2hlY2siKTsKKyRzZXNzaW9uLT5kbygi Q1JFQVRFIEVYVEVOU0lPTiBwYWdlaW5zcGVjdCIpOwogCiAjIEdldCBhIG5vbi16ZXJvIGRh dGZyb3plbnhpZAotJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxcShWQUNVVU0gRlJF RVpFKSk7Ciskc2Vzc2lvbi0+ZG8ocXEoVkFDVVVNIEZSRUVaRSkpOwogCiAjIENyZWF0ZSB0 aGUgdGVzdCB0YWJsZSB3aXRoIHByZWNpc2VseSB0aGUgc2NoZW1hIHRoYXQgb3VyIGNvcnJ1 cHRpb24gZnVuY3Rpb24KICMgZXhwZWN0cy4KLSRub2RlLT5zYWZlX3BzcWwoCi0JJ3Bvc3Rn cmVzJywgcXEoCiskc2Vzc2lvbi0+ZG8oCisJcXEoCiAJCUNSRUFURSBUQUJMRSBwdWJsaWMu dGVzdCAoYSBCSUdJTlQsIGIgVEVYVCwgYyBURVhUKTsKIAkJQUxURVIgVEFCTEUgcHVibGlj LnRlc3QgU0VUIChhdXRvdmFjdXVtX2VuYWJsZWQ9ZmFsc2UpOwogCQlBTFRFUiBUQUJMRSBw dWJsaWMudGVzdCBBTFRFUiBDT0xVTU4gYyBTRVQgU1RPUkFHRSBFWFRFUk5BTDsKQEAgLTIw OSwxNCArMjExLDE1IEBAICRub2RlLT5zYWZlX3BzcWwoCiAjIFdlIHdhbnQgKDAgPCBkYXRm cm96ZW54aWQgPCB0ZXN0LnJlbGZyb3plbnhpZCkuICBUbyBhY2hpZXZlIHRoaXMsIHdlIGZy ZWV6ZQogIyBhbiBvdGhlcndpc2UgdW51c2VkIHRhYmxlLCBwdWJsaWMuanVuaywgcHJpb3Ig dG8gaW5zZXJ0aW5nIGRhdGEgYW5kIGZyZWV6aW5nCiAjIHB1YmxpYy50ZXN0Ci0kbm9kZS0+ c2FmZV9wc3FsKAotCSdwb3N0Z3JlcycsIHFxKAorJHNlc3Npb24tPmRvKAorCXFxKAogCQlD UkVBVEUgVEFCTEUgcHVibGljLmp1bmsgQVMgU0VMRUNUICdqdW5rJzo6VEVYVCBBUyBqdW5r X2NvbHVtbjsKIAkJQUxURVIgVEFCTEUgcHVibGljLmp1bmsgU0VUIChhdXRvdmFjdXVtX2Vu YWJsZWQ9ZmFsc2UpOwotCQlWQUNVVU0gRlJFRVpFIHB1YmxpYy5qdW5rCi0JKSk7CisJKSwK KyAgIAknVkFDVVVNIEZSRUVaRSBwdWJsaWMuanVuaycKKyk7CiAKLW15ICRyZWwgPSAkbm9k ZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCitteSAkcmVsID0gJHNlc3Npb24tPnF1ZXJ5X29u ZXZhbCgKIAlxcShTRUxFQ1QgcGdfcmVsYXRpb25fZmlsZXBhdGgoJ3B1YmxpYy50ZXN0Jykp KTsKIG15ICRyZWxwYXRoID0gIiRwZ2RhdGEvJHJlbCI7CiAKQEAgLTIyOSwyMyArMjMyLDI0 IEBAIG15ICRST1dDT1VOVF9CQVNJQyA9IDE2OwogCiAjIEZpcnN0IGluc2VydCBkYXRhIG5l ZWRlZCBmb3IgdGVzdHMgdW5yZWxhdGVkIHRvIHVwZGF0ZSBjaGFpbiB2YWxpZGF0aW9uLgog IyBUaGVuIGZyZWV6ZSB0aGUgcGFnZS4gVGhlc2UgdHVwbGVzIGFyZSBhdCBvZmZzZXQgbnVt YmVycyAxIHRvIDE2LgotJG5vZGUtPnNhZmVfcHNxbCgKLQkncG9zdGdyZXMnLCBxcSgKKyRz ZXNzaW9uLT5kbygKKwlxcSgKIAlJTlNFUlQgSU5UTyBwdWJsaWMudGVzdCAoYSwgYiwgYykK IAkJU0VMRUNUCiAJCQl4J0RFQURGOUY5REVBREY5RjknOjpiaWdpbnQsCiAJCQknYWJjZGVm ZycsCiAJCQlyZXBlYXQoJ3cnLCAxMDAwMCkKIAlGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAk Uk9XQ09VTlRfQkFTSUMpOwotCVZBQ1VVTSBGUkVFWkUgcHVibGljLnRlc3Q7KQorICAgICks CisJJ1ZBQ1VVTSBGUkVFWkUgcHVibGljLnRlc3QnCiApOwogCiAjIENyZWF0ZSBzb21lIHNp bXBsZSBIT1QgdXBkYXRlIGNoYWlucyBmb3IgbGluZSBwb2ludGVyIHZhbGlkYXRpb24uIEFm dGVyCiAjIHRoZSBwYWdlIGlzIEhPVCBwcnVuZWQsIHdlJ2xsIGhhdmUgdHdvIHJlZGlyZWN0 cyBsaW5lIHBvaW50ZXJzIGVhY2ggcG9pbnRpbmcKICMgdG8gYSB0dXBsZS4gV2UnbGwgdGhl biBjaGFuZ2UgdGhlIHNlY29uZCByZWRpcmVjdCB0byBwb2ludCB0byB0aGUgc2FtZQogIyB0 dXBsZSBhcyB0aGUgZmlyc3Qgb25lIGFuZCB2ZXJpZnkgdGhhdCB3ZSBjYW4gZGV0ZWN0IGNv cnJ1cHRpb24uCi0kbm9kZS0+c2FmZV9wc3FsKAotCSdwb3N0Z3JlcycsIHFxKAorJHNlc3Np b24tPmRvKAorCXFxKAogCQlJTlNFUlQgSU5UTyBwdWJsaWMudGVzdCAoYSwgYiwgYykKIAkJ CVZBTFVFUyAoIHgnREVBREY5RjlERUFERjlGOSc6OmJpZ2ludCwgJ2FiY2RlZmcnLAogCQkJ CQkgZ2VuZXJhdGVfc2VyaWVzKDEsMikpOyAtLSBvZmZzZXQgbnVtYmVycyAxNyBhbmQgMTgK QEAgLTI1NCw4ICsyNTgsOCBAQCAkbm9kZS0+c2FmZV9wc3FsKAogCSkpOwogCiAjIENyZWF0 ZSBzb21lIG1vcmUgSE9UIHVwZGF0ZSBjaGFpbnMuCi0kbm9kZS0+c2FmZV9wc3FsKAotCSdw b3N0Z3JlcycsIHFxKAorJHNlc3Npb24tPmRvKAorCXFxKAogCQlJTlNFUlQgSU5UTyBwdWJs aWMudGVzdCAoYSwgYiwgYykKIAkJCVZBTFVFUyAoIHgnREVBREY5RjlERUFERjlGOSc6OmJp Z2ludCwgJ2FiY2RlZmcnLAogCQkJCQkgZ2VuZXJhdGVfc2VyaWVzKDMsNikpOyAtLSBvZmZz ZXQgbnVtYmVycyAyMSB0aHJvdWdoIDI0CkBAIC0yNjQsMjUgKzI2OCwyOSBAQCAkbm9kZS0+ c2FmZV9wc3FsKAogCSkpOwogCiAjIE5lZ2F0aXZlIHRlc3QgY2FzZSBvZiBIT1QtcHJ1bmlu ZyB3aXRoIGFib3J0ZWQgdHVwbGUuCi0kbm9kZS0+c2FmZV9wc3FsKAotCSdwb3N0Z3Jlcycs IHFxKAorJHNlc3Npb24tPmRvKAorCXFxKAogCQlCRUdJTjsKIAkJVVBEQVRFIHB1YmxpYy50 ZXN0IFNFVCBjID0gJ2EnIFdIRVJFIGMgPSAnNSc7IC0tIG9mZnNldCBudW1iZXIgMjcKIAkJ QUJPUlQ7Ci0JCVZBQ1VVTSBGUkVFWkUgcHVibGljLnRlc3Q7Ci0JKSk7CisgICAgICAgKSwK KwkgICAnVkFDVVVNIEZSRUVaRSBwdWJsaWMudGVzdDsnLAorCSk7CiAKICMgTmV4dCB1cGRh dGUgb24gYW55IHR1cGxlIHdpbGwgYmUgc3RvcmVkIGF0IHRoZSBzYW1lIHBsYWNlIG9mIHR1 cGxlIGluc2VydGVkCiAjIGJ5IGFib3J0ZWQgdHJhbnNhY3Rpb24uIFRoaXMgc2hvdWxkIG5v dCBjYXVzZSB0aGUgdGFibGUgdG8gYXBwZWFyIGNvcnJ1cHQuCi0kbm9kZS0+c2FmZV9wc3Fs KAotCSdwb3N0Z3JlcycsIHFxKAorJHNlc3Npb24tPmRvKAorCXFxKAorICAgICAgICBCRUdJ TjsKIAkJVVBEQVRFIHB1YmxpYy50ZXN0IFNFVCBjID0gJ2EnIFdIRVJFIGMgPSAnNic7IC0t IG9mZnNldCBudW1iZXIgMjcgYWdhaW4KKyAgICAgICAgQ09NTUlUOwogCQlWQUNVVU0gRlJF RVpFIHB1YmxpYy50ZXN0OwogCSkpOwogCiAjIERhdGEgZm9yIEhPVCBjaGFpbiB2YWxpZGF0 aW9uLCBzbyBub3QgY2FsbGluZyBWQUNVVU0gRlJFRVpFLgotJG5vZGUtPnNhZmVfcHNxbCgK LQkncG9zdGdyZXMnLCBxcSgKKyRzZXNzaW9uLT5kbygKKwlxcSgKKyAgICAgICAgQkVHSU47 CiAJCUlOU0VSVCBJTlRPIHB1YmxpYy50ZXN0IChhLCBiLCBjKQogCQkJVkFMVUVTICggeCdE RUFERjlGOURFQURGOUY5Jzo6YmlnaW50LCAnYWJjZGVmZycsCiAJCQkJCSBnZW5lcmF0ZV9z ZXJpZXMoNywxNSkpOyAtLSBvZmZzZXQgbnVtYmVycyAyOCB0byAzNgpAQCAtMjkzLDExICsz MDEsMTIgQEAgJG5vZGUtPnNhZmVfcHNxbCgKIAkJVVBEQVRFIHB1YmxpYy50ZXN0IFNFVCBj ID0gJ2EnIFdIRVJFIGMgPSAnMTMnOyAtLSBvZmZzZXQgbnVtYmVyIDQxCiAJCVVQREFURSBw dWJsaWMudGVzdCBTRVQgYyA9ICdhJyBXSEVSRSBjID0gJzE0JzsgLS0gb2Zmc2V0IG51bWJl ciA0MgogCQlVUERBVEUgcHVibGljLnRlc3QgU0VUIGMgPSAnYScgV0hFUkUgYyA9ICcxNSc7 IC0tIG9mZnNldCBudW1iZXIgNDMKKyAgICAgICAgQ09NTUlUOwogCSkpOwogCiAjIE5lZWQg b25lIGFib3J0ZWQgdHJhbnNhY3Rpb24gdG8gdGVzdCBjb3JydXB0aW9uIGluIEhPVCBjaGFp bnMuCi0kbm9kZS0+c2FmZV9wc3FsKAotCSdwb3N0Z3JlcycsIHFxKAorJHNlc3Npb24tPmRv KAorCXFxKAogCQlCRUdJTjsKIAkJVVBEQVRFIHB1YmxpYy50ZXN0IFNFVCBjID0gJ2EnIFdI RVJFIGMgPSAnOSc7IC0tIG9mZnNldCBudW1iZXIgNDQKIAkJQUJPUlQ7CkBAIC0zMDYsMTkg KzMxNSwxOSBAQCAkbm9kZS0+c2FmZV9wc3FsKAogIyBOZWVkIG9uZSBpbi1wcm9ncmVzcyB0 cmFuc2FjdGlvbiB0byB0ZXN0IGZldyBjb3JydXB0aW9uIGluIEhPVCBjaGFpbnMuCiAjIFdl IGFyZSBjcmVhdGluZyBQUkVQQVJFIFRSQU5TQUNUSU9OIGhlcmUgYXMgdGhlc2Ugd2lsbCBu b3QgYmUgYWJvcnRlZAogIyBldmVuIGlmIHdlIHN0b3AgdGhlIG5vZGUuCi0kbm9kZS0+c2Fm ZV9wc3FsKAotCSdwb3N0Z3JlcycsIHFxKAorJHNlc3Npb24tPmRvKAorCXFxKAogCQlCRUdJ TjsKIAkJUFJFUEFSRSBUUkFOU0FDVElPTiAnaW5fcHJvZ3Jlc3NfdHgnOwogCSkpOwotbXkg JGluX3Byb2dyZXNzX3hpZCA9ICRub2RlLT5zYWZlX3BzcWwoCi0JJ3Bvc3RncmVzJywgcXEo CitteSAkaW5fcHJvZ3Jlc3NfeGlkID0gJHNlc3Npb24tPnF1ZXJ5X29uZXZhbCgKKwlxcSgK IAkJU0VMRUNUIHRyYW5zYWN0aW9uIEZST00gcGdfcHJlcGFyZWRfeGFjdHM7CiAJKSk7CiAK LW15ICRyZWxmcm96ZW54aWQgPSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCitteSAk cmVsZnJvemVueGlkID0gJHNlc3Npb24tPnF1ZXJ5X29uZXZhbCgKIAlxKHNlbGVjdCByZWxm cm96ZW54aWQgZnJvbSBwZ19jbGFzcyB3aGVyZSByZWxuYW1lID0gJ3Rlc3QnKSk7Ci1teSAk ZGF0ZnJvemVueGlkID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorbXkgJGRhdGZy b3plbnhpZCA9ICRzZXNzaW9uLT5xdWVyeV9vbmV2YWwoCiAJcShzZWxlY3QgZGF0ZnJvemVu eGlkIGZyb20gcGdfZGF0YWJhc2Ugd2hlcmUgZGF0bmFtZSA9ICdwb3N0Z3JlcycpKTsKIAog IyBTYW5pdHkgY2hlY2sgdGhhdCBvdXIgJ3Rlc3QnIHRhYmxlIGhhcyBhIHJlbGZyb3plbnhp ZCBuZXdlciB0aGFuIHRoZQpAQCAtMzI2LDYgKzMzNSw3IEBAIG15ICRkYXRmcm96ZW54aWQg PSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCiAjIGZpcnN0IG5vcm1hbCB4aWQuICBX ZSByZWx5IG9uIHRoZXNlIGludmFyaWFudHMgaW4gc29tZSBvZiBvdXIgdGVzdHMuCiBpZiAo JGRhdGZyb3plbnhpZCA8PSAzIHx8ICRkYXRmcm96ZW54aWQgPj0gJHJlbGZyb3plbnhpZCkK IHsKKwkkc2Vzc2lvbi0+Y2xvc2U7CiAJJG5vZGUtPmNsZWFuX25vZGU7CiAJcGxhbiBza2lw X2FsbCA9PgogCSAgIlhpZCB0aHJlc2hvbGRzIG5vdCBhcyBleHBlY3RlZDogZ290IGRhdGZy b3plbnhpZCA9ICRkYXRmcm96ZW54aWQsIHJlbGZyb3plbnhpZCA9ICRyZWxmcm96ZW54aWQi OwpAQCAtMzM0LDE3ICszNDQsMjEgQEAgaWYgKCRkYXRmcm96ZW54aWQgPD0gMyB8fCAkZGF0 ZnJvemVueGlkID49ICRyZWxmcm96ZW54aWQpCiAKICMgRmluZCB3aGVyZSBlYWNoIG9mIHRo ZSB0dXBsZXMgaXMgbG9jYXRlZCBvbiB0aGUgcGFnZS4gSWYgYSBwYXJ0aWN1bGFyCiAjIGxp bmUgcG9pbnRlciBpcyBhIHJlZGlyZWN0IHJhdGhlciB0aGFuIGEgdHVwbGUsIHdlIHJlY29y ZCB0aGUgb2Zmc2V0IGFzIC0xLgotbXkgQGxwX29mZiA9IHNwbGl0ICdcbicsICRub2RlLT5z YWZlX3BzcWwoCi0JJ3Bvc3RncmVzJywgcXEoCitteSAkbHBfb2ZmX3JlcyA9ICRzZXNzaW9u LT5xdWVyeSgKKwlxcSgKIAkgICAgU0VMRUNUIENBU0UgV0hFTiBscF9mbGFncyA9IDIgVEhF TiAtMSBFTFNFIGxwX29mZiBFTkQKIAkgICAgRlJPTSBoZWFwX3BhZ2VfaXRlbXMoZ2V0X3Jh d19wYWdlKCd0ZXN0JywgJ21haW4nLCAwKSkKICAgICApCi0pOworICAgKTsKK215IEBscF9v ZmY7CitwdXNoKEBscF9vZmYsICRfLT5bMF0pIGZvcmVhY2ggQHskbHBfb2ZmX3Jlcy0+e3Jv d3N9fTsKKwogc2NhbGFyIEBscF9vZmYgPT0gJFJPV0NPVU5UIG9yIEJBSUxfT1VUKCJyb3cg b2Zmc2V0IGNvdW50cyBtaXNtYXRjaCIpOwogCiAjIFNhbml0eSBjaGVjayB0aGF0IG91ciAn dGVzdCcgdGFibGUgb24gZGlzayBsYXlvdXQgbWF0Y2hlcyBleHBlY3RhdGlvbnMuICBJZgog IyB0aGlzIGlzIG5vdCBzbywgd2Ugd2lsbCBoYXZlIHRvIHNraXAgdGhlIHRlc3QgdW50aWwg c29tZWJvZHkgdXBkYXRlcyB0aGUgdGVzdAogIyB0byB3b3JrIG9uIHRoaXMgcGxhdGZvcm0u Ciskc2Vzc2lvbi0+Y2xvc2U7CiAkbm9kZS0+c3RvcDsKIG15ICRmaWxlOwogb3BlbigkZmls ZSwgJys8JywgJHJlbHBhdGgpCkBAIC03NTAsMTcgKzc2NCwxOSBAQCBmb3IgKG15ICR0dXBp ZHggPSAwOyAkdHVwaWR4IDwgJFJPV0NPVU5UOyAkdHVwaWR4KyspCiBjbG9zZSgkZmlsZSkK ICAgb3IgQkFJTF9PVVQoImNsb3NlIGZhaWxlZDogJCEiKTsKICRub2RlLT5zdGFydDsKKyRz ZXNzaW9uLT5yZWNvbm5lY3Q7CiAKICMgUnVuIHBnX2FtY2hlY2sgYWdhaW5zdCB0aGUgY29y cnVwdCB0YWJsZSB3aXRoIGVwb2NoPTAsIGNvbXBhcmluZyBhY3R1YWwKICMgY29ycnVwdGlv biBtZXNzYWdlcyBhZ2FpbnN0IHRoZSBleHBlY3RlZCBtZXNzYWdlcwogJG5vZGUtPmNvbW1h bmRfY2hlY2tzX2FsbCgKIAlbICdwZ19hbWNoZWNrJywgJy0tbm8tZGVwZW5kZW50LWluZGV4 ZXMnLCAnLXAnLCAkcG9ydCwgJ3Bvc3RncmVzJyBdLAogCTIsIFtAZXhwZWN0ZWRdLCBbXSwg J0V4cGVjdGVkIGNvcnJ1cHRpb24gbWVzc2FnZSBvdXRwdXQnKTsKLSRub2RlLT5zYWZlX3Bz cWwoCi0JJ3Bvc3RncmVzJywgcXEoCiskc2Vzc2lvbi0+ZG8oCisJcXEoCiAgICAgICAgICAg ICAgICAgICAgICAgICBDT01NSVQgUFJFUEFSRUQgJ2luX3Byb2dyZXNzX3R4JzsKICAgICAg ICAgKSk7CiAKKyRzZXNzaW9uLT5jbG9zZTsKICRub2RlLT50ZWFyZG93bl9ub2RlOwogJG5v ZGUtPmNsZWFuX25vZGU7CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3BlcmwvUG9zdGdyZVNR TC9QcUZGSS5wbSBiL3NyYy90ZXN0L3BlcmwvUG9zdGdyZVNRTC9QcUZGSS5wbQpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5mYWM1NDRkMzJjCi0tLSAvZGV2L251 bGwKKysrIGIvc3JjL3Rlc3QvcGVybC9Qb3N0Z3JlU1FML1BxRkZJLnBtCkBAIC0wLDAgKzEs NTY0IEBACisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj CisjCisjIEZGSSB3cmFwcGVyIGZvciBsaWJwcQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3BhY2thZ2UgUG9zdGdyZVNRTDo6UHFGRkk7CisK K3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7CisKK3VzZSBGRkk6 OlBsYXR5cHVzOwordXNlIEZGSTo6Q2hlY2tMaWI7CisKK3VzZSBFeHBvcnRlciBxdyhpbXBv cnQpOworCitvdXIgQEVYUE9SVCA9IHF3ICgKKworICBDT05ORUNUSU9OX09LCisgIENPTk5F Q1RJT05fQkFECisgIENPTk5FQ1RJT05fU1RBUlRFRAorICBDT05ORUNUSU9OX01BREUKKyAg Q09OTkVDVElPTl9BV0FJVElOR19SRVNQT05TRQorICBDT05ORUNUSU9OX0FVVEhfT0sKKyAg Q09OTkVDVElPTl9TRVRFTlYKKyAgQ09OTkVDVElPTl9TU0xfU1RBUlRVUAorICBDT05ORUNU SU9OX05FRURFRAorICBDT05ORUNUSU9OX0NIRUNLX1dSSVRBQkxFCisgIENPTk5FQ1RJT05f Q09OU1VNRQorICBDT05ORUNUSU9OX0dTU19TVEFSVFVQCisgIENPTk5FQ1RJT05fQ0hFQ0tf VEFSR0VUCisgIENPTk5FQ1RJT05fQ0hFQ0tfU1RBTkRCWQorCisgIFBHUkVTX0VNUFRZX1FV RVJZCisgIFBHUkVTX0NPTU1BTkRfT0sKKyAgUEdSRVNfVFVQTEVTX09LCisgIFBHUkVTX0NP UFlfT1VUCisgIFBHUkVTX0NPUFlfSU4KKyAgUEdSRVNfQkFEX1JFU1BPTlNFCisgIFBHUkVT X05PTkZBVEFMX0VSUk9SCisgIFBHUkVTX0ZBVEFMX0VSUk9SCisgIFBHUkVTX0NPUFlfQk9U SAorICBQR1JFU19TSU5HTEVfVFVQTEUKKyAgUEdSRVNfUElQRUxJTkVfU1lOQworICBQR1JF U19QSVBFTElORV9BQk9SVEVECisKKyAgUFFQSU5HX09LCisgIFBRUElOR19SRUpFQ1QKKyAg UFFQSU5HX05PX1JFU1BPTlNFCisgIFBRUElOR19OT19BVFRFTVBUCisKKyAgUFFUUkFOU19J RExFCisgIFBRVFJBTlNfQUNUSVZFCisgIFBRVFJBTlNfSU5UUkFOUworICBQUVRSQU5TX0lO RVJST1IKKyAgUFFUUkFOU19VTktOT1dOCisKKyAgQk9PTE9JRAorICBCWVRFQU9JRAorICBD SEFST0lECisgIE5BTUVPSUQKKyAgSU5UOE9JRAorICBJTlQyT0lECisgIElOVDJWRUNUT1JP SUQKKyAgSU5UNE9JRAorICBURVhUT0lECisgIE9JRE9JRAorICBUSURPSUQKKyAgWElET0lE CisgIENJRE9JRAorICBPSURWRUNUT1JPSUQKKyAgSlNPTk9JRAorICBYTUxPSUQKKyAgWElE OE9JRAorICBQT0lOVE9JRAorICBMU0VHT0lECisgIFBBVEhPSUQKKyAgQk9YT0lECisgIFBP TFlHT05PSUQKKyAgTElORU9JRAorICBGTE9BVDRPSUQKKyAgRkxPQVQ4T0lECisgIFVOS05P V05PSUQKKyAgQ0lSQ0xFT0lECisgIE1PTkVZT0lECisgIE1BQ0FERFJPSUQKKyAgSU5FVE9J RAorICBDSURST0lECisgIE1BQ0FERFI4T0lECisgIEFDTElURU1PSUQKKyAgQlBDSEFST0lE CisgIFZBUkNIQVJPSUQKKyAgREFURU9JRAorICBUSU1FT0lECisgIFRJTUVTVEFNUE9JRAor ICBUSU1FU1RBTVBUWk9JRAorICBJTlRFUlZBTE9JRAorICBUSU1FVFpPSUQKKyAgQklUT0lE CisgIFZBUkJJVE9JRAorICBOVU1FUklDT0lECisgIFJFRkNVUlNPUk9JRAorICBVVUlET0lE CisgIFRTVkVDVE9ST0lECisgIEdUU1ZFQ1RPUk9JRAorICBUU1FVRVJZT0lECisgIEpTT05C T0lECisgIEpTT05QQVRIT0lECisgIFRYSURfU05BUFNIT1RPSUQKKyAgSU5UNFJBTkdFT0lE CisgIE5VTVJBTkdFT0lECisgIFRTUkFOR0VPSUQKKyAgVFNUWlJBTkdFT0lECisgIERBVEVS QU5HRU9JRAorICBJTlQ4UkFOR0VPSUQKKyAgSU5UNE1VTFRJUkFOR0VPSUQKKyAgTlVNTVVM VElSQU5HRU9JRAorICBUU01VTFRJUkFOR0VPSUQKKyAgVFNUWk1VTFRJUkFOR0VPSUQKKyAg REFURU1VTFRJUkFOR0VPSUQKKyAgSU5UOE1VTFRJUkFOR0VPSUQKKyAgUkVDT1JET0lECisg IFJFQ09SREFSUkFZT0lECisgIENTVFJJTkdPSUQKKyAgVk9JRE9JRAorICBUUklHR0VST0lE CisgIEVWRU5UX1RSSUdHRVJPSUQKKyAgQk9PTEFSUkFZT0lECisgIEJZVEVBQVJSQVlPSUQK KyAgQ0hBUkFSUkFZT0lECisgIE5BTUVBUlJBWU9JRAorICBJTlQ4QVJSQVlPSUQKKyAgSU5U MkFSUkFZT0lECisgIElOVDJWRUNUT1JBUlJBWU9JRAorICBJTlQ0QVJSQVlPSUQKKyAgVEVY VEFSUkFZT0lECisgIE9JREFSUkFZT0lECisgIFRJREFSUkFZT0lECisgIFhJREFSUkFZT0lE CisgIENJREFSUkFZT0lECisgIE9JRFZFQ1RPUkFSUkFZT0lECisgIEpTT05BUlJBWU9JRAor ICBYTUxBUlJBWU9JRAorICBYSUQ4QVJSQVlPSUQKKyAgUE9JTlRBUlJBWU9JRAorICBMU0VH QVJSQVlPSUQKKyAgUEFUSEFSUkFZT0lECisgIEJPWEFSUkFZT0lECisgIFBPTFlHT05BUlJB WU9JRAorICBMSU5FQVJSQVlPSUQKKyAgRkxPQVQ0QVJSQVlPSUQKKyAgRkxPQVQ4QVJSQVlP SUQKKyAgQ0lSQ0xFQVJSQVlPSUQKKyAgTU9ORVlBUlJBWU9JRAorICBNQUNBRERSQVJSQVlP SUQKKyAgSU5FVEFSUkFZT0lECisgIENJRFJBUlJBWU9JRAorICBNQUNBRERSOEFSUkFZT0lE CisgIEFDTElURU1BUlJBWU9JRAorICBCUENIQVJBUlJBWU9JRAorICBWQVJDSEFSQVJSQVlP SUQKKyAgREFURUFSUkFZT0lECisgIFRJTUVBUlJBWU9JRAorICBUSU1FU1RBTVBBUlJBWU9J RAorICBUSU1FU1RBTVBUWkFSUkFZT0lECisgIElOVEVSVkFMQVJSQVlPSUQKKyAgVElNRVRa QVJSQVlPSUQKKyAgQklUQVJSQVlPSUQKKyAgVkFSQklUQVJSQVlPSUQKKyAgTlVNRVJJQ0FS UkFZT0lECisgIFJFRkNVUlNPUkFSUkFZT0lECisgIFVVSURBUlJBWU9JRAorICBUU1ZFQ1RP UkFSUkFZT0lECisgIEdUU1ZFQ1RPUkFSUkFZT0lECisgIFRTUVVFUllBUlJBWU9JRAorICBK U09OQkFSUkFZT0lECisgIEpTT05QQVRIQVJSQVlPSUQKKyAgVFhJRF9TTkFQU0hPVEFSUkFZ T0lECisgIElOVDRSQU5HRUFSUkFZT0lECisgIE5VTVJBTkdFQVJSQVlPSUQKKyAgVFNSQU5H RUFSUkFZT0lECisgIFRTVFpSQU5HRUFSUkFZT0lECisgIERBVEVSQU5HRUFSUkFZT0lECisg IElOVDhSQU5HRUFSUkFZT0lECisgIElOVDRNVUxUSVJBTkdFQVJSQVlPSUQKKyAgTlVNTVVM VElSQU5HRUFSUkFZT0lECisgIFRTTVVMVElSQU5HRUFSUkFZT0lECisgIFRTVFpNVUxUSVJB TkdFQVJSQVlPSUQKKyAgREFURU1VTFRJUkFOR0VBUlJBWU9JRAorICBJTlQ4TVVMVElSQU5H RUFSUkFZT0lECisgIENTVFJJTkdBUlJBWU9JRAorCispOworCisjIGNvbm5lY3Rpb24gc3Rh dHVzCisKK3VzZSBjb25zdGFudCB7CisJQ09OTkVDVElPTl9PSyA9PiAwLAorCUNPTk5FQ1RJ T05fQkFEID0+IDEsCisJIyBOb24tYmxvY2tpbmcgbW9kZSBvbmx5IGJlbG93IGhlcmUKKwor CUNPTk5FQ1RJT05fU1RBUlRFRCA9PiAyLAorCUNPTk5FQ1RJT05fTUFERSA9PiAzLAorCUNP Tk5FQ1RJT05fQVdBSVRJTkdfUkVTUE9OU0UgPT4gNCwKKwlDT05ORUNUSU9OX0FVVEhfT0sg PT4gNSwKKwlDT05ORUNUSU9OX1NFVEVOViA9PiA2LAorCUNPTk5FQ1RJT05fU1NMX1NUQVJU VVAgPT4gNywKKwlDT05ORUNUSU9OX05FRURFRCA9PiA4LAorCUNPTk5FQ1RJT05fQ0hFQ0tf V1JJVEFCTEUgPT4gOSwKKwlDT05ORUNUSU9OX0NPTlNVTUUgPT4gMTAsCisJQ09OTkVDVElP Tl9HU1NfU1RBUlRVUCA9PiAxMSwKKwlDT05ORUNUSU9OX0NIRUNLX1RBUkdFVCA9PiAxMiwK KwlDT05ORUNUSU9OX0NIRUNLX1NUQU5EQlkgPT4gMTMsCit9OworCisjIGV4ZWMgc3RhdHVz CisKK3VzZSBjb25zdGFudCB7CisJUEdSRVNfRU1QVFlfUVVFUlkgPT4gMCwKKwlQR1JFU19D T01NQU5EX09LID0+IDEsCisJUEdSRVNfVFVQTEVTX09LID0+IDIsCisJUEdSRVNfQ09QWV9P VVQgPT4gMywKKwlQR1JFU19DT1BZX0lOID0+IDQsCisJUEdSRVNfQkFEX1JFU1BPTlNFID0+ IDUsCisJUEdSRVNfTk9ORkFUQUxfRVJST1IgPT4gNiwKKwlQR1JFU19GQVRBTF9FUlJPUiA9 PiA3LAorCVBHUkVTX0NPUFlfQk9USCA9PiA4LAorCVBHUkVTX1NJTkdMRV9UVVBMRSA9PiA5 LAorCVBHUkVTX1BJUEVMSU5FX1NZTkMgPT4gMTAsCisJUEdSRVNfUElQRUxJTkVfQUJPUlRF RCA9PiAxMSwKK307CisKKyMgcGluZyBzdGF0dXMKKwordXNlIGNvbnN0YW50IHsKKwlQUVBJ TkdfT0sgPT4gMCwKKwlQUVBJTkdfUkVKRUNUID0+IDEsCisJUFFQSU5HX05PX1JFU1BPTlNF ID0+IDIsCisJUFFQSU5HX05PX0FUVEVNUFQgPT4gMywKK307CisKKyMgdHhuIHN0YXR1cwor dXNlIGNvbnN0YW50IHsKKwlQUVRSQU5TX0lETEUgPT4gMCwKKwlQUVRSQU5TX0FDVElWRSA9 PiAxLAorCVBRVFJBTlNfSU5UUkFOUyA9PiAyLAorCVBRVFJBTlNfSU5FUlJPUiA9PiAzLAor CVBRVFJBTlNfVU5LTk9XTiA9PiA0LAorfTsKKworIyB0eXBlIG9pZHMKK3VzZSBjb25zdGFu dCB7CisJQk9PTE9JRCA9PiAxNiwKKwlCWVRFQU9JRCA9PiAxNywKKwlDSEFST0lEID0+IDE4 LAorCU5BTUVPSUQgPT4gMTksCisJSU5UOE9JRCA9PiAyMCwKKwlJTlQyT0lEID0+IDIxLAor CUlOVDJWRUNUT1JPSUQgPT4gMjIsCisJSU5UNE9JRCA9PiAyMywKKwlURVhUT0lEID0+IDI1 LAorCU9JRE9JRCA9PiAyNiwKKwlUSURPSUQgPT4gMjcsCisJWElET0lEID0+IDI4LAorCUNJ RE9JRCA9PiAyOSwKKwlPSURWRUNUT1JPSUQgPT4gMzAsCisJSlNPTk9JRCA9PiAxMTQsCisJ WE1MT0lEID0+IDE0MiwKKwlYSUQ4T0lEID0+IDUwNjksCisJUE9JTlRPSUQgPT4gNjAwLAor CUxTRUdPSUQgPT4gNjAxLAorCVBBVEhPSUQgPT4gNjAyLAorCUJPWE9JRCA9PiA2MDMsCisJ UE9MWUdPTk9JRCA9PiA2MDQsCisJTElORU9JRCA9PiA2MjgsCisJRkxPQVQ0T0lEID0+IDcw MCwKKwlGTE9BVDhPSUQgPT4gNzAxLAorCVVOS05PV05PSUQgPT4gNzA1LAorCUNJUkNMRU9J RCA9PiA3MTgsCisJTU9ORVlPSUQgPT4gNzkwLAorCU1BQ0FERFJPSUQgPT4gODI5LAorCUlO RVRPSUQgPT4gODY5LAorCUNJRFJPSUQgPT4gNjUwLAorCU1BQ0FERFI4T0lEID0+IDc3NCwK KwlBQ0xJVEVNT0lEID0+IDEwMzMsCisJQlBDSEFST0lEID0+IDEwNDIsCisJVkFSQ0hBUk9J RCA9PiAxMDQzLAorCURBVEVPSUQgPT4gMTA4MiwKKwlUSU1FT0lEID0+IDEwODMsCisJVElN RVNUQU1QT0lEID0+IDExMTQsCisJVElNRVNUQU1QVFpPSUQgPT4gMTE4NCwKKwlJTlRFUlZB TE9JRCA9PiAxMTg2LAorCVRJTUVUWk9JRCA9PiAxMjY2LAorCUJJVE9JRCA9PiAxNTYwLAor CVZBUkJJVE9JRCA9PiAxNTYyLAorCU5VTUVSSUNPSUQgPT4gMTcwMCwKKwlSRUZDVVJTT1JP SUQgPT4gMTc5MCwKKwlVVUlET0lEID0+IDI5NTAsCisJVFNWRUNUT1JPSUQgPT4gMzYxNCwK KwlHVFNWRUNUT1JPSUQgPT4gMzY0MiwKKwlUU1FVRVJZT0lEID0+IDM2MTUsCisJSlNPTkJP SUQgPT4gMzgwMiwKKwlKU09OUEFUSE9JRCA9PiA0MDcyLAorCVRYSURfU05BUFNIT1RPSUQg PT4gMjk3MCwKKwlJTlQ0UkFOR0VPSUQgPT4gMzkwNCwKKwlOVU1SQU5HRU9JRCA9PiAzOTA2 LAorCVRTUkFOR0VPSUQgPT4gMzkwOCwKKwlUU1RaUkFOR0VPSUQgPT4gMzkxMCwKKwlEQVRF UkFOR0VPSUQgPT4gMzkxMiwKKwlJTlQ4UkFOR0VPSUQgPT4gMzkyNiwKKwlJTlQ0TVVMVElS QU5HRU9JRCA9PiA0NDUxLAorCU5VTU1VTFRJUkFOR0VPSUQgPT4gNDUzMiwKKwlUU01VTFRJ UkFOR0VPSUQgPT4gNDUzMywKKwlUU1RaTVVMVElSQU5HRU9JRCA9PiA0NTM0LAorCURBVEVN VUxUSVJBTkdFT0lEID0+IDQ1MzUsCisJSU5UOE1VTFRJUkFOR0VPSUQgPT4gNDUzNiwKKwlS RUNPUkRPSUQgPT4gMjI0OSwKKwlSRUNPUkRBUlJBWU9JRCA9PiAyMjg3LAorCUNTVFJJTkdP SUQgPT4gMjI3NSwKKwlWT0lET0lEID0+IDIyNzgsCisJVFJJR0dFUk9JRCA9PiAyMjc5LAor CUVWRU5UX1RSSUdHRVJPSUQgPT4gMzgzOCwKKwlCT09MQVJSQVlPSUQgPT4gMTAwMCwKKwlC WVRFQUFSUkFZT0lEID0+IDEwMDEsCisJQ0hBUkFSUkFZT0lEID0+IDEwMDIsCisJTkFNRUFS UkFZT0lEID0+IDEwMDMsCisJSU5UOEFSUkFZT0lEID0+IDEwMTYsCisJSU5UMkFSUkFZT0lE ID0+IDEwMDUsCisJSU5UMlZFQ1RPUkFSUkFZT0lEID0+IDEwMDYsCisJSU5UNEFSUkFZT0lE ID0+IDEwMDcsCisJVEVYVEFSUkFZT0lEID0+IDEwMDksCisJT0lEQVJSQVlPSUQgPT4gMTAy OCwKKwlUSURBUlJBWU9JRCA9PiAxMDEwLAorCVhJREFSUkFZT0lEID0+IDEwMTEsCisJQ0lE QVJSQVlPSUQgPT4gMTAxMiwKKwlPSURWRUNUT1JBUlJBWU9JRCA9PiAxMDEzLAorCUpTT05B UlJBWU9JRCA9PiAxOTksCisJWE1MQVJSQVlPSUQgPT4gMTQzLAorCVhJRDhBUlJBWU9JRCA9 PiAyNzEsCisJUE9JTlRBUlJBWU9JRCA9PiAxMDE3LAorCUxTRUdBUlJBWU9JRCA9PiAxMDE4 LAorCVBBVEhBUlJBWU9JRCA9PiAxMDE5LAorCUJPWEFSUkFZT0lEID0+IDEwMjAsCisJUE9M WUdPTkFSUkFZT0lEID0+IDEwMjcsCisJTElORUFSUkFZT0lEID0+IDYyOSwKKwlGTE9BVDRB UlJBWU9JRCA9PiAxMDIxLAorCUZMT0FUOEFSUkFZT0lEID0+IDEwMjIsCisJQ0lSQ0xFQVJS QVlPSUQgPT4gNzE5LAorCU1PTkVZQVJSQVlPSUQgPT4gNzkxLAorCU1BQ0FERFJBUlJBWU9J RCA9PiAxMDQwLAorCUlORVRBUlJBWU9JRCA9PiAxMDQxLAorCUNJRFJBUlJBWU9JRCA9PiA2 NTEsCisJTUFDQUREUjhBUlJBWU9JRCA9PiA3NzUsCisJQUNMSVRFTUFSUkFZT0lEID0+IDEw MzQsCisJQlBDSEFSQVJSQVlPSUQgPT4gMTAxNCwKKwlWQVJDSEFSQVJSQVlPSUQgPT4gMTAx NSwKKwlEQVRFQVJSQVlPSUQgPT4gMTE4MiwKKwlUSU1FQVJSQVlPSUQgPT4gMTE4MywKKwlU SU1FU1RBTVBBUlJBWU9JRCA9PiAxMTE1LAorCVRJTUVTVEFNUFRaQVJSQVlPSUQgPT4gMTE4 NSwKKwlJTlRFUlZBTEFSUkFZT0lEID0+IDExODcsCisJVElNRVRaQVJSQVlPSUQgPT4gMTI3 MCwKKwlCSVRBUlJBWU9JRCA9PiAxNTYxLAorCVZBUkJJVEFSUkFZT0lEID0+IDE1NjMsCisJ TlVNRVJJQ0FSUkFZT0lEID0+IDEyMzEsCisJUkVGQ1VSU09SQVJSQVlPSUQgPT4gMjIwMSwK KwlVVUlEQVJSQVlPSUQgPT4gMjk1MSwKKwlUU1ZFQ1RPUkFSUkFZT0lEID0+IDM2NDMsCisJ R1RTVkVDVE9SQVJSQVlPSUQgPT4gMzY0NCwKKwlUU1FVRVJZQVJSQVlPSUQgPT4gMzY0NSwK KwlKU09OQkFSUkFZT0lEID0+IDM4MDcsCisJSlNPTlBBVEhBUlJBWU9JRCA9PiA0MDczLAor CVRYSURfU05BUFNIT1RBUlJBWU9JRCA9PiAyOTQ5LAorCUlOVDRSQU5HRUFSUkFZT0lEID0+ IDM5MDUsCisJTlVNUkFOR0VBUlJBWU9JRCA9PiAzOTA3LAorCVRTUkFOR0VBUlJBWU9JRCA9 PiAzOTA5LAorCVRTVFpSQU5HRUFSUkFZT0lEID0+IDM5MTEsCisJREFURVJBTkdFQVJSQVlP SUQgPT4gMzkxMywKKwlJTlQ4UkFOR0VBUlJBWU9JRCA9PiAzOTI3LAorCUlOVDRNVUxUSVJB TkdFQVJSQVlPSUQgPT4gNjE1MCwKKwlOVU1NVUxUSVJBTkdFQVJSQVlPSUQgPT4gNjE1MSwK KwlUU01VTFRJUkFOR0VBUlJBWU9JRCA9PiA2MTUyLAorCVRTVFpNVUxUSVJBTkdFQVJSQVlP SUQgPT4gNjE1MywKKwlEQVRFTVVMVElSQU5HRUFSUkFZT0lEID0+IDYxNTUsCisJSU5UOE1V TFRJUkFOR0VBUlJBWU9JRCA9PiA2MTU3LAorCUNTVFJJTkdBUlJBWU9JRCA9PiAxMjYzLAor fTsKKworCisKK215IEBwcm9jcyA9IHF3KAorCisgIFBRY29ubmVjdGRiCisgIFBRY29ubmVj dGRiUGFyYW1zCisgIFBRc2V0ZGJMb2dpbgorICBQUWZpbmlzaAorICBQUXJlc2V0CisgIFBR ZGIKKyAgUFF1c2VyCisgIFBRcGFzcworICBQUWhvc3QKKyAgUFFob3N0YWRkcgorICBQUXBv cnQKKyAgUFF0dHkKKyAgUFFvcHRpb25zCisgIFBRc3RhdHVzCisgIFBRdHJhbnNhY3Rpb25T dGF0dXMKKyAgUFFwYXJhbWV0ZXJTdGF0dXMKKyAgUFFwaW5nCisgIFBRcGluZ1BhcmFtcwor CisgIFBRZXhlYworICBQUWV4ZWNQYXJhbXMKKyAgUFFwcmVwYXJlCisgIFBRZXhlY1ByZXBh cmVkCisKKyAgUFFkZXNjcmliZVByZXBhcmVkCisgIFBRZGVzY3JpYmVQb3J0YWwKKworICBQ UWNsb3NlUHJlcGFyZWQKKyAgUFFjbG9zZVBvcnRhbAorICBQUWNsZWFyCisKKyAgUFFwcm90 b2NvbFZlcnNpb24KKyAgUFFzZXJ2ZXJWZXJzaW9uCisgIFBRZXJyb3JNZXNzYWdlCisgIFBR c29ja2V0CisgIFBRYmFja2VuZFBJRAorICBQUWNvbm5lY3Rpb25OZWVkc1Bhc3N3b3JkCisg IFBRY29ubmVjdGlvblVzZWRQYXNzd29yZAorICBQUWNvbm5lY3Rpb25Vc2VkR1NTQVBJCisg IFBRY2xpZW50RW5jb2RpbmcKKyAgUFFzZXRDbGllbnRFbmNvZGluZworCisgIFBRcmVzdWx0 U3RhdHVzCisgIFBRcmVzU3RhdHVzCisgIFBRcmVzdWx0RXJyb3JNZXNzYWdlCisgIFBRcmVz dWx0RXJyb3JGaWVsZAorICBQUW50dXBsZXMKKyAgUFFuZmllbGRzCisgIFBRYmluYXJ5VHVw bGVzCisgIFBRZm5hbWUKKyAgUFFmbnVtYmVyCisgIFBRZnRhYmxlCisgIFBRZnRhYmxlY29s CisgIFBRZmZvcm1hdAorICBQUWZ0eXBlCisgIFBRZnNpemUKKyAgUFFmbW9kCisgIFBRY21k U3RhdHVzCisgIFBRb2lkVmFsdWUKKyAgUFFjbWRUdXBsZXMKKyAgUFFnZXR2YWx1ZQorICBQ UWdldGxlbmd0aAorICBQUWdldGlzbnVsbAorICBQUW5wYXJhbXMKKyAgUFFwYXJhbXR5cGUK KworKTsKKworcHVzaChARVhQT1JULCBAcHJvY3MpOworCitzdWIgc2V0dXAKK3sKKwlteSAk bGliZGlyID0gc2hpZnQ7CisKKwlteSAkZmZpID0gRkZJOjpQbGF0eXB1cy0+bmV3KGFwaSA9 PiAxKTsKKworCSRmZmktPnR5cGUoJ29wYXF1ZScgPT4gJ1BHY29ubicpOworCSRmZmktPnR5 cGUoJ29wYXF1ZScgPT4gJ1BHcmVzdWx0Jyk7CisJJGZmaS0+dHlwZSgndWludDMyJyA9PiAn T2lkJyk7CisJJGZmaS0+dHlwZSgnaW50JyA9PiAnRXhlY1N0YXR1c1R5cGUnKTsKKworCW15 ICRsaWIgPSBmaW5kX2xpYl9vcl9kaWUoCisJCWxpYiA9PiAncHEnLAorCQlsaWJwYXRoID0+ IFskbGliZGlyXSwKKwkJc3lzdGVtcGF0aCA9PiBbXSwpOworCSRmZmktPmxpYigkbGliKTsK KworCSRmZmktPmF0dGFjaCgnUFFjb25uZWN0ZGInID0+IFsnc3RyaW5nJ10gPT4gJ1BHY29u bicpOworCSRmZmktPmF0dGFjaCgKKwkJJ1BRY29ubmVjdGRiUGFyYW1zJyA9PiBbICdzdHJp bmdbXScsICdzdHJpbmdbXScsICdpbnQnIF0gPT4gJ1BHY29ubicpOworCSRmZmktPmF0dGFj aCgKKwkJJ1BRc2V0ZGJMb2dpbicgPT4gWworCQkJJ3N0cmluZycsICdzdHJpbmcnLCAnc3Ry aW5nJywgJ3N0cmluZycsCisJCQknc3RyaW5nJywgJ3N0cmluZycsICdzdHJpbmcnLAorCQld ID0+ICdQR2Nvbm4nKTsKKwkkZmZpLT5hdHRhY2goJ1BRZmluaXNoJyA9PiBbJ1BHY29ubidd ID0+ICd2b2lkJyk7CisJJGZmaS0+YXR0YWNoKCdQUXJlc2V0JyA9PiBbJ1BHY29ubiddID0+ ICd2b2lkJyk7CisJJGZmaS0+YXR0YWNoKCdQUWRiJyA9PiBbJ1BHY29ubiddID0+ICdzdHJp bmcnKTsKKwkkZmZpLT5hdHRhY2goJ1BRdXNlcicgPT4gWydQR2Nvbm4nXSA9PiAnc3RyaW5n Jyk7CisJJGZmaS0+YXR0YWNoKCdQUXBhc3MnID0+IFsnUEdjb25uJ10gPT4gJ3N0cmluZycp OworCSRmZmktPmF0dGFjaCgnUFFob3N0JyA9PiBbJ1BHY29ubiddID0+ICdzdHJpbmcnKTsK KwkkZmZpLT5hdHRhY2goJ1BRaG9zdGFkZHInID0+IFsnUEdjb25uJ10gPT4gJ3N0cmluZycp OworCSRmZmktPmF0dGFjaCgnUFFwb3J0JyA9PiBbJ1BHY29ubiddID0+ICdzdHJpbmcnKTsK KwkkZmZpLT5hdHRhY2goJ1BRdHR5JyA9PiBbJ1BHY29ubiddID0+ICdzdHJpbmcnKTsKKwkk ZmZpLT5hdHRhY2goJ1BRb3B0aW9ucycgPT4gWydQR2Nvbm4nXSA9PiAnc3RyaW5nJyk7CisJ JGZmaS0+YXR0YWNoKCdQUXN0YXR1cycgPT4gWydQR2Nvbm4nXSA9PiAnaW50Jyk7CisJJGZm aS0+YXR0YWNoKCdQUXRyYW5zYWN0aW9uU3RhdHVzJyA9PiBbJ1BHY29ubiddID0+ICdpbnQn KTsKKwkkZmZpLT5hdHRhY2goJ1BRcGFyYW1ldGVyU3RhdHVzJyA9PiBbICdQR2Nvbm4nLCAn c3RyaW5nJyBdID0+ICdzdHJpbmcnKTsKKwkkZmZpLT5hdHRhY2goJ1BRcGluZycgPT4gWydz dHJpbmcnXSA9PiAnaW50Jyk7CisJJGZmaS0+YXR0YWNoKAorCQknUFFwaW5nUGFyYW1zJyA9 PiBbICdzdHJpbmdbXScsICdzdHJpbmdbXScsICdpbnQnIF0gPT4gJ2ludCcpOworCisJJGZm aS0+YXR0YWNoKCdQUXByb3RvY29sVmVyc2lvbicgPT4gWydQR2Nvbm4nXSA9PiAnaW50Jyk7 CisJJGZmaS0+YXR0YWNoKCdQUXNlcnZlclZlcnNpb24nID0+IFsnUEdjb25uJ10gPT4gJ2lu dCcpOworCSRmZmktPmF0dGFjaCgnUFFlcnJvck1lc3NhZ2UnID0+IFsnUEdjb25uJ10gPT4g J3N0cmluZycpOworCSRmZmktPmF0dGFjaCgnUFFzb2NrZXQnID0+IFsnUEdjb25uJ10gPT4g J2ludCcpOworCSRmZmktPmF0dGFjaCgnUFFiYWNrZW5kUElEJyA9PiBbJ1BHY29ubiddID0+ ICdpbnQnKTsKKwkkZmZpLT5hdHRhY2goJ1BRY29ubmVjdGlvbk5lZWRzUGFzc3dvcmQnID0+ IFsnUEdjb25uJ10gPT4gJ2ludCcpOworCSRmZmktPmF0dGFjaCgnUFFjb25uZWN0aW9uVXNl ZFBhc3N3b3JkJyA9PiBbJ1BHY29ubiddID0+ICdpbnQnKTsKKwkkZmZpLT5hdHRhY2goJ1BR Y29ubmVjdGlvblVzZWRHU1NBUEknID0+IFsnUEdjb25uJ10gPT4gJ2ludCcpOworCSRmZmkt PmF0dGFjaCgnUFFjbGllbnRFbmNvZGluZycgPT4gWydQR2Nvbm4nXSA9PiAnaW50Jyk7CisJ JGZmaS0+YXR0YWNoKCdQUXNldENsaWVudEVuY29kaW5nJyA9PiBbICdQR2Nvbm4nLCAnc3Ry aW5nJyBdID0+ICdpbnQnKTsKKworCSRmZmktPmF0dGFjaCgnUFFleGVjJyA9PiBbICdQR2Nv bm4nLCAnc3RyaW5nJyBdID0+ICdQR3Jlc3VsdCcpOworCSRmZmktPmF0dGFjaCgKKwkJJ1BR ZXhlY1BhcmFtcycgPT4gWworCQkJJ1BHY29ubicsICdzdHJpbmcnLCAnaW50JywgJ2ludFtd JywKKwkJCSdzdHJpbmdbXScsICdpbnRbXScsICdpbnRbXScsICdpbnQnCisJCV0gPT4gJ1BH cmVzdWx0Jyk7CisJJGZmaS0+YXR0YWNoKAorCQknUFFwcmVwYXJlJyA9PiBbICdQR2Nvbm4n LCAnc3RyaW5nJywgJ3N0cmluZycsICdpbnQnLCAnaW50W10nIF0gPT4KKwkJICAnUEdyZXN1 bHQnKTsKKwkkZmZpLT5hdHRhY2goCisJCSdQUWV4ZWNQcmVwYXJlZCcgPT4gWyAnUEdjb25u JywgJ3N0cmluZycsICdpbnQnLAorCQkJJ3N0cmluZ1tdJywgJ2ludFtdJywgJ2ludFtdJywg J2ludCcgXSA9PiAnUEdyZXN1bHQnKTsKKworCSRmZmktPmF0dGFjaCgnUFFyZXN1bHRTdGF0 dXMnID0+IFsnUEdyZXN1bHQnXSA9PiAnRXhlY1N0YXR1c1R5cGUnKTsKKwkkZmZpLT5hdHRh Y2goJ1BRcmVzU3RhdHVzJyA9PiBbJ0V4ZWNTdGF0dXNUeXBlJ10gPT4gJ3N0cmluZycpOwor CSRmZmktPmF0dGFjaCgnUFFyZXN1bHRFcnJvck1lc3NhZ2UnID0+IFsnUEdyZXN1bHQnXSA9 PiAnc3RyaW5nJyk7CisJJGZmaS0+YXR0YWNoKCdQUXJlc3VsdEVycm9yRmllbGQnID0+IFsg J1BHcmVzdWx0JywgJ2ludCcgXSA9PiAnc3RyaW5nJyk7CisJJGZmaS0+YXR0YWNoKCdQUW50 dXBsZXMnID0+IFsnUEdyZXN1bHQnXSA9PiAnaW50Jyk7CisJJGZmaS0+YXR0YWNoKCdQUW5m aWVsZHMnID0+IFsnUEdyZXN1bHQnXSA9PiAnaW50Jyk7CisJJGZmaS0+YXR0YWNoKCdQUWJp bmFyeVR1cGxlcycgPT4gWydQR3Jlc3VsdCddID0+ICdpbnQnKTsKKwkkZmZpLT5hdHRhY2go J1BRZm5hbWUnID0+IFsgJ1BHcmVzdWx0JywgJ2ludCcgXSA9PiAnc3RyaW5nJyk7CisJJGZm aS0+YXR0YWNoKCdQUWZudW1iZXInID0+IFsgJ1BHcmVzdWx0JywgJ3N0cmluZycgXSA9PiAn aW50Jyk7CisJJGZmaS0+YXR0YWNoKCdQUWZ0YWJsZScgPT4gWyAnUEdyZXN1bHQnLCAnaW50 JyBdID0+ICdPaWQnKTsKKwkkZmZpLT5hdHRhY2goJ1BRZnRhYmxlY29sJyA9PiBbICdQR3Jl c3VsdCcsICdpbnQnIF0gPT4gJ2ludCcpOworCSRmZmktPmF0dGFjaCgnUFFmZm9ybWF0JyA9 PiBbICdQR3Jlc3VsdCcsICdpbnQnIF0gPT4gJ2ludCcpOworCSRmZmktPmF0dGFjaCgnUFFm dHlwZScgPT4gWyAnUEdyZXN1bHQnLCAnaW50JyBdID0+ICdPaWQnKTsKKwkkZmZpLT5hdHRh Y2goJ1BRZnNpemUnID0+IFsgJ1BHcmVzdWx0JywgJ2ludCcgXSA9PiAnaW50Jyk7CisJJGZm aS0+YXR0YWNoKCdQUWZtb2QnID0+IFsgJ1BHcmVzdWx0JywgJ2ludCcgXSA9PiAnaW50Jyk7 CisJJGZmaS0+YXR0YWNoKCdQUWNtZFN0YXR1cycgPT4gWydQR3Jlc3VsdCddID0+ICdzdHJp bmcnKTsKKwkkZmZpLT5hdHRhY2goJ1BRb2lkVmFsdWUnID0+IFsnUEdyZXN1bHQnXSA9PiAn T2lkJyk7CisJJGZmaS0+YXR0YWNoKCdQUWNtZFR1cGxlcycgPT4gWydQR3Jlc3VsdCddID0+ ICdzdHJpbmcnKTsKKwkkZmZpLT5hdHRhY2goJ1BRZ2V0dmFsdWUnID0+IFsgJ1BHcmVzdWx0 JywgJ2ludCcsICdpbnQnIF0gPT4gJ3N0cmluZycpOworCSRmZmktPmF0dGFjaCgnUFFnZXRs ZW5ndGgnID0+IFsgJ1BHcmVzdWx0JywgJ2ludCcsICdpbnQnIF0gPT4gJ2ludCcpOworCSRm ZmktPmF0dGFjaCgnUFFnZXRpc251bGwnID0+IFsgJ1BHcmVzdWx0JywgJ2ludCcsICdpbnQn IF0gPT4gJ2ludCcpOworCSRmZmktPmF0dGFjaCgnUFFucGFyYW1zJyA9PiBbJ1BHcmVzdWx0 J10gPT4gJ2ludCcpOworCSRmZmktPmF0dGFjaCgnUFFwYXJhbXR5cGUnID0+IFsgJ1BHcmVz dWx0JywgJ2ludCcgXSA9PiAnT2lkJyk7CisKKworCSRmZmktPmF0dGFjaCgKKwkJJ1BRZGVz Y3JpYmVQcmVwYXJlZCcgPT4gWyAnUEdjb25uJywgJ3N0cmluZycgXSA9PiAnUEdyZXN1bHQn KTsKKwkkZmZpLT5hdHRhY2goJ1BRZGVzY3JpYmVQb3J0YWwnID0+IFsgJ1BHY29ubicsICdz dHJpbmcnIF0gPT4gJ1BHcmVzdWx0Jyk7CisKKwkkZmZpLT5hdHRhY2goJ1BRY2xvc2VQcmVw YXJlZCcgPT4gWyAnUEdjb25uJywgJ3N0cmluZycgXSA9PiAnUEdyZXN1bHQnKTsKKwkkZmZp LT5hdHRhY2goJ1BRY2xvc2VQb3J0YWwnID0+IFsgJ1BHY29ubicsICdzdHJpbmcnIF0gPT4g J1BHcmVzdWx0Jyk7CisJJGZmaS0+YXR0YWNoKCdQUWNsZWFyJyA9PiBbJ1BHcmVzdWx0J10g PT4gJ3ZvaWQnKTsKK30KKworCisxOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcGVybC9Qb3N0 Z3JlU1FML1Rlc3QvU2Vzc2lvbi5wbSBiL3NyYy90ZXN0L3BlcmwvUG9zdGdyZVNRTC9UZXN0 L1Nlc3Npb24ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uNzQ0 NDNhOWVlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3BlcmwvUG9zdGdyZVNRTC9U ZXN0L1Nlc3Npb24ucG0KQEAgLTAsMCArMSwxNDMgQEAKK3BhY2thZ2UgUG9zdGdyZVNRTDo6 VGVzdDo6U2Vzc2lvbjsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5ncyBGQVRBTCA9PiAn YWxsJzsKKworCit1c2UgUG9zdGdyZVNRTDo6UHFGRkk7CisKK215ICRzZXR1cF9vazsKKwor c3ViIHNldHVwCit7CisJcmV0dXJuIGlmICRzZXR1cF9vazsKKwlteSAkbGliZGlyID0gc2hp ZnQ7CisJUG9zdGdyZVNRTDo6UHFGRkk6OnNldHVwKCRsaWJkaXIpOworCSRzZXR1cF9vayA9 IDE7Cit9CisKK3N1YiBuZXcKK3sKKwlteSAkY2xhc3MgPSBzaGlmdDsKKwlteSAkc2VsZiA9 IHt9OworCWJsZXNzICRzZWxmLCAkY2xhc3M7CisJbXkgJWFyZ3MgPSBAXzsKKwlteSAkbm9k ZSA9ICRhcmdze25vZGV9OworCW15ICRkYm5hbWUgPSAkYXJnc3tkYm5hbWV9IHx8ICdwb3N0 Z3Jlcyc7CisJZGllICJiYWQgbm9kZSIgdW5sZXNzICRub2RlLT5pc2EoIlBvc3RncmVTUUw6 OlRlc3Q6OkNsdXN0ZXIiKTsKKwl1bmxlc3MgKCRzZXR1cF9vaykKKwl7CisJCW15ICRsaWJk aXIgPSAkbm9kZS0+Y29uZmlnX2RhdGEoJy0tbGliZGlyJyk7CisJCXNldHVwKCRsaWJkaXIp OworCX0KKwkkc2VsZi0+e2Nvbm5zdHJ9ID0gJG5vZGUtPmNvbm5zdHIoJGRibmFtZSk7CisJ JHNlbGYtPntjb25ufSA9IFBRY29ubmVjdGRiKCRzZWxmLT57Y29ubnN0cn0pOworCXJldHVy biAkc2VsZjsKK30KKworc3ViIGNsb3NlCit7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlQUWZp bmlzaCgkc2VsZi0+e2Nvbm59KTsKKwlkZWxldGUgJHNlbGYtPntjb25ufTsKK30KKworc3Vi IERFU1RST1kKK3sKKwlteSAkc2VsZiA9IHNoaWZ0OworCSRzZWxmLT5jbG9zZSBpZiAkc2Vs Zi0+e2Nvbm59OworfQorCitzdWIgcmVjb25uZWN0Cit7CisJbXkgJHNlbGYgPSBzaGlmdDsK Kwkkc2VsZi0+Y2xvc2UgaWYgJHNlbGYtPntjb25ufTsKKwkkc2VsZi0+e2Nvbm59ID0gUFFj b25uZWN0ZGIoJHNlbGYtPntjb25uc3RyfSk7CQorfQorCisjIHJ1biBzb21lIHNxbCB3aGlj aCBkb2Vzbid0IHJldHVybiB0dXBsZXMKKworc3ViIGRvCit7CisJbXkgJHNlbGYgPSBzaGlm dDsKKwlteSAkY29ubiA9ICRzZWxmLT57Y29ubn07CisJZm9yZWFjaCBteSAkc3FsIChAXykK Kwl7CisJCW15ICRyZXN1bHQgPSBQUWV4ZWMoJGNvbm4sICRzcWwpOworCQlteSAkb2sgPSAk cmVzdWx0ICYmIChQUXJlc3VsdFN0YXR1cygkcmVzdWx0KSA9PSBQR1JFU19DT01NQU5EX09L KTsKKwkJUFFjbGVhcigkcmVzdWx0KTsKKwkJcmV0dXJuIHVuZGVmIHVubGVzcyAkb2s7CisJ fQorCXJldHVybiAxOworfQorCisjIHJ1biBzb21lIHNxbCB0aGF0IGRvZXMgcmV0dXJuIHR1 cGxlcworCitzdWIgcXVlcnkKK3sKKwlteSAkc2VsZiA9IHNoaWZ0OworCW15ICRzcWwgPSBz aGlmdDsKKwlteSAkY29ubiA9ICRzZWxmLT57Y29ubn07CisJbXkgJHJlc3VsdCA9IFBRZXhl YygkY29ubiwgJHNxbCk7CisJbXkgJG9rID0gJHJlc3VsdCAmJiAoUFFyZXN1bHRTdGF0dXMo JHJlc3VsdCkgPT0gUEdSRVNfVFVQTEVTX09LKTsKKwl1bmxlc3MgICgkb2spCisJeworCQlQ UWNsZWFyKCRyZXN1bHQpOworCQlyZXR1cm4gdW5kZWY7CisJfQorCW15ICRudHVwbGVzID0g UFFudHVwbGVzKCRyZXN1bHQpOworCW15ICRuZmllbGRzID0gUFFuZmllbGRzKCRyZXN1bHQp OworCW15ICRyZXMgPSB7CW5hbWVzID0+IFtdLCB0eXBlcyA9PiBbXSwgcm93cyA9PiBbXSwg fTsKKwkjIGFzc3VtaW5nIGhlcmUgdGhhdCB0aGUgc3RyaW5ncyByZXR1cm5lZCBieSBQUWZu YW1lIGFuZCBQUWdldHZhbHVlCisJIyBhcmUgbWFwcGVkIGludG8gcGVybCBzcGFjZSB1c2lu ZyBzZXRzdnB2IG9yIHNpbWlsYXIgYW5kIHRodXMgd29uJ3QKKwkjIGJlIGFmZmVjdCBieSB1 cyBjYWxsaW5nIFBRY2xlYXIgb24gdGhlIHJlc3VsdCBvYmplY3QuCisJZm9yZWFjaCBteSAk ZmllbGQgKDAgLi4gJG5maWVsZHMtMSkKKwl7CisJCXB1c2goQHskcmVzLT57bmFtZXN9fSwg UFFmbmFtZSgkcmVzdWx0LCAkZmllbGQpKTsKKwkJcHVzaChAeyRyZXMtPnt0eXBlc319LCBQ UWZ0eXBlKCRyZXN1bHQsICRmaWVsZCkpOworCX0KKwlmb3JlYWNoIG15ICRucm93ICgwLi4g JG50dXBsZXMgLSAxKQorCXsKKwkJbXkgJHJvdyA9IFtdOworCQlmb3JlYWNoIG15ICRmaWVs ZCAoIDAgLi4gJG5maWVsZHMpCisJCXsKKwkJCW15ICR2YWwgPSBQUWdldHZhbHVlKCRyZXN1 bHQsICRucm93LCAkZmllbGQpOworCQkJaWYgKCgkdmFsIC8vICIiKSBlcSAiIikKKwkJCXsK KwkJCQkkdmFsID0gdW5kZWYgaWYgUFFnZXRpc251bGwoJHJlc3VsdCwgJG5yb3csICRmaWVs ZCk7CisJCQl9CisJCQlwdXNoKEAkcm93LCAkdmFsKTsKKwkJfQorCQlwdXNoKEB7JHJlcy0+ e3Jvd3N9fSwgJHJvdyk7CisJfQorCVBRY2xlYXIoJHJlc3VsdCk7CisJcmV0dXJuICRyZXM7 Cit9CisKK3N1YiBxdWVyeV9vbmV2YWwKK3sKKwlteSAkc2VsZiA9IHNoaWZ0OworCW15ICRz cWwgPSBzaGlmdDsKKwlteSAkY29ubiA9ICRzZWxmLT57Y29ubn07CisJbXkgJHJlc3VsdCA9 IFBRZXhlYygkY29ubiwgJHNxbCk7CisJbXkgJG9rID0gJHJlc3VsdCAmJiAoUFFyZXN1bHRT dGF0dXMoJHJlc3VsdCkgPT0gUEdSRVNfVFVQTEVTX09LKTsKKwl1bmxlc3MgICgkb2spCisJ eworCQlQUWNsZWFyKCRyZXN1bHQpOworCQlyZXR1cm4gdW5kZWY7CisJfQorCW15ICRudHVw bGVzID0gUFFudHVwbGVzKCRyZXN1bHQpOworCW15ICRuZmllbGRzID0gUFFuZmllbGRzKCRy ZXN1bHQpOworCWRpZSAiJG50dXBsZXMgdHVwbGVzICE9IDEgb3IgJG5maWVsZHMgZmllbGRz ICE9IDEiCisJICBpZiAkbnR1cGxlcyAhPSAxIHx8ICRuZmllbGRzICE9IDE7CisJbXkgJHZh bCA9IFBRZ2V0dmFsdWUoJHJlc3VsdCwgMCwgMCk7CisJaWYgKCR2YWwgZXEgIiIpCisJewor CQkkdmFsID0gdW5kZWYgaWYgUEdnZXRpc251bGwoJHJlc3VsdCwgMCwgMCk7CisJfQorCVBR Y2xlYXIoJHJlc3VsdCk7CisJcmV0dXJuICR2YWw7CisJCit9CisKKzE7Cg== --------------Zq000vvVPS29KWUBYb4LgEyW--