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.96) (envelope-from ) id 1vpOhj-007Q6w-2B for pgsql-hackers@arkaria.postgresql.org; Mon, 09 Feb 2026 10:41:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vpOhh-00A9vq-2G for pgsql-hackers@arkaria.postgresql.org; Mon, 09 Feb 2026 10:41:17 +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.96) (envelope-from ) id 1vpOhh-00A9vh-0x for pgsql-hackers@lists.postgresql.org; Mon, 09 Feb 2026 10:41:17 +0000 Received: from mail-ed1-x52d.google.com ([2a00:1450:4864:20::52d]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vpOhe-00000001nd0-20Da for pgsql-hackers@lists.postgresql.org; Mon, 09 Feb 2026 10:41:16 +0000 Received: by mail-ed1-x52d.google.com with SMTP id 4fb4d7f45d1cf-65832e566edso5608636a12.2 for ; Mon, 09 Feb 2026 02:41:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770633673; cv=none; d=google.com; s=arc-20240605; b=CHw36dRruUbhZsXhxYn9E/IkWxg9gfNSHrJg+aP0/IvE3wpWfh6HNGozaDlKj882I4 vjqqzotgVKez0UBqq8jc4A36yPO/3kacMT5Mv/OUOXLfuwrXcDdlElJQ328hhRVqkoil bDbE9ZRiZ5pFXkSDuspGpEWTFjUFxYB0StvFFSBG380Se+Mqr/kzA18G71E/9RH4xH8e PgxzfNQZ/zSMMSe0YbMr61oYWkKWkJFDUHrZS6aNxSlzZPnfZEQ7bWUBOglOjrOlXmgP slpj/4ldkafRJyEufkLxiB5aiofrYBmXXu6LNmJAX/eZKDG9QtA/ETKTaUaIv1LwXVAu PB9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=wRZtWhEupTEsa5Haa/ZGULLeUlTCbsJAcTuTRTPYbCE=; fh=PCElDQIIAdSsae8xvLaGuY4STS5z8jMO38KG/bNjtro=; b=hhWCk0Q9YuWWBb3fxseqbQoH6H+RQp0HGVvjIAV+12ZL+R8mx4+auelDSJhoM8AOW8 h1otWlA7Fq6Z7cZ+Fputfts3pyaNLo0mpqgNxLYpGXXk6n3nctthAyTBB2EwVCfPnMDk msWpDVaBaJ7r+7K+IoujOKJ2DdjpF9Cd+MgJuyFBl4PvOTkPa7BBR3tkLLbFMxMIcnhg 6bD2Ow1INCHyj8Ti113kRiWiuRIqrkBlvK1PAZ3xbqAKZN6pzQrGDd4DkID1Cfm/e758 A0oXDohoSX7GVeoCqliU/NUdlHSHNK8dcxuK2KRObVB4hX0AP4r443b6lYyHDS8Z+DOi pN5A==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770633673; x=1771238473; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=wRZtWhEupTEsa5Haa/ZGULLeUlTCbsJAcTuTRTPYbCE=; b=S4zZu7ihrO2aygs8kwXUJFFQm+4eVZnWDsJwKU9T6wsesGKPzXG8wIeQED73+pY1Q2 t1jpoMdP7d6/V6/EsqNILkaHeGR6SXXF/R8Z2UNE1unoqYd43EBBUywRFit05TjwvHbD 7KRCajeIqBorqVQbpJPyPw172GdZJhxlWprDcrgqUk2L035WzeclRMGbCJ1JVueSl4cC amlWoq9k3pWXcjxzjR8K4jY651b8/WFLD+WKzezIVNS1/1s3CPbw2jAJDMDI+eCuDSmk yZ4F8IrQ98AUXPGE3ueDnHX+FYUpE1mjG5ztnytaQ6ew41pmq9Muu4nWXuYv3VVcgGtp izTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770633673; x=1771238473; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=wRZtWhEupTEsa5Haa/ZGULLeUlTCbsJAcTuTRTPYbCE=; b=Obj6MdaU9GYN6rsHVCLZbWD+WmOgmoDrQqrNoawxM7yQTW54Klq4goNkrgnvJ3TlsQ bsZvpBb7M58B2xa9NhOrVZVq/n86szkngPbDedeXAmmJZ9tJGWdYAvmtIsTt/3r1al9/ rHn+8Y9uGaXUP9WymhUjNRJyay1P8W+hAwOrwHdzLdLkF+ojNQOoHvcrWKSzobWeijIS pChg1Wvw+QDyYAauI2eCci/7RKg+i87sPguBnjBFL9HSIxGxu0dsDGO2TxnD6okrFsPU Dk4DkHWaiCaq6LHbtdPjf7aOF+HwShSCIJmKEKAd/FdSxFTg7NFYOvOHSB2IMipcr5nZ qHRg== X-Gm-Message-State: AOJu0YyxzqL+aRzB2b9m3SFmDq8+9v75bnaptq4yKCrhTWx++U6rHMR5 j0bjT30/VuvmqTpNxJ2K4rEtHygZF6HBOgbICtGj9EiwtcxfvtVowkKZlnSJLPbs0aTxcjDroCi 7duDQkwOVAnMJpGPbhmGrldlNmqZnAllf6A+EuqaTuNqp X-Gm-Gg: AZuq6aKsqLcnZt71G4xVdYhW+qWsmJTRuryWq4cVCDjvujpdwaqVzxSRZFe+4WMiiyY IZo2dA2f7WYOoWy5VNTwXI2Avx0Rye2u3NTFqB0hfF1xMbFOURhn6DvdizwYrE8gG9nl/vNJSBl Ym5Qf8V/Ux3hybsNwma7J6bZaFXbLDkjlO32GBdqXbu9saGbek73g7DBXHahCGXB54Xti+fbk34 Q4vJyc60vvkwBFCqL0dSK1Ri2s1usK6sPX24MxFmLYjmBQ7EndU8/VJemKQn7pCpkktg8UPlBz0 o7ms9qGN9Zs6yp4MJxHZV2RF06le2IMPPsQzbtQB5Omzs7TObb0WLD1uOPIzihfB8cW2YA== X-Received: by 2002:a17:907:1c09:b0:b83:32b7:21b0 with SMTP id a640c23a62f3a-b8edf1ea5d9mr555104766b.17.1770633672602; Mon, 09 Feb 2026 02:41:12 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Xuneng Zhou Date: Mon, 9 Feb 2026 18:40:59 +0800 X-Gm-Features: AZwV_QgWZ124dmpzW29Plrfnp7EMboqsWrkg3pbgSP0036B3lA-2CbR5_-EXs2c Message-ID: Subject: Re: Streamify more code paths To: Nazir Bilal Yavuz Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="00000000000015afa4064a61c7c0" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000015afa4064a61c7c0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Thu, Feb 5, 2026 at 12:01=E2=80=AFPM Xuneng Zhou = wrote: > > Hi, > > On Tue, Dec 30, 2025 at 10:43=E2=80=AFAM Xuneng Zhou wrote: > > > > Hi, > > > > On Tue, Dec 30, 2025 at 9:51=E2=80=AFAM Xuneng Zhou wrote: > > > > > > Hi, > > > > > > Thanks for looking into this. > > > > > > On Mon, Dec 29, 2025 at 6:58=E2=80=AFPM Nazir Bilal Yavuz wrote: > > > > > > > > Hi, > > > > > > > > On Sun, 28 Dec 2025 at 14:46, Xuneng Zhou wr= ote: > > > > > > > > > > Hi, > > > > > > > > > > > > Two more to go: > > > > > > patch 5: Streamify log_newpage_range() WAL logging path > > > > > > patch 6: Streamify hash index VACUUM primary bucket page reads > > > > > > > > > > > > Benchmarks will be conducted soon. > > > > > > > > > > > > > > > > v6 in the last message has a problem and has not been updated. At= tach > > > > > the right one again. Sorry for the noise. > > > > > > > > 0003 and 0006: > > > > > > > > You need to add 'StatApproxReadStreamPrivate' and > > > > 'HashBulkDeleteStreamPrivate' to the typedefs.list. > > > > > > Done. > > > > > > > 0005: > > > > > > > > @@ -1321,8 +1341,10 @@ log_newpage_range(Relation rel, ForkNumber f= orknum, > > > > nbufs =3D 0; > > > > while (nbufs < XLR_MAX_BLOCK_ID && blkno < endblk) > > > > { > > > > - Buffer buf =3D ReadBufferExtended(rel, forknum,= blkno, > > > > - RBM_NORMAL, NULL)= ; > > > > + Buffer buf =3D read_stream_next_buffer(stream, = NULL); > > > > + > > > > + if (!BufferIsValid(buf)) > > > > + break; > > > > > > > > We are loosening a check here, there should not be a invalid buffer= in > > > > the stream until the endblk. I think you can remove this > > > > BufferIsValid() check, then we can learn if something goes wrong. > > > > > > My concern before for not adding assert at the end of streaming is th= e > > > potential early break in here: > > > > > > /* Nothing more to do if all remaining blocks were empty. */ > > > if (nbufs =3D=3D 0) > > > break; > > > > > > After looking more closely, it turns out to be a misunderstanding of = the logic. > > > > > > > 0006: > > > > > > > > You can use read_stream_reset() instead of read_stream_end(), then = you > > > > can use the same stream with different variables, I believe this is > > > > the preferred way. > > > > > > > > Rest LGTM! > > > > > > > > > > Yeah, reset seems a more proper way here. > > > > > > > Run pgindent using the updated typedefs.list. > > > > I've completed benchmarking of the v4 streaming read patches across > three I/O methods (io_uring, sync, worker). Tests were run with cold > cache on large datasets. > > --- Settings --- > > shared_buffers =3D '8GB' > effective_io_concurrency =3D 200 > io_method =3D $IO_METHOD > io_workers =3D $IO_WORKERS > io_max_concurrency =3D $IO_MAX_CONCURRENCY > track_io_timing =3D on > autovacuum =3D off > checkpoint_timeout =3D 1h > max_wal_size =3D 10GB > max_parallel_workers_per_gather =3D 0 > > --- Machine --- > CPU: 48-core > RAM: 256 GB DDR5 > Disk: 2 x 1.92 TB NVMe SSD > > --- Executive Summary --- > > The patches provide significant benefits for I/O-bound sequential > operations, with the greatest improvements seen when using > asynchronous I/O methods (io_uring and worker). The synchronous I/O > mode shows reduced but still meaningful gains. > > --- Results by I/O Method > > Best Results: io_method=3Dworker > > bloom_scan: 4.14x (75.9% faster); 93% fewer reads > pgstattuple: 1.59x (37.1% faster); 94% fewer reads > hash_vacuum: 1.05x (4.4% faster); 80% fewer reads > gin_vacuum: 1.06x (5.6% faster); 15% fewer reads > bloom_vacuum: 1.04x (3.9% faster); 76% fewer reads > wal_logging: 0.98x (-2.5%, neutral/slightly slower); no change in reads > > io_method=3Dio_uring > > bloom_scan: 3.12x (68.0% faster); 93% fewer reads > pgstattuple: 1.50x (33.2% faster); 94% fewer reads > hash_vacuum: 1.03x (3.3% faster); 80% fewer reads > gin_vacuum: 1.02x (2.1% faster); 15% fewer reads > bloom_vacuum: 1.03x (3.4% faster); 76% fewer reads > wal_logging: 1.00x (-0.5%, neutral); no change in reads > > io_method=3Dsync (baseline comparison) > > bloom_scan: 1.20x (16.4% faster); 93% fewer reads > pgstattuple: 1.10x (9.0% faster); 94% fewer reads > hash_vacuum: 1.01x (0.8% faster); 80% fewer reads > gin_vacuum: 1.02x (1.7% faster); 15% fewer reads > bloom_vacuum: 1.03x (2.8% faster); 76% fewer reads > wal_logging: 0.99x (-0.7%, neutral); no change in reads > > --- Observations --- > > Async I/O amplifies streaming benefits: The same patches show 3-4x > improvement with worker/io_uring vs 1.2x with sync. > > I/O operation reduction is consistent: All modes show the same ~93-94% > reduction in I/O operations for bloom_scan and pgstattuple. > > VACUUM operations show modest gains: Despite large I/O reductions > (76-80%), wall-clock improvements are smaller (3-15%) since VACUUM has > larger CPU overhead (tuple processing, index maintenance, WAL > logging). > > log_newpage_range shows no benefit: The patch provides no improvement (~0= .97x). > > -- > Best, > Xuneng There was an issue in the wal_log test of the original script. --- The original benchmark used: ALTER TABLE ... SET LOGGED This path performs a full table rewrite via ATRewriteTable() (tablecmds.c). It creates a new relfilenode and copies tuples into it. It does not call log_newpage_range() on rewritten pages. log_newpage_range() may only appear indirectly through the pending-sync logic in storage.c, and only when: wal_level =3D minimal, and relation size < wal_skip_threshold (default 2MB). Our test tables (1M=E2=80=9320M rows) are far larger than 2MB. In that case= , PostgreSQL fsyncs the file instead of WAL-logging it. Therefore, the previous benchmark measured table rewrite I/O, not the log_newpage_range() path. --- Current design: GIN index build The benchmark now uses: CREATE INDEX ... USING gin (doc_tsv) This reliably exercises log_newpage_range() because: - ginbuild() constructs the index and WAL-logs all new index pages using log_newpage_range(). - This is part of the normal GIN build path, independent of wal_skip_thresh= old. - The streaming-read patch modifies the WAL logging path inside log_newpage_range(), which this test directly targets. --- Results (wal_logging_large) worker: 1.00x (+0.5%); no meaningful change in reads io_uring: 1.01x (+1.3%); no meaningful change in reads sync: 1.01x (+1.1%); no meaningful change in reads --=20 Best, Xuneng --00000000000015afa4064a61c7c0 Content-Type: text/x-sh; charset="UTF-8"; name="run_streaming_benchmark.sh" Content-Disposition: attachment; filename="run_streaming_benchmark.sh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlf1j54p0 IyEvdXNyL2Jpbi9lbnYgYmFzaApzZXQgLWV1byBwaXBlZmFpbAoKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIwojIFN0cmVhbWluZyBSZWFkIFBhdGNoZXMgQmVuY2htYXJrCiMKIyBVc2FnZTogLi9ydW5f c3RyZWFtaW5nX2JlbmNoLnNoIFtPUFRJT05TXSA8cGF0Y2g+CiMKIyBPcHRpb25zOgojICAgLS1j bGVhbiAgICAgICAgICAgUmVtb3ZlIGV4aXN0aW5nIGJ1aWxkcyBhbmQgc3RhcnQgZnJlc2gKIyAg IC0tYmFzZWxpbmUgICAgICAgIEFsc28gYnVpbGQgYW5kIHRlc3QgdmFuaWxsYSBQb3N0Z3JlU1FM IGZvciBjb21wYXJpc29uCiMgICAtLXRlc3QgVEVTVCAgICAgICBSdW4gc3BlY2lmaWMgdGVzdCAo Ymxvb21fc2NhbiwgYmxvb21fdmFjdXVtLCBwZ3N0YXR0dXBsZSwKIyAgICAgICAgICAgICAgICAg ICAgIGdpbl92YWN1dW0sIHdhbF9sb2dnaW5nLCBoYXNoX3ZhY3V1bSwgb3IgImFsbCIpCiMgICAt LWlvLW1ldGhvZCBNT0RFICBJL08gbWV0aG9kOiBpb191cmluZywgd29ya2VyLCBvciBzeW5jIChk ZWZhdWx0OiBpb191cmluZykKIyAgIC0taW8td29ya2VycyBOICAgIE51bWJlciBvZiBJL08gd29y a2VycyBmb3Igd29ya2VyIG1vZGUgKGRlZmF1bHQ6IDMpCiMgICAtLWlvLWNvbmN1cnJlbmN5IE4g IE1heCBjb25jdXJyZW50IEkvT3MgcGVyIHByb2Nlc3MgKGRlZmF1bHQ6IDY0KQojICAgLS1wcm9m aWxlICAgICAgICAgICBFbmFibGUgcGVyZiBwcm9maWxpbmcgYW5kIGZsYW1lZ3JhcGggZ2VuZXJh dGlvbgojCiMgRW52aXJvbm1lbnQ6CiMgICBXT1JLUk9PVCAgICAgQmFzZSBkaXJlY3RvcnkgKGRl ZmF1bHQ6ICRIT01FL3BnX2JlbmNoKQojICAgUkVQUyAgICAgICAgIFJlcGV0aXRpb25zIHBlciB0 ZXN0IChkZWZhdWx0OiA1KQojICAgU0laRVMgICAgICAgIFRhYmxlIHNpemVzIHRvIHRlc3QgKGRl ZmF1bHQ6ICJsYXJnZSIpCiMgICBGTEFNRUdSQVBIX0RJUiAgUGF0aCB0byBGbGFtZUdyYXBoIHRv b2xzIChkZWZhdWx0OiAkSE9NRS9GbGFtZUdyYXBoKQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgps b2coKSB7IHByaW50ZiAnXDAzM1sxOzM0bT09PlwwMzNbMG0gJXNcbicgIiQqIjsgfQpkaWUoKSB7 IHByaW50ZiAnXDAzM1sxOzMxbUVSUk9SOlwwMzNbMG0gJXNcbicgIiQqIiA+JjI7IGV4aXQgMTsg fQoKIyAtLS0gQ0xJIHBhcnNpbmcgLS0tCkNMRUFOPTAKQkFTRUxJTkU9MApET19QUk9GSUxFPTAK VEVTVD0iYWxsIgpJT19NRVRIT0Q9IiR7SU9fTUVUSE9EOi1pb191cmluZ30iCklPX1dPUktFUlM9 IiR7SU9fV09SS0VSUzotM30iCklPX01BWF9DT05DVVJSRU5DWT0iJHtJT19NQVhfQ09OQ1VSUkVO Q1k6LTY0fSIKUEFUQ0g9IiIKCndoaWxlIFtbICQjIC1ndCAwIF1dOyBkbwogIGNhc2UgIiQxIiBp bgogICAgLS1jbGVhbikgICAgICAgICAgQ0xFQU49MSA7OwogICAgLS1iYXNlbGluZSkgICAgICAg QkFTRUxJTkU9MSA7OwogICAgLS1wcm9maWxlKSAgICAgICAgRE9fUFJPRklMRT0xIDs7CiAgICAt LXRlc3QpICAgICAgICAgICBURVNUPSIkMiI7IHNoaWZ0IDs7CiAgICAtLWlvLW1ldGhvZCkgICAg ICBJT19NRVRIT0Q9IiQyIjsgc2hpZnQgOzsKICAgIC0taW8td29ya2VycykgICAgIElPX1dPUktF UlM9IiQyIjsgc2hpZnQgOzsKICAgIC0taW8tY29uY3VycmVuY3kpIElPX01BWF9DT05DVVJSRU5D WT0iJDIiOyBzaGlmdCA7OwogICAgLWh8LS1oZWxwKSAgICAgICAgc2VkIC1uICczLDE5cCcgIiQw IiB8IHNlZCAncy9eIyBcPy8vJzsgZXhpdCAwIDs7CiAgICAtKikgICAgICAgICAgICAgICBkaWUg IlVua25vd24gb3B0aW9uOiAkMSIgOzsKICAgICopICAgICAgICAgICAgICAgIFBBVENIPSIkMSIg OzsKICBlc2FjCiAgc2hpZnQKZG9uZQoKIyBWYWxpZGF0ZSBpb19tZXRob2QKY2FzZSAiJElPX01F VEhPRCIgaW4KICBpb191cmluZ3x3b3JrZXJ8c3luYykgOzsKICAqKSBkaWUgIkludmFsaWQgLS1p by1tZXRob2Q6ICRJT19NRVRIT0QgKG11c3QgYmUgaW9fdXJpbmcsIHdvcmtlciwgb3Igc3luYyki IDs7CmVzYWMKCltbIC16ICIkUEFUQ0giIF1dICYmIGRpZSAiVXNhZ2U6ICQwIFstLWNsZWFuXSBb LS1iYXNlbGluZV0gWy0tdGVzdCBURVNUXSA8cGF0Y2g+IgpbWyAhIC1mICIkUEFUQ0giIF1dICYm IGRpZSAiUGF0Y2ggbm90IGZvdW5kOiAkUEFUQ0giCltbICIkUEFUQ0giICE9IC8qIF1dICYmIFBB VENIPSIkUFdELyRQQVRDSCIKCiMgLS0tIFByb2ZpbGluZyB2YWxpZGF0aW9uIC0tLQpGTEFNRUdS QVBIX0RJUj0iJHtGTEFNRUdSQVBIX0RJUjotJEhPTUUvRmxhbWVHcmFwaH0iClBFUkZfU1VETz0i JHtQRVJGX1NVRE86LXN1ZG99IgpQRVJGX0VWRU5UPSIke1BFUkZfRVZFTlQ6LWN5Y2xlc30iICAj IGN5Y2xlcyA9IHVzZXIra2VybmVsOyBjeWNsZXM6dSA9IHVzZXItb25seQppZiBbWyAkRE9fUFJP RklMRSAtZXEgMSBdXTsgdGhlbgogIGNvbW1hbmQgLXYgcGVyZiA+L2Rldi9udWxsIDI+JjEgfHwg ZGllICJOZWVkIHBlcmYgKHN1ZG8gYXB0IGluc3RhbGwgbGludXgtdG9vbHMtJCh1bmFtZSAtcikp IgogIFtbIC14ICIkRkxBTUVHUkFQSF9ESVIvc3RhY2tjb2xsYXBzZS1wZXJmLnBsIiBdXSB8fCBk aWUgIk1pc3NpbmcgJEZMQU1FR1JBUEhfRElSL3N0YWNrY29sbGFwc2UtcGVyZi5wbCAoZ2l0IGNs b25lIGh0dHBzOi8vZ2l0aHViLmNvbS9icmVuZGFuZ3JlZ2cvRmxhbWVHcmFwaCkiCiAgW1sgLXgg IiRGTEFNRUdSQVBIX0RJUi9mbGFtZWdyYXBoLnBsIiBdXSB8fCBkaWUgIk1pc3NpbmcgJEZMQU1F R1JBUEhfRElSL2ZsYW1lZ3JhcGgucGwiCmZpCgojIC0tLSBDb25maWd1cmF0aW9uIC0tLQpXT1JL Uk9PVD0iJHtXT1JLUk9PVDotJEhPTUUvcGdfYmVuY2h9IgpSRVBTPSIke1JFUFM6LTV9IgpTSVpF Uz0iJHtTSVpFUzotbGFyZ2V9IgoKUk9PVF9CQVNFPSIkV09SS1JPT1QvdmFuaWxsYSIKUk9PVF9Q QVRDSD0iJFdPUktST09UL3BhdGNoZWQiCgojIC0tLSBIZWxwZXJzIC0tLQpwZygpIHsgZWNobyAi JDEvcGcvYmluLyQyIjsgfQoKcGlja19wb3J0KCkgewogIGZvciBwIGluICQoc2VxICIkezE6LTU0 MzJ9IiA2MDAwMCk7IGRvCiAgICBsc29mIC1pVENQOiIkcCIgLXNUQ1A6TElTVEVOID4vZGV2L251 bGwgMj4mMSB8fCB7IGVjaG8gIiRwIjsgcmV0dXJuOyB9CiAgZG9uZQogIGRpZSAiTm8gZnJlZSBw b3J0IGZvdW5kIgp9CgojIC0tLSBCdWlsZCBQb3N0Z3JlU1FMIC0tLQpidWlsZF9wZygpIHsKICBs b2NhbCBST09UPSIkMSIgUEFUQ0hfRklMRT0iJHsyOi19IgogIAogIFtbICRDTEVBTiAtZXEgMSBd XSAmJiBybSAtcmYgIiRST09UIgogIAogIGlmIFtbIC14ICIkKHBnICIkUk9PVCIgaW5pdGRiKSIg XV07IHRoZW4KICAgIGxvZyAiUmV1c2luZyBidWlsZDogJFJPT1QiCiAgICByZXR1cm4KICBmaQog IAogIGxvZyAiQnVpbGRpbmcgUG9zdGdyZVNRTDogJFJPT1QiCiAgbWtkaXIgLXAgIiRST09UIgog IAogIGdpdCBjbG9uZSAtLWRlcHRoIDEgaHR0cHM6Ly9naXRodWIuY29tL3Bvc3RncmVzL3Bvc3Rn cmVzICIkUk9PVC9zcmMiIDI+L2Rldi9udWxsCiAgY2QgIiRST09UL3NyYyIKICAKICBbWyAtbiAi JFBBVENIX0ZJTEUiIF1dICYmIHsgbG9nICJBcHBseWluZyBwYXRjaCI7IGdpdCBhcHBseSAiJFBB VENIX0ZJTEUiOyB9CiAgCiAgLi9jb25maWd1cmUgLS1wcmVmaXg9IiRST09UL3BnIiAtLXdpdGgt bGlidXJpbmcgXAogICAgQ0ZMQUdTPSctTzIgLWdnZGIzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy JyA+L2Rldi9udWxsIDI+JjEKICAKICBtYWtlIC1qIiQobnByb2MpIiBpbnN0YWxsID4vZGV2L251 bGwgMj4mMQogIG1ha2UgLUMgY29udHJpYi9ibG9vbSBpbnN0YWxsID4vZGV2L251bGwgMj4mMQog IG1ha2UgLUMgY29udHJpYi9wZ3N0YXR0dXBsZSBpbnN0YWxsID4vZGV2L251bGwgMj4mMQp9Cgoj IC0tLSBDbHVzdGVyIG1hbmFnZW1lbnQgLS0tCmluaXRfY2x1c3RlcigpIHsKICBsb2NhbCBST09U PSIkMSIgUE9SVD0iJDIiCiAgCiAgcm0gLXJmICIkUk9PVC9kYXRhIgogICIkKHBnICIkUk9PVCIg aW5pdGRiKSIgLUQgIiRST09UL2RhdGEiIC0tbm8tbG9jYWxlID4vZGV2L251bGwgMj4mMQogIAog IGNhdCA+PiAiJFJPT1QvZGF0YS9wb3N0Z3Jlc3FsLmNvbmYiIDw8RU9GCnBvcnQgPSAkUE9SVAps aXN0ZW5fYWRkcmVzc2VzID0gJzEyNy4wLjAuMScKc2hhcmVkX2J1ZmZlcnMgPSAnOEdCJwplZmZl Y3RpdmVfaW9fY29uY3VycmVuY3kgPSAyMDAKaW9fbWV0aG9kID0gJElPX01FVEhPRAppb193b3Jr ZXJzID0gJElPX1dPUktFUlMKaW9fbWF4X2NvbmN1cnJlbmN5ID0gJElPX01BWF9DT05DVVJSRU5D WQp0cmFja19pb190aW1pbmcgPSBvbgp0cmFja193YWxfaW9fdGltaW5nID0gb24Kc3luY2hyb25v dXNfY29tbWl0ID0gb24KYXV0b3ZhY3V1bSA9IG9mZgpjaGVja3BvaW50X3RpbWVvdXQgPSAxaApt YXhfd2FsX3NpemUgPSAxMEdCCm1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAwCkVP RgogIAogICIkKHBnICIkUk9PVCIgcGdfY3RsKSIgLUQgIiRST09UL2RhdGEiIC1sICIkUk9PVC9z ZXJ2ZXIubG9nIiBzdGFydCAtdyA+L2Rldi9udWxsCn0KCnN0b3BfY2x1c3RlcigpIHsKICBsb2Nh bCBST09UPSIkMSIKICAiJChwZyAiJFJPT1QiIHBnX2N0bCkiIC1EICIkUk9PVC9kYXRhIiBzdG9w IC1tIGZhc3QgMj4vZGV2L251bGwgfHwgdHJ1ZQp9Cgpkcm9wX2NhY2hlcygpIHsKICBsb2NhbCBS T09UPSIkMSIKICBzdG9wX2NsdXN0ZXIgIiRST09UIgogIHN5bmMKICBlY2hvIDMgfCBzdWRvIHRl ZSAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBzbGVl cCAyCiAgIiQocGcgIiRST09UIiBwZ19jdGwpIiAtRCAiJFJPT1QvZGF0YSIgLWwgIiRST09UL3Nl cnZlci5sb2ciIHN0YXJ0IC13ID4vZGV2L251bGwKfQoKcHNxbF9ydW4oKSB7CiAgbG9jYWwgUk9P VD0iJDEiIFBPUlQ9IiQyIgogIHNoaWZ0IDIKICAiJChwZyAiJFJPT1QiIHBzcWwpIiAtaCAxMjcu MC4wLjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3JlcyAtdiBPTl9FUlJPUl9TVE9QPTEgLUF0cSAiJEAi Cn0KCiMgLS0tIFRpbWluZyAtLS0KcnVuX3RpbWVkKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JU PSIkMiIgU1FMPSIkMyIKICBsb2NhbCBtcwogICMgLVg6IGlnbm9yZSAucHNxbHJjLCAtdiBPTl9F UlJPUl9TVE9QPTE6IGZhaWwgb24gU1FMIGVycm9ycwogICMgUGFyc2UgbGFzdCBUaW1lOiBsaW5l LCBoYW5kbGUgYm90aCAibXMiIGFuZCAicyIgdW5pdHMKICBtcz0kKCIkKHBnICIkUk9PVCIgcHNx bCkiIC1oIDEyNy4wLjAuMSAtcCAiJFBPUlQiIC1kIHBvc3RncmVzIC1YIC12IE9OX0VSUk9SX1NU T1A9MSAtQXQgXAogICAgLWMgJ1x0aW1pbmcgb24nIC1jICIkU1FMIiAyPiYxIHwgXAogICAgYXdr ICcKICAgICAgL1RpbWU6LyB7CiAgICAgICAgdmFsPSQyOyB1bml0PSQzOwogICAgICAgIGlmICh1 bml0PT0ibXMiKSBtcz12YWw7CiAgICAgICAgZWxzZSBpZiAodW5pdD09InMiKSBtcz12YWwqMTAw MDsKICAgICAgfQogICAgICBFTkQgeyBpZiAobXM9PSIiKSBleGl0IDE7IHByaW50ZiAiJS4zZlxu IiwgbXM7IH0KICAgICcpCiAgIyBWYWxpZGF0ZSBudW1lcmljIG91dHB1dAogIFtbICIkbXMiID1+ IF5bMC05XSsoXC5bMC05XSspPyQgXV0gfHwgeyBlY2hvICJFUlJPUjogTm9uLW51bWVyaWMgdGlt aW5nOiAkbXMiID4mMjsgcmV0dXJuIDE7IH0KICBlY2hvICIkbXMiCn0KCiMgLS0tIEkvTyBTdGF0 cyAtLS0KIyBSdW4gU1FMIGFuZCBjYXB0dXJlIHRpbWluZyArIEkvTyBzdGF0cyBmcm9tIHBnX3N0 YXRfaW8KIyBSZXNldHMgc3RhdHMgYmVmb3JlIHF1ZXJ5LCB3YWl0cyBmb3IgZmx1c2gsIHRoZW4g cmVhZHMgYWJzb2x1dGUgdmFsdWVzCiMgTm90ZTogcGdfc3RhdF9pbyBoYXMgUEdTVEFUX01JTl9J TlRFUlZBTD0xMDAwbXMgZmx1c2ggZGVsYXksIHNvIHdlIHdhaXQgMS41cwojICAgICAgIGFmdGVy IHRoZSBxdWVyeSB0byBlbnN1cmUgc3RhdHMgYXJlIGZsdXNoZWQgdG8gc2hhcmVkIG1lbW9yeS4K IyBOb3RlOiBwZ19zdGF0X2lvIGNvdW50cyBJL08gb3BlcmF0aW9ucywgbm90IHBhZ2VzICh3aXRo IGlvX2NvbWJpbmVfbGltaXQ9MTI4a0IsCiMgICAgICAgdXAgdG8gMTYgcGFnZXMgcGVyIG9wZXJh dGlvbikuIFRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IuCiMgUmV0dXJuczogbXMscmVhZHMscmVh ZF90aW1lCnJ1bl90aW1lZF93aXRoX2lvKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIg U1FMPSIkMyIKICBsb2NhbCByZXN1bHQKICAKICAjIFJlc2V0IHN0YXRzLCBydW4gcXVlcnksIHdh aXQgZm9yIGZsdXNoLCByZWFkIGFic29sdXRlIHZhbHVlcwogICMgLSBGaWx0ZXIgYnkgY2xpZW50 IGJhY2tlbmQgYW5kIGlvIHdvcmtlciAoZXhjbHVkZXMgYmd3cml0ZXIvY2hlY2twb2ludGVyKQog ICMgLSAxLjVzIGRlbGF5IGFsbG93cyBzdGF0cyB0byBmbHVzaCAoUEdTVEFUX01JTl9JTlRFUlZB TD0xMDAwbXMpCiAgcmVzdWx0PSQoIiQocGcgIiRST09UIiBwc3FsKSIgLWggMTI3LjAuMC4xIC1w ICIkUE9SVCIgLWQgcG9zdGdyZXMgLVggLXYgT05fRVJST1JfU1RPUD0xIDw8RU9TUUwKU0VMRUNU IHBnX3N0YXRfcmVzZXRfc2hhcmVkKCdpbycpOwpcXHRpbWluZyBvbgokU1FMClxcdGltaW5nIG9m ZgpTRUxFQ1QgcGdfc2xlZXAoMS41KTsKXFx0IG9uClNFTEVDVCAKICBDT0FMRVNDRShTVU0ocmVh ZHMpLDApOjpiaWdpbnQsCiAgQ09BTEVTQ0UoU1VNKHJlYWRfdGltZSksMCk6Om51bWVyaWMoMTIs MikKRlJPTSBwZ19zdGF0X2lvIApXSEVSRSBvYmplY3QgPSAncmVsYXRpb24nIEFORCBiYWNrZW5k X3R5cGUgSU4gKCdjbGllbnQgYmFja2VuZCcsICdpbyB3b3JrZXInKTsKRU9TUUwKICAyPiYxKQog IAogICMgUGFyc2UgdGltaW5nIChsYXN0IFRpbWU6IGxpbmUpCiAgbG9jYWwgbXMKICBtcz0kKGVj aG8gIiRyZXN1bHQiIHwgYXdrICcKICAgIC9UaW1lOi8gewogICAgICB2YWw9JDI7IHVuaXQ9JDM7 CiAgICAgIGlmICh1bml0PT0ibXMiKSBtcz12YWw7CiAgICAgIGVsc2UgaWYgKHVuaXQ9PSJzIikg bXM9dmFsKjEwMDA7CiAgICB9CiAgICBFTkQgeyBpZiAobXM9PSIiKSBleGl0IDE7IHByaW50ZiAi JS4zZlxuIiwgbXM7IH0KICAnKQogIAogICMgUGFyc2UgSS9PIHN0YXRzIChsYXN0IG5vbi1lbXB0 eSBsaW5lIHdpdGggcGlwZSBzZXBhcmF0b3I6IHJlYWRzfHJlYWRfdGltZSkKICBsb2NhbCByZWFk cyByZWFkX3RpbWUKICBsb2NhbCBpb19saW5lCiAgaW9fbGluZT0kKGVjaG8gIiRyZXN1bHQiIHwg Z3JlcCAnfCcgfCB0YWlsIC0xKQogIHJlYWRzPSQoZWNobyAiJGlvX2xpbmUiIHwgY3V0IC1kJ3wn IC1mMSB8IHRyIC1kICcgJykKICByZWFkX3RpbWU9JChlY2hvICIkaW9fbGluZSIgfCBjdXQgLWQn fCcgLWYyIHwgdHIgLWQgJyAnKQogIAogICMgRGVmYXVsdCB0byAwIGlmIG5vdCBmb3VuZAogIFtb ICIkcmVhZHMiID1+IF4tP1swLTldKyQgXV0gfHwgcmVhZHM9MAogIFtbICIkcmVhZF90aW1lIiA9 fiBeLT9bMC05XSsoXC5bMC05XSspPyQgXV0gfHwgcmVhZF90aW1lPTAKICAKICBlY2hvICIkbXMs JHJlYWRzLCRyZWFkX3RpbWUiCn0KCiMgLS0tIFN0YXRpc3RpY3MgLS0tCmNhbGNfbWVkaWFuKCkg ewogIGF3ayAtRiwgJ05SPjF7YVsrK25dPSQyfUVORHsKICAgIGlmKG49PTApe3ByaW50IDA7IGV4 aXR9CiAgICBmb3IoaT0xO2k8PW47aSsrKWZvcihqPWkrMTtqPD1uO2orKylpZihhW2ldPmFbal0p e3Q9YVtpXTthW2ldPWFbal07YVtqXT10fQogICAgcHJpbnQgKG4lMik/YVtpbnQobi8yKSsxXToo YVtuLzJdK2Fbbi8yKzFdKS8yCiAgfScgIiQxIgp9CgpjYWxjX21lZGlhbl9jb2woKSB7CiAgbG9j YWwgZmlsZT0iJDEiIGNvbD0iJDIiCiAgYXdrIC1GLCAtdiBjb2w9IiRjb2wiICdOUj4xe2FbKytu XT0kY29sfUVORHsKICAgIGlmKG49PTApe3ByaW50IDA7IGV4aXR9CiAgICBmb3IoaT0xO2k8PW47 aSsrKWZvcihqPWkrMTtqPD1uO2orKylpZihhW2ldPmFbal0pe3Q9YVtpXTthW2ldPWFbal07YVtq XT10fQogICAgcHJpbnQgKG4lMik/YVtpbnQobi8yKSsxXTooYVtuLzJdK2Fbbi8yKzFdKS8yCiAg fScgIiRmaWxlIgp9CgpjYWxjX3N0YXRzKCkgewogIGxvY2FsIGNzdj0iJDEiCiAgYXdrIC1GLCAn TlI+MXthWysrbl09JDI7cys9JDJ9RU5EewogICAgaWYobj09MClleGl0CiAgICBmb3IoaT0xO2k8 PW47aSsrKWZvcihqPWkrMTtqPD1uO2orKylpZihhW2ldPmFbal0pe3Q9YVtpXTthW2ldPWFbal07 YVtqXT10fQogICAgbWVkPShuJTIpP2FbaW50KG4vMikrMV06KGFbbi8yXSthW24vMisxXSkvMgog ICAgYXZnPXMvbjsgZm9yKGk9MTtpPD1uO2krKylzcys9KGFbaV0tYXZnKV4yOyBzZD1zcXJ0KHNz L24pCiAgICBwcmludGYgIm1lZGlhbj0lLjFmbXMgbWVhbj0lLjFmwrElLjFmbXMgbj0lZCIsIG1l ZCwgYXZnLCBzZCwgbgogIH0nICIkY3N2Igp9CgojIC0tLSBQcm9maWxpbmcgLS0tCiMgUnVuIGEg U1FMIGNvbW1hbmQgdW5kZXIgcGVyZiwgYXR0YWNoaW5nIHRvIHRoZSBiYWNrZW5kIFBJRC4KIyBH ZW5lcmF0ZXMgcGVyZi5kYXRhIGFuZCBmbGFtZWdyYXBoIFNWRy4KIyAgIHByb2ZpbGVfc3FsIFJP T1QgUE9SVCBMQUJFTCBTUUwKcHJvZmlsZV9zcWwoKSB7CiAgW1sgJERPX1BST0ZJTEUgLW5lIDEg XV0gJiYgcmV0dXJuCiAgCiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNR TD0iJDQiCiAgbG9jYWwgUFJPRl9ESVI9IiRST09UL3Byb2ZpbGUiCiAgbWtkaXIgLXAgIiRQUk9G X0RJUiIKICAKICBsb2NhbCBQRVJGX0RBVEE9IiRQUk9GX0RJUi8ke0xBQkVMfS5wZXJmLmRhdGEi CiAgbG9jYWwgU1ZHPSIkUFJPRl9ESVIvJHtMQUJFTH0uc3ZnIgogIGxvY2FsIHBzcWxfYmluCiAg cHNxbF9iaW49IiQocGcgIiRST09UIiBwc3FsKSIKICAKICAjIFVzZSBhIHVuaXF1ZSBhcHBsaWNh dGlvbl9uYW1lIHRvIGZpbmQgdGhlIGJhY2tlbmQgUElECiAgbG9jYWwgQVBQPSJwcm9mXyR7TEFC RUx9XyQkIgogIAogICMgTGF1bmNoIGEgcHNxbCBzZXNzaW9uIHRoYXQgd2lsbCBmaXJzdCBpZGVu dGlmeSBpdHNlbGYsIHRoZW4gcnVuIHRoZSBTUUwKICAjIFRoZSBwZ19zbGVlcCgpIGdpdmVzIHVz IHRpbWUgdG8gZmluZCB0aGUgYmFja2VuZCBQSUQgYW5kIGF0dGFjaCBwZXJmCiAgUEdBUFBOQU1F PSIkQVBQIiAiJHBzcWxfYmluIiAtaCAxMjcuMC4wLjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3JlcyBc CiAgICAtWCAtdiBPTl9FUlJPUl9TVE9QPTEgPDxFT1NRTCA+L2Rldi9udWxsIDI+JjEgJgpTRUxF Q1QgcGdfc2xlZXAoMik7CiRTUUwKRU9TUUwKICBsb2NhbCBRVUVSWV9TSEVMTF9QSUQ9JCEKICAK ICAjIEZpbmQgdGhlIGJhY2tlbmQgUElEIHZpYSBwZ19zdGF0X2FjdGl2aXR5CiAgbG9jYWwgQkFD S0VORF9QSUQ9IiIKICBmb3IgKChuPTA7IG48MTAwOyBuKyspKTsgZG8KICAgIEJBQ0tFTkRfUElE PSQoIiRwc3FsX2JpbiIgLWggMTI3LjAuMC4xIC1wICIkUE9SVCIgLWQgcG9zdGdyZXMgLUF0cSBc CiAgICAgIC1jICJTRUxFQ1QgcGlkIEZST00gcGdfc3RhdF9hY3Rpdml0eSBXSEVSRSBhcHBsaWNh dGlvbl9uYW1lPScke0FQUH0nIE9SREVSIEJZIGJhY2tlbmRfc3RhcnQgREVTQyBMSU1JVCAxOyIg Mj4vZGV2L251bGwpCiAgICBbWyAtbiAiJEJBQ0tFTkRfUElEIiAmJiAtZCAiL3Byb2MvJEJBQ0tF TkRfUElEIiBdXSAmJiBicmVhawogICAgc2xlZXAgMC4wNQogIGRvbmUKICAKICBpZiBbWyAteiAi JEJBQ0tFTkRfUElEIiB8fCAhIC1kICIvcHJvYy8kQkFDS0VORF9QSUQiIF1dOyB0aGVuCiAgICBs b2cgIldBUk5JTkc6IENvdWxkIG5vdCBmaW5kIGJhY2tlbmQgUElEIGZvciBwcm9maWxpbmcsIHNr aXBwaW5nIgogICAgd2FpdCAiJFFVRVJZX1NIRUxMX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQog ICAgcmV0dXJuCiAgZmkKICAKICBsb2cgIlByb2ZpbGluZyBiYWNrZW5kIFBJRCAkQkFDS0VORF9Q SUQg4oaSICRQRVJGX0RBVEEiCiAgCiAgIyBBdHRhY2ggcGVyZiB0byB0aGUgYmFja2VuZDsgd2Ug ZXhwbGljaXRseSBraWxsIC1JTlQgaXQgYWZ0ZXIgdGhlIHF1ZXJ5IGZpbmlzaGVzCiAgJFBFUkZf U1VETyBwZXJmIHJlY29yZCAtZyAtLWNhbGwtZ3JhcGggZHdhcmYgXAogICAgLXAgIiRCQUNLRU5E X1BJRCIgLW8gIiRQRVJGX0RBVEEiIFwKICAgIC0tZXZlbnQ9IiRQRVJGX0VWRU5UIiAyPi9kZXYv bnVsbCAmCiAgbG9jYWwgUEVSRl9QSUQ9JCEKICBzbGVlcCAwLjEKICAKICAjIFZlcmlmeSBwZXJm IGFjdHVhbGx5IHN0YXJ0ZWQgKHBlcm1pc3Npb25zLCB2YWxpZCBQSUQsIGV0Yy4pCiAgaWYgISBr aWxsIC0wICIkUEVSRl9QSUQiIDI+L2Rldi9udWxsOyB0aGVuCiAgICBsb2cgIldBUk5JTkc6IHBl cmYgcmVjb3JkIGZhaWxlZCB0byBzdGFydCAocGVybWlzc2lvbnMvY29uZmlnPyksIHNraXBwaW5n IGZsYW1lZ3JhcGgiCiAgICB3YWl0ICIkUVVFUllfU0hFTExfUElEIiAyPi9kZXYvbnVsbCB8fCB0 cnVlCiAgICByZXR1cm4KICBmaQogIAogICMgV2FpdCBmb3IgdGhlIHF1ZXJ5IHRvIGZpbmlzaAog IHdhaXQgIiRRVUVSWV9TSEVMTF9QSUQiIDI+L2Rldi9udWxsIHx8IHRydWUKICAKICAjIEdpdmUg cGVyZiBhIG1vbWVudCB0byBmbHVzaCwgdGhlbiBzdG9wIGl0CiAgc2xlZXAgMC41CiAgJFBFUkZf U1VETyBraWxsIC1JTlQgIiRQRVJGX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZTsgd2FpdCAiJFBF UkZfUElEIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgCiAgIyBHZW5lcmF0ZSBmbGFtZWdyYXBoCiAg Z2VuZXJhdGVfZmxhbWVncmFwaCAiJFBFUkZfREFUQSIgIiRTVkciICIkTEFCRUwiCn0KCiMgQ29u dmVydCBwZXJmLmRhdGEg4oaSIGZsYW1lZ3JhcGggU1ZHCiMgICBnZW5lcmF0ZV9mbGFtZWdyYXBo IFBFUkZfREFUQSBTVkdfUEFUSCBUSVRMRQpnZW5lcmF0ZV9mbGFtZWdyYXBoKCkgewogIGxvY2Fs IFBFUkZfREFUQT0iJDEiIFNWRz0iJDIiIFRJVExFPSIkMyIKICAKICBbWyAtZiAiJFBFUkZfREFU QSIgXV0gfHwgcmV0dXJuCiAgCiAgbG9jYWwgRk9MREVEPSIke1BFUkZfREFUQSUucGVyZi5kYXRh fS5mb2xkZWQiCiAgaWYgJFBFUkZfU1VETyBwZXJmIHNjcmlwdCAtaSAiJFBFUkZfREFUQSIgMj4v ZGV2L251bGwgXAogICAgICB8ICIkRkxBTUVHUkFQSF9ESVIvc3RhY2tjb2xsYXBzZS1wZXJmLnBs IiA+ICIkRk9MREVEIiAyPi9kZXYvbnVsbCBcCiAgICAgICYmIFtbIC1zICIkRk9MREVEIiBdXTsg dGhlbgogICAgIiRGTEFNRUdSQVBIX0RJUi9mbGFtZWdyYXBoLnBsIiAtLXRpdGxlICIkVElUTEUi IC0tY291bnRuYW1lIHNhbXBsZXMgXAogICAgICAiJEZPTERFRCIgPiAiJFNWRyIgMj4vZGV2L251 bGwKICAgIGxvZyAiRmxhbWVncmFwaDogJFNWRyIKICAgIHJtIC1mICIkRk9MREVEIgogIGVsc2UK ICAgIGxvZyAiV0FSTklORzogRmFpbGVkIHRvIGdlbmVyYXRlIGZsYW1lZ3JhcGggZm9yICRUSVRM RSIKICAgIHJtIC1mICIkRk9MREVEIgogIGZpCn0KCiMgLS0tIEJlbmNobWFyayBydW5uZXIgLS0t CmJlbmNobWFyaygpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIE5BTUU9IiQzIiBTUUw9 IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1QvcmVzdWx0cy8ke05BTUV9LmNzdiIKICAKICBta2RpciAt cCAiJFJPT1QvcmVzdWx0cyIKICBlY2hvICJydW4sbXMscmVhZHMscmVhZF90aW1lX21zIiA+ICIk T1VUIgogIAogIGZvciAoKGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAgICBkcm9wX2NhY2hlcyAi JFJPT1QiCiAgICBsb2NhbCByZXN1bHQgbXMgcmVhZHMgcmVhZF90aW1lCiAgICByZXN1bHQ9JChy dW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9SVCIgIiRTUUwiKQogICAgSUZTPScsJyByZWFk IC1yIG1zIHJlYWRzIHJlYWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVh ZHMsJHJlYWRfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiROQU1FIFskaS8kUkVQU106ICR7bXN9 bXMgKHJlYWRzPSRyZWFkcywgaW9fdGltZT0ke3JlYWRfdGltZX1tcykiCiAgZG9uZQp9CgojIC0t LSBEYXRhIHNldHVwIGZ1bmN0aW9ucyAtLS0Kc2V0dXBfYmxvb20oKSB7CiAgbG9jYWwgUk9PVD0i JDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBsb2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBpbgog ICAgc21hbGwpICBOUk9XUz0xMDAwMDAgOzsKICAgIG1lZGl1bSkgTlJPV1M9MTAwMDAwMCA7Owog ICAgbGFyZ2UpICBOUk9XUz0xMDAwMDAwMCA7OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5nIEJs b29tIHRlc3QgZGF0YSAoJFNJWkU6ICROUk9XUyByb3dzKSIKICBwc3FsX3J1biAiJFJPT1QiICIk UE9SVCIgPDxTUUwKQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIGJsb29tOwpEUk9QIFRB QkxFIElGIEVYSVNUUyBibG9vbV90ZXN0OwpDUkVBVEUgVEFCTEUgYmxvb21fdGVzdCAoaWQgSU5U LCBkYXRhIFRFWFQsIHZhbDEgSU5ULCB2YWwyIElOVCk7CklOU0VSVCBJTlRPIGJsb29tX3Rlc3Qg U0VMRUNUIGksICdkYXRhXyd8fGksIGklMTAwMCwgaSUxMDAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwkTlJPV1MpIGk7CkNSRUFURSBJTkRFWCBibG9vbV9pZHggT04gYmxvb21fdGVzdCBVU0lORyBi bG9vbSAodmFsMSwgdmFsMik7ClZBQ1VVTSBBTkFMWVpFIGJsb29tX3Rlc3Q7CkNIRUNLUE9JTlQ7 ClNRTAp9CgpzZXR1cF9wZ3N0YXR0dXBsZSgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIi IFNJWkU9IiQzIgogIGxvY2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5S T1dTPTEwMDAwMCA7OwogICAgbWVkaXVtKSBOUk9XUz0xMDAwMDAwIDs7CiAgICBsYXJnZSkgIE5S T1dTPTEwMDAwMDAwIDs7CiAgZXNhYwogIAogIGxvZyAiQ3JlYXRpbmcgcGdzdGF0dHVwbGUgdGVz dCBkYXRhICgkU0laRTogJE5ST1dTIHJvd3MpIgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiA8 PFNRTApDUkVBVEUgRVhURU5TSU9OIElGIE5PVCBFWElTVFMgcGdzdGF0dHVwbGU7CkRST1AgVEFC TEUgSUYgRVhJU1RTIGhlYXBfdGVzdDsKQ1JFQVRFIFRBQkxFIGhlYXBfdGVzdCAoaWQgU0VSSUFM IFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOwpJTlNFUlQgSU5UTyBoZWFwX3Rlc3QgKGRhdGEpIFNF TEVDVCByZXBlYXQoJ3gnLDEwMCkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwkTlJPV1MpOwpWQUNV VU0gQU5BTFlaRSBoZWFwX3Rlc3Q7CkNIRUNLUE9JTlQ7ClNRTAp9CgpzZXR1cF9naW4oKSB7CiAg bG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBsb2NhbCBOUk9XUwogIGNhc2Ug IiRTSVpFIiBpbgogICAgc21hbGwpICBOUk9XUz0xMDAwMDAgOzsKICAgIG1lZGl1bSkgTlJPV1M9 MTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9XUz01MDAwMDAwIDs7CiAgZXNhYwogIAogIGxvZyAi Q3JlYXRpbmcgR0lOIHRlc3QgZGF0YSAoJFNJWkU6ICROUk9XUyByb3dzKSIKICBwc3FsX3J1biAi JFJPT1QiICIkUE9SVCIgPDxTUUwKRFJPUCBUQUJMRSBJRiBFWElTVFMgZ2luX3Rlc3Q7Ci0tIE5v IFBSSU1BUlkgS0VZOiBpc29sYXRlIEdJTiBpbmRleCB2YWN1dW0gZnJvbSBidHJlZSBvdmVyaGVh ZApDUkVBVEUgVEFCTEUgZ2luX3Rlc3QgKGlkIElOVCwgdGFncyBURVhUW10pOwpJTlNFUlQgSU5U TyBnaW5fdGVzdCAoaWQsIHRhZ3MpClNFTEVDVCBpLCBBUlJBWShTRUxFQ1QgJ3RhZ18nfHwocmFu ZG9tKCkqMTAwKTo6aW50IEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsNSkpCkZST00gZ2VuZXJhdGVf c2VyaWVzKDEsJE5ST1dTKSBpOwpDUkVBVEUgSU5ERVggZ2luX2lkeCBPTiBnaW5fdGVzdCBVU0lO RyBnaW4gKHRhZ3MpOwpWQUNVVU0gQU5BTFlaRSBnaW5fdGVzdDsKQ0hFQ0tQT0lOVDsKU1FMCn0K CnNldHVwX2hhc2goKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBs b2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBpbgogICAgc21hbGwpICBOUk9XUz01MDAwMDAgOzsK ICAgIG1lZGl1bSkgTlJPV1M9NTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9XUz0yMDAwMDAwMCA7 OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5nIEhhc2ggdGVzdCBkYXRhICgkU0laRTogJE5ST1dT IHVuaXF1ZSB2YWx1ZXMpIgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiA8PFNRTApEUk9QIFRB QkxFIElGIEVYSVNUUyBoYXNoX3Rlc3Q7Ci0tIE5vIFBSSU1BUlkgS0VZOiBpc29sYXRlIGhhc2gg aW5kZXggdmFjdXVtIGZyb20gYnRyZWUgb3ZlcmhlYWQKQ1JFQVRFIFRBQkxFIGhhc2hfdGVzdCAo aWQgSU5ULCBkYXRhIFRFWFQpOwpJTlNFUlQgSU5UTyBoYXNoX3Rlc3QgU0VMRUNUIGksICd4JyBG Uk9NIGdlbmVyYXRlX3NlcmllcygxLCROUk9XUykgaTsKQ1JFQVRFIElOREVYIGhhc2hfaWR4IE9O IGhhc2hfdGVzdCBVU0lORyBoYXNoIChpZCk7ClZBQ1VVTSBBTkFMWVpFIGhhc2hfdGVzdDsKQ0hF Q0tQT0lOVDsKU1FMCn0KCnNldHVwX3dhbCgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIi IFNJWkU9IiQzIgogIGxvY2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5S T1dTPTEwMDAwMDAgOzsKICAgIG1lZGl1bSkgTlJPV1M9NTAwMDAwMCA7OwogICAgbGFyZ2UpICBO Uk9XUz0yMDAwMDAwMCA7OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5nIHRhYmxlIGZvciBHSU4g aW5kZXggYnVpbGQgLyBsb2dfbmV3cGFnZV9yYW5nZSB0ZXN0ICgkU0laRTogJE5ST1dTIHJvd3Mp IgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiA8PFNRTApEUk9QIFRBQkxFIElGIEVYSVNUUyB3 YWxfdGVzdDsKLS0gVGFibGUgd2l0aCB0c3ZlY3RvciBjb2x1bW4gZm9yIEdJTiBpbmRleGluZyAo ZnVsbC10ZXh0IHNlYXJjaCkKLS0gR0lOIGluZGV4IGJ1aWxkcyBhbHdheXMgY2FsbCBsb2dfbmV3 cGFnZV9yYW5nZSgpIGF0IHRoZSBlbmQgb2YKLS0gZ2luYnVpbGQoKSAoZ2luaW5zZXJ0LmMpIHRv IFdBTC1sb2cgYWxsIGluZGV4IHBhZ2VzLiAKQ1JFQVRFIFRBQkxFIHdhbF90ZXN0IChpZCBJTlQs IGRvYyBURVhULCBkb2NfdHN2IFRTVkVDVE9SKTsKSU5TRVJUIElOVE8gd2FsX3Rlc3QKICBTRUxF Q1QgaSwKICAgICAgICAgJ3dvcmQnIHx8IChyYW5kb20oKSoxMDAwMCk6OmludCB8fCAnIHRlcm0n IHx8IChyYW5kb20oKSoxMDAwMCk6OmludAogICAgICAgICAgIHx8ICcgdG9rZW4nIHx8IChyYW5k b20oKSo1MDAwKTo6aW50IHx8ICcgcGhyYXNlJyB8fCAocmFuZG9tKCkqODAwMCk6OmludCwKICAg ICAgICAgdG9fdHN2ZWN0b3IoJ3NpbXBsZScsCiAgICAgICAgICAgJ3dvcmQnIHx8IChyYW5kb20o KSoxMDAwMCk6OmludCB8fCAnIHRlcm0nIHx8IChyYW5kb20oKSoxMDAwMCk6OmludAogICAgICAg ICAgIHx8ICcgdG9rZW4nIHx8IChyYW5kb20oKSo1MDAwKTo6aW50IHx8ICcgcGhyYXNlJyB8fCAo cmFuZG9tKCkqODAwMCk6OmludCkKICBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCROUk9XUykgaTsK VkFDVVVNIEFOQUxZWkUgd2FsX3Rlc3Q7CkNIRUNLUE9JTlQ7ClNRTAp9CgojIC0tLSBUZXN0IGZ1 bmN0aW9ucyAtLS0KdGVzdF9ibG9vbV9zY2FuKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIk MiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBzZXR1cF9ibG9vbSAiJFJPT1QiICIkUE9SVCIgIiRT SVpFIgogIHByb2ZpbGVfc3FsICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fYmxvb21fc2Nhbl8k e1NJWkV9IiBcCiAgICAiU0VUIGVuYWJsZV9zZXFzY2FuPW9mZjsgU0VMRUNUIENPVU5UKCopIEZS T00gYmxvb21fdGVzdCBXSEVSRSB2YWwxPTQyIEFORCB2YWwyPTc7IgogIGJlbmNobWFyayAiJFJP T1QiICIkUE9SVCIgIiR7TEFCRUx9X2Jsb29tX3NjYW5fJHtTSVpFfSIgXAogICAgIlNFVCBlbmFi bGVfc2Vxc2Nhbj1vZmY7IFNFTEVDVCBDT1VOVCgqKSBGUk9NIGJsb29tX3Rlc3QgV0hFUkUgdmFs MT00MiBBTkQgdmFsMj03OyIKfQoKdGVzdF9ibG9vbV92YWN1dW0oKSB7CiAgbG9jYWwgUk9PVD0i JDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1QvcmVz dWx0cy8ke0xBQkVMfV9ibG9vbV92YWN1dW1fJHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09U L3Jlc3VsdHMiCiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAK ICAjIFByb2ZpbGluZyBydW4gKHNlcGFyYXRlIGZyb20gbWVhc3VyZW1lbnQpCiAgaWYgW1sgJERP X1BST0ZJTEUgLWVxIDEgXV07IHRoZW4KICAgIHNldHVwX2Jsb29tICIkUk9PVCIgIiRQT1JUIiAi JFNJWkUiCiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIkRFTEVURSBGUk9NIGJsb29t X3Rlc3QgV0hFUkUgaWQgJSAxMCA9IDA7IgogICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBPUlQi ICIke0xBQkVMfV9ibG9vbV92YWN1dW1fJHtTSVpFfSIgIlZBQ1VVTSBibG9vbV90ZXN0OyIKICBm aQogIAogIGZvciAoKGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAgICAjIEZyZXNoIHRhYmxlIGVh Y2ggcnVuIGZvciBjb25zaXN0ZW50IHN0YXRlCiAgICBzZXR1cF9ibG9vbSAiJFJPT1QiICIkUE9S VCIgIiRTSVpFIgogICAgIyBDcmVhdGUgMTAlIGRlYWQgdHVwbGVzCiAgICBwc3FsX3J1biAiJFJP T1QiICIkUE9SVCIgLWMgIkRFTEVURSBGUk9NIGJsb29tX3Rlc3QgV0hFUkUgaWQgJSAxMCA9IDA7 IgogICAgCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiCiAgICBsb2NhbCByZXN1bHQgbXMgcmVhZHMg cmVhZF90aW1lCiAgICByZXN1bHQ9JChydW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9SVCIg IlZBQ1VVTSBibG9vbV90ZXN0OyIpCiAgICBJRlM9JywnIHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90 aW1lIDw8PCIkcmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1lIiA+PiAi JE9VVCIKICAgIGxvZyAiJHtMQUJFTH1fYmxvb21fdmFjdXVtXyR7U0laRX0gWyRpLyRSRVBTXTog JHttc31tcyAocmVhZHM9JHJlYWRzLCBpb190aW1lPSR7cmVhZF90aW1lfW1zKSIKICBkb25lCn0K CnRlc3RfcGdzdGF0dHVwbGUoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0i JDMiIFNJWkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1QvcmVzdWx0cy8ke0xBQkVMfV9wZ3N0YXR0 dXBsZV8ke1NJWkV9LmNzdiIKICBta2RpciAtcCAiJFJPT1QvcmVzdWx0cyIKICBlY2hvICJydW4s bXMscmVhZHMscmVhZF90aW1lX21zIiA+ICIkT1VUIgogIAogICMgUHJvZmlsaW5nIHJ1biAoc2Vw YXJhdGUgZnJvbSBtZWFzdXJlbWVudCDigJQgcGdzdGF0dHVwbGVfYXBwcm94IGlzIHJlYWQtb25s eSwgc2FmZSB0byBwcm9maWxlIGlubGluZSkKICBpZiBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXTsg dGhlbgogICAgc2V0dXBfcGdzdGF0dHVwbGUgIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgIHBz cWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiVVBEQVRFIGhlYXBfdGVzdCBTRVQgZGF0YSA9IGRh dGEgfHwgJyEnIFdIRVJFIGlkICUgNSA9IDA7IgogICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBP UlQiICIke0xBQkVMfV9wZ3N0YXR0dXBsZV8ke1NJWkV9IiBcCiAgICAgICJTRUxFQ1QgKiBGUk9N IHBnc3RhdHR1cGxlX2FwcHJveCgnaGVhcF90ZXN0Jyk7IgogIGZpCiAgCiAgZm9yICgoaT0xOyBp PD1SRVBTOyBpKyspKTsgZG8KICAgICMgRnJlc2ggdGFibGUgZWFjaCBydW4KICAgIHNldHVwX3Bn c3RhdHR1cGxlICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgICAjIFVQREFURSBjbGVhcnMgdGhl IGFsbC12aXNpYmxlIGJpdCBpbiB0aGUgVmlzaWJpbGl0eSBNYXAgZm9yIGFmZmVjdGVkIHBhZ2Vz LgogICAgIyBwZ3N0YXR0dXBsZV9hcHByb3ggc2tpcHMgYWxsLXZpc2libGUgcGFnZXMgKGVzdGlt YXRlcyBmcm9tIFZNIHdpdGhvdXQgcmVhZGluZykuCiAgICAjIFRoaXMgZW5zdXJlcyB0aGUgZnVu Y3Rpb24gbXVzdCBhY3R1YWxseSByZWFkIHBhZ2VzLCBleGVyY2lzaW5nIHRoZSBzdHJlYW1pbmcg cGF0aC4KICAgIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiVVBEQVRFIGhlYXBfdGVzdCBT RVQgZGF0YSA9IGRhdGEgfHwgJyEnIFdIRVJFIGlkICUgNSA9IDA7IgogICAgCiAgICBkcm9wX2Nh Y2hlcyAiJFJPT1QiCiAgICBsb2NhbCByZXN1bHQgbXMgcmVhZHMgcmVhZF90aW1lCiAgICByZXN1 bHQ9JChydW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9SVCIgIlNFTEVDVCAqIEZST00gcGdz dGF0dHVwbGVfYXBwcm94KCdoZWFwX3Rlc3QnKTsiKQogICAgSUZTPScsJyByZWFkIC1yIG1zIHJl YWRzIHJlYWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVhZHMsJHJlYWRf dGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X3Bnc3RhdHR1cGxlXyR7U0laRX0gWyRp LyRSRVBTXTogJHttc31tcyAocmVhZHM9JHJlYWRzLCBpb190aW1lPSR7cmVhZF90aW1lfW1zKSIK ICBkb25lCn0KCnRlc3RfZ2luX3ZhY3V1bSgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIi IExBQkVMPSIkMyIgU0laRT0iJDQiCiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1bHRzLyR7TEFCRUx9 X2dpbl92YWN1dW1fJHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMiCiAgZWNo byAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAKICAjIFByb2ZpbGluZyBy dW4gKHNlcGFyYXRlIGZyb20gbWVhc3VyZW1lbnQpCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEg XV07IHRoZW4KICAgIHNldHVwX2dpbiAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgcHJvZmls ZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV9naW5fdmFjdXVtXyR7U0laRX0iICJWQUNV VU0gQU5BTFlaRSBnaW5fdGVzdDsiCiAgZmkKICAKICBmb3IgKChpPTE7IGk8PVJFUFM7IGkrKykp OyBkbwogICAgIyBGcmVzaCB0YWJsZSBlYWNoIHJ1biBmb3IgY29uc2lzdGVudCBzdGF0ZQogICAg c2V0dXBfZ2luICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgICAKICAgIGRyb3BfY2FjaGVzICIk Uk9PVCIKICAgIGxvY2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUKICAgICMgVkFDVVVNIEFO QUxZWkUgZm9yY2VzIGdpbnZhY3V1bWNsZWFudXAoKSB0byBydW4gYW5kIHNjYW4gYWxsIHBhZ2Vz CiAgICByZXN1bHQ9JChydW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9SVCIgIlZBQ1VVTSBB TkFMWVpFIGdpbl90ZXN0OyIpCiAgICBJRlM9JywnIHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90aW1l IDw8PCIkcmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1lIiA+PiAiJE9V VCIKICAgIGxvZyAiJHtMQUJFTH1fZ2luX3ZhY3V1bV8ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9 bXMgKHJlYWRzPSRyZWFkcywgaW9fdGltZT0ke3JlYWRfdGltZX1tcykiCiAgZG9uZQp9Cgp0ZXN0 X2hhc2hfdmFjdXVtKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBT SVpFPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtMQUJFTH1faGFzaF92YWN1dW1f JHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMiCiAgZWNobyAicnVuLG1zLHJl YWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAKICAjIFByb2ZpbGluZyBydW4gKHNlcGFyYXRl IGZyb20gbWVhc3VyZW1lbnQpCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRoZW4KICAg IHNldHVwX2hhc2ggIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgIHBzcWxfcnVuICIkUk9PVCIg IiRQT1JUIiAtYyAiREVMRVRFIEZST00gaGFzaF90ZXN0IFdIRVJFIGlkICUgMTAgPSAwOyIKICAg IHByb2ZpbGVfc3FsICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1faGFzaF92YWN1dW1fJHtTSVpF fSIgIlZBQ1VVTSBoYXNoX3Rlc3Q7IgogIGZpCiAgCiAgZm9yICgoaT0xOyBpPD1SRVBTOyBpKysp KTsgZG8KICAgICMgRnJlc2ggdGFibGUgZWFjaCBydW4gZm9yIGNvbnNpc3RlbnQgc3RhdGUKICAg IHNldHVwX2hhc2ggIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgICMgQ3JlYXRlIDEwJSBkZWFk IHR1cGxlcwogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJERUxFVEUgRlJPTSBoYXNo X3Rlc3QgV0hFUkUgaWQgJSAxMCA9IDA7IgogICAgCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiCiAg ICBsb2NhbCByZXN1bHQgbXMgcmVhZHMgcmVhZF90aW1lCiAgICByZXN1bHQ9JChydW5fdGltZWRf d2l0aF9pbyAiJFJPT1QiICIkUE9SVCIgIlZBQ1VVTSBoYXNoX3Rlc3Q7IikKICAgIElGUz0nLCcg cmVhZCAtciBtcyByZWFkcyByZWFkX3RpbWUgPDw8IiRyZXN1bHQiCiAgICBlY2hvICIkaSwkbXMs JHJlYWRzLCRyZWFkX3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIke0xBQkVMfV9oYXNoX3ZhY3V1 bV8ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgaW9fdGltZT0ke3Jl YWRfdGltZX1tcykiCiAgZG9uZQp9Cgp0ZXN0X3dhbF9sb2dnaW5nKCkgewogIGxvY2FsIFJPT1Q9 IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jl c3VsdHMvJHtMQUJFTH1fd2FsX2xvZ2dpbmdfJHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09U L3Jlc3VsdHMiCiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAK ICAjIEJ1aWxkIHRhYmxlIG9uY2UgLSBvbmx5IHJlYnVpbGQgaW5kZXggZWFjaCByZXAKICBzZXR1 cF93YWwgIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAKICBsb2NhbCBXQUxfU1FMPSJDUkVBVEUg SU5ERVggd2FsX3Rlc3RfZ2luX2lkeCBPTiB3YWxfdGVzdCBVU0lORyBnaW4gKGRvY190c3YpOyIK ICAKICBmb3IgKChpPTE7IGk8PVJFUFM7IGkrKykpOyBkbwogICAgIyBEcm9wIGluZGV4IGZyb20g cHJldmlvdXMgaXRlcmF0aW9uCiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIkRST1Ag SU5ERVggSUYgRVhJU1RTIHdhbF90ZXN0X2dpbl9pZHg7IgogICAgCiAgICAjIFByb2ZpbGUgb24g Zmlyc3QgcmVwIG9ubHkKICAgIFtbICIkaSIgLWVxIDEgXV0gJiYgcHJvZmlsZV9zcWwgIiRST09U IiAiJFBPUlQiICIke0xBQkVMfV93YWxfbG9nZ2luZ18ke1NJWkV9IiAiJFdBTF9TUUwiCiAgICAj IFJlLWRyb3AgYWZ0ZXIgcHJvZmlsaW5nIHJ1biBjcmVhdGVkIGl0CiAgICBbWyAiJGkiIC1lcSAx ICYmICRET19QUk9GSUxFIC1lcSAxIF1dICYmIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAi RFJPUCBJTkRFWCBJRiBFWElTVFMgd2FsX3Rlc3RfZ2luX2lkeDsiCiAgICAKICAgICMgRHJvcCBP UyBjYWNoZXMgLSBpbmRleCBwYWdlcyBhcmUgQ09MRCBvbiBkaXNrCiAgICBkcm9wX2NhY2hlcyAi JFJPT1QiCiAgICAKICAgICMgQ1JFQVRFIElOREVYIG9uIEdJTiAodHN2ZWN0b3Jfb3BzKToKICAg ICMgLSBHSU4gYWx3YXlzIHVzZXMgdGhlIHNhbWUgYnVpbGQgcGF0aDogZ2luYnVpbGQoKSBwb3B1 bGF0ZXMgdGhlCiAgICAjICAgaW5kZXggaW4gbWVtb3J5LCBmbHVzaGVzIHRvIGRpc2ssIHRoZW4g Y2FsbHMgbG9nX25ld3BhZ2VfcmFuZ2UoKQogICAgIyAgIHRvIHJlYWQgQUxMIGluZGV4IHBhZ2Vz IGFuZCB3cml0ZSB0aGVtIHRvIFdBTCAoZ2luaW5zZXJ0LmM6Nzg1LTc5MCkKICAgIGxvY2FsIHJl c3VsdCBtcyByZWFkcyByZWFkX3RpbWUKICAgIHJlc3VsdD0kKHJ1bl90aW1lZF93aXRoX2lvICIk Uk9PVCIgIiRQT1JUIiAiJFdBTF9TUUwiKQogICAgSUZTPScsJyByZWFkIC1yIG1zIHJlYWRzIHJl YWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVhZHMsJHJlYWRfdGltZSIg Pj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X3dhbF9sb2dnaW5nXyR7U0laRX0gWyRpLyRSRVBT XTogJHttc31tcyAocmVhZHM9JHJlYWRzLCBpb190aW1lPSR7cmVhZF90aW1lfW1zKSIKICBkb25l Cn0KCiMgLS0tIFJ1biB0ZXN0cyBmb3IgYSBidWlsZCAtLS0KcnVuX3Rlc3RzKCkgewogIGxvY2Fs IFJPT1Q9IiQxIiBMQUJFTD0iJDIiCiAgbG9jYWwgUE9SVAogIFBPUlQ9JChwaWNrX3BvcnQpCiAg CiAgbG9nICJbJExBQkVMXSBTdGFydGluZyBjbHVzdGVyIG9uIHBvcnQgJFBPUlQiCiAgaW5pdF9j bHVzdGVyICIkUk9PVCIgIiRQT1JUIgogIAogIHRyYXAgInN0b3BfY2x1c3RlciAnJFJPT1QnIiBF WElUCiAgCiAgZm9yIFNJWkUgaW4gJFNJWkVTOyBkbwogICAgY2FzZSAiJFRFU1QiIGluCiAgICAg IGJsb29tX3NjYW4pICAgdGVzdF9ibG9vbV9zY2FuICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAi JFNJWkUiIDs7CiAgICAgIGJsb29tX3ZhY3V1bSkgdGVzdF9ibG9vbV92YWN1dW0gIiRST09UIiAi JFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAgICAgcGdzdGF0dHVwbGUpICB0ZXN0X3Bnc3Rh dHR1cGxlICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiIDs7CiAgICAgIGdpbl92YWN1 dW0pICAgdGVzdF9naW5fdmFjdXVtICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiIDs7 CiAgICAgIGhhc2hfdmFjdXVtKSAgdGVzdF9oYXNoX3ZhY3V1bSAiJFJPT1QiICIkUE9SVCIgIiRM QUJFTCIgIiRTSVpFIiA7OwogICAgICB3YWxfbG9nZ2luZykgIHRlc3Rfd2FsX2xvZ2dpbmcgIiRS T09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAgICAgYWxsKQogICAgICAgIHRlc3Rf Ymxvb21fc2NhbiAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIgogICAgICAgIHRlc3Rf Ymxvb21fdmFjdXVtICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiCiAgICAgICAgdGVz dF9wZ3N0YXR0dXBsZSAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIgogICAgICAgIHRl c3RfZ2luX3ZhY3V1bSAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIgogICAgICAgIHRl c3RfaGFzaF92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIKICAgICAgICB0 ZXN0X3dhbF9sb2dnaW5nICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiCiAgICAgICAg OzsKICAgICAgKikgZGllICJVbmtub3duIHRlc3Q6ICRURVNUIiA7OwogICAgZXNhYwogIGRvbmUK ICAKICBzdG9wX2NsdXN0ZXIgIiRST09UIgogIHRyYXAgLSBFWElUCn0KCiMgLS0tIENvbXBhcmUg cmVzdWx0cyAtLS0KY29tcGFyZV9yZXN1bHRzKCkgewogIGxvY2FsIGJhc2VfY3N2PSIkMSIgcGF0 Y2hfY3N2PSIkMiIgbGFiZWw9IiQzIgogIAogIFtbICEgLWYgIiRiYXNlX2NzdiIgfHwgISAtZiAi JHBhdGNoX2NzdiIgXV0gJiYgcmV0dXJuCiAgCiAgbG9jYWwgYmFzZV9tZWQgcGF0Y2hfbWVkCiAg YmFzZV9tZWQ9JChjYWxjX21lZGlhbiAiJGJhc2VfY3N2IikKICBwYXRjaF9tZWQ9JChjYWxjX21l ZGlhbiAiJHBhdGNoX2NzdiIpCiAgCiAgIyBHdWFyZCBhZ2FpbnN0IGVtcHR5IG9yIHplcm8gdmFs dWVzIHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVybwogIFtbIC16ICIkYmFzZV9tZWQiIHx8ICIk YmFzZV9tZWQiID09ICIwIiBdXSAmJiBiYXNlX21lZD0iMC4wMDEiCiAgW1sgLXogIiRwYXRjaF9t ZWQiIHx8ICIkcGF0Y2hfbWVkIiA9PSAiMCIgXV0gJiYgcGF0Y2hfbWVkPSIwLjAwMSIKICAKICBs b2NhbCBzcGVlZHVwIHBjdAogIHNwZWVkdXA9JChhd2sgIkJFR0lOIHsgcHJpbnRmIFwiJS4yZlwi LCAkYmFzZV9tZWQgLyAkcGF0Y2hfbWVkIH0iKQogIHBjdD0kKGF3ayAiQkVHSU4geyBwcmludGYg XCIlLjFmXCIsICgkYmFzZV9tZWQgLSAkcGF0Y2hfbWVkKSAvICRiYXNlX21lZCAqIDEwMCB9IikK ICAKICBsb2NhbCBpb19pbmZvPSIiCiAgaWYgaGVhZCAtMSAiJGJhc2VfY3N2IiB8IGdyZXAgLXEg InJlYWRzIjsgdGhlbgogICAgIyBTdGFuZGFyZCB0ZXN0OiBjb2x1bW5zIGFyZSBydW4sbXMscmVh ZHMscmVhZF90aW1lX21zCiAgICBsb2NhbCBiYXNlX3JlYWRzIHBhdGNoX3JlYWRzIGJhc2VfaW8g cGF0Y2hfaW8KICAgIGJhc2VfcmVhZHM9JChjYWxjX21lZGlhbl9jb2wgIiRiYXNlX2NzdiIgMykK ICAgIHBhdGNoX3JlYWRzPSQoY2FsY19tZWRpYW5fY29sICIkcGF0Y2hfY3N2IiAzKQogICAgYmFz ZV9pbz0kKGNhbGNfbWVkaWFuX2NvbCAiJGJhc2VfY3N2IiA0KQogICAgcGF0Y2hfaW89JChjYWxj X21lZGlhbl9jb2wgIiRwYXRjaF9jc3YiIDQpCiAgICAjIERlZmF1bHQgdG8gMCBpZiBlbXB0eQog ICAgW1sgLXogIiRiYXNlX3JlYWRzIiBdXSAmJiBiYXNlX3JlYWRzPTAKICAgIFtbIC16ICIkcGF0 Y2hfcmVhZHMiIF1dICYmIHBhdGNoX3JlYWRzPTAKICAgIFtbIC16ICIkYmFzZV9pbyIgXV0gJiYg YmFzZV9pbz0wCiAgICBbWyAteiAiJHBhdGNoX2lvIiBdXSAmJiBwYXRjaF9pbz0wCiAgICBpb19p bmZvPSIgIChyZWFkcz0ke2Jhc2VfcmVhZHN94oaSJHtwYXRjaF9yZWFkc30sIGlvX3RpbWU9JHti YXNlX2lvfeKGkiR7cGF0Y2hfaW99bXMpIgogIGZpCiAgCiAgcHJpbnRmICIlLTI2cyBiYXNlPSU4 LjFmbXMgIHBhdGNoPSU4LjFmbXMgICU1LjJmeCAgKCU1LjFmJSUpJXNcbiIgXAogICAgIiRsYWJl bCIgIiRiYXNlX21lZCIgIiRwYXRjaF9tZWQiICIkc3BlZWR1cCIgIiRwY3QiICIkaW9faW5mbyIK fQoKcHJpbnRfc3VtbWFyeSgpIHsKICBlY2hvICIiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIiAgICAgICAgICAgICAgICAgICAgIFNU UkVBTUlORyBSRUFEIEJFTkNITUFSSyBSRVNVTFRTICAgICAgICAgICAgICAgICAgICIKICBlY2hv ICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAiIgog IAogIGlmIFtbICRCQVNFTElORSAtZXEgMSBdXTsgdGhlbgogICAgcHJpbnRmICIlLTI2cyAlLTE3 cyAlLTE3cyAlLTdzICUtN3MgJXNcbiIgIlRFU1QiICJCQVNFTElORSIgIlBBVENIRUQiICJTUEVF RFVQIiAiQ0hBTkdFIiAiSS9PIFRJTUUiCiAgICBlY2hvICLilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAiCiAgICAKICAgIGZvciBT SVpFIGluICRTSVpFUzsgZG8KICAgICAgZm9yIHRlc3RfbmFtZSBpbiBibG9vbV9zY2FuIGJsb29t X3ZhY3V1bSBwZ3N0YXR0dXBsZSBnaW5fdmFjdXVtIGhhc2hfdmFjdXVtIHdhbF9sb2dnaW5nOyBk bwogICAgICAgIFtbICIkVEVTVCIgIT0gImFsbCIgJiYgIiRURVNUIiAhPSAiJHRlc3RfbmFtZSIg XV0gJiYgY29udGludWUKICAgICAgICBjb21wYXJlX3Jlc3VsdHMgXAogICAgICAgICAgIiRST09U X0JBU0UvcmVzdWx0cy9iYXNlXyR7dGVzdF9uYW1lfV8ke1NJWkV9LmNzdiIgXAogICAgICAgICAg IiRST09UX1BBVENIL3Jlc3VsdHMvcGF0Y2hlZF8ke3Rlc3RfbmFtZX1fJHtTSVpFfS5jc3YiIFwK ICAgICAgICAgICIke3Rlc3RfbmFtZX1fJHtTSVpFfSIKICAgICAgZG9uZQogICAgZG9uZQogIGVs c2UKICAgIGVjaG8gIlJlc3VsdHMgKHBhdGNoZWQgb25seSk6IgogICAgZWNobyAiIgogICAgZm9y IGYgaW4gIiRST09UX1BBVENIL3Jlc3VsdHMvIiouY3N2OyBkbwogICAgICBbWyAtZiAiJGYiIF1d IHx8IGNvbnRpbnVlCiAgICAgIHByaW50ZiAiJS00MHMgJXNcbiIgIiQoYmFzZW5hbWUgIiRmIiAu Y3N2KToiICIkKGNhbGNfc3RhdHMgIiRmIikiCiAgICBkb25lCiAgZmkKICAKICBlY2hvICIiCiAg ZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8g IkNTViBmaWxlczogJFJPT1RfUEFUQ0gvcmVzdWx0cy8iCiAgW1sgJEJBU0VMSU5FIC1lcSAxIF1d ICYmIGVjaG8gIkJhc2VsaW5lOiAgJFJPT1RfQkFTRS9yZXN1bHRzLyIKICAKICAjIExpc3QgZ2Vu ZXJhdGVkIGZsYW1lZ3JhcGhzCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRoZW4KICAg IGxvY2FsIHN2Z3M9KCkKICAgIGZvciBkaXIgaW4gIiRST09UX0JBU0UvcHJvZmlsZSIgIiRST09U X1BBVENIL3Byb2ZpbGUiOyBkbwogICAgICBbWyAtZCAiJGRpciIgXV0gfHwgY29udGludWUKICAg ICAgZm9yIHN2ZyBpbiAiJGRpciIvKi5zdmc7IGRvCiAgICAgICAgW1sgLWYgIiRzdmciIF1dICYm IHN2Z3MrPSgiJHN2ZyIpCiAgICAgIGRvbmUKICAgIGRvbmUKICAgIGlmIFtbICR7I3N2Z3NbQF19 IC1ndCAwIF1dOyB0aGVuCiAgICAgIGVjaG8gIiIKICAgICAgZWNobyAiRmxhbWVncmFwaHM6Igog ICAgICBmb3Igc3ZnIGluICIke3N2Z3NbQF19IjsgZG8gZWNobyAiICAkc3ZnIjsgZG9uZQogICAg ZmkKICBmaQogIAogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkCIKfQoKIyAtLS0gTWFpbiAtLS0KbWFpbigpIHsKICBsb2cgIlN0cmVhbWluZyBSZWFkIEJl bmNobWFyayIKICBsb2cgIlBhdGNoOiAkUEFUQ0giCiAgbG9nICJUZXN0czogJFRFU1QiCiAgbG9n ICJTaXplczogJFNJWkVTIgogIGxvZyAiUmVwczogICRSRVBTIgogIGxvZyAiSS9POiAgICRJT19N RVRIT0QgKHdvcmtlcnM9JElPX1dPUktFUlMsIGNvbmN1cnJlbmN5PSRJT19NQVhfQ09OQ1VSUkVO Q1kpIgogIFtbICRET19QUk9GSUxFIC1lcSAxIF1dICYmIGxvZyAiUHJvZmlsZTogZW5hYmxlZCAo ZmxhbWVncmFwaHMg4oaSIDxyb290Pi9wcm9maWxlLykiCiAgCiAgIyBCdWlsZAogIGlmIFtbICRC QVNFTElORSAtZXEgMSBdXTsgdGhlbgogICAgYnVpbGRfcGcgIiRST09UX0JBU0UiICIiCiAgZmkK ICBidWlsZF9wZyAiJFJPT1RfUEFUQ0giICIkUEFUQ0giCiAgCiAgIyBSdW4gdGVzdHMKICBpZiBb WyAkQkFTRUxJTkUgLWVxIDEgXV07IHRoZW4KICAgIGxvZyAiUnVubmluZyBiYXNlbGluZSB0ZXN0 cyIKICAgIHJ1bl90ZXN0cyAiJFJPT1RfQkFTRSIgImJhc2UiCiAgZmkKICAKICBsb2cgIlJ1bm5p bmcgcGF0Y2hlZCB0ZXN0cyIKICBydW5fdGVzdHMgIiRST09UX1BBVENIIiAicGF0Y2hlZCIKICAK ICAjIFN1bW1hcnkKICBwcmludF9zdW1tYXJ5Cn0KCm1haW4K --00000000000015afa4064a61c7c0--