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 1vnAax-003DEj-0o for pgsql-hackers@arkaria.postgresql.org; Tue, 03 Feb 2026 07:13:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vnAav-003cRc-1T for pgsql-hackers@arkaria.postgresql.org; Tue, 03 Feb 2026 07:13:05 +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 1vnAav-003cRT-06 for pgsql-hackers@lists.postgresql.org; Tue, 03 Feb 2026 07:13:04 +0000 Received: from mail-oa1-x32.google.com ([2001:4860:4864:20::32]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vnAas-00000000nXv-0h91 for pgsql-hackers@lists.postgresql.org; Tue, 03 Feb 2026 07:13:04 +0000 Received: by mail-oa1-x32.google.com with SMTP id 586e51a60fabf-40945a682b5so1970263fac.1 for ; Mon, 02 Feb 2026 23:13:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770102780; cv=none; d=google.com; s=arc-20240605; b=kTPpIeW4R2RG2h/qREKtc0RyqXUR4JMliTERxPEqToV61CbDTXRw1N6ttp0V93wa98 HiwN6ctcEb5YNIXcy4ei37aeUFE/ypbvLyZeut7L/7xC9Ke2CaV1ZtS/ziEnkQVTGCUT OzpJHFeOyopWV8MjrTwx8Y4xxpuXKMacFxVSKkWIXb/Eas7Vb++H2WBy0aY5YyPaWerz pJZw2GEaLT8dUcuIy8nuJ0oTvrgXZ1KjMKK9PEb5YJjCoyHb8+NPzzlBry8ZighURAmh F1vDLeg7A29X8T/p6KBMc0D9askx03yp3aHvzKd1gRn4V0V9prBXf7FHCOAkCi8Md1gh pv6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=PnIgTxnoFshM9w/8NpnuJmPFIXU0sT+2IhmW0Xreqog=; fh=pmBMntjmyx6XYOkmIq7jCPL8+6Ex8nEv6KGKxj4+8uc=; b=jkmYWV2baR1IN0tljjtB0b0JWWk5aDU4SuP0ZzN+Ch+nwqPzHM42zozo/W08+l9YsJ 3W0Q2ptM/MTGuIWXF1D8LrRMfBjZhblCnoZomm+C1tHxix7IxCZQILx9iKOL2+x4eCKs hUBTtqiIX2eJVDxPFLMcNHvNyF6Zhbcawn6ssDYBQ8fp/HWqhX4SJYbTe6ybdoA6qygy wYpGFduLbvoAQC6xqjWXkZ4duS/EDzfEfBjgV7ZZDl8WhYy2b0Vts7ppfhz9dYBab4Lj HGyby9ItguMlBrgwvYQ7kv+jRp8Z8zNpYe6VG0JiGGdfiqlfWcSZMKPDtsRc1wMm2drQ VAUw==; 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=1770102780; x=1770707580; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=PnIgTxnoFshM9w/8NpnuJmPFIXU0sT+2IhmW0Xreqog=; b=FAUmt4PGCRu3gaSZGhwN9Cex4xwej8b086U7Gp/5D+muTg9hWw3Zcf3GPQYTW4AcEP 5vMH72kJiBoSYWRSQ3NBWTHDwG3pyUspnjLsqXIfGCpQ5F8o9GqqvdNNi2gc6fjbs6g8 eqwOegeTFNkambbwC2Mm+sFjyGqZXB1/U9SmBQy+qpy6XvlhQVWHwnfWfthfgWL5zsmj V2JMHDYyjj60m7HtD7wXT0v/SzqWT2nI7aLppVQ0YeJ5OfNsNfkzol6H+lkxTIgJ59WT T6iI1cnRSZzGjVhY0n53q+oFqv8VxzxiyiT2GvtniL4a/+qFFU+lPn8oGshz1gAPXY/F wEIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770102780; x=1770707580; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=PnIgTxnoFshM9w/8NpnuJmPFIXU0sT+2IhmW0Xreqog=; b=T6B2jHnxD3xz7BQhW08Cu0XXPGiUG+sh80ppTTBVKbkiWSrpVI2d9o2FU17AVUz+G4 G2Jf4rG0Dv/VfR2uTb4OlMUORVftNzxnJt0Qii3hAxbADT6M6Aic4mCydmOPtjc/zOCK eDwSNLauBXojL/20qd/w/HtXM+r1WG/tfXzuDFzv0MbCV17mNUVWVn7T/dtb3exuPtv8 xgM1jcVIMH+acoVKKbnyb12dFo5KY5lnzq3f1tyJKS1t6HJmg91OcGfAcqYUbBxu1W8S /VLV5MMMIs0vAeTFAUb0LgwenS7RaTIy9qet67I6x1RoR6Re25ynWsuaZnhrfWJvBVv1 W90A== X-Gm-Message-State: AOJu0YwFORiAKoU46gBwtYR1TuqJncqYRo56l2Ze2FwJkwJHh9JCYYVL 3q12po7dyTgE/FduWVtGNzBwcOZglMFVKcDidYSdpwxjYzNywIxABvIN6eBfNm0dTmYNISrUOeN SWeofXn+x9a/JAe78qIzo93UPaKHqwhYT6iez X-Gm-Gg: AZuq6aKWsNo/Btowzhw/ztevw9aDQYjO7O96FV0htsAaN1Uh/In59+rN5A2MJg9aIbo h5dwouTZUn2YZJHEWabMPVDA6kjy9xBxPie7igxNTz1T8CJYnxf4aBZ6XlfJVNBONriUmkibEZI NPDYIs+5PQBuuNs/sw8u/Ij2GjX6Tpd/adwnIg503uKqFA2yBzbxIx+tADAqO8Oq8fnJkggK+wD mtZ+8/Gtf4yVNZPbOl4GWujxWx6cdRjbKMubRCMXNILYQgLWcBZrly4tnBZcbbM+aLkmZu5 X-Received: by 2002:a05:6820:3092:b0:662:fa75:d6df with SMTP id 006d021491bc7-6630f003c2amr6732932eaf.12.1770102780027; Mon, 02 Feb 2026 23:13:00 -0800 (PST) MIME-Version: 1.0 From: Richard Guo Date: Tue, 3 Feb 2026 16:12:48 +0900 X-Gm-Features: AZwV_Qh_-oJOa6qbNPPGe4w23BT1Rafql9BQhCEDOFSG2edWB_qODDhdMgAzrVQ Message-ID: Subject: Convert NOT IN sublinks to anti-joins when safe To: Pg Hackers Content-Type: multipart/mixed; boundary="0000000000006b99130649e62b02" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006b99130649e62b02 Content-Type: text/plain; charset="UTF-8" This topic has been discussed several times in the past. Due to the semantic mismatch regarding NULL handling, NOT IN is not ordinarily equivalent to an anti-join. However, if we can prove that neither the outer expressions nor the subquery outputs can yield NULL values, it should be safe to convert NOT IN to an anti-join. I believe we are now in a much better position to attempt this again. The planner has accumulated significant infrastructure that makes this proof straightforward and reliable. Specifically, we can now leverage the outer-join-aware-Var infrastructure to tell whether a Var comes from the nullable side of an outer join, and the not-null-attnums hash table to efficiently check whether a Var is defined NOT NULL. We also have the expr_is_nonnullable() function that is smart enough to deduce non-nullability for expressions more complex than simple Vars/Consts. Attached is a draft patch for this attempt (part of the code is adapted from an old patch [1] by David and Tom). This patch aims for a conservative implementation: the goal is not to handle every theoretical case, but to handle canonical query patterns with minimal code complexity. The patch primarily targets patterns like: SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM banned_users); ... and SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM banned_users WHERE user_id IS NOT NULL); This is a very typical syntax for exclusion. In well-modeled databases, join keys like id and user_id are very likely to be defined as NOT NULL. It seems to me that the ROI here is quite positive: the added code complexity is very low (thanks to the existing infrastructure), while the benefit is that users writing this typical pattern will finally get efficient anti-join plans without needing manual rewrites. (For the outer expressions, we could potentially also use outer query quals to prove non-nullability. This patch does not attempt to do so. Implementing this would require passing state down during the pull_up_sublinks recursion; and given that find_nonnullable_vars can fail to prove non-nullability in many cases due to the lack of const-simplification at this stage, I'm not sure whether it is worth the code complexity. Besides, I haven't fully convinced myself that doing this does not introduce correctness issues.) Any thoughts? [1] https://postgr.es/m/13766.1405037879@sss.pgh.pa.us - Richard --0000000000006b99130649e62b02 Content-Type: application/octet-stream; name="v1-0001-Convert-NOT-IN-sublinks-to-anti-joins-when-safe.patch" Content-Disposition: attachment; filename="v1-0001-Convert-NOT-IN-sublinks-to-anti-joins-when-safe.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ml69gw1o0 RnJvbSBlZDJmNzY0ZGNkMDhkMjNjZjE5ZGQzNjNmZDczNWVhMWZmNWMyN2Y2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSaWNoYXJkIEd1byA8Z3VvZmVuZ2xpbnV4QGdtYWlsLmNvbT4K RGF0ZTogRnJpLCAzMCBKYW4gMjAyNiAxMjoyOTo0MiArMDkwMApTdWJqZWN0OiBbUEFUQ0ggdjFd IENvbnZlcnQgTk9UIElOIHN1YmxpbmtzIHRvIGFudGktam9pbnMgd2hlbiBzYWZlCgpUaGUgcGxh bm5lciBoYXMgaGlzdG9yaWNhbGx5IGJlZW4gdW5hYmxlIHRvIGNvbnZlcnQgInggTk9UIElOIChT RUxFQ1QKeSAuLi4pIiBzdWJsaW5rcyBpbnRvIGFudGktam9pbnMuICBUaGlzIGlzIGJlY2F1c2Ug c3RhbmRhcmQgU1FMCnNlbWFudGljcyBmb3IgTk9UIElOIHJlcXVpcmUgdGhhdCBpZiBlaXRoZXIg b3BlcmFuZCBpcyBOVUxMLCB0aGUKcmVzdWx0IGlzIE5VTEwgKGVmZmVjdGl2ZWx5IGZhbHNlKSwg Y2F1c2luZyB0aGUgcm93IHRvIGJlIGRpc2NhcmRlZC4KSW4gY29udHJhc3QsIGFuIGFudGktam9p biByZXR1cm5zIHRydWUgKHJvdyBwcmVzZXJ2ZWQpIGlmIG5vIG1hdGNoIGlzCmZvdW5kLiAgRHVl IHRvIHRoaXMgc2VtYW50aWMgbWlzbWF0Y2ggcmVnYXJkaW5nIE5VTEwgaGFuZGxpbmcsIHRoZQpj b252ZXJzaW9uIHdhcyBwcmV2aW91c2x5IGNvbnNpZGVyZWQgdW5zYWZlLgoKSG93ZXZlciwgaWYg d2UgY2FuIHByb3ZlIHRoYXQgbmVpdGhlciBzaWRlIG9mIHRoZSBjb21wYXJpc29uIGNhbiB5aWVs ZApOVUxMIHZhbHVlcywgdGhlIGJlaGF2aW9yIG9mIE5PVCBJTiBhbmQgYW50aS1qb2luIGJlY29t ZXMgaWRlbnRpY2FsLgpFbmFibGluZyB0aGlzIGNvbnZlcnNpb24gYWxsb3dzIHRoZSBwbGFubmVy IHRvIHRyZWF0IHRoZSBzdWJsaW5rIGFzIGEKZmlyc3QtY2xhc3MgcmVsYXRpb24gcmF0aGVyIHRo YW4gYW4gb3BhcXVlIFN1YlBsYW4gZmlsdGVyLiAgVGhpcwp1bmxvY2tzIGdsb2JhbCBqb2luIG9y ZGVyaW5nIG9wdGltaXphdGlvbiBhbmQgcGVybWl0cyB0aGUgc2VsZWN0aW9uIG9mCnRoZSBtb3N0 IGVmZmljaWVudCBqb2luIGFsZ29yaXRobSBiYXNlZCBvbiBjb3N0LCBvZnRlbiB5aWVsZGluZwpz aWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZm9yIGxhcmdlIGRhdGFzZXRzLgoK VGhpcyBwYXRjaCB2ZXJpZmllcyB0aGF0IG5laXRoZXIgc2lkZSBvZiB0aGUgY29tcGFyaXNvbiBj YW4gYmUgTlVMTAphbmQgcGVyZm9ybXMgdGhlIGNvbnZlcnNpb24gd2hlbiBzYWZldHkgaXMgcHJv dmVuLiAgRm9yIGEgVmFyIHRvIGJlCmd1YXJhbnRlZWQgbm9uLW51bGxhYmxlLCBpdCBtdXN0IGJl IGRlZmluZWQgYXMgTk9UIE5VTEwgaW4gdGhlIHNjaGVtYQphbmQgbm90IGNvbWUgZnJvbSB0aGUg bnVsbGFibGUgc2lkZSBvZiBhbiBvdXRlciBqb2luLCBvciBpdCBtdXN0IGJlCmZvcmNlZCBub24t bnVsbGFibGUgYnkgcHJvcGVyIHF1YWwgY2xhdXNlcy4gIFRoaXMgcGF0Y2ggbGV2ZXJhZ2VzIHRo ZQpvdXRlci1qb2luLWF3YXJlLVZhciBpbmZyYXN0cnVjdHVyZSB0byBkZXRlY3QgaWYgYSBWYXIg Y29tZXMgZnJvbSB0aGUKbnVsbGFibGUgc2lkZSBvZiBhbiBvdXRlciBqb2luLCBhbmQgY29uc3Vs dHMgdGhlIE5PVC1OVUxMLWF0dG51bXMgaGFzaAp0YWJsZSB0byBlZmZpY2llbnRseSB2ZXJpZnkg c2NoZW1hIGRlZmluaXRpb25zLiAgQWRkaXRpb25hbGx5LCBpdAplbXBsb3lzIGZpbmRfbm9ubnVs bGFibGVfdmFycyB0byBpZGVudGlmeSBWYXJzIGZvcmNlZCBub24tbnVsbGFibGUgYnkKZ2l2ZW4g cXVhbCBjbGF1c2VzIGFuZCBleHByX2lzX25vbm51bGxhYmxlIHRvIGRlZHVjZSBub24tbnVsbGFi aWxpdHkKZm9yIG90aGVyIGV4cHJlc3Npb24gdHlwZXMuCi0tLQogc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BsYW4vaW5pdHNwbGFuLmMgICAgfCAgIDQgKy0KIHNyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL3N1YnNlbGVjdC5jICAgIHwgMTI4ICsrKysrKystCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIv cHJlcC9wcmVwam9pbnRyZWUuYyB8ICA2NSArKystCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRp bC9jbGF1c2VzLmMgICAgICB8IDM3MiArKysrKysrKysrKysrKysrKystLS0KIHNyYy9iYWNrZW5k L3V0aWxzL2FkdC9pbnQ4LmMgICAgICAgICAgICAgIHwgICAyICstCiBzcmMvYmFja2VuZC91dGls cy9jYWNoZS9sc3lzY2FjaGUuYyAgICAgICB8ICAyNyArKwogc3JjL2luY2x1ZGUvb3B0aW1pemVy L2NsYXVzZXMuaCAgICAgICAgICAgfCAgIDEgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL29wdGlt aXplci5oICAgICAgICAgfCAgMTMgKy0KIHNyYy9pbmNsdWRlL29wdGltaXplci9zdWJzZWxlY3Qu aCAgICAgICAgIHwgICAxICsKIHNyYy9pbmNsdWRlL3V0aWxzL2xzeXNjYWNoZS5oICAgICAgICAg ICAgIHwgICAxICsKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3Vic2VsZWN0Lm91dCAgIHwg Mzc2ICsrKysrKysrKysrKysrKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N1YnNlbGVj dC5zcWwgICAgICAgIHwgMTUxICsrKysrKysrKwogMTIgZmlsZXMgY2hhbmdlZCwgMTA3NyBpbnNl cnRpb25zKCspLCA2NCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGxhbi9pbml0c3BsYW4uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2luaXRz cGxhbi5jCmluZGV4IDk3ZWE5NWE0ZWI4Li45YWFmMWM0ZTVjYSAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BsYW4vaW5pdHNwbGFuLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BsYW4vaW5pdHNwbGFuLmMKQEAgLTM0NDcsNyArMzQ0Nyw3IEBAIHJlc3RyaWN0aW9uX2lz X2Fsd2F5c190cnVlKFBsYW5uZXJJbmZvICpyb290LAogCQlpZiAobnVsbHRlc3QtPmFyZ2lzcm93 KQogCQkJcmV0dXJuIGZhbHNlOwogCi0JCXJldHVybiBleHByX2lzX25vbm51bGxhYmxlKHJvb3Qs IG51bGx0ZXN0LT5hcmcsIHRydWUpOworCQlyZXR1cm4gZXhwcl9pc19ub25udWxsYWJsZShyb290 LCBudWxsdGVzdC0+YXJnLCBOT1ROVUxMX1NPVVJDRV9SRUxPUFQpOwogCX0KIAogCS8qIElmIGl0 J3MgYW4gT1IsIGNoZWNrIGl0cyBzdWItY2xhdXNlcyAqLwpAQCAtMzUxMiw3ICszNTEyLDcgQEAg cmVzdHJpY3Rpb25faXNfYWx3YXlzX2ZhbHNlKFBsYW5uZXJJbmZvICpyb290LAogCQlpZiAobnVs bHRlc3QtPmFyZ2lzcm93KQogCQkJcmV0dXJuIGZhbHNlOwogCi0JCXJldHVybiBleHByX2lzX25v bm51bGxhYmxlKHJvb3QsIG51bGx0ZXN0LT5hcmcsIHRydWUpOworCQlyZXR1cm4gZXhwcl9pc19u b25udWxsYWJsZShyb290LCBudWxsdGVzdC0+YXJnLCBOT1ROVUxMX1NPVVJDRV9SRUxPUFQpOwog CX0KIAogCS8qIElmIGl0J3MgYW4gT1IsIGNoZWNrIGl0cyBzdWItY2xhdXNlcyAqLwpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vc3Vic2VsZWN0LmMgYi9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvcGxhbi9zdWJzZWxlY3QuYwppbmRleCBlOWRjOWQzMWYwNS4uNmYwYzQ3NjAy ZmYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1YnNlbGVjdC5jCisr KyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1YnNlbGVjdC5jCkBAIC05MSw2ICs5MSw3 IEBAIHN0YXRpYyBib29sIGNvbnRhaW5fb3V0ZXJfc2VsZnJlZihOb2RlICpub2RlKTsKIHN0YXRp YyBib29sIGNvbnRhaW5fb3V0ZXJfc2VsZnJlZl93YWxrZXIoTm9kZSAqbm9kZSwgSW5kZXggKmRl cHRoKTsKIHN0YXRpYyB2b2lkIGlubGluZV9jdGUoUGxhbm5lckluZm8gKnJvb3QsIENvbW1vblRh YmxlRXhwciAqY3RlKTsKIHN0YXRpYyBib29sIGlubGluZV9jdGVfd2Fsa2VyKE5vZGUgKm5vZGUs IGlubGluZV9jdGVfd2Fsa2VyX2NvbnRleHQgKmNvbnRleHQpOworc3RhdGljIGJvb2wgc3VibGlu a19vdXRlcmV4cHJzX2FyZV9ub3RfbnVsbGFibGUoUGxhbm5lckluZm8gKnJvb3QsIFN1Ykxpbmsg KnN1YmxpbmspOwogc3RhdGljIGJvb2wgc2ltcGxpZnlfRVhJU1RTX3F1ZXJ5KFBsYW5uZXJJbmZv ICpyb290LCBRdWVyeSAqcXVlcnkpOwogc3RhdGljIFF1ZXJ5ICpjb252ZXJ0X0VYSVNUU190b19B TlkoUGxhbm5lckluZm8gKnJvb3QsIFF1ZXJ5ICpzdWJzZWxlY3QsCiAJCQkJCQkJCQlOb2RlICoq dGVzdGV4cHIsIExpc3QgKipwYXJhbUlkcyk7CkBAIC0xMzA2LDExICsxMzA3LDE0IEBAIGNvbnZl cnRfVkFMVUVTX3RvX0FOWShQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqdGVzdGV4cHIsIFF1ZXJ5 ICp2YWx1ZXMpCiAgKiBJZiBzbywgZm9ybSBhIEpvaW5FeHByIGFuZCByZXR1cm4gaXQuICBSZXR1 cm4gTlVMTCBpZiB0aGUgU3ViTGluayBjYW5ub3QKICAqIGJlIGNvbnZlcnRlZCB0byBhIGpvaW4u CiAgKgotICogVGhlIG9ubHkgbm9uLW9idmlvdXMgaW5wdXQgcGFyYW1ldGVyIGlzIGF2YWlsYWJs ZV9yZWxzOiB0aGlzIGlzIHRoZSBzZXQKLSAqIG9mIHF1ZXJ5IHJlbHMgdGhhdCBjYW4gc2FmZWx5 IGJlIHJlZmVyZW5jZWQgaW4gdGhlIHN1YmxpbmsgZXhwcmVzc2lvbi4KLSAqIChXZSBtdXN0IHJl c3RyaWN0IHRoaXMgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIHNlbWFudGljcyB3aGVuIGEgc3VibGlu awotICogaXMgcHJlc2VudCBpbiBhbiBvdXRlciBqb2luJ3MgT04gcXVhbC4pICBUaGUgY29udmVy c2lvbiBtdXN0IGZhaWwgaWYKLSAqIHRoZSBjb252ZXJ0ZWQgcXVhbCB3b3VsZCByZWZlcmVuY2Ug YW55IGJ1dCB0aGVzZSBwYXJlbnQtcXVlcnkgcmVsaWRzLgorICogSWYgdW5kZXJfbm90IGlzIHRy dWUsIHRoZSBjYWxsZXIgYWN0dWFsbHkgZm91bmQgTk9UIChBTlkgU3ViTGluayksIHNvCisgKiB0 aGF0IHdoYXQgd2UgbXVzdCB0cnkgdG8gYnVpbGQgaXMgYW4gQU5USSBub3QgU0VNSSBqb2luLgor ICoKKyAqIGF2YWlsYWJsZV9yZWxzIGlzIHRoZSBzZXQgb2YgcXVlcnkgcmVscyB0aGF0IGNhbiBz YWZlbHkgYmUgcmVmZXJlbmNlZAorICogaW4gdGhlIHN1YmxpbmsgZXhwcmVzc2lvbi4gIChXZSBt dXN0IHJlc3RyaWN0IHRoaXMgdG8gYXZvaWQgY2hhbmdpbmcKKyAqIHRoZSBzZW1hbnRpY3Mgd2hl biBhIHN1YmxpbmsgaXMgcHJlc2VudCBpbiBhbiBvdXRlciBqb2luJ3MgT04gcXVhbC4pCisgKiBU aGUgY29udmVyc2lvbiBtdXN0IGZhaWwgaWYgdGhlIGNvbnZlcnRlZCBxdWFsIHdvdWxkIHJlZmVy ZW5jZSBhbnkgYnV0CisgKiB0aGVzZSBwYXJlbnQtcXVlcnkgcmVsaWRzLgogICoKICAqIE9uIHN1 Y2Nlc3MsIHRoZSByZXR1cm5lZCBKb2luRXhwciBoYXMgbGFyZyA9IE5VTEwgYW5kIHJhcmcgPSB0 aGUgam9pbnRyZWUKICAqIGl0ZW0gcmVwcmVzZW50aW5nIHRoZSBwdWxsZWQtdXAgc3VicXVlcnku ICBUaGUgY2FsbGVyIG11c3Qgc2V0IGxhcmcgdG8KQEAgLTEzMzMsNyArMTMzNyw3IEBAIGNvbnZl cnRfVkFMVUVTX3RvX0FOWShQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqdGVzdGV4cHIsIFF1ZXJ5 ICp2YWx1ZXMpCiAgKi8KIEpvaW5FeHByICoKIGNvbnZlcnRfQU5ZX3N1YmxpbmtfdG9fam9pbihQ bGFubmVySW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGluaywKLQkJCQkJCQlSZWxpZHMgYXZhaWxh YmxlX3JlbHMpCisJCQkJCQkJYm9vbCB1bmRlcl9ub3QsIFJlbGlkcyBhdmFpbGFibGVfcmVscykK IHsKIAlKb2luRXhwciAgICpyZXN1bHQ7CiAJUXVlcnkJICAgKnBhcnNlID0gcm9vdC0+cGFyc2U7 CkBAIC0xMzUxLDYgKzEzNTUsMTggQEAgY29udmVydF9BTllfc3VibGlua190b19qb2luKFBsYW5u ZXJJbmZvICpyb290LCBTdWJMaW5rICpzdWJsaW5rLAogCiAJQXNzZXJ0KHN1YmxpbmstPnN1Ykxp bmtUeXBlID09IEFOWV9TVUJMSU5LKTsKIAorCS8qCisJICogUGVyIFNRTCBzcGVjLCBOT1QgSU4g aXMgbm90IG9yZGluYXJpbHkgZXF1aXZhbGVudCB0byBhbiBhbnRpLWpvaW4sIHNvCisJICogdGhh dCBieSBkZWZhdWx0IHdlIGhhdmUgdG8gZmFpbCB3aGVuIHVuZGVyX25vdC4gIEhvd2V2ZXIsIGlm IHdlIGNhbgorCSAqIHByb3ZlIHRoYXQgbmVpdGhlciB0aGUgb3V0ZXIgcXVlcnkncyBleHByZXNz aW9ucyBub3IgdGhlIHN1Yi1zZWxlY3QncworCSAqIG91dHB1dCBjb2x1bW5zIGNhbiBiZSBOVUxM LCB0aGVuIHRoZSBsb2dpYyBpcyBpZGVudGljYWwgYW5kIGl0J3Mgc2FmZQorCSAqIHRvIGNvbnZl cnQgTk9UIElOIHRvIGFuIGFudGktam9pbi4KKwkgKi8KKwlpZiAodW5kZXJfbm90ICYmCisJCSgh c3VibGlua19vdXRlcmV4cHJzX2FyZV9ub3RfbnVsbGFibGUocm9vdCwgc3VibGluaykgfHwKKwkJ ICFxdWVyeV9vdXRwdXRzX2FyZV9ub3RfbnVsbGFibGUoc3Vic2VsZWN0KSkpCisJCXJldHVybiBO VUxMOworCiAJLyoKIAkgKiBJZiB0aGUgc3ViLXNlbGVjdCBjb250YWlucyBhbnkgVmFycyBvZiB0 aGUgcGFyZW50IHF1ZXJ5LCB3ZSB0cmVhdCBpdCBhcwogCSAqIExBVEVSQUwuICAoVmFycyBmcm9t IGhpZ2hlciBsZXZlbHMgZG9uJ3QgbWF0dGVyIGhlcmUuKQpAQCAtMTQyOCw3ICsxNDQ0LDcgQEAg Y29udmVydF9BTllfc3VibGlua190b19qb2luKFBsYW5uZXJJbmZvICpyb290LCBTdWJMaW5rICpz dWJsaW5rLAogCSAqIEFuZCBmaW5hbGx5LCBidWlsZCB0aGUgSm9pbkV4cHIgbm9kZS4KIAkgKi8K IAlyZXN1bHQgPSBtYWtlTm9kZShKb2luRXhwcik7Ci0JcmVzdWx0LT5qb2ludHlwZSA9IEpPSU5f U0VNSTsKKwlyZXN1bHQtPmpvaW50eXBlID0gdW5kZXJfbm90ID8gSk9JTl9BTlRJIDogSk9JTl9T RU1JOwogCXJlc3VsdC0+aXNOYXR1cmFsID0gZmFsc2U7CiAJcmVzdWx0LT5sYXJnID0gTlVMTDsJ CS8qIGNhbGxlciBtdXN0IGZpbGwgdGhpcyBpbiAqLwogCXJlc3VsdC0+cmFyZyA9IChOb2RlICop IHJ0cjsKQEAgLTE0NDEsMTIgKzE0NTcsMTA0IEBAIGNvbnZlcnRfQU5ZX3N1YmxpbmtfdG9fam9p bihQbGFubmVySW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGluaywKIAlyZXR1cm4gcmVzdWx0Owog fQogCisvKgorICogc3VibGlua19vdXRlcmV4cHJzX2FyZV9ub3RfbnVsbGFibGU6IHZlcmlmeSB0 aGF0IHRoZSBvdXRlciBleHByZXNzaW9ucworICogaW52b2x2ZWQgaW4gYW4gQU5ZX1NVQkxJTksg dGVzdGV4cHIgYXJlIHByb3ZhYmx5IG5vbi1udWxsYWJsZS4KKyAqCisgKiBXZSBoYW5kbGUgdGhl IHR3byBzdGFuZGFyZCBwYXJzZXIgcmVwcmVzZW50YXRpb25zIGZvciBBTlkgc3VibGlua3M6IGEg c2luZ2xlCisgKiBPcEV4cHIgZm9yIHNpbmdsZS1jb2x1bW4gY29tcGFyaXNvbnMsIGFuZCBhIEJv b2xFeHByIGNvbnRhaW5pbmcgYSBsaXN0IG9mCisgKiBPcEV4cHJzIGZvciBtdWx0aS1jb2x1bW4g Y29tcGFyaXNvbnMuICBJbiBib3RoIGNhc2VzLCB3ZSBjb2xsZWN0IHRoZSBvdXRlcgorICogZXhw cmVzc2lvbnMgKHdoaWNoIGFyZSB0aGUgZmlyc3QgYXJndW1lbnRzIG9mIHRoZSBPcEV4cHJzKSBh bmQgdmVyaWZ5IHRoZWlyCisgKiBub24tbnVsbGFiaWxpdHkuCisgKgorICogSXQgaXMgYWNjZXB0 YWJsZSBmb3IgdGhpcyBjaGVjayBub3QgdG8gYmUgZXhoYXVzdGl2ZS4gIFdlIGNhbiBlcnIgb24g dGhlCisgKiBzaWRlIG9mIGNvbnNlcnZhdGlzbTogaWYgd2UncmUgbm90IHN1cmUsIGl0J3Mgb2th eSB0byByZXR1cm4gRkFMU0UuCisgKi8KK3N0YXRpYyBib29sCitzdWJsaW5rX291dGVyZXhwcnNf YXJlX25vdF9udWxsYWJsZShQbGFubmVySW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGluaykKK3sK KwlOb2RlCSAgICp0ZXN0ZXhwciA9IHN1YmxpbmstPnRlc3RleHByOworCUxpc3QJICAgKm91dGVy X2V4cHJzID0gTklMOworCUxpc3RDZWxsICAgKmxjOworCisJLyogUHVudCBpZiBzdWJsaW5rIGlz IG5vdCBpbiB0aGUgZXhwZWN0ZWQgZm9ybWF0ICovCisJaWYgKHN1YmxpbmstPnN1YkxpbmtUeXBl ICE9IEFOWV9TVUJMSU5LIHx8IHRlc3RleHByID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKwor CWlmIChJc0EodGVzdGV4cHIsIE9wRXhwcikpCisJeworCQkvKiBzaW5nbGUtY29sdW1uIGNvbXBh cmlzb24gKi8KKwkJT3BFeHByCSAgICpvcGV4cHIgPSAoT3BFeHByICopIHRlc3RleHByOworCisJ CUFzc2VydChsaXN0X2xlbmd0aChvcGV4cHItPmFyZ3MpID09IDIpOworCisJCW91dGVyX2V4cHJz ID0gbGFwcGVuZChvdXRlcl9leHBycywgbGluaXRpYWwob3BleHByLT5hcmdzKSk7CisJfQorCWVs c2UgaWYgKElzQSh0ZXN0ZXhwciwgQm9vbEV4cHIpKQorCXsKKwkJLyogbXVsdGktY29sdW1uIGNv bXBhcmlzb24gKEFORCBjbGF1c2Ugb2YgT3BFeHBycykgKi8KKwkJQm9vbEV4cHIgICAqYiA9IChC b29sRXhwciAqKSB0ZXN0ZXhwcjsKKworCQlpZiAoYi0+Ym9vbG9wICE9IEFORF9FWFBSKQorCQkJ cmV0dXJuIGZhbHNlOworCisJCWZvcmVhY2gobGMsIGItPmFyZ3MpCisJCXsKKwkJCU9wRXhwcgkg ICAqb3BleHByID0gKE9wRXhwciAqKSBsZmlyc3QobGMpOworCisJCQlpZiAoIUlzQShvcGV4cHIs IE9wRXhwcikpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQlBc3NlcnQobGlzdF9sZW5ndGgob3Bl eHByLT5hcmdzKSA9PSAyKTsKKworCQkJb3V0ZXJfZXhwcnMgPSBsYXBwZW5kKG91dGVyX2V4cHJz LCBsaW5pdGlhbChvcGV4cHItPmFyZ3MpKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvKiBQdW50 IGlmIG90aGVyIG5vZGUgdHlwZXMgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICog U2luY2UgdGhlIHF1ZXJ5IGhhc24ndCB5ZXQgYmVlbiB0aHJvdWdoIGV4cHJlc3Npb24gcHJlcHJv Y2Vzc2luZywgd2UKKwkgKiBtdXN0IGFwcGx5IGZsYXR0ZW5fam9pbl9hbGlhc192YXJzIHRvIHRo ZSBvdXRlciBleHByZXNzaW9ucyB0byBhdm9pZAorCSAqIGJlaW5nIGZvb2xlZCBieSBqb2luIGFs aWFzZXMuCisJICoKKwkgKiBXZSBkbyBub3QgbmVlZCB0byBhcHBseSBmbGF0dGVuX2dyb3VwX2V4 cHJzIHRob3VnaCwgc2luY2UgZ3JvdXBpbmcgVmFycworCSAqIGNhbm5vdCBhcHBlYXIgaW4gam9p bnRyZWUgcXVhbHMuCisJICovCisJb3V0ZXJfZXhwcnMgPSAoTGlzdCAqKQorCQlmbGF0dGVuX2pv aW5fYWxpYXNfdmFycyhyb290LCByb290LT5wYXJzZSwgKE5vZGUgKikgb3V0ZXJfZXhwcnMpOwor CisJLyogQ2hlY2sgdGhhdCBldmVyeSBvdXRlciBleHByZXNzaW9uIGlzIG5vbi1udWxsYWJsZSAq LworCWZvcmVhY2gobGMsIG91dGVyX2V4cHJzKQorCXsKKwkJRXhwcgkgICAqZXhwciA9IChFeHBy ICopIGxmaXJzdChsYyk7CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhbHJlYWR5IGNvbGxlY3RlZCBy ZWxhdGlvbi1sZXZlbCBub3QtbnVsbCBjb25zdHJhaW50cyBmb3IKKwkJICogdGhlIG91dGVyIHF1 ZXJ5LCBzbyB3ZSBjYW4gY29uc3VsdCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZm9yCisJCSAqIG51 bGxhYmlsaXR5IGluZm9ybWF0aW9uLgorCQkgKi8KKwkJaWYgKCFleHByX2lzX25vbm51bGxhYmxl KHJvb3QsIGV4cHIsIE5PVE5VTExfU09VUkNFX0hBU0hUQUJMRSkpCisJCQlyZXR1cm4gZmFsc2U7 CisKKwkJLyoKKwkJICogWFhYIEl0IGlzIHBvc3NpYmxlIHRvIGZ1cnRoZXIgcHJvdmUgbm9uLW51 bGxhYmlsaXR5IGJ5IGV4YW1pbmluZworCQkgKiB0aGUgcXVhbCBjbGF1c2VzIGF2YWlsYWJsZSBh dCBvciBiZWxvdyB0aGUgam9pbnRyZWUgbm9kZSB3aGVyZSB0aGlzCisJCSAqIE5PVCBJTiBjbGF1 c2UgaXMgZXZhbHVhdGVkLCBidXQgZm9yIHRoZSBtb21lbnQgaXQgZG9lc24ndCBzZWVtCisJCSAq IHdvcnRoIHRoZSBleHRyYSBjb21wbGljYXRpb24uCisJCSAqLworCX0KKworCXJldHVybiB0cnVl OworfQorCiAvKgogICogY29udmVydF9FWElTVFNfc3VibGlua190b19qb2luOiB0cnkgdG8gY29u dmVydCBhbiBFWElTVFMgU3ViTGluayB0byBhIGpvaW4KICAqCi0gKiBUaGUgQVBJIG9mIHRoaXMg ZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGNvbnZlcnRfQU5ZX3N1YmxpbmtfdG9fam9pbidzLAot ICogZXhjZXB0IHRoYXQgd2UgYWxzbyBzdXBwb3J0IHRoZSBjYXNlIHdoZXJlIHRoZSBjYWxsZXIg aGFzIGZvdW5kIE5PVCBFWElTVFMsCi0gKiBzbyB3ZSBuZWVkIGFuIGFkZGl0aW9uYWwgaW5wdXQg cGFyYW1ldGVyICJ1bmRlcl9ub3QiLgorICogVGhlIEFQSSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGlk ZW50aWNhbCB0byBjb252ZXJ0X0FOWV9zdWJsaW5rX3RvX2pvaW4ncy4KICAqLwogSm9pbkV4cHIg KgogY29udmVydF9FWElTVFNfc3VibGlua190b19qb2luKFBsYW5uZXJJbmZvICpyb290LCBTdWJM aW5rICpzdWJsaW5rLApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3ByZXAvcHJl cGpvaW50cmVlLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcHJlcC9wcmVwam9pbnRyZWUuYwpp bmRleCBjODBiZmM4OGQ4Mi4uNGNiYzE2NzQyMGQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29w dGltaXplci9wcmVwL3ByZXBqb2ludHJlZS5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9w cmVwL3ByZXBqb2ludHJlZS5jCkBAIC04NDgsMTQgKzg0OCwxNSBAQCBwdWxsX3VwX3N1Ymxpbmtz X3F1YWxfcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqbm9kZSwKIAkJCWlmICgoc2Fv cCA9IGNvbnZlcnRfVkFMVUVTX3RvX0FOWShyb290LAogCQkJCQkJCQkJCQkgIHN1YmxpbmstPnRl c3RleHByLAogCQkJCQkJCQkJCQkgIChRdWVyeSAqKSBzdWJsaW5rLT5zdWJzZWxlY3QpKSAhPSBO VUxMKQotCisJCQl7CiAJCQkJLyoKIAkJCQkgKiBUaGUgVkFMVUVTIHNlcXVlbmNlIHdhcyBzaW1w bGlmaWVkLiAgTm90aGluZyBtb3JlIHRvIGRvCiAJCQkJICogaGVyZS4KIAkJCQkgKi8KIAkJCQly ZXR1cm4gKE5vZGUgKikgc2FvcDsKKwkJCX0KIAotCQkJaWYgKChqID0gY29udmVydF9BTllfc3Vi bGlua190b19qb2luKHJvb3QsIHN1YmxpbmssCisJCQlpZiAoKGogPSBjb252ZXJ0X0FOWV9zdWJs aW5rX3RvX2pvaW4ocm9vdCwgc3VibGluaywgZmFsc2UsCiAJCQkJCQkJCQkJCQkgYXZhaWxhYmxl X3JlbHMxKSkgIT0gTlVMTCkKIAkJCXsKIAkJCQkvKiBZZXM7IGluc2VydCB0aGUgbmV3IGpvaW4g bm9kZSBpbnRvIHRoZSBqb2luIHRyZWUgKi8KQEAgLTg4MSw3ICs4ODIsNyBAQCBwdWxsX3VwX3N1 YmxpbmtzX3F1YWxfcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqbm9kZSwKIAkJCQly ZXR1cm4gTlVMTDsKIAkJCX0KIAkJCWlmIChhdmFpbGFibGVfcmVsczIgIT0gTlVMTCAmJgotCQkJ CShqID0gY29udmVydF9BTllfc3VibGlua190b19qb2luKHJvb3QsIHN1YmxpbmssCisJCQkJKGog PSBjb252ZXJ0X0FOWV9zdWJsaW5rX3RvX2pvaW4ocm9vdCwgc3VibGluaywgZmFsc2UsCiAJCQkJ CQkJCQkJCQkgYXZhaWxhYmxlX3JlbHMyKSkgIT0gTlVMTCkKIAkJCXsKIAkJCQkvKiBZZXM7IGlu c2VydCB0aGUgbmV3IGpvaW4gbm9kZSBpbnRvIHRoZSBqb2luIHRyZWUgKi8KQEAgLTk2NiwxNCAr OTY3LDY4IEBAIHB1bGxfdXBfc3VibGlua3NfcXVhbF9yZWN1cnNlKFBsYW5uZXJJbmZvICpyb290 LCBOb2RlICpub2RlLAogCX0KIAlpZiAoaXNfbm90Y2xhdXNlKG5vZGUpKQogCXsKLQkJLyogSWYg dGhlIGltbWVkaWF0ZSBhcmd1bWVudCBvZiBOT1QgaXMgRVhJU1RTLCB0cnkgdG8gY29udmVydCAq LworCQkvKiBJZiB0aGUgaW1tZWRpYXRlIGFyZ3VtZW50IG9mIE5PVCBpcyBBTlkgb3IgRVhJU1RT LCB0cnkgdG8gY29udmVydCAqLwogCQlTdWJMaW5rICAgICpzdWJsaW5rID0gKFN1YkxpbmsgKikg Z2V0X25vdGNsYXVzZWFyZygoRXhwciAqKSBub2RlKTsKIAkJSm9pbkV4cHIgICAqajsKIAkJUmVs aWRzCQljaGlsZF9yZWxzOwogCiAJCWlmIChzdWJsaW5rICYmIElzQShzdWJsaW5rLCBTdWJMaW5r KSkKIAkJewotCQkJaWYgKHN1YmxpbmstPnN1YkxpbmtUeXBlID09IEVYSVNUU19TVUJMSU5LKQor CQkJaWYgKHN1YmxpbmstPnN1YkxpbmtUeXBlID09IEFOWV9TVUJMSU5LKQorCQkJeworCQkJCWlm ICgoaiA9IGNvbnZlcnRfQU5ZX3N1YmxpbmtfdG9fam9pbihyb290LCBzdWJsaW5rLCB0cnVlLAor CQkJCQkJCQkJCQkJCSBhdmFpbGFibGVfcmVsczEpKSAhPSBOVUxMKQorCQkJCXsKKwkJCQkJLyog WWVzOyBpbnNlcnQgdGhlIG5ldyBqb2luIG5vZGUgaW50byB0aGUgam9pbiB0cmVlICovCisJCQkJ CWotPmxhcmcgPSAqanRsaW5rMTsKKwkJCQkJKmp0bGluazEgPSAoTm9kZSAqKSBqOworCQkJCQkv KiBSZWN1cnNpdmVseSBwcm9jZXNzIHB1bGxlZC11cCBqb2ludHJlZSBub2RlcyAqLworCQkJCQlq LT5yYXJnID0gcHVsbF91cF9zdWJsaW5rc19qb2ludHJlZV9yZWN1cnNlKHJvb3QsCisJCQkJCQkJ CQkJCQkJCQkJai0+cmFyZywKKwkJCQkJCQkJCQkJCQkJCQkmY2hpbGRfcmVscyk7CisKKwkJCQkJ LyoKKwkJCQkJICogTm93IHJlY3Vyc2l2ZWx5IHByb2Nlc3MgdGhlIHB1bGxlZC11cCBxdWFscy4g IEJlY2F1c2UKKwkJCQkJICogd2UgYXJlIHVuZGVybmVhdGggYSBOT1QsIHdlIGNhbid0IHB1bGwg dXAgc3VibGlua3MgdGhhdAorCQkJCQkgKiByZWZlcmVuY2UgdGhlIGxlZnQtaGFuZCBzdHVmZiwg YnV0IGl0J3Mgc3RpbGwgb2theSB0bworCQkJCQkgKiBwdWxsIHVwIHN1YmxpbmtzIHJlZmVyZW5j aW5nIGotPnJhcmcuCisJCQkJCSAqLworCQkJCQlqLT5xdWFscyA9IHB1bGxfdXBfc3VibGlua3Nf cXVhbF9yZWN1cnNlKHJvb3QsCisJCQkJCQkJCQkJCQkJCQkgai0+cXVhbHMsCisJCQkJCQkJCQkJ CQkJCQkgJmotPnJhcmcsCisJCQkJCQkJCQkJCQkJCQkgY2hpbGRfcmVscywKKwkJCQkJCQkJCQkJ CQkJCSBOVUxMLCBOVUxMKTsKKwkJCQkJLyogUmV0dXJuIE5VTEwgcmVwcmVzZW50aW5nIGNvbnN0 YW50IFRSVUUgKi8KKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCWlmIChhdmFpbGFibGVf cmVsczIgIT0gTlVMTCAmJgorCQkJCQkoaiA9IGNvbnZlcnRfQU5ZX3N1YmxpbmtfdG9fam9pbihy b290LCBzdWJsaW5rLCB0cnVlLAorCQkJCQkJCQkJCQkJCSBhdmFpbGFibGVfcmVsczIpKSAhPSBO VUxMKQorCQkJCXsKKwkJCQkJLyogWWVzOyBpbnNlcnQgdGhlIG5ldyBqb2luIG5vZGUgaW50byB0 aGUgam9pbiB0cmVlICovCisJCQkJCWotPmxhcmcgPSAqanRsaW5rMjsKKwkJCQkJKmp0bGluazIg PSAoTm9kZSAqKSBqOworCQkJCQkvKiBSZWN1cnNpdmVseSBwcm9jZXNzIHB1bGxlZC11cCBqb2lu dHJlZSBub2RlcyAqLworCQkJCQlqLT5yYXJnID0gcHVsbF91cF9zdWJsaW5rc19qb2ludHJlZV9y ZWN1cnNlKHJvb3QsCisJCQkJCQkJCQkJCQkJCQkJai0+cmFyZywKKwkJCQkJCQkJCQkJCQkJCQkm Y2hpbGRfcmVscyk7CisKKwkJCQkJLyoKKwkJCQkJICogTm93IHJlY3Vyc2l2ZWx5IHByb2Nlc3Mg dGhlIHB1bGxlZC11cCBxdWFscy4gIEJlY2F1c2UKKwkJCQkJICogd2UgYXJlIHVuZGVybmVhdGgg YSBOT1QsIHdlIGNhbid0IHB1bGwgdXAgc3VibGlua3MgdGhhdAorCQkJCQkgKiByZWZlcmVuY2Ug dGhlIGxlZnQtaGFuZCBzdHVmZiwgYnV0IGl0J3Mgc3RpbGwgb2theSB0bworCQkJCQkgKiBwdWxs IHVwIHN1YmxpbmtzIHJlZmVyZW5jaW5nIGotPnJhcmcuCisJCQkJCSAqLworCQkJCQlqLT5xdWFs cyA9IHB1bGxfdXBfc3VibGlua3NfcXVhbF9yZWN1cnNlKHJvb3QsCisJCQkJCQkJCQkJCQkJCQkg ai0+cXVhbHMsCisJCQkJCQkJCQkJCQkJCQkgJmotPnJhcmcsCisJCQkJCQkJCQkJCQkJCQkgY2hp bGRfcmVscywKKwkJCQkJCQkJCQkJCQkJCSBOVUxMLCBOVUxMKTsKKwkJCQkJLyogUmV0dXJuIE5V TEwgcmVwcmVzZW50aW5nIGNvbnN0YW50IFRSVUUgKi8KKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJ fQorCQkJfQorCQkJZWxzZSBpZiAoc3VibGluay0+c3ViTGlua1R5cGUgPT0gRVhJU1RTX1NVQkxJ TkspCiAJCQl7CiAJCQkJaWYgKChqID0gY29udmVydF9FWElTVFNfc3VibGlua190b19qb2luKHJv b3QsIHN1YmxpbmssIHRydWUsCiAJCQkJCQkJCQkJCQkJCWF2YWlsYWJsZV9yZWxzMSkpICE9IE5V TEwpCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1c2VzLmMgYi9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1c2VzLmMKaW5kZXggMzIyMDQ3NzZjNDUuLmM0 Yzg5OTU2YjUyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1c2Vz LmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvY2xhdXNlcy5jCkBAIC0yMSw2ICsy MSw3IEBACiAKICNpbmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCiAjaW5jbHVkZSAiY2F0 YWxvZy9wZ19jbGFzcy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfaW5oZXJpdHMuaCIKICNpbmNs dWRlICJjYXRhbG9nL3BnX2xhbmd1YWdlLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19vcGVyYXRv ci5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfcHJvYy5oIgpAQCAtMTEyLDYgKzExMyw3IEBAIHN0 YXRpYyBib29sIGNvbnRhaW5fY29udGV4dF9kZXBlbmRlbnRfbm9kZV93YWxrZXIoTm9kZSAqbm9k ZSwgaW50ICpmbGFncyk7CiBzdGF0aWMgYm9vbCBjb250YWluX2xlYWtlZF92YXJzX3dhbGtlcihO b2RlICpub2RlLCB2b2lkICpjb250ZXh0KTsKIHN0YXRpYyBSZWxpZHMgZmluZF9ub25udWxsYWJs ZV9yZWxzX3dhbGtlcihOb2RlICpub2RlLCBib29sIHRvcF9sZXZlbCk7CiBzdGF0aWMgTGlzdCAq ZmluZF9ub25udWxsYWJsZV92YXJzX3dhbGtlcihOb2RlICpub2RlLCBib29sIHRvcF9sZXZlbCk7 CitzdGF0aWMgdm9pZCBmaW5kX3N1YnF1ZXJ5X3NhZmVfcXVhbHMoTm9kZSAqanRub2RlLCBMaXN0 ICoqc2FmZV9xdWFscyk7CiBzdGF0aWMgYm9vbCBpc19zdHJpY3Rfc2FvcChTY2FsYXJBcnJheU9w RXhwciAqZXhwciwgYm9vbCBmYWxzZU9LKTsKIHN0YXRpYyBib29sIGNvbnZlcnRfc2FvcF90b19o YXNoZWRfc2FvcF93YWxrZXIoTm9kZSAqbm9kZSwgdm9pZCAqY29udGV4dCk7CiBzdGF0aWMgTm9k ZSAqZXZhbF9jb25zdF9leHByZXNzaW9uc19tdXRhdG9yKE5vZGUgKm5vZGUsCkBAIC0xNDMzLDYg KzE0MzUsMTAgQEAgY29udGFpbl9sZWFrZWRfdmFyc193YWxrZXIoTm9kZSAqbm9kZSwgdm9pZCAq Y29udGV4dCkKIAkJCQkJCQkJICBjb250ZXh0KTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisgKgkJICBOdWxsYWJpbGl0eSBhbmFseXNpcworICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAv KgogICogZmluZF9ub25udWxsYWJsZV9yZWxzCiAgKgkJRGV0ZXJtaW5lIHdoaWNoIGJhc2UgcmVs cyBhcmUgZm9yY2VkIG5vbm51bGxhYmxlIGJ5IGdpdmVuIGNsYXVzZS4KQEAgLTE3MDEsNyArMTcw Nyw3IEBAIGZpbmRfbm9ubnVsbGFibGVfcmVsc193YWxrZXIoTm9kZSAqbm9kZSwgYm9vbCB0b3Bf bGV2ZWwpCiAgKiBidXQgaGVyZSB3ZSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgaXMgYSBCb29sZWFu IGV4cHJlc3Npb24sIGFuZCB3aXNoIHRvCiAgKiBzZWUgaWYgTlVMTCBpbnB1dHMgd2lsbCBwcm92 YWJseSBjYXVzZSBhIEZBTFNFLW9yLU5VTEwgcmVzdWx0LiAgV2UgZXhwZWN0CiAgKiB0aGUgZXhw cmVzc2lvbiB0byBoYXZlIGJlZW4gQU5EL09SIGZsYXR0ZW5lZCBhbmQgY29udmVydGVkIHRvIGlt cGxpY2l0LUFORAotICogZm9ybWF0LgorICogZm9ybWF0IChidXQgdGhlIHJlc3VsdHMgYXJlIHN0 aWxsIGdvb2QgaWYgaXQgd2Fzbid0IEFORC9PUiBmbGF0dGVuZWQpLgogICoKICAqIEF0dG5vcyBv ZiB0aGUgaWRlbnRpZmllZCBWYXJzIGFyZSByZXR1cm5lZCBpbiBhIG11bHRpYml0bWFwc2V0IChh IExpc3Qgb2YKICAqIEJpdG1hcHNldHMpLiAgTGlzdCBpbmRleGVzIGNvcnJlc3BvbmQgdG8gcmVs aWRzICh2YXJub3MpLCB3aGlsZSB0aGUgcGVyLXJlbApAQCAtMjAyMSw2ICsyMDI3LDIyOSBAQCBm aW5kX2ZvcmNlZF9udWxsX3ZhcihOb2RlICpub2RlKQogCXJldHVybiBOVUxMOwogfQogCisvKgor ICogcXVlcnlfb3V0cHV0c19hcmVfbm90X251bGxhYmxlCisgKgkJUmV0dXJucyBUUlVFIGlmIHRo ZSBvdXRwdXQgdmFsdWVzIG9mIHRoZSBRdWVyeSBhcmUgY2VydGFpbmx5IG5vdCBOVUxMLgorICoJ CUFsbCBvdXRwdXQgY29sdW1ucyBtdXN0IHJldHVybiBub24tTlVMTCB0byBhbnN3ZXIgVFJVRS4K KyAqCisgKiBUaGUgcmVhc29uIHRoaXMgdGFrZXMgYSBRdWVyeSwgYW5kIG5vdCBqdXN0IGFuIGlu ZGl2aWR1YWwgdGxpc3QgZXhwcmVzc2lvbiwKKyAqIGlzIHNvIHRoYXQgd2UgY2FuIG1ha2UgdXNl IG9mIHRoZSBxdWVyeSdzIFdIRVJFL09OIGNsYXVzZXMgdG8gcHJvdmUgaXQgZG9lcworICogbm90 IHJldHVybiBudWxscy4KKyAqCisgKiBJbiBjdXJyZW50IHVzYWdlLCB0aGUgcGFzc2VkIHN1Yi1R dWVyeSBoYXNuJ3QgeWV0IGJlZW4gdGhyb3VnaCBhbnkgcGxhbm5lcgorICogcHJvY2Vzc2luZy4g IFRoaXMgbWVhbnMgdGhhdCBhcHBseWluZyBmaW5kX25vbm51bGxhYmxlX3ZhcnMoKSB0byBpdHMg V0hFUkUKKyAqIGNsYXVzZXMgaXNuJ3QgcmVhbGx5IGlkZWFsOiBmb3IgbGFjayBvZiBjb25zdC1z aW1wbGlmaWNhdGlvbiwgd2UgbWlnaHQgYmUKKyAqIHVuYWJsZSB0byBwcm92ZSBub3QtbnVsbG5l c3MgaW4gc29tZSBjYXNlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIHByb3ZlZCBpdAorICogYWZ0ZXJ3 YXJkcy4gIEhvd2V2ZXIsIHdlIHNob3VsZCBub3QgZ2V0IGFueSBmYWxzZSBwb3NpdGl2ZSByZXN1 bHRzLgorICoKKyAqIExpa2UgdGhlIG90aGVyIGZvcm1zIG9mIG51bGxhYmlsaXR5IGFuYWx5c2lz IGFib3ZlLCB3ZSBjYW4gZXJyIG9uIHRoZQorICogc2lkZSBvZiBjb25zZXJ2YXRpc206IGlmIHdl J3JlIG5vdCBzdXJlLCBpdCdzIG9rYXkgdG8gcmV0dXJuIEZBTFNFLgorICovCitib29sCitxdWVy eV9vdXRwdXRzX2FyZV9ub3RfbnVsbGFibGUoUXVlcnkgKnF1ZXJ5KQoreworCVBsYW5uZXJJbmZv IHN1YnJvb3Q7CisJTGlzdAkgICAqc2FmZV9xdWFscyA9IE5JTDsKKwlMaXN0CSAgICpub25udWxs YWJsZV92YXJzID0gTklMOworCWJvb2wJCWNvbXB1dGVkX25vbm51bGxhYmxlX3ZhcnMgPSBmYWxz ZTsKKwlMaXN0Q2VsbCAgICp0bDsKKworCS8qCisJICogSWYgdGhlIHF1ZXJ5IGNvbnRhaW5zIHNl dCBvcGVyYXRpb25zLCBwdW50LiAgVGhlIHNldCBvcHMgdGhlbXNlbHZlcworCSAqIGNvdWxkbid0 IGludHJvZHVjZSBudWxscyB0aGF0IHdlcmVuJ3QgaW4gdGhlaXIgaW5wdXRzLCBidXQgdGhlIHRs aXN0CisJICogcHJlc2VudCBpbiB0aGUgdG9wLWxldmVsIHF1ZXJ5IGlzIGp1c3QgZHVtbXkgYW5k IHdvbid0IGdpdmUgdXMgdXNlZnVsCisJICogaW5mby4gIFdlIGNvdWxkIGdldCBhbiBhbnN3ZXIg YnkgcmVjdXJzaW5nIHRvIGV4YW1pbmUgZWFjaCBsZWFmIHF1ZXJ5LAorCSAqIGJ1dCBmb3IgdGhl IG1vbWVudCBpdCBkb2Vzbid0IHNlZW0gd29ydGggdGhlIGV4dHJhIGNvbXBsaWNhdGlvbi4KKwkg Ki8KKwlpZiAocXVlcnktPnNldE9wZXJhdGlvbnMpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJ ICogSWYgdGhlIHF1ZXJ5IGNvbnRhaW5zIGdyb3VwaW5nIHNldHMsIHB1bnQuICBHcm91cGluZyBz ZXRzIGNhbiBpbnRyb2R1Y2UKKwkgKiBOVUxMIHZhbHVlcywgYW5kIHdlIGN1cnJlbnRseSBsYWNr IHRoZSBQbGFubmVySW5mbyBuZWVkZWQgdG8gZmxhdHRlbgorCSAqIGdyb3VwaW5nIFZhcnMgaW4g dGhlIHF1ZXJ5J3Mgb3V0cHV0cy4KKwkgKi8KKwlpZiAocXVlcnktPmdyb3VwaW5nU2V0cykKKwkJ cmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBXZSBuZWVkIGEgUGxhbm5lckluZm8gdG8gcGFzcyB0 byBleHByX2lzX25vbm51bGxhYmxlLiAgRm9ydHVuYXRlbHksIHdlCisJICogY2FuIGNvbnMgdXAg YW4gZW50aXJlbHkgZHVtbXkgb25lLCBiZWNhdXNlIG9ubHkgdGhlICJwYXJzZSIgbGluayBpbiB0 aGUKKwkgKiBzdHJ1Y3QgaXMgdXNlZCBieSBleHByX2lzX25vbm51bGxhYmxlLgorCSAqLworCU1l bVNldCgmc3Vicm9vdCwgMCwgc2l6ZW9mKHN1YnJvb3QpKTsKKwlzdWJyb290LnBhcnNlID0gcXVl cnk7CisKKwkvKgorCSAqIEV4YW1pbmUgZWFjaCB0YXJnZXRsaXN0IGVudHJ5IHRvIHByb3ZlIHRo YXQgaXQgY2FuJ3QgcHJvZHVjZSBOVUxMLgorCSAqLworCWZvcmVhY2godGwsIHF1ZXJ5LT50YXJn ZXRMaXN0KQorCXsKKwkJVGFyZ2V0RW50cnkgKnRsZSA9IChUYXJnZXRFbnRyeSAqKSBsZmlyc3Qo dGwpOworCQlFeHByCSAgICpleHByID0gdGxlLT5leHByOworCisJCS8qIFJlc2p1bmsgY29sdW1u cyBjYW4gYmUgaWdub3JlZDogdGhleSBkb24ndCBwcm9kdWNlIG91dHB1dCB2YWx1ZXMgKi8KKwkJ aWYgKHRsZS0+cmVzanVuaykKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIExvb2sgdGhyb3Vn aCBiaW5hcnkgcmVsYWJlbGluZ3MsIHNpbmNlIHdlIGtub3cgdGhvc2UgZG9uJ3QKKwkJICogaW50 cm9kdWNlIG51bGxzLgorCQkgKi8KKwkJd2hpbGUgKGV4cHIgJiYgSXNBKGV4cHIsIFJlbGFiZWxU eXBlKSkKKwkJCWV4cHIgPSAoKFJlbGFiZWxUeXBlICopIGV4cHIpLT5hcmc7CisKKwkJaWYgKGV4 cHIgPT0gTlVMTCkJCS8qIHBhcmFub2lhICovCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyoKKwkJ ICogU2luY2UgdGhlIHN1YnF1ZXJ5IGhhc24ndCB5ZXQgYmVlbiB0aHJvdWdoIGV4cHJlc3Npb24K KwkJICogcHJlcHJvY2Vzc2luZywgd2UgbXVzdCBhcHBseSBmbGF0dGVuX2pvaW5fYWxpYXNfdmFy cyB0byB0aGUgZ2l2ZW4KKwkJICogZXhwcmVzc2lvbiwgYW5kIHRvIHRoZSBxdWFscyBmb3VuZCBi eSBmaW5kX3N1YnF1ZXJ5X3NhZmVfcXVhbHMsIHRvCisJCSAqIGF2b2lkIGJlaW5nIGZvb2xlZCBi eSBqb2luIGFsaWFzZXMuCisJCSAqCisJCSAqIFdlIHdvbid0IGJlIGRlYWxpbmcgd2l0aCBhcmJp dHJhcnkgZXhwcmVzc2lvbnMsIHNvIGl0J3Mgc2FmZSB0byB1c2UKKwkJICogTlVMTCBhcyB0aGUg cm9vdCwgc28gbG9uZyBhcyBhZGp1c3Rfc3RhbmRhcmRfam9pbl9hbGlhc19leHByZXNzaW9uCisJ CSAqIGNhbiBoYW5kbGUgZXZlcnl0aGluZyB0aGUgcGFyc2VyIHdvdWxkIG1ha2UgYXMgYSBqb2lu IGFsaWFzCisJCSAqIGV4cHJlc3Npb24uCisJCSAqLworCQlleHByID0gKEV4cHIgKikgZmxhdHRl bl9qb2luX2FsaWFzX3ZhcnMoTlVMTCwgcXVlcnksIChOb2RlICopIGV4cHIpOworCisJCS8qCisJ CSAqIFNpbWlsYXJseSwgd2UgbXVzdCBhcHBseSBmbGF0dGVuX2dyb3VwX2V4cHJzIHRvIHRoZSBn aXZlbgorCQkgKiBleHByZXNzaW9uIHRvIGF2b2lkIGJlaW5nIGZvb2xlZCBieSBncm91cGluZyBW YXJzLiAgV2UgZG8gbm90IG5lZWQKKwkJICogdG8gYXBwbHkgZmxhdHRlbl9ncm91cF9leHBycyB0 byB0aGUgcXVhbHMgZm91bmQgYnkKKwkJICogZmluZF9zdWJxdWVyeV9zYWZlX3F1YWxzIHRob3Vn aCwgYXMgZ3JvdXBpbmcgVmFycyBjYW5ub3QgYXBwZWFyIGluCisJCSAqIGpvaW50cmVlIHF1YWxz LgorCQkgKgorCQkgKiBXZSBoYXZlIHZlcmlmaWVkIHRoYXQgdGhlIHF1ZXJ5IGRvZXMgbm90IGNv bnRhaW4gZ3JvdXBpbmcgc2V0cywgc28KKwkJICogaXQncyBzYWZlIHRvIHVzZSBOVUxMIGFzIHRo ZSByb290IGhlcmUuCisJCSAqLworCQlleHByID0gKEV4cHIgKikgZmxhdHRlbl9ncm91cF9leHBy cyhOVUxMLCBxdWVyeSwgKE5vZGUgKikgZXhwcik7CisKKwkJLyoKKwkJICogQ2hlY2sgdG8gc2Vl IGlmIHRoZSBleHByIGNhbm5vdCBiZSBOVUxMLiAgU2luY2Ugd2UncmUgb24gYSByYXcKKwkJICog cGFyc2UgdHJlZSwgd2UgbmVlZCB0byBsb29rIHVwIHRoZSBub3QtbnVsbCBjb25zdHJhaW50cyBm cm9tIHRoZQorCQkgKiBzeXN0ZW0gY2F0YWxvZ3MuCisJCSAqLworCQlpZiAoZXhwcl9pc19ub25u dWxsYWJsZSgmc3Vicm9vdCwgZXhwciwgTk9UTlVMTF9TT1VSQ0VfU1lTQ0FDSEUpKQorCQkJY29u dGludWU7CisKKwkJaWYgKElzQShleHByLCBWYXIpKQorCQl7CisJCQlWYXIJCSAgICp2YXIgPSAo VmFyICopIGV4cHI7CisKKwkJCS8qCisJCQkgKiBGb3IgYSBwbGFpbiBWYXIsIGV2ZW4gaWYgdGhh dCBkaWRuJ3Qgd29yaywgd2UgY2FuIGNvbmNsdWRlIHRoYXQKKwkJCSAqIHRoZSBWYXIgaXMgbm90 IG51bGxhYmxlIGlmIGZpbmRfbm9ubnVsbGFibGVfdmFycyBjYW4gZmluZCBhCisJCQkgKiAidmFy IElTIE5PVCBOVUxMIiBvciBzaW1pbGFybHkgc3RyaWN0IGNvbmRpdGlvbiBhbW9uZyB0aGUgcXVh bHMKKwkJCSAqIG9uIG5vbi1vdXRlcmpvaW5lZC1yZWxzLiAgQ29tcHV0ZSB0aGUgbGlzdCBvZiBW YXJzIGhhdmluZyBzdWNoCisJCQkgKiBxdWFscyBpZiB3ZSBkaWRuJ3QgYWxyZWFkeS4KKwkJCSAq LworCQkJaWYgKCFjb21wdXRlZF9ub25udWxsYWJsZV92YXJzKQorCQkJeworCQkJCWZpbmRfc3Vi cXVlcnlfc2FmZV9xdWFscygoTm9kZSAqKSBxdWVyeS0+am9pbnRyZWUsICZzYWZlX3F1YWxzKTsK KwkJCQlzYWZlX3F1YWxzID0gKExpc3QgKikKKwkJCQkJZmxhdHRlbl9qb2luX2FsaWFzX3ZhcnMo TlVMTCwgcXVlcnksIChOb2RlICopIHNhZmVfcXVhbHMpOworCQkJCW5vbm51bGxhYmxlX3ZhcnMg PSBmaW5kX25vbm51bGxhYmxlX3ZhcnMoKE5vZGUgKikgc2FmZV9xdWFscyk7CisJCQkJY29tcHV0 ZWRfbm9ubnVsbGFibGVfdmFycyA9IHRydWU7CisJCQl9CisKKwkJCWlmICghbWJtc19pc19tZW1i ZXIodmFyLT52YXJubywKKwkJCQkJCQkJdmFyLT52YXJhdHRubyAtIEZpcnN0TG93SW52YWxpZEhl YXBBdHRyaWJ1dGVOdW1iZXIsCisJCQkJCQkJCW5vbm51bGxhYmxlX3ZhcnMpKQorCQkJCXJldHVy biBmYWxzZTsJLyogd2UgZmFpbGVkIHRvIHByb3ZlIHRoZSBWYXIgbm9uLW51bGwgKi8KKwkJfQor CQllbHNlCisJCXsKKwkJCS8qIFB1bnQgb3RoZXJ3aXNlICovCisJCQlyZXR1cm4gZmFsc2U7CisJ CX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIGZpbmRfc3VicXVlcnlfc2FmZV9x dWFscworICoJCVRyYXZlcnNlIGpvaW50cmVlIHRvIGxvY2F0ZSBxdWFscyBvbiBub24tb3V0ZXJq b2luZWQtcmVscy4KKyAqCisgKiBXZSBsb2NhdGUgYWxsIFdIRVJFIGFuZCBKT0lOL09OIHF1YWxz IHRoYXQgY29uc3RyYWluIHRoZSByZWxzIHRoYXQgYXJlIG5vdAorICogYmVsb3cgdGhlIG51bGxh YmxlIHNpZGUgb2YgYW55IG91dGVyIGpvaW4sIGFuZCBhZGQgdGhlbSB0byB0aGUgKnNhZmVfcXVh bHMKKyAqIGxpc3QgKGZvcm1pbmcgYSBsaXN0IHdpdGggaW1wbGljaXQtQU5EIHNlbWFudGljcyku ICBUaGVzZSBxdWFscyBjYW4gYmUgdXNlZAorICogdG8gcHJvdmUgbm9uLW51bGxhYmlsaXR5IG9m IHRoZSBzdWJxdWVyeSdzIG91dHB1dHMuCisgKgorICogVG9wLWxldmVsIGNhbGxlciBtdXN0IGlu aXRpYWxpemUgKnNhZmVfcXVhbHMgdG8gTklMLgorICovCitzdGF0aWMgdm9pZAorZmluZF9zdWJx dWVyeV9zYWZlX3F1YWxzKE5vZGUgKmp0bm9kZSwgTGlzdCAqKnNhZmVfcXVhbHMpCit7CisJaWYg KGp0bm9kZSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKElzQShqdG5vZGUsIFJhbmdlVGJsUmVm KSkKKwl7CisJCS8qIExlYWYgbm9kZTogbm90aGluZyB0byBkbyAqLworCQlyZXR1cm47CisJfQor CWVsc2UgaWYgKElzQShqdG5vZGUsIEZyb21FeHByKSkKKwl7CisJCUZyb21FeHByICAgKmYgPSAo RnJvbUV4cHIgKikganRub2RlOworCQlMaXN0Q2VsbCAgICpsYzsKKworCQkvKiBBbGwgZWxlbWVu dHMgb2YgdGhlIEZST00gbGlzdCBhcmUgYWxsb3dhYmxlICovCisJCWZvcmVhY2gobGMsIGYtPmZy b21saXN0KQorCQkJZmluZF9zdWJxdWVyeV9zYWZlX3F1YWxzKChOb2RlICopIGxmaXJzdChsYyks IHNhZmVfcXVhbHMpOworCQkvKiAuLi4gYW5kIGl0cyBXSEVSRSBxdWFscyBhcmUgdG9vICovCisJ CWlmIChmLT5xdWFscykKKwkJCSpzYWZlX3F1YWxzID0gbGFwcGVuZCgqc2FmZV9xdWFscywgZi0+ cXVhbHMpOworCX0KKwllbHNlIGlmIChJc0EoanRub2RlLCBKb2luRXhwcikpCisJeworCQlKb2lu RXhwciAgICpqID0gKEpvaW5FeHByICopIGp0bm9kZTsKKworCQlzd2l0Y2ggKGotPmpvaW50eXBl KQorCQl7CisJCQljYXNlIEpPSU5fSU5ORVI6CisJCQkJLyogdmlzaXQgYm90aCBjaGlsZHJlbiAq LworCQkJCWZpbmRfc3VicXVlcnlfc2FmZV9xdWFscyhqLT5sYXJnLCBzYWZlX3F1YWxzKTsKKwkJ CQlmaW5kX3N1YnF1ZXJ5X3NhZmVfcXVhbHMoai0+cmFyZywgc2FmZV9xdWFscyk7CisJCQkJLyog YW5kIGdyYWIgdGhlIE9OIHF1YWxzIHRvbyAqLworCQkJCWlmIChqLT5xdWFscykKKwkJCQkJKnNh ZmVfcXVhbHMgPSBsYXBwZW5kKCpzYWZlX3F1YWxzLCBqLT5xdWFscyk7CisJCQkJYnJlYWs7CisK KwkJCWNhc2UgSk9JTl9MRUZUOgorCQkJY2FzZSBKT0lOX1NFTUk6CisJCQljYXNlIEpPSU5fQU5U SToKKworCQkJCS8qCisJCQkJICogT25seSB0aGUgbGVmdCBpbnB1dCBpcyBwb3NzaWJseSBub24t bnVsbGFibGU7IGZ1cnRoZXJtb3JlLAorCQkJCSAqIHRoZSBxdWFscyBvZiB0aGlzIGpvaW4gZG9u J3QgY29uc3RyYWluIHRoZSBsZWZ0IGlucHV0LgorCQkJCSAqIE5vdGU6IHdlIHByb2JhYmx5IGNh bid0IHNlZSBTRU1JIG9yIEFOVEkgam9pbnMgYXQgdGhpcworCQkJCSAqIHBvaW50LCBidXQgaWYg d2UgZG8sIHdlIGNhbiB0cmVhdCB0aGVtIGxpa2UgTEVGVCBqb2lucy4KKwkJCQkgKi8KKwkJCQlm aW5kX3N1YnF1ZXJ5X3NhZmVfcXVhbHMoai0+bGFyZywgc2FmZV9xdWFscyk7CisJCQkJYnJlYWs7 CisKKwkJCWNhc2UgSk9JTl9SSUdIVDoKKwkJCQkvKiBSZXZlcnNlIG9mIHRoZSBhYm92ZSBjYXNl ICovCisJCQkJZmluZF9zdWJxdWVyeV9zYWZlX3F1YWxzKGotPnJhcmcsIHNhZmVfcXVhbHMpOwor CQkJCWJyZWFrOworCisJCQljYXNlIEpPSU5fRlVMTDoKKwkJCQkvKiBOZWl0aGVyIHNpZGUgaXMg bm9uLW51bGxhYmxlLCBzbyBzdG9wIGRlc2NlbmRpbmcgKi8KKwkJCQlicmVhazsKKworCQkJZGVm YXVsdDoKKwkJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIGpvaW4gdHlwZTogJWQiLAorCQkJ CQkgKGludCkgai0+am9pbnR5cGUpOworCQl9CisJfQorCWVsc2UKKwkJZWxvZyhFUlJPUiwgInVu cmVjb2duaXplZCBub2RlIHR5cGU6ICVkIiwKKwkJCSAoaW50KSBub2RlVGFnKGp0bm9kZSkpOwor fQorCiAvKgogICogQ2FuIHdlIHRyZWF0IGEgU2NhbGFyQXJyYXlPcEV4cHIgYXMgc3RyaWN0Pwog ICoKQEAgLTMzMzgsNyArMzU2Nyw4IEBAIGV2YWxfY29uc3RfZXhwcmVzc2lvbnNfbXV0YXRvcihO b2RlICpub2RlLAogCQkJCQkJbmV3YXJncyA9IGxhcHBlbmQobmV3YXJncywgZSk7CiAJCQkJCQli cmVhazsKIAkJCQkJfQotCQkJCQlpZiAoZXhwcl9pc19ub25udWxsYWJsZShjb250ZXh0LT5yb290 LCAoRXhwciAqKSBlLCBmYWxzZSkpCisJCQkJCWlmIChleHByX2lzX25vbm51bGxhYmxlKGNvbnRl eHQtPnJvb3QsIChFeHByICopIGUsCisJCQkJCQkJCQkJCU5PVE5VTExfU09VUkNFX0hBU0hUQUJM RSkpCiAJCQkJCXsKIAkJCQkJCWlmIChuZXdhcmdzID09IE5JTCkKIAkJCQkJCQlyZXR1cm4gZTsJ LyogZmlyc3QgZXhwciAqLwpAQCAtMzUzMiw3ICszNzYyLDcgQEAgZXZhbF9jb25zdF9leHByZXNz aW9uc19tdXRhdG9yKE5vZGUgKm5vZGUsCiAJCQkJCQkgKi8KIAkJCQkJCWlmIChyZWxlbSAmJgog CQkJCQkJCWV4cHJfaXNfbm9ubnVsbGFibGUoY29udGV4dC0+cm9vdCwgKEV4cHIgKikgcmVsZW0s Ci0JCQkJCQkJCQkJCQlmYWxzZSkpCisJCQkJCQkJCQkJCQlOT1ROVUxMX1NPVVJDRV9IQVNIVEFC TEUpKQogCQkJCQkJewogCQkJCQkJCWlmIChudGVzdC0+bnVsbHRlc3R0eXBlID09IElTX05VTEwp CiAJCQkJCQkJCXJldHVybiBtYWtlQm9vbENvbnN0KGZhbHNlLCBmYWxzZSk7CkBAIC0zNTg0LDcg KzM4MTQsOCBAQCBldmFsX2NvbnN0X2V4cHJlc3Npb25zX211dGF0b3IoTm9kZSAqbm9kZSwKIAkJ CQkJcmV0dXJuIG1ha2VCb29sQ29uc3QocmVzdWx0LCBmYWxzZSk7CiAJCQkJfQogCQkJCWlmICgh bnRlc3QtPmFyZ2lzcm93ICYmIGFyZyAmJgotCQkJCQlleHByX2lzX25vbm51bGxhYmxlKGNvbnRl eHQtPnJvb3QsIChFeHByICopIGFyZywgZmFsc2UpKQorCQkJCQlleHByX2lzX25vbm51bGxhYmxl KGNvbnRleHQtPnJvb3QsIChFeHByICopIGFyZywKKwkJCQkJCQkJCQlOT1ROVUxMX1NPVVJDRV9I QVNIVEFCTEUpKQogCQkJCXsKIAkJCQkJYm9vbAkJcmVzdWx0OwogCkBAIC00MjczLDE0ICs0NTA0 LDExIEBAIHNpbXBsaWZ5X2FnZ3JlZihBZ2dyZWYgKmFnZ3JlZiwgZXZhbF9jb25zdF9leHByZXNz aW9uc19jb250ZXh0ICpjb250ZXh0KQogICogSWYgdGhlIFZhciBpcyBkZWZpbmVkIE5PVCBOVUxM IGFuZCBtZWFud2hpbGUgaXMgbm90IG51bGxlZCBieSBhbnkgb3V0ZXIKICAqIGpvaW5zIG9yIGdy b3VwaW5nIHNldHMsIHRoZW4gd2UgY2FuIGtub3cgdGhhdCBpdCBjYW5ub3QgYmUgTlVMTC4KICAq Ci0gKiB1c2VfcmVsX2luZm8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgUmVs T3B0SW5mbyBpcyBhdmFpbGFibGUgZm9yCi0gKiB1c2UuCisgKiAic291cmNlIiBzcGVjaWZpZXMg d2hlcmUgd2Ugc2hvdWxkIGxvb2sgZm9yIE5PVCBOVUxMIHByb29mcy4KICAqLwogYm9vbAotdmFy X2lzX25vbm51bGxhYmxlKFBsYW5uZXJJbmZvICpyb290LCBWYXIgKnZhciwgYm9vbCB1c2VfcmVs X2luZm8pCit2YXJfaXNfbm9ubnVsbGFibGUoUGxhbm5lckluZm8gKnJvb3QsIFZhciAqdmFyLCBO b3ROdWxsU291cmNlIHNvdXJjZSkKIHsKLQlCaXRtYXBzZXQgICpub3RudWxsYXR0bnVtcyA9IE5V TEw7Ci0KIAlBc3NlcnQoSXNBKHZhciwgVmFyKSk7CiAKIAkvKiBza2lwIHVwcGVyLWxldmVsIFZh cnMgKi8KQEAgLTQyOTUsMzUgKzQ1MjMsODUgQEAgdmFyX2lzX25vbm51bGxhYmxlKFBsYW5uZXJJ bmZvICpyb290LCBWYXIgKnZhciwgYm9vbCB1c2VfcmVsX2luZm8pCiAJaWYgKHZhci0+dmFyYXR0 bm8gPCAwKQogCQlyZXR1cm4gdHJ1ZTsKIAotCS8qCi0JICogQ2hlY2sgaWYgdGhlIFZhciBpcyBk ZWZpbmVkIGFzIE5PVCBOVUxMLiAgV2UgcmV0cmlldmUgdGhlIGNvbHVtbiBOT1QKLQkgKiBOVUxM IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29ycmVzcG9uZGluZyBSZWxPcHRJbmZv IGlmIGl0IGlzCi0JICogYXZhaWxhYmxlOyBvdGhlcndpc2UsIHdlIHNlYXJjaCB0aGUgaGFzaCB0 YWJsZSBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLQkgKi8KLQlpZiAodXNlX3JlbF9pbmZvKQotCXsK LQkJUmVsT3B0SW5mbyAqcmVsID0gZmluZF9iYXNlX3JlbChyb290LCB2YXItPnZhcm5vKTsKKwkv KiB3ZSBkb24ndCB0cnVzdCB3aG9sZS1yb3cgVmFycyAqLworCWlmICh2YXItPnZhcmF0dG5vID09 IDApCisJCXJldHVybiBmYWxzZTsKIAotCQlub3RudWxsYXR0bnVtcyA9IHJlbC0+bm90bnVsbGF0 dG51bXM7Ci0JfQotCWVsc2UKKwkvKiBDaGVjayBpZiB0aGUgVmFyIGlzIGRlZmluZWQgYXMgTk9U IE5VTEwuICovCisJc3dpdGNoIChzb3VyY2UpCiAJewotCQlSYW5nZVRibEVudHJ5ICpydGUgPSBw bGFubmVyX3J0X2ZldGNoKHZhci0+dmFybm8sIHJvb3QpOworCQljYXNlIE5PVE5VTExfU09VUkNF X1JFTE9QVDoKKwkJCXsKKwkJCQkvKgorCQkJCSAqIFdlIHJldHJpZXZlIHRoZSBjb2x1bW4gTk9U IE5VTEwgY29uc3RyYWludCBpbmZvcm1hdGlvbiBmcm9tCisJCQkJICogdGhlIGNvcnJlc3BvbmRp bmcgUmVsT3B0SW5mby4KKwkJCQkgKi8KKwkJCQlSZWxPcHRJbmZvICpyZWw7CisJCQkJQml0bWFw c2V0ICAqbm90bnVsbGF0dG51bXM7CiAKLQkJLyoKLQkJICogV2UgbXVzdCBza2lwIGluaGVyaXRh bmNlIHBhcmVudCB0YWJsZXMsIGFzIHNvbWUgY2hpbGQgdGFibGVzIG1heQotCQkgKiBoYXZlIGEg Tk9UIE5VTEwgY29uc3RyYWludCBmb3IgYSBjb2x1bW4gd2hpbGUgb3RoZXJzIG1heSBub3QuICBU aGlzCi0JCSAqIGNhbm5vdCBoYXBwZW4gd2l0aCBwYXJ0aXRpb25lZCB0YWJsZXMsIHRob3VnaC4K LQkJICovCi0JCWlmIChydGUtPmluaCAmJiBydGUtPnJlbGtpbmQgIT0gUkVMS0lORF9QQVJUSVRJ T05FRF9UQUJMRSkKLQkJCXJldHVybiBmYWxzZTsKKwkJCQlyZWwgPSBmaW5kX2Jhc2VfcmVsKHJv b3QsIHZhci0+dmFybm8pOworCQkJCW5vdG51bGxhdHRudW1zID0gcmVsLT5ub3RudWxsYXR0bnVt czsKIAotCQlub3RudWxsYXR0bnVtcyA9IGZpbmRfcmVsYXRpb25fbm90bnVsbGF0dHMocm9vdCwg cnRlLT5yZWxpZCk7Ci0JfQorCQkJCXJldHVybiBibXNfaXNfbWVtYmVyKHZhci0+dmFyYXR0bm8s IG5vdG51bGxhdHRudW1zKTsKKwkJCX0KKwkJY2FzZSBOT1ROVUxMX1NPVVJDRV9IQVNIVEFCTEU6 CisJCQl7CisJCQkJLyoKKwkJCQkgKiBXZSByZXRyaWV2ZSB0aGUgY29sdW1uIE5PVCBOVUxMIGNv bnN0cmFpbnQgaW5mb3JtYXRpb24gZnJvbQorCQkJCSAqIHRoZSBoYXNoIHRhYmxlLgorCQkJCSAq LworCQkJCVJhbmdlVGJsRW50cnkgKnJ0ZTsKKwkJCQlCaXRtYXBzZXQgICpub3RudWxsYXR0bnVt czsKIAotCWlmICh2YXItPnZhcmF0dG5vID4gMCAmJgotCQlibXNfaXNfbWVtYmVyKHZhci0+dmFy YXR0bm8sIG5vdG51bGxhdHRudW1zKSkKLQkJcmV0dXJuIHRydWU7CisJCQkJcnRlID0gcGxhbm5l cl9ydF9mZXRjaCh2YXItPnZhcm5vLCByb290KTsKKworCQkJCS8qCisJCQkJICogV2UgbXVzdCBz a2lwIGluaGVyaXRhbmNlIHBhcmVudCB0YWJsZXMsIGFzIHNvbWUgY2hpbGQKKwkJCQkgKiB0YWJs ZXMgbWF5IGhhdmUgYSBOT1QgTlVMTCBjb25zdHJhaW50IGZvciBhIGNvbHVtbiB3aGlsZQorCQkJ CSAqIG90aGVycyBtYXkgbm90LiAgVGhpcyBjYW5ub3QgaGFwcGVuIHdpdGggcGFydGl0aW9uZWQK KwkJCQkgKiB0YWJsZXMsIHRob3VnaC4KKwkJCQkgKi8KKwkJCQlpZiAocnRlLT5pbmggJiYgcnRl LT5yZWxraW5kICE9IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUpCisJCQkJCXJldHVybiBmYWxz ZTsKKworCQkJCW5vdG51bGxhdHRudW1zID0gZmluZF9yZWxhdGlvbl9ub3RudWxsYXR0cyhyb290 LCBydGUtPnJlbGlkKTsKKworCQkJCXJldHVybiBibXNfaXNfbWVtYmVyKHZhci0+dmFyYXR0bm8s IG5vdG51bGxhdHRudW1zKTsKKwkJCX0KKwkJY2FzZSBOT1ROVUxMX1NPVVJDRV9TWVNDQUNIRToK KwkJCXsKKwkJCQkvKgorCQkJCSAqIFdlIGxvb2sgdXAgdGhlICJhdHRub3RudWxsIiBmaWVsZCBp biB0aGUgYXR0cmlidXRlCisJCQkJICogcmVsYXRpb24uCisJCQkJICovCisJCQkJUmFuZ2VUYmxF bnRyeSAqcnRlOworCisJCQkJcnRlID0gcGxhbm5lcl9ydF9mZXRjaCh2YXItPnZhcm5vLCByb290 KTsKKworCQkJCS8qIFdlIGNhbiBvbmx5IHJlYXNvbiBhYm91dCBvcmRpbmFyeSByZWxhdGlvbnMg Ki8KKwkJCQlpZiAocnRlLT5ydGVraW5kICE9IFJURV9SRUxBVElPTikKKwkJCQkJcmV0dXJuIGZh bHNlOworCisJCQkJLyoKKwkJCQkgKiBXZSBtdXN0IHNraXAgaW5oZXJpdGFuY2UgcGFyZW50IHRh YmxlcywgYXMgc29tZSBjaGlsZAorCQkJCSAqIHRhYmxlcyBtYXkgaGF2ZSBhIE5PVCBOVUxMIGNv bnN0cmFpbnQgZm9yIGEgY29sdW1uIHdoaWxlCisJCQkJICogb3RoZXJzIG1heSBub3QuICBUaGlz IGNhbm5vdCBoYXBwZW4gd2l0aCBwYXJ0aXRpb25lZAorCQkJCSAqIHRhYmxlcywgdGhvdWdoLgor CQkJCSAqCisJCQkJICogTm90ZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHJlbGF0aW9u IGFjdHVhbGx5IGhhcyBhbnkKKwkJCQkgKiBjaGlsZHJlbiwgYXMgd2UgbWlnaHQgbm90IGhhdmUg ZG9uZSB0aGF0IHlldC4KKwkJCQkgKi8KKwkJCQlpZiAocnRlLT5pbmggJiYgaGFzX3N1YmNsYXNz KHJ0ZS0+cmVsaWQpICYmCisJCQkJCXJ0ZS0+cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVE X1RBQkxFKQorCQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCQlyZXR1cm4gZ2V0X2F0dG5vdG51bGwo cnRlLT5yZWxpZCwgdmFyLT52YXJhdHRubyk7CisJCQl9CisJCWRlZmF1bHQ6CisJCQllbG9nKEVS Uk9SLCAidW5yZWNvZ25pemVkIE5vdE51bGxTb3VyY2U6ICVkIiwKKwkJCQkgKGludCkgc291cmNl KTsKKwkJCWJyZWFrOworCX0KIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTQzMzMsMTYgKzQ2MTEs MjIgQEAgdmFyX2lzX25vbm51bGxhYmxlKFBsYW5uZXJJbmZvICpyb290LCBWYXIgKnZhciwgYm9v bCB1c2VfcmVsX2luZm8pCiAgKgogICogUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gJ2V4cHIn IGNhbm5vdCBwcm9kdWNlIFNRTCBOVUxMcy4KICAqCi0gKiBJZiAndXNlX3JlbF9pbmZvJyBpcyB0 cnVlLCBudWxsYWJpbGl0eSBvZiBWYXJzIGlzIGNoZWNrZWQgdmlhIHRoZQotICogY29ycmVzcG9u ZGluZyBSZWxPcHRJbmZvIGZvciB0aGUgZ2l2ZW4gVmFyLiAgU29tZSBjYWxsZXJzIHJlcXVpcmUK LSAqIG51bGxhYmlsaXR5IGluZm9ybWF0aW9uIGJlZm9yZSBSZWxPcHRJbmZvcyBhcmUgZ2VuZXJh dGVkLiAgVGhlc2Ugc2hvdWxkCi0gKiBwYXNzICd1c2VfcmVsX2luZm8nIGFzIGZhbHNlLgorICog c291cmNlOiBzcGVjaWZpZXMgd2hlcmUgd2Ugc2hvdWxkIGxvb2sgZm9yIE5PVCBOVUxMIHByb29m cyBmb3IgVmFycy4KKyAqCS0gTk9UTlVMTF9TT1VSQ0VfUkVMT1BUOiBVc2VkIHdoZW4gUmVsT3B0 SW5mb3MgaGF2ZSBiZWVuIGdlbmVyYXRlZC4gIFdlCisgKglyZXRyaWV2ZSBudWxsYWJpbGl0eSBp bmZvcm1hdGlvbiBkaXJlY3RseSBmcm9tIHRoZSBSZWxPcHRJbmZvIGNvcnJlc3BvbmRpbmcKKyAq CXRvIHRoZSBWYXIuCisgKgktIE5PVE5VTExfU09VUkNFX0hBU0hUQUJMRTogVXNlZCB3aGVuIFJl bE9wdEluZm9zIGFyZSBub3QgeWV0IGF2YWlsYWJsZSwKKyAqCWJ1dCB3ZSBoYXZlIGFscmVhZHkg Y29sbGVjdGVkIHJlbGF0aW9uLWxldmVsIG5vdC1udWxsIGNvbnN0cmFpbnRzIGludG8gdGhlCisg KglnbG9iYWwgaGFzaCB0YWJsZS4KKyAqCS0gTk9UTlVMTF9TT1VSQ0VfU1lTQ0FDSEU6IFVzZWQg Zm9yIHJhdyBwYXJzZSB0cmVlcyB3aGVyZSBuZWl0aGVyCisgKglSZWxPcHRJbmZvcyBub3IgdGhl IGhhc2ggdGFibGUgYXJlIGF2YWlsYWJsZS4gIEluIHRoaXMgY2FzZSwgd2UgaGF2ZSB0bworICoJ bG9vayB1cCB0aGUgJ2F0dG5vdG51bGwnIGZpZWxkIGRpcmVjdGx5IGluIHRoZSBzeXN0ZW0gY2F0 YWxvZ3MuCiAgKgogICogRm9yIG5vdywgd2Ugc3VwcG9ydCBvbmx5IGEgbGltaXRlZCBzZXQgb2Yg ZXhwcmVzc2lvbiB0eXBlcy4gIFN1cHBvcnQgZm9yCiAgKiBhZGRpdGlvbmFsIG5vZGUgdHlwZXMg Y2FuIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuCiAgKi8KIGJvb2wKLWV4cHJfaXNfbm9ubnVsbGFi bGUoUGxhbm5lckluZm8gKnJvb3QsIEV4cHIgKmV4cHIsIGJvb2wgdXNlX3JlbF9pbmZvKQorZXhw cl9pc19ub25udWxsYWJsZShQbGFubmVySW5mbyAqcm9vdCwgRXhwciAqZXhwciwgTm90TnVsbFNv dXJjZSBzb3VyY2UpCiB7CiAJLyogc2luY2UgdGhpcyBmdW5jdGlvbiByZWN1cnNlcywgaXQgY291 bGQgYmUgZHJpdmVuIHRvIHN0YWNrIG92ZXJmbG93ICovCiAJY2hlY2tfc3RhY2tfZGVwdGgoKTsK QEAgLTQzNTIsNyArNDYzNiw3IEBAIGV4cHJfaXNfbm9ubnVsbGFibGUoUGxhbm5lckluZm8gKnJv b3QsIEV4cHIgKmV4cHIsIGJvb2wgdXNlX3JlbF9pbmZvKQogCQljYXNlIFRfVmFyOgogCQkJewog CQkJCWlmIChyb290KQotCQkJCQlyZXR1cm4gdmFyX2lzX25vbm51bGxhYmxlKHJvb3QsIChWYXIg KikgZXhwciwgdXNlX3JlbF9pbmZvKTsKKwkJCQkJcmV0dXJuIHZhcl9pc19ub25udWxsYWJsZShy b290LCAoVmFyICopIGV4cHIsIHNvdXJjZSk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUX0Nv bnN0OgpAQCAtNDM2OSw3ICs0NjUzLDcgQEAgZXhwcl9pc19ub25udWxsYWJsZShQbGFubmVySW5m byAqcm9vdCwgRXhwciAqZXhwciwgYm9vbCB1c2VfcmVsX2luZm8pCiAKIAkJCQlmb3JlYWNoX3B0 cihFeHByLCBhcmcsIGNvYWxlc2NlZXhwci0+YXJncykKIAkJCQl7Ci0JCQkJCWlmIChleHByX2lz X25vbm51bGxhYmxlKHJvb3QsIGFyZywgdXNlX3JlbF9pbmZvKSkKKwkJCQkJaWYgKGV4cHJfaXNf bm9ubnVsbGFibGUocm9vdCwgYXJnLCBzb3VyY2UpKQogCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJ fQogCQkJfQpAQCAtNDM4NCw3ICs0NjY4LDcgQEAgZXhwcl9pc19ub25udWxsYWJsZShQbGFubmVy SW5mbyAqcm9vdCwgRXhwciAqZXhwciwgYm9vbCB1c2VfcmVsX2luZm8pCiAKIAkJCQlmb3JlYWNo X3B0cihFeHByLCBhcmcsIG1pbm1heGV4cHItPmFyZ3MpCiAJCQkJewotCQkJCQlpZiAoZXhwcl9p c19ub25udWxsYWJsZShyb290LCBhcmcsIHVzZV9yZWxfaW5mbykpCisJCQkJCWlmIChleHByX2lz X25vbm51bGxhYmxlKHJvb3QsIGFyZywgc291cmNlKSkKIAkJCQkJCXJldHVybiB0cnVlOwogCQkJ CX0KIAkJCX0KQEAgLTQ0MDAsMTMgKzQ2ODQsMTMgQEAgZXhwcl9pc19ub25udWxsYWJsZShQbGFu bmVySW5mbyAqcm9vdCwgRXhwciAqZXhwciwgYm9vbCB1c2VfcmVsX2luZm8pCiAKIAkJCQkvKiBU aGUgZGVmYXVsdCByZXN1bHQgbXVzdCBiZSBwcmVzZW50IGFuZCBub24tbnVsbGFibGUgKi8KIAkJ CQlpZiAoY2FzZWV4cHItPmRlZnJlc3VsdCA9PSBOVUxMIHx8Ci0JCQkJCSFleHByX2lzX25vbm51 bGxhYmxlKHJvb3QsIGNhc2VleHByLT5kZWZyZXN1bHQsIHVzZV9yZWxfaW5mbykpCisJCQkJCSFl eHByX2lzX25vbm51bGxhYmxlKHJvb3QsIGNhc2VleHByLT5kZWZyZXN1bHQsIHNvdXJjZSkpCiAJ CQkJCXJldHVybiBmYWxzZTsKIAogCQkJCS8qIEFsbCBicmFuY2ggcmVzdWx0cyBtdXN0IGJlIG5v bi1udWxsYWJsZSAqLwogCQkJCWZvcmVhY2hfcHRyKENhc2VXaGVuLCBjYXNld2hlbiwgY2FzZWV4 cHItPmFyZ3MpCiAJCQkJewotCQkJCQlpZiAoIWV4cHJfaXNfbm9ubnVsbGFibGUocm9vdCwgY2Fz ZXdoZW4tPnJlc3VsdCwgdXNlX3JlbF9pbmZvKSkKKwkJCQkJaWYgKCFleHByX2lzX25vbm51bGxh YmxlKHJvb3QsIGNhc2V3aGVuLT5yZXN1bHQsIHNvdXJjZSkpCiAJCQkJCQlyZXR1cm4gZmFsc2U7 CiAJCQkJfQogCkBAIC00NDU0LDcgKzQ3MzgsNyBAQCBleHByX2lzX25vbm51bGxhYmxlKFBsYW5u ZXJJbmZvICpyb290LCBFeHByICpleHByLCBib29sIHVzZV9yZWxfaW5mbykKIAkJCQkgKiBub24t bnVsbGFibGUuCiAJCQkJICovCiAJCQkJcmV0dXJuIGV4cHJfaXNfbm9ubnVsbGFibGUocm9vdCwg KChSZWxhYmVsVHlwZSAqKSBleHByKS0+YXJnLAotCQkJCQkJCQkJCSAgIHVzZV9yZWxfaW5mbyk7 CisJCQkJCQkJCQkJICAgc291cmNlKTsKIAkJCX0KIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2ludDguYyBiL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC9pbnQ4LmMKaW5kZXggMzdkMzQ2ODViOTMuLjZjOGZiN2I3Mjc1IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC91dGlscy9hZHQvaW50OC5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9p bnQ4LmMKQEAgLTgzNCw3ICs4MzQsNyBAQCBpbnQ4aW5jX3N1cHBvcnQoUEdfRlVOQ1RJT05fQVJH UykKIAkJCQlQR19SRVRVUk5fUE9JTlRFUihOVUxMKTsKIAogCQkJLyogSWYgdGhlIGFyZyBpc24n dCBOVUxMYWJsZSwgZG8gdGhlIGNvbnZlcnNpb24gKi8KLQkJCWlmIChleHByX2lzX25vbm51bGxh YmxlKHJlcS0+cm9vdCwgYXJnLCBmYWxzZSkpCisJCQlpZiAoZXhwcl9pc19ub25udWxsYWJsZShy ZXEtPnJvb3QsIGFyZywgTk9UTlVMTF9TT1VSQ0VfSEFTSFRBQkxFKSkKIAkJCXsKIAkJCQlBZ2dy ZWYJICAgKm5ld2FnZzsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvY2FjaGUvbHN5 c2NhY2hlLmMgYi9zcmMvYmFja2VuZC91dGlscy9jYWNoZS9sc3lzY2FjaGUuYwppbmRleCBiOTI0 YTJkOTAwYi4uZTc5MDUzMWIwZmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hl L2xzeXNjYWNoZS5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL2xzeXNjYWNoZS5jCkBA IC0xMDcxLDYgKzEwNzEsMzMgQEAgZ2V0X2F0dG9wdGlvbnMoT2lkIHJlbGlkLCBpbnQxNiBhdHRu dW0pCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorLyoKKyAqIGdldF9hdHRub3RudWxsCisgKgorICoJ CUdpdmVuIHRoZSByZWxhdGlvbiBpZCBhbmQgdGhlIGF0dHJpYnV0ZSBudW1iZXIsCisgKgkJcmV0 dXJuIHRoZSAiYXR0bm90bnVsbCIgZmllbGQgZnJvbSB0aGUgYXR0cmlidXRlIHJlbGF0aW9uLgor ICovCitib29sCitnZXRfYXR0bm90bnVsbChPaWQgcmVsaWQsIEF0dHJOdW1iZXIgYXR0bnVtKQor eworCUhlYXBUdXBsZQl0cDsKKwlib29sCQlyZXN1bHQgPSBmYWxzZTsKKworCXRwID0gU2VhcmNo U3lzQ2FjaGUyKEFUVE5VTSwKKwkJCQkJCSBPYmplY3RJZEdldERhdHVtKHJlbGlkKSwKKwkJCQkJ CSBJbnQxNkdldERhdHVtKGF0dG51bSkpOworCisJaWYgKEhlYXBUdXBsZUlzVmFsaWQodHApKQor CXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0X3R1cCA9IChGb3JtX3BnX2F0dHJpYnV0ZSkgR0VU U1RSVUNUKHRwKTsKKworCQlyZXN1bHQgPSBhdHRfdHVwLT5hdHRub3RudWxsOworCQlSZWxlYXNl U3lzQ2FjaGUodHApOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qCQkJCS0tLS0tLS0t LS0gUEdfQ0FTVCBDQUNIRSAtLS0tLS0tLS0tCQkJCQkgKi8KIAogLyoKZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL29wdGltaXplci9jbGF1c2VzLmggYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvY2xh dXNlcy5oCmluZGV4IGE2NDAzNGU4YTZkLi44NTNhMjhjMDAwNyAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvb3B0aW1pemVyL2NsYXVzZXMuaAorKysgYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvY2xh dXNlcy5oCkBAIC00Miw2ICs0Miw3IEBAIGV4dGVybiBSZWxpZHMgZmluZF9ub25udWxsYWJsZV9y ZWxzKE5vZGUgKmNsYXVzZSk7CiBleHRlcm4gTGlzdCAqZmluZF9ub25udWxsYWJsZV92YXJzKE5v ZGUgKmNsYXVzZSk7CiBleHRlcm4gTGlzdCAqZmluZF9mb3JjZWRfbnVsbF92YXJzKE5vZGUgKm5v ZGUpOwogZXh0ZXJuIFZhciAqZmluZF9mb3JjZWRfbnVsbF92YXIoTm9kZSAqbm9kZSk7CitleHRl cm4gYm9vbCBxdWVyeV9vdXRwdXRzX2FyZV9ub3RfbnVsbGFibGUoUXVlcnkgKnF1ZXJ5KTsKIAog ZXh0ZXJuIGJvb2wgaXNfcHNldWRvX2NvbnN0YW50X2NsYXVzZShOb2RlICpjbGF1c2UpOwogZXh0 ZXJuIGJvb2wgaXNfcHNldWRvX2NvbnN0YW50X2NsYXVzZV9yZWxpZHMoTm9kZSAqY2xhdXNlLCBS ZWxpZHMgcmVsaWRzKTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wdGltaXplci9vcHRpbWl6 ZXIuaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9vcHRpbWl6ZXIuaAppbmRleCAzZDI3YTAxOTYw OS4uODg5MmM5MmFkMzcgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXplci9vcHRpbWl6 ZXIuaAorKysgYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvb3B0aW1pemVyLmgKQEAgLTEzMCw2ICsx MzAsMTQgQEAgZXh0ZXJuIEV4cHIgKmNhbm9uaWNhbGl6ZV9xdWFsKEV4cHIgKnF1YWwsIGJvb2wg aXNfY2hlY2spOwogCiAvKiBpbiB1dGlsL2NsYXVzZXMuYzogKi8KIAorLyogRW51bSB0byBzcGVj aWZ5IHdoZXJlIHZhcl9pc19ub25udWxsYWJsZSBzaG91bGQgbG9vayBmb3IgTk9UIE5VTEwgcHJv b2ZzICovCit0eXBlZGVmIGVudW0KK3sKKwlOT1ROVUxMX1NPVVJDRV9SRUxPUFQsCQkvKiBVc2Ug UmVsT3B0SW5mbyAqLworCU5PVE5VTExfU09VUkNFX0hBU0hUQUJMRSwJLyogVXNlIEdsb2JhbCBI YXNoIFRhYmxlICovCisJTk9UTlVMTF9TT1VSQ0VfU1lTQ0FDSEUsCS8qIFVzZSBTeXN0ZW0gQ2F0 YWxvZyAqLworfQkJCU5vdE51bGxTb3VyY2U7CisKIGV4dGVybiBib29sIGNvbnRhaW5fbXV0YWJs ZV9mdW5jdGlvbnMoTm9kZSAqY2xhdXNlKTsKIGV4dGVybiBib29sIGNvbnRhaW5fbXV0YWJsZV9m dW5jdGlvbnNfYWZ0ZXJfcGxhbm5pbmcoRXhwciAqZXhwcik7CiBleHRlcm4gYm9vbCBjb250YWlu X3ZvbGF0aWxlX2Z1bmN0aW9ucyhOb2RlICpjbGF1c2UpOwpAQCAtMTQ1LDEwICsxNTMsMTEgQEAg ZXh0ZXJuIE5vZGUgKmVzdGltYXRlX2V4cHJlc3Npb25fdmFsdWUoUGxhbm5lckluZm8gKnJvb3Qs IE5vZGUgKm5vZGUpOwogZXh0ZXJuIEV4cHIgKmV2YWx1YXRlX2V4cHIoRXhwciAqZXhwciwgT2lk IHJlc3VsdF90eXBlLCBpbnQzMiByZXN1bHRfdHlwbW9kLAogCQkJCQkJICAgT2lkIHJlc3VsdF9j b2xsYXRpb24pOwogCi1leHRlcm4gYm9vbCB2YXJfaXNfbm9ubnVsbGFibGUoUGxhbm5lckluZm8g KnJvb3QsIFZhciAqdmFyLCBib29sIHVzZV9yZWxfaW5mbyk7CitleHRlcm4gYm9vbCB2YXJfaXNf bm9ubnVsbGFibGUoUGxhbm5lckluZm8gKnJvb3QsIFZhciAqdmFyLAorCQkJCQkJCSAgIE5vdE51 bGxTb3VyY2Ugc291cmNlKTsKIAogZXh0ZXJuIGJvb2wgZXhwcl9pc19ub25udWxsYWJsZShQbGFu bmVySW5mbyAqcm9vdCwgRXhwciAqZXhwciwKLQkJCQkJCQkJYm9vbCB1c2VfcmVsX2luZm8pOwor CQkJCQkJCQlOb3ROdWxsU291cmNlIHNvdXJjZSk7CiAKIGV4dGVybiBMaXN0ICpleHBhbmRfZnVu Y3Rpb25fYXJndW1lbnRzKExpc3QgKmFyZ3MsIGJvb2wgaW5jbHVkZV9vdXRfYXJndW1lbnRzLAog CQkJCQkJCQkJICAgT2lkIHJlc3VsdF90eXBlLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0 aW1pemVyL3N1YnNlbGVjdC5oIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3N1YnNlbGVjdC5oCmlu ZGV4IDhhNTUwM2ViOTczLi40ZWNjY2Y0NmJkMyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3B0 aW1pemVyL3N1YnNlbGVjdC5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9zdWJzZWxlY3Qu aApAQCAtMjIsNiArMjIsNyBAQCBleHRlcm4gU2NhbGFyQXJyYXlPcEV4cHIgKmNvbnZlcnRfVkFM VUVTX3RvX0FOWShQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJCVF1ZXJ5ICp2YWx1ZXMp OwogZXh0ZXJuIEpvaW5FeHByICpjb252ZXJ0X0FOWV9zdWJsaW5rX3RvX2pvaW4oUGxhbm5lcklu Zm8gKnJvb3QsCiAJCQkJCQkJCQkJCSBTdWJMaW5rICpzdWJsaW5rLAorCQkJCQkJCQkJCQkgYm9v bCB1bmRlcl9ub3QsCiAJCQkJCQkJCQkJCSBSZWxpZHMgYXZhaWxhYmxlX3JlbHMpOwogZXh0ZXJu IEpvaW5FeHByICpjb252ZXJ0X0VYSVNUU19zdWJsaW5rX3RvX2pvaW4oUGxhbm5lckluZm8gKnJv b3QsCiAJCQkJCQkJCQkJCQlTdWJMaW5rICpzdWJsaW5rLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1 ZGUvdXRpbHMvbHN5c2NhY2hlLmggYi9zcmMvaW5jbHVkZS91dGlscy9sc3lzY2FjaGUuaAppbmRl eCA1NjU1YWNhNGMxNC4uMzZhYjc5ODczOTIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxz L2xzeXNjYWNoZS5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL2xzeXNjYWNoZS5oCkBAIC05OCw2 ICs5OCw3IEBAIGV4dGVybiBPaWQJZ2V0X2F0dHR5cGUoT2lkIHJlbGlkLCBBdHRyTnVtYmVyIGF0 dG51bSk7CiBleHRlcm4gdm9pZCBnZXRfYXR0dHlwZXR5cG1vZGNvbGwoT2lkIHJlbGlkLCBBdHRy TnVtYmVyIGF0dG51bSwKIAkJCQkJCQkJICBPaWQgKnR5cGlkLCBpbnQzMiAqdHlwbW9kLCBPaWQg KmNvbGxpZCk7CiBleHRlcm4gRGF0dW0gZ2V0X2F0dG9wdGlvbnMoT2lkIHJlbGlkLCBpbnQxNiBh dHRudW0pOworZXh0ZXJuIGJvb2wgZ2V0X2F0dG5vdG51bGwoT2lkIHJlbGlkLCBBdHRyTnVtYmVy IGF0dG51bSk7CiBleHRlcm4gT2lkCWdldF9jYXN0X29pZChPaWQgc291cmNldHlwZWlkLCBPaWQg dGFyZ2V0dHlwZWlkLCBib29sIG1pc3Npbmdfb2spOwogZXh0ZXJuIGNoYXIgKmdldF9jb2xsYXRp b25fbmFtZShPaWQgY29sbG9pZCk7CiBleHRlcm4gYm9vbCBnZXRfY29sbGF0aW9uX2lzZGV0ZXJt aW5pc3RpYyhPaWQgY29sbG9pZCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL3N1YnNlbGVjdC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5v dXQKaW5kZXggMjEzNWQ4Mjg4NGQuLjEyMzExMGE3ZmEyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9zdWJzZWxlY3Qub3V0CkBAIC0zMzIzLDMgKzMzMjMsMzc5IEBAIFNFTEVDVCB0ZW4gRlJP TSBvbmVrIHQgV0hFUkUgMS4wOjppbnRlZ2VyIElOICgoVkFMVUVTICgxKSwgKDMpKSk7CiAgU2Vx IFNjYW4gb24gb25layB0CiAoMSByb3cpCiAKKy0tCistLSBDaGVjayBOT1QgSU4gcGVyZm9ybXMg YW4gQU5USSBKT0lOIHdoZW4gYm90aCB0aGUgb3V0ZXIgcXVlcnkncyBleHByZXNzaW9ucworLS0g YW5kIHRoZSBzdWItc2VsZWN0J3Mgb3V0cHV0IGNvbHVtbnMgYXJlIHByb3ZhYmx5IG5vbi1udWxs YWJsZS4KKy0tCitCRUdJTjsKK0NSRUFURSBURU1QIFRBQkxFIG5vdF9udWxsX3RhYiAoaWQgaW50 IE5PVCBOVUxMLCB2YWwgaW50IE5PVCBOVUxMKTsKK0NSRUFURSBURU1QIFRBQkxFIG51bGxfdGFi IChpZCBpbnQsIHZhbCBpbnQpOworLS0gQU5USSBKT0lOOiBib3RoIHNpZGVzIGFyZSBkZWZpbmVk IE5PVCBOVUxMCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3Rh YgorV0hFUkUgaWQgTk9UIElOIChTRUxFQ1QgaWQgRlJPTSBub3RfbnVsbF90YWIpOworICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBBbnRp IEpvaW4KKyAgIEhhc2ggQ29uZDogKG5vdF9udWxsX3RhYi5pZCA9IG5vdF9udWxsX3RhYl8xLmlk KQorICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYgorICAgLT4gIEhhc2gKKyAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiBub3RfbnVsbF90YWIgbm90X251bGxfdGFiXzEKKyg1IHJvd3MpCisK Ky0tIE5vIEFOVEkgSk9JTjogb3V0ZXIgc2lkZSBpcyBudWxsYWJsZQorRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUICogRlJPTSBudWxsX3RhYgorV0hFUkUgaWQgTk9UIElOIChTRUxFQ1QgaWQg RlJPTSBub3RfbnVsbF90YWIpOworICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIG51bGxfdGFiCisgICBGaWx0 ZXI6IChOT1QgKEFOWSAoaWQgPSAoaGFzaGVkIFN1YlBsYW4gYW55XzEpLmNvbDEpKSkKKyAgIFN1 YlBsYW4gYW55XzEKKyAgICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYgorKDQgcm93cykK KworLS0gTm8gQU5USSBKT0lOOiBpbm5lciBzaWRlIGlzIG51bGxhYmxlCitFWFBMQUlOIChDT1NU UyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElOIChTRUxF Q1QgaWQgRlJPTSBudWxsX3RhYik7CisgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gbm90X251bGxfdGFiCisg ICBGaWx0ZXI6IChOT1QgKEFOWSAoaWQgPSAoaGFzaGVkIFN1YlBsYW4gYW55XzEpLmNvbDEpKSkK KyAgIFN1YlBsYW4gYW55XzEKKyAgICAgLT4gIFNlcSBTY2FuIG9uIG51bGxfdGFiCisoNCByb3dz KQorCistLSBBTlRJIEpPSU46IG91dGVyIHNpZGUgaXMgZGVmaW5lZCBOT1QgTlVMTCwgaW5uZXIg c2lkZSBpcyBmb3JjZWQgbm9ubnVsbGFibGUKKy0tIGJ5IHF1YWwgY2xhdXNlCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElOIChT RUxFQ1QgaWQgRlJPTSBudWxsX3RhYiBXSEVSRSBpZCBJUyBOT1QgTlVMTCk7CisgICAgICAgICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBBbnRpIEpvaW4KKyAgIEhhc2ggQ29u ZDogKG5vdF9udWxsX3RhYi5pZCA9IG51bGxfdGFiLmlkKQorICAgLT4gIFNlcSBTY2FuIG9uIG5v dF9udWxsX3RhYgorICAgLT4gIEhhc2gKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBudWxsX3Rh YgorICAgICAgICAgICAgICAgRmlsdGVyOiAoaWQgSVMgTk9UIE5VTEwpCisoNiByb3dzKQorCist LSBObyBBTlRJIEpPSU46IG91dGVyIHNpZGUgaXMgbnVsbGFibGUgKHdlIGRvbid0IGNoZWNrIG91 dGVyIHF1ZXJ5IHF1YWxzIGZvciBub3cpCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBG Uk9NIG51bGxfdGFiCitXSEVSRSBpZCBJUyBOT1QgTlVMTAorICBBTkQgaWQgTk9UIElOIChTRUxF Q1QgaWQgRlJPTSBub3RfbnVsbF90YWIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBudWxsX3RhYgorICAgRmlsdGVyOiAo KGlkIElTIE5PVCBOVUxMKSBBTkQgKE5PVCAoQU5ZIChpZCA9IChoYXNoZWQgU3ViUGxhbiBhbnlf MSkuY29sMSkpKSkKKyAgIFN1YlBsYW4gYW55XzEKKyAgICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9u dWxsX3RhYgorKDQgcm93cykKKworLS0gQU5USSBKT0lOOiBvdXRlciBzaWRlIGlzIGRlZmluZWQg Tk9UIE5VTEwsIGlubmVyIHNpZGUgaXMgZGVmaW5lZCBOT1QgTlVMTAorLS0gYW5kIGlzIG5vdCBu dWxsZWQgYnkgb3V0ZXIgam9pbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBu b3RfbnVsbF90YWIKK1dIRVJFIGlkIE5PVCBJTiAoCisgICAgU0VMRUNUIHQxLmlkCisgICAgRlJP TSBub3RfbnVsbF90YWIgdDEKKyAgICBMRUZUIEpPSU4gbm90X251bGxfdGFiIHQyIE9OIHQxLmlk ID0gdDIuaWQKKyk7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBIYXNoIEFudGkgSm9pbgorICAgSGFzaCBDb25kOiAobm90X251bGxfdGFiLmlk ID0gdDEuaWQpCisgICAtPiAgU2VxIFNjYW4gb24gbm90X251bGxfdGFiCisgICAtPiAgSGFzaAor ICAgICAgICAgLT4gIE1lcmdlIExlZnQgSm9pbgorICAgICAgICAgICAgICAgTWVyZ2UgQ29uZDog KHQxLmlkID0gdDIuaWQpCisgICAgICAgICAgICAgICAtPiAgU29ydAorICAgICAgICAgICAgICAg ICAgICAgU29ydCBLZXk6IHQxLmlkCisgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4g b24gbm90X251bGxfdGFiIHQxCisgICAgICAgICAgICAgICAtPiAgU29ydAorICAgICAgICAgICAg ICAgICAgICAgU29ydCBLZXk6IHQyLmlkCisgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNj YW4gb24gbm90X251bGxfdGFiIHQyCisoMTIgcm93cykKKworLS0gTm8gQU5USSBKT0lOOiBpbm5l ciBzaWRlIGlzIGRlZmluZWQgTk9UIE5VTEwgYnV0IGlzIG51bGxlZCBieSBvdXRlciBqb2luCitF WFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQg Tk9UIElOICgKKyAgICBTRUxFQ1QgdDIuaWQKKyAgICBGUk9NIG5vdF9udWxsX3RhYiB0MQorICAg IExFRlQgSk9JTiBub3RfbnVsbF90YWIgdDIgT04gdDEuaWQgPSB0Mi5pZAorKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBT ZXEgU2NhbiBvbiBub3RfbnVsbF90YWIKKyAgIEZpbHRlcjogKE5PVCAoQU5ZIChpZCA9IChoYXNo ZWQgU3ViUGxhbiBhbnlfMSkuY29sMSkpKQorICAgU3ViUGxhbiBhbnlfMQorICAgICAtPiAgTWVy Z2UgTGVmdCBKb2luCisgICAgICAgICAgIE1lcmdlIENvbmQ6ICh0MS5pZCA9IHQyLmlkKQorICAg ICAgICAgICAtPiAgU29ydAorICAgICAgICAgICAgICAgICBTb3J0IEtleTogdDEuaWQKKyAgICAg ICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYiB0MQorICAgICAgICAgICAt PiAgU29ydAorICAgICAgICAgICAgICAgICBTb3J0IEtleTogdDIuaWQKKyAgICAgICAgICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYiB0MgorKDExIHJvd3MpCisKKy0tIEFOVEkg Sk9JTjogb3V0ZXIgc2lkZSBpcyBkZWZpbmVkIE5PVCBOVUxMLCBpbm5lciBzaWRlIGlzIGZvcmNl ZCBub25udWxsYWJsZQorLS0gYnkgcXVhbCBjbGF1c2UKK0VYUExBSU4gKENPU1RTIE9GRikKK1NF TEVDVCAqIEZST00gbm90X251bGxfdGFiCitXSEVSRSBpZCBOT1QgSU4gKAorICAgIFNFTEVDVCB0 MS5pZAorICAgIEZST00gbnVsbF90YWIgdDEKKyAgICBMRUZUIEpPSU4gbnVsbF90YWIgdDIgT04g dDEuaWQgPSB0Mi5pZAorICAgIFdIRVJFIHQxLmlkIElTIE5PVCBOVUxMCispOworICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggQW50aSBKb2lu CisgICBIYXNoIENvbmQ6IChub3RfbnVsbF90YWIuaWQgPSB0MS5pZCkKKyAgIC0+ICBTZXEgU2Nh biBvbiBub3RfbnVsbF90YWIKKyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgTWVyZ2UgTGVmdCBK b2luCisgICAgICAgICAgICAgICBNZXJnZSBDb25kOiAodDEuaWQgPSB0Mi5pZCkKKyAgICAgICAg ICAgICAgIC0+ICBTb3J0CisgICAgICAgICAgICAgICAgICAgICBTb3J0IEtleTogdDEuaWQKKyAg ICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBudWxsX3RhYiB0MQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgRmlsdGVyOiAoaWQgSVMgTk9UIE5VTEwpCisgICAgICAgICAgICAg ICAtPiAgU29ydAorICAgICAgICAgICAgICAgICAgICAgU29ydCBLZXk6IHQyLmlkCisgICAgICAg ICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbnVsbF90YWIgdDIKKygxMyByb3dzKQorCist LSBBTlRJIEpPSU46IG91dGVyIHNpZGUgaXMgZGVmaW5lZCBOT1QgTlVMTCwgaW5uZXIgc2lkZSBp cyBmb3JjZWQgbm9ubnVsbGFibGUKKy0tIGJ5IHF1YWwgY2xhdXNlCitFWFBMQUlOIChDT1NUUyBP RkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElOICgKKyAgICBT RUxFQ1QgdDEuaWQKKyAgICBGUk9NIG51bGxfdGFiIHQxCisgICAgSU5ORVIgSk9JTiBudWxsX3Rh YiB0MiBPTiB0MS5pZCA9IHQyLmlkCisgICAgTEVGVCBKT0lOIG51bGxfdGFiIHQzIE9OIFRSVUUK Kyk7CisgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTWVyZ2Ug QW50aSBKb2luCisgICBNZXJnZSBDb25kOiAobm90X251bGxfdGFiLmlkID0gdDEuaWQpCisgICAt PiAgU29ydAorICAgICAgICAgU29ydCBLZXk6IG5vdF9udWxsX3RhYi5pZAorICAgICAgICAgLT4g IFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYgorICAgLT4gIE5lc3RlZCBMb29wIExlZnQgSm9pbgor ICAgICAgICAgLT4gIE1lcmdlIEpvaW4KKyAgICAgICAgICAgICAgIE1lcmdlIENvbmQ6ICh0MS5p ZCA9IHQyLmlkKQorICAgICAgICAgICAgICAgLT4gIFNvcnQKKyAgICAgICAgICAgICAgICAgICAg IFNvcnQgS2V5OiB0MS5pZAorICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIG51 bGxfdGFiIHQxCisgICAgICAgICAgICAgICAtPiAgU29ydAorICAgICAgICAgICAgICAgICAgICAg U29ydCBLZXk6IHQyLmlkCisgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbnVs bF90YWIgdDIKKyAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIG51bGxfdGFiIHQzCisoMTYgcm93cykKKworLS0gQU5USSBKT0lOOiBvdXRlciBz aWRlIGlzIGRlZmluZWQgTk9UIE5VTEwgYW5kIGlzIG5vdCBudWxsZWQgYnkgb3V0ZXIgam9pbiwK Ky0tIGlubmVyIHNpZGUgaXMgZGVmaW5lZCBOT1QgTlVMTAorRVhQTEFJTiAoQ09TVFMgT0ZGKQor U0VMRUNUICogRlJPTSBub3RfbnVsbF90YWIgdDEKK0xFRlQgSk9JTiBub3RfbnVsbF90YWIgdDIg T04gdDEuaWQgPSB0Mi5pZAorV0hFUkUgdDEuaWQgTk9UIElOIChTRUxFQ1QgaWQgRlJPTSBub3Rf bnVsbF90YWIpOworICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE1lcmdlIExlZnQgSm9pbgorICAgTWVyZ2UgQ29uZDogKHQxLmlkID0gdDIuaWQpCisg ICAtPiAgU29ydAorICAgICAgICAgU29ydCBLZXk6IHQxLmlkCisgICAgICAgICAtPiAgSGFzaCBB bnRpIEpvaW4KKyAgICAgICAgICAgICAgIEhhc2ggQ29uZDogKHQxLmlkID0gbm90X251bGxfdGFi LmlkKQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYiB0MQorICAg ICAgICAgICAgICAgLT4gIEhhc2gKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBv biBub3RfbnVsbF90YWIKKyAgIC0+ICBTb3J0CisgICAgICAgICBTb3J0IEtleTogdDIuaWQKKyAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiBub3RfbnVsbF90YWIgdDIKKygxMiByb3dzKQorCistLSBO byBBTlRJIEpPSU46IG91dGVyIHNpZGUgaXMgbnVsbGVkIGJ5IG91dGVyIGpvaW4KK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gbm90X251bGxfdGFiIHQxCitMRUZUIEpPSU4gbm90 X251bGxfdGFiIHQyIE9OIHQxLmlkID0gdDIuaWQKK1dIRVJFIHQyLmlkIE5PVCBJTiAoU0VMRUNU IGlkIEZST00gbm90X251bGxfdGFiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBNZXJnZSBMZWZ0IEpvaW4KKyAg IE1lcmdlIENvbmQ6ICh0MS5pZCA9IHQyLmlkKQorICAgRmlsdGVyOiAoTk9UIChBTlkgKHQyLmlk ID0gKGhhc2hlZCBTdWJQbGFuIGFueV8xKS5jb2wxKSkpCisgICAtPiAgU29ydAorICAgICAgICAg U29ydCBLZXk6IHQxLmlkCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbm90X251bGxfdGFiIHQx CisgICAtPiAgU29ydAorICAgICAgICAgU29ydCBLZXk6IHQyLmlkCisgICAgICAgICAtPiAgU2Vx IFNjYW4gb24gbm90X251bGxfdGFiIHQyCisgICBTdWJQbGFuIGFueV8xCisgICAgIC0+ICBTZXEg U2NhbiBvbiBub3RfbnVsbF90YWIKKygxMSByb3dzKQorCistLSBObyBBTlRJIEpPSU46IHN1Ymxp bmsgaXMgaW4gYW4gb3V0ZXIgam9pbidzIE9OIHF1YWwgYW5kIHJlZmVyZW5jZXMgdGhlCistLSBu b24tbnVsbGFibGUgc2lkZQorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBub3Rf bnVsbF90YWIgdDEKK0xFRlQgSk9JTiBub3RfbnVsbF90YWIgdDIKK09OIHQxLmlkIE5PVCBJTiAo U0VMRUNUIGlkIEZST00gbm90X251bGxfdGFiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVz dGVkIExvb3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKE5PVCAoQU5ZICh0MS5pZCA9ICho YXNoZWQgU3ViUGxhbiBhbnlfMSkuY29sMSkpKQorICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxs X3RhYiB0MQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbm90 X251bGxfdGFiIHQyCisgICBTdWJQbGFuIGFueV8xCisgICAgIC0+ICBTZXEgU2NhbiBvbiBub3Rf bnVsbF90YWIKKyg3IHJvd3MpCisKKy0tIEFOVEkgSk9JTjogb3V0ZXIgc2lkZSBpcyBkZWZpbmVk IE5PVCBOVUxMIGFuZCBpcyBub3QgbnVsbGVkIGJ5IG91dGVyIGpvaW4sCistLSBpbm5lciBzaWRl IGlzIGRlZmluZWQgTk9UIE5VTEwKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00g bm90X251bGxfdGFiIHQxCitMRUZUIEpPSU4gbm90X251bGxfdGFiIHQyCitPTiB0Mi5pZCBOT1Qg SU4gKFNFTEVDVCBpZCBGUk9NIG5vdF9udWxsX3RhYik7CisgICAgICAgICAgICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICAt PiAgU2VxIFNjYW4gb24gbm90X251bGxfdGFiIHQxCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAg ICAgIC0+ICBIYXNoIEFudGkgSm9pbgorICAgICAgICAgICAgICAgSGFzaCBDb25kOiAodDIuaWQg PSBub3RfbnVsbF90YWIuaWQpCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbm90X251 bGxfdGFiIHQyCisgICAgICAgICAgICAgICAtPiAgSGFzaAorICAgICAgICAgICAgICAgICAgICAg LT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYgorKDggcm93cykKKworLS0gQU5USSBKT0lOOiBi b3RoIHNpZGVzIGFyZSBkZWZpbmVkIE5PVCBOVUxMCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgKGlkLCB2YWwpIE5PVCBJTiAoU0VMRUNUIGlk LCB2YWwgRlJPTSBub3RfbnVsbF90YWIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBNZXJnZSBBbnRpIEpvaW4KKyAgIE1lcmdlIENvbmQ6ICgobm90X251bGxfdGFiLmlkID0gbm90 X251bGxfdGFiXzEuaWQpIEFORCAobm90X251bGxfdGFiLnZhbCA9IG5vdF9udWxsX3RhYl8xLnZh bCkpCisgICAtPiAgU29ydAorICAgICAgICAgU29ydCBLZXk6IG5vdF9udWxsX3RhYi5pZCwgbm90 X251bGxfdGFiLnZhbAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYgorICAg LT4gIFNvcnQKKyAgICAgICAgIFNvcnQgS2V5OiBub3RfbnVsbF90YWJfMS5pZCwgbm90X251bGxf dGFiXzEudmFsCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbm90X251bGxfdGFiIG5vdF9udWxs X3RhYl8xCisoOCByb3dzKQorCistLSBObyBBTlRJIEpPSU46IG9uZSBjb2x1bW4gb2YgdGhlIG91 dGVyIHNpZGUgaXMgbnVsbGFibGUKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00g bm90X251bGxfdGFiIHQxLCBudWxsX3RhYiB0MgorV0hFUkUgKHQxLmlkLCB0Mi5pZCkgTk9UIElO IChTRUxFQ1QgaWQsIHZhbCBGUk9NIG5vdF9udWxsX3RhYik7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBG aWx0ZXI6IChOT1QgKEFOWSAoKHQxLmlkID0gKGhhc2hlZCBTdWJQbGFuIGFueV8xKS5jb2wxKSBB TkQgKHQyLmlkID0gKGhhc2hlZCBTdWJQbGFuIGFueV8xKS5jb2wyKSkpKQorICAgLT4gIFNlcSBT Y2FuIG9uIG5vdF9udWxsX3RhYiB0MQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAg U2VxIFNjYW4gb24gbnVsbF90YWIgdDIKKyAgIFN1YlBsYW4gYW55XzEKKyAgICAgLT4gIFNlcSBT Y2FuIG9uIG5vdF9udWxsX3RhYgorKDcgcm93cykKKworLS0gTm8gQU5USSBKT0lOOiBvbmUgY29s dW1uIG9mIHRoZSBpbm5lciBzaWRlIGlzIG51bGxhYmxlCitFWFBMQUlOIChDT1NUUyBPRkYpCitT RUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgKGlkLCB2YWwpIE5PVCBJTiAoU0VMRUNU IHQxLmlkLCB0Mi5pZCBGUk9NIG5vdF9udWxsX3RhYiB0MSwgbnVsbF90YWIgdDIpOworICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg U2VxIFNjYW4gb24gbm90X251bGxfdGFiCisgICBGaWx0ZXI6IChOT1QgKEFOWSAoKGlkID0gKFN1 YlBsYW4gYW55XzEpLmNvbDEpIEFORCAodmFsID0gKFN1YlBsYW4gYW55XzEpLmNvbDIpKSkpCisg ICBTdWJQbGFuIGFueV8xCisgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAtPiAgTmVz dGVkIExvb3AKKyAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYiB0 MQorICAgICAgICAgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIG51bGxfdGFiIHQyCisoOCByb3dzKQorCistLSBBTlRJIEpPSU46 IENPQUxFU0NFKG51bGxhYmxlLCBjb25zdGFudCkgaXMgbm9uLW51bGxhYmxlCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG51bGxfdGFiCitXSEVSRSBDT0FMRVNDRShpZCwgLTEp IE5PVCBJTiAoU0VMRUNUIGlkIEZST00gbm90X251bGxfdGFiKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIEhhc2ggQW50aSBKb2luCisgICBIYXNoIENvbmQ6IChDT0FMRVNDRShu dWxsX3RhYi5pZCwgJy0xJzo6aW50ZWdlcikgPSBub3RfbnVsbF90YWIuaWQpCisgICAtPiAgU2Vx IFNjYW4gb24gbnVsbF90YWIKKyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24g bm90X251bGxfdGFiCisoNSByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBG Uk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElOIChTRUxFQ1QgQ09BTEVTQ0UoaWQsIC0x KSBGUk9NIG51bGxfdGFiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2gg QW50aSBKb2luCisgICBIYXNoIENvbmQ6IChub3RfbnVsbF90YWIuaWQgPSBDT0FMRVNDRShudWxs X3RhYi5pZCwgJy0xJzo6aW50ZWdlcikpCisgICAtPiAgU2VxIFNjYW4gb24gbm90X251bGxfdGFi CisgICAtPiAgSGFzaAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIG51bGxfdGFiCisoNSByb3dz KQorCistLSBBTlRJIEpPSU46IEdST1VQIEJZICh3aXRob3V0IEdyb3VwaW5nIFNldHMpIHByZXNl cnZlcyB0aGUgbm9uLW51bGxhYmlsaXR5IG9mCistLSB0aGUgY29sdW1uCitFWFBMQUlOIChDT1NU UyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElOIChTRUxF Q1QgaWQgRlJPTSBub3RfbnVsbF90YWIgR1JPVVAgQlkgaWQpOworICAgICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBBbnRp IEpvaW4KKyAgIEhhc2ggQ29uZDogKG5vdF9udWxsX3RhYi5pZCA9IG5vdF9udWxsX3RhYl8xLmlk KQorICAgLT4gIFNlcSBTY2FuIG9uIG5vdF9udWxsX3RhYgorICAgLT4gIEhhc2gKKyAgICAgICAg IC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAgICAgICAgICBHcm91cCBLZXk6IG5vdF9udWxsX3Rh Yl8xLmlkCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbm90X251bGxfdGFiIG5vdF9u dWxsX3RhYl8xCisoNyByb3dzKQorCistLSBObyBBTlRJIEpPSU46IEdST1VQIEJZIG9uIGEgbnVs bGFibGUgY29sdW1uCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxs X3RhYgorV0hFUkUgaWQgTk9UIElOIChTRUxFQ1QgaWQgRlJPTSBudWxsX3RhYiBHUk9VUCBCWSBp ZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgU2VxIFNjYW4gb24gbm90X251bGxfdGFiCisgICBGaWx0ZXI6IChOT1QgKEFO WSAoaWQgPSAoaGFzaGVkIFN1YlBsYW4gYW55XzEpLmNvbDEpKSkKKyAgIFN1YlBsYW4gYW55XzEK KyAgICAgLT4gIEhhc2hBZ2dyZWdhdGUKKyAgICAgICAgICAgR3JvdXAgS2V5OiBudWxsX3RhYi5p ZAorICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbnVsbF90YWIKKyg2IHJvd3MpCisKKy0tIE5v IEFOVEkgSk9JTjogR3JvdXBpbmcgU2V0cyBjYW4gaW50cm9kdWNlIE5VTExzCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElOICgK KyAgICBTRUxFQ1QgaWQKKyAgICBGUk9NIG5vdF9udWxsX3RhYgorICAgIEdST1VQIEJZIEdST1VQ SU5HIFNFVFMgKChpZCksICh2YWwpKQorKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBub3RfbnVsbF90 YWIKKyAgIEZpbHRlcjogKE5PVCAoQU5ZIChpZCA9IChoYXNoZWQgU3ViUGxhbiBhbnlfMSkuY29s MSkpKQorICAgU3ViUGxhbiBhbnlfMQorICAgICAtPiAgSGFzaEFnZ3JlZ2F0ZQorICAgICAgICAg ICBIYXNoIEtleTogbm90X251bGxfdGFiXzEuaWQKKyAgICAgICAgICAgSGFzaCBLZXk6IG5vdF9u dWxsX3RhYl8xLnZhbAorICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gbm90X251bGxfdGFiIG5v dF9udWxsX3RhYl8xCisoNyByb3dzKQorCitST0xMQkFDSzsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL3N1YnNlbGVjdC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxl Y3Quc3FsCmluZGV4IGNhZGMzMjkzNjg3Li43NWU1OGNjOWI1ZiAxMDA2NDQKLS0tIGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvc3Vic2VsZWN0LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9z dWJzZWxlY3Quc3FsCkBAIC0xNDQ4LDMgKzE0NDgsMTU0IEBAIFNFTEVDVCAqIEZST00gb25layB0 MSwgbGF0ZXJhbCAoU0VMRUNUICogRlJPTSBvbmVrIHQyIFdIRVJFIHQyLnRlbiBJTiAodmFsdWVz ICh0CiAtLSBWdEEgY2F1c2VzIHRoZSB3aG9sZSBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZCBh cyBhIGNvbnN0YW50CiBFWFBMQUlOIChDT1NUUyBPRkYpCiBTRUxFQ1QgdGVuIEZST00gb25layB0 IFdIRVJFIDEuMDo6aW50ZWdlciBJTiAoKFZBTFVFUyAoMSksICgzKSkpOworCistLQorLS0gQ2hl Y2sgTk9UIElOIHBlcmZvcm1zIGFuIEFOVEkgSk9JTiB3aGVuIGJvdGggdGhlIG91dGVyIHF1ZXJ5 J3MgZXhwcmVzc2lvbnMKKy0tIGFuZCB0aGUgc3ViLXNlbGVjdCdzIG91dHB1dCBjb2x1bW5zIGFy ZSBwcm92YWJseSBub24tbnVsbGFibGUuCistLQorCitCRUdJTjsKKworQ1JFQVRFIFRFTVAgVEFC TEUgbm90X251bGxfdGFiIChpZCBpbnQgTk9UIE5VTEwsIHZhbCBpbnQgTk9UIE5VTEwpOworQ1JF QVRFIFRFTVAgVEFCTEUgbnVsbF90YWIgKGlkIGludCwgdmFsIGludCk7CisKKy0tIEFOVEkgSk9J TjogYm90aCBzaWRlcyBhcmUgZGVmaW5lZCBOT1QgTlVMTAorRVhQTEFJTiAoQ09TVFMgT0ZGKQor U0VMRUNUICogRlJPTSBub3RfbnVsbF90YWIKK1dIRVJFIGlkIE5PVCBJTiAoU0VMRUNUIGlkIEZS T00gbm90X251bGxfdGFiKTsKKworLS0gTm8gQU5USSBKT0lOOiBvdXRlciBzaWRlIGlzIG51bGxh YmxlCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG51bGxfdGFiCitXSEVSRSBp ZCBOT1QgSU4gKFNFTEVDVCBpZCBGUk9NIG5vdF9udWxsX3RhYik7CisKKy0tIE5vIEFOVEkgSk9J TjogaW5uZXIgc2lkZSBpcyBudWxsYWJsZQorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICog RlJPTSBub3RfbnVsbF90YWIKK1dIRVJFIGlkIE5PVCBJTiAoU0VMRUNUIGlkIEZST00gbnVsbF90 YWIpOworCistLSBBTlRJIEpPSU46IG91dGVyIHNpZGUgaXMgZGVmaW5lZCBOT1QgTlVMTCwgaW5u ZXIgc2lkZSBpcyBmb3JjZWQgbm9ubnVsbGFibGUKKy0tIGJ5IHF1YWwgY2xhdXNlCitFWFBMQUlO IChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElO IChTRUxFQ1QgaWQgRlJPTSBudWxsX3RhYiBXSEVSRSBpZCBJUyBOT1QgTlVMTCk7CisKKy0tIE5v IEFOVEkgSk9JTjogb3V0ZXIgc2lkZSBpcyBudWxsYWJsZSAod2UgZG9uJ3QgY2hlY2sgb3V0ZXIg cXVlcnkgcXVhbHMgZm9yIG5vdykKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00g bnVsbF90YWIKK1dIRVJFIGlkIElTIE5PVCBOVUxMCisgIEFORCBpZCBOT1QgSU4gKFNFTEVDVCBp ZCBGUk9NIG5vdF9udWxsX3RhYik7CisKKy0tIEFOVEkgSk9JTjogb3V0ZXIgc2lkZSBpcyBkZWZp bmVkIE5PVCBOVUxMLCBpbm5lciBzaWRlIGlzIGRlZmluZWQgTk9UIE5VTEwKKy0tIGFuZCBpcyBu b3QgbnVsbGVkIGJ5IG91dGVyIGpvaW4KK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZS T00gbm90X251bGxfdGFiCitXSEVSRSBpZCBOT1QgSU4gKAorICAgIFNFTEVDVCB0MS5pZAorICAg IEZST00gbm90X251bGxfdGFiIHQxCisgICAgTEVGVCBKT0lOIG5vdF9udWxsX3RhYiB0MiBPTiB0 MS5pZCA9IHQyLmlkCispOworCistLSBObyBBTlRJIEpPSU46IGlubmVyIHNpZGUgaXMgZGVmaW5l ZCBOT1QgTlVMTCBidXQgaXMgbnVsbGVkIGJ5IG91dGVyIGpvaW4KK0VYUExBSU4gKENPU1RTIE9G RikKK1NFTEVDVCAqIEZST00gbm90X251bGxfdGFiCitXSEVSRSBpZCBOT1QgSU4gKAorICAgIFNF TEVDVCB0Mi5pZAorICAgIEZST00gbm90X251bGxfdGFiIHQxCisgICAgTEVGVCBKT0lOIG5vdF9u dWxsX3RhYiB0MiBPTiB0MS5pZCA9IHQyLmlkCispOworCistLSBBTlRJIEpPSU46IG91dGVyIHNp ZGUgaXMgZGVmaW5lZCBOT1QgTlVMTCwgaW5uZXIgc2lkZSBpcyBmb3JjZWQgbm9ubnVsbGFibGUK Ky0tIGJ5IHF1YWwgY2xhdXNlCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5v dF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElOICgKKyAgICBTRUxFQ1QgdDEuaWQKKyAgICBGUk9N IG51bGxfdGFiIHQxCisgICAgTEVGVCBKT0lOIG51bGxfdGFiIHQyIE9OIHQxLmlkID0gdDIuaWQK KyAgICBXSEVSRSB0MS5pZCBJUyBOT1QgTlVMTAorKTsKKworLS0gQU5USSBKT0lOOiBvdXRlciBz aWRlIGlzIGRlZmluZWQgTk9UIE5VTEwsIGlubmVyIHNpZGUgaXMgZm9yY2VkIG5vbm51bGxhYmxl CistLSBieSBxdWFsIGNsYXVzZQorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBu b3RfbnVsbF90YWIKK1dIRVJFIGlkIE5PVCBJTiAoCisgICAgU0VMRUNUIHQxLmlkCisgICAgRlJP TSBudWxsX3RhYiB0MQorICAgIElOTkVSIEpPSU4gbnVsbF90YWIgdDIgT04gdDEuaWQgPSB0Mi5p ZAorICAgIExFRlQgSk9JTiBudWxsX3RhYiB0MyBPTiBUUlVFCispOworCistLSBBTlRJIEpPSU46 IG91dGVyIHNpZGUgaXMgZGVmaW5lZCBOT1QgTlVMTCBhbmQgaXMgbm90IG51bGxlZCBieSBvdXRl ciBqb2luLAorLS0gaW5uZXIgc2lkZSBpcyBkZWZpbmVkIE5PVCBOVUxMCitFWFBMQUlOIChDT1NU UyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYiB0MQorTEVGVCBKT0lOIG5vdF9udWxs X3RhYiB0MiBPTiB0MS5pZCA9IHQyLmlkCitXSEVSRSB0MS5pZCBOT1QgSU4gKFNFTEVDVCBpZCBG Uk9NIG5vdF9udWxsX3RhYik7CisKKy0tIE5vIEFOVEkgSk9JTjogb3V0ZXIgc2lkZSBpcyBudWxs ZWQgYnkgb3V0ZXIgam9pbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBub3Rf bnVsbF90YWIgdDEKK0xFRlQgSk9JTiBub3RfbnVsbF90YWIgdDIgT04gdDEuaWQgPSB0Mi5pZAor V0hFUkUgdDIuaWQgTk9UIElOIChTRUxFQ1QgaWQgRlJPTSBub3RfbnVsbF90YWIpOworCistLSBO byBBTlRJIEpPSU46IHN1YmxpbmsgaXMgaW4gYW4gb3V0ZXIgam9pbidzIE9OIHF1YWwgYW5kIHJl ZmVyZW5jZXMgdGhlCistLSBub24tbnVsbGFibGUgc2lkZQorRVhQTEFJTiAoQ09TVFMgT0ZGKQor U0VMRUNUICogRlJPTSBub3RfbnVsbF90YWIgdDEKK0xFRlQgSk9JTiBub3RfbnVsbF90YWIgdDIK K09OIHQxLmlkIE5PVCBJTiAoU0VMRUNUIGlkIEZST00gbm90X251bGxfdGFiKTsKKworLS0gQU5U SSBKT0lOOiBvdXRlciBzaWRlIGlzIGRlZmluZWQgTk9UIE5VTEwgYW5kIGlzIG5vdCBudWxsZWQg Ynkgb3V0ZXIgam9pbiwKKy0tIGlubmVyIHNpZGUgaXMgZGVmaW5lZCBOT1QgTlVMTAorRVhQTEFJ TiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBub3RfbnVsbF90YWIgdDEKK0xFRlQgSk9JTiBu b3RfbnVsbF90YWIgdDIKK09OIHQyLmlkIE5PVCBJTiAoU0VMRUNUIGlkIEZST00gbm90X251bGxf dGFiKTsKKworLS0gQU5USSBKT0lOOiBib3RoIHNpZGVzIGFyZSBkZWZpbmVkIE5PVCBOVUxMCitF WFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgKGlk LCB2YWwpIE5PVCBJTiAoU0VMRUNUIGlkLCB2YWwgRlJPTSBub3RfbnVsbF90YWIpOworCistLSBO byBBTlRJIEpPSU46IG9uZSBjb2x1bW4gb2YgdGhlIG91dGVyIHNpZGUgaXMgbnVsbGFibGUKK0VY UExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gbm90X251bGxfdGFiIHQxLCBudWxsX3Rh YiB0MgorV0hFUkUgKHQxLmlkLCB0Mi5pZCkgTk9UIElOIChTRUxFQ1QgaWQsIHZhbCBGUk9NIG5v dF9udWxsX3RhYik7CisKKy0tIE5vIEFOVEkgSk9JTjogb25lIGNvbHVtbiBvZiB0aGUgaW5uZXIg c2lkZSBpcyBudWxsYWJsZQorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBub3Rf bnVsbF90YWIKK1dIRVJFIChpZCwgdmFsKSBOT1QgSU4gKFNFTEVDVCB0MS5pZCwgdDIuaWQgRlJP TSBub3RfbnVsbF90YWIgdDEsIG51bGxfdGFiIHQyKTsKKworLS0gQU5USSBKT0lOOiBDT0FMRVND RShudWxsYWJsZSwgY29uc3RhbnQpIGlzIG5vbi1udWxsYWJsZQorRVhQTEFJTiAoQ09TVFMgT0ZG KQorU0VMRUNUICogRlJPTSBudWxsX3RhYgorV0hFUkUgQ09BTEVTQ0UoaWQsIC0xKSBOT1QgSU4g KFNFTEVDVCBpZCBGUk9NIG5vdF9udWxsX3RhYik7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NF TEVDVCAqIEZST00gbm90X251bGxfdGFiCitXSEVSRSBpZCBOT1QgSU4gKFNFTEVDVCBDT0FMRVND RShpZCwgLTEpIEZST00gbnVsbF90YWIpOworCistLSBBTlRJIEpPSU46IEdST1VQIEJZICh3aXRo b3V0IEdyb3VwaW5nIFNldHMpIHByZXNlcnZlcyB0aGUgbm9uLW51bGxhYmlsaXR5IG9mCistLSB0 aGUgY29sdW1uCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3Rh YgorV0hFUkUgaWQgTk9UIElOIChTRUxFQ1QgaWQgRlJPTSBub3RfbnVsbF90YWIgR1JPVVAgQlkg aWQpOworCistLSBObyBBTlRJIEpPSU46IEdST1VQIEJZIG9uIGEgbnVsbGFibGUgY29sdW1uCitF WFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQg Tk9UIElOIChTRUxFQ1QgaWQgRlJPTSBudWxsX3RhYiBHUk9VUCBCWSBpZCk7CisKKy0tIE5vIEFO VEkgSk9JTjogR3JvdXBpbmcgU2V0cyBjYW4gaW50cm9kdWNlIE5VTExzCitFWFBMQUlOIChDT1NU UyBPRkYpCitTRUxFQ1QgKiBGUk9NIG5vdF9udWxsX3RhYgorV0hFUkUgaWQgTk9UIElOICgKKyAg ICBTRUxFQ1QgaWQKKyAgICBGUk9NIG5vdF9udWxsX3RhYgorICAgIEdST1VQIEJZIEdST1VQSU5H IFNFVFMgKChpZCksICh2YWwpKQorKTsKKworUk9MTEJBQ0s7Ci0tIAoyLjM5LjUgKEFwcGxlIEdp dC0xNTQpCgo= --0000000000006b99130649e62b02--