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 1wTDSX-000OCY-0E for pgsql-hackers@arkaria.postgresql.org; Sat, 30 May 2026 06:46:13 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wTDSU-005bPJ-0W for pgsql-hackers@arkaria.postgresql.org; Sat, 30 May 2026 06:46:10 +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 1wTDST-005bPA-2V for pgsql-hackers@lists.postgresql.org; Sat, 30 May 2026 06:46:10 +0000 Received: from mail-vs1-xe32.google.com ([2607:f8b0:4864:20::e32]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wTDSO-00000000GrH-266m for pgsql-hackers@postgresql.org; Sat, 30 May 2026 06:46:09 +0000 Received: by mail-vs1-xe32.google.com with SMTP id ada2fe7eead31-6c25b040555so931721137.1 for ; Fri, 29 May 2026 23:46:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1780123562; cv=none; d=google.com; s=arc-20240605; b=jSlOfWK2O7IGZ2WkC5t50H4aoUXmdGqVitzgcLYR3nrW7EObhpkfwpMz8La4BSH2Vm Nigk2jj5koGT4bwbq7JTnycOyGBdByOsItj8HU3eofqF7Lz9ucNIV5g0YCakiNCVP4RX bzAGJUz1U2sPVPq4fVElmLdMPMzvrQX7Dv7NQfuFs3YygjLv/IXNLmeNY2amedbsIixH sGqtFl+msBzhL+00e5z3sMtowyXIyKw9oKFkEKYGfRqU1InW1gsi7S/nayFK52EFdf+R NORb/WqGquVsCF6EHr73CFPQc7weojPgo8Ci8N8gOD4Ka/03TccNFjM0Jj9QPf8uJ+Rg 3YYg== 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=y6OQBIpyoBc+yw3vEx100OE/Y6DQwo+3/V5jRjW0bHM=; fh=tAjZntVC/FGvL73011VMJGa0Vq2Mn0Cz82A00nb/8bQ=; b=D0xK85iNXHsd/bcFVbyKm/DR+RLt1vGc2FDpAszo6TWDb68+nvhTyCd4+RMAkrQUuC YZmKw10tVh2o5W72fXLZi3wROp0KjE8RoR938EPCexVdCY/HtpoSgCQTQSAXm/a1ZMQF Uy033//F04QuvfPsUoklDQQAykXmGAx+Es5xhNCIWpRt1w7l8au5DLAynKkugWx2pV86 7o0T1kiY/X1r3SR08WfNVU7hEN9rUmFSqO3s6ktOMupC/0WlD858sojz0RClQhhKFuZj b201OTB6wjQ+v3OGeX/K7Ha0v8uqXeWKUKmI2+rIqY8Ekz81u7TaX7aSRkSQoUGhzw24 7KgQ==; darn=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=20251104; t=1780123562; x=1780728362; darn=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=y6OQBIpyoBc+yw3vEx100OE/Y6DQwo+3/V5jRjW0bHM=; b=kV8U8AIIkME6jeFAjLKZULUK9znISFOPc0We5x783aOu0ot/6SWVYdzSn3Cp/yQNVd W63k1vEGXea+U794n1vSimXMWXBL2Dyf0XgcM6ScvHjW8hI0bFIuzPaBTO7tfUXcnLF7 n4YzXUSHlhkbalG28MrCQlQ2KCzx3174Z1ZdUPSoNEY5CW27hGmJ7Mdrg0vqWO0X6e3t qbWhRjOnp7Ox5TCmtu1SxLIr7dSM1CJkZ0LQehM0vHO0j41MGCRXn2t/L/58TV6GnNrR WObiRg5YEh6q9fDWLlZW978rjS1/HnuHQ7UGvLVCqCIAqsAAxpdMCA+WF82b3qr5+c9y /hLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780123562; x=1780728362; 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=y6OQBIpyoBc+yw3vEx100OE/Y6DQwo+3/V5jRjW0bHM=; b=CuHyeL3l4sQdY7kTcO+KknDHmeDm3OVYvwuWyladwwvb8+eLsFvfflE58cSMZDOVkR s0xnPibgH1lU6Wb1oGjU9r6MeGEOTQdWtlcoq7N7gKzt4ipanKMNvoVkxN+FNgJfkmTK z4MfAS6exU6V0BRuk8rBV+w8+deXXdWU+uj/VKCAx9x7jZErS8MlkP7vzZguBub+6cvO CrcmInbAXH11yD7cKxQFHjxTHbgseicssvGZVoOOKN9bzo/4rceurVszgXwlIOkJFJ9U 04EQdFGw7qkFlW2oldf6pqSe9xOcDW5clE+FhwZQpyoSJhBr5xgiNf/ag7m/k4sybWeX KNkw== X-Forwarded-Encrypted: i=1; AFNElJ8EzI0QKf4ubSi4d9X6A+Tx5gn9r3eaBScdmjyyxqyhZbKKt3B9p5d7B5pEyiq5ENpS8DWPYGKWuOtQ7mfp@postgresql.org X-Gm-Message-State: AOJu0Yxwi9GV6b1LipW3NEYm0QSfBqtiHMEhwa6qlHAGZDJ443BXLmmP zK2zPGUH94f30PF/0Sum0qnVhBKTY7gFi9X6Mt0dejObALseXuMM2g9mRhQa77Wau+pY2bdqFNl 5PDMAqtvChC6zJuYBFTCIBMLV+ESoTCg= X-Gm-Gg: Acq92OFOXzRr9iJ8P0M54lAFas8sHHd7KM983uDV8VvJ6d5vf3xeTCC+z89G5RazIcZ +U90q5RqlJ7IHm0PHLEOu/6Q2tMFjUb5OexBq9HHq2AAvca5nF8vkhagQMy5RBem8H3tIPAT7qV E0ZqkOh0XJ1E7mrUgGod5/HCepFtPxPQSmqS74TfYnqF5BAraV3kA1GoUZFdc9+Ku8qkjthsdVQ mYOfvyGvhpCNt6ri1vI1fB+u6kzocHDqft+qOmJOCvqwiemCGxuaEtEvo4rWyudAUjCi6fuAjx2 cDm5GoIYCxD11Av/AJz2TUZ2RvQHAqKAd5ED8q/BiW6Jqhbv58txUwi4eDbAUOjJDsJDKW+T2gn rZ9Ol1nSL0YRj0fGTmCmsOhKPqeDgxtYbGtbE/GElMCGjvgdvCa/+qFL8mV3FVlCHMNFssYDk4C T0qQYchKk2oFBQ6nSbLVuYr4/JCOK97X+/ X-Received: by 2002:a05:6102:3f11:b0:610:6e69:5235 with SMTP id ada2fe7eead31-6c687fbe320mr893100137.22.1780123562170; Fri, 29 May 2026 23:46:02 -0700 (PDT) MIME-Version: 1.0 References: <20260502.140304.670813149418899420.ishii@postgresql.org> <20260505.090124.365339750969814137.ishii@postgresql.org> <20260517.190023.159085681032648582.ishii@postgresql.org> In-Reply-To: From: jian he Date: Sat, 30 May 2026 14:45:25 +0800 X-Gm-Features: AVHnY4LYpeeG4GN6DoHfPH9NPjHe1gsNLf9qlkeYG4Q9UG2aEN_a4q2kb70kLtI Message-ID: Subject: Re: Row pattern recognition To: assam258@gmail.com Cc: Tatsuo Ishii , zsolt.parragi@percona.com, sjjang112233@gmail.com, vik@postgresfriends.org, er@xs4all.nl, jacob.champion@enterprisedb.com, david.g.johnston@gmail.com, peter@eisentraut.org, li.evan.chao@gmail.com, pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="000000000000947d910653035072" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000947d910653035072 Content-Type: text/plain; charset="UTF-8" Hi. -- Consecutive VAR merge: A A+ -> a{2,} -- Tests line 251: child->max == RPR_QUANTITY_INF branch in mergeConsecutiveVars -- prev: A{1,1} (finite), child: A+ (infinite) triggers line 251 evaluation EXPLAIN (COSTS OFF) SELECT COUNT(*) OVER w FROM rpr_plan WINDOW w AS (ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING PATTERN (A A+) DEFINE A AS val > 0); -- Consecutive VAR merge: A A+ -> a{2,} -- Tests line 251: child->max == RPR_QUANTITY_INF branch in mergeConsecutiveVars -- prev: A{1,1} (finite), child: A+ (infinite) triggers line 251 evaluation EXPLAIN (COSTS OFF) SELECT COUNT(*) OVER w FROM rpr_plan WINDOW w AS (ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING PATTERN (A A+) DEFINE A AS val > 0); Comments like "Tests line 251" should not appear in SQL, since the line number would change. So, we need to rephrase this comment. Please don't delete it, it may clarify the patch for future readers. /* * nfa_add_state_unique * * Add a state to ctx->states at the END, only if no duplicate exists. * Returns true if state was added, false if duplicate found (state is freed). * Earlier states have better lexical order (DFS traversal order), so existing wins. */ static bool nfa_add_state_unique(WindowAggState *winstate, RPRNFAContext *ctx, RPRNFAState *state) The "at the END" confuses me. It may also refers to RPR_VARID_END / RPRElemIsEnd. How about something like: "Add the state to the end of the ctx->states linked list, but only if a duplicate state is not already present." I think a bunch of these uppercase ENDs should just be lowercase "end", capitalizing them may collides visually with RPR_VARID_END and RPRElemIsEnd and makes the comments harder to read. In nfa_match: "Non-VAR elements (ALT, END, FIN) are kept as-is for advance phase." Here END does mean RPRElemIsEnd, right? That one's probably fine as uppercase since it's listed alongside other element kinds. But then: /* * Evaluate VAR elements against current row. For VARs that reach max * count with END next, advance through END chain inline so absorb phase * can compare states at judgment points. */ I'm think END here means the tail of the RPRNFAContext->RPRNFAState linked list, not the element kind -- which is exactly the ambiguity I'm worried about. Could we lowercase the list-end ones and keep uppercase only when actually referring to the END element kind? The comment under nfa_advance_var is confusing (for me). /* After a successful match, count >= 1, so at least one must be true */ nfa_advance_var doesn't actually know anything about match status (i think), it can be reached with count == 0. I added this elog(INFO) to confirm: if (count < 1 && currentPos > -1) elog(INFO, "should not reach, count is %d, currentPos=%ld", count, currentPos); ...and it does fire, so the comment's premise isn't quite right. ------------------------------------------------ please check the attached minor refactoring. 1. Refactor struct WindowAggState: Remove the nfaStateSize and nfaVisitedNWords fields because they are constant, and we can easily compute it, seems not necessary to stay in WindowAggState. 2. Rename nfa_context_alloc() to nfa_context_make(), nfa_state_alloc() to nfa_state_make(), nfa_state_create() to nfa_state_clone(). Rationale: We have makeNode, changing "alloc" to "make" would be more intuitive, IMHO. In tablecmd.c, we have CloneForeignKeyConstraints, which is based on existing information, creating a new node, here we are doing the same in nfa_state_create. 3. Refactor functions: nfa_advance_alt, nfa_advance_begin, nfa_advance_end, and nfa_advance_var. Because the (RPRPatternElement *elem) parameter is unnecessary. -- jian https://www.enterprisedb.com/ --000000000000947d910653035072 Content-Type: application/octet-stream; name="v47-0002-remove-nfa-related-function-name.no-cfbot" Content-Disposition: attachment; filename="v47-0002-remove-nfa-related-function-name.no-cfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mprzgeso1 RnJvbSBjNjU3OTRhYzcwNjZlMjEwMTgzMWRkM2M1MmQxNGE1ODY0YzI5OTU1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IEZyaSwgMjkgTWF5IDIwMjYgMTQ6Mjk6NTMgKzA4MDAKU3ViamVjdDogW1BBVENIIHY0 NyAyLzNdIHJlbW92ZSBuZmEgcmVsYXRlZCBmdW5jdGlvbiBuYW1lCgpyZW5hbWUgbmZhX2NvbnRl eHRfYWxsb2MoKSB0byBuZmFfY29udGV4dF9tYWtlKCkuCnJlbmFtZSBuZmFfc3RhdGVfY3JlYXRl KCkgdG8gbmZhX3N0YXRlX2Nsb25lKCkuCi0tLQogc3JjL2JhY2tlbmQvZXhlY3V0b3IvUkVBRE1F LnJwciAgICAgICB8ICAyICstCiBzcmMvYmFja2VuZC9leGVjdXRvci9leGVjUlBSLmMgICAgICAg IHwgNTggKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL3Jwcl9uZmEub3V0IHwgIDIgKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jwcl9uZmEuc3Fs ICAgICAgfCAgMiArLQogNCBmaWxlcyBjaGFuZ2VkLCAzMiBpbnNlcnRpb25zKCspLCAzMiBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9leGVjdXRvci9SRUFETUUucnByIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3IvUkVBRE1FLnJwcgppbmRleCAwNWUxNjA5YTY2Ni4uYjExNjA0 N2UxNmEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL1JFQURNRS5ycHIKKysrIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3IvUkVBRE1FLnJwcgpAQCAtNTU2LDcgKzU1Niw3IEBAIFZJLTIu IENvbnRleHQgQ3JlYXRpb246IEV4ZWNSUFJTdGFydENvbnRleHQoKQogCiBDcmVhdGVzIGEgbmV3 IGNvbnRleHQgYW5kIHBlcmZvcm1zIHRoZSBpbml0aWFsIGFkdmFuY2UuCiAKLSAgKDEpIEFsbG9j YXRlIGNvbnRleHQgdmlhIG5mYV9jb250ZXh0X2FsbG9jKCkKKyAgKDEpIEFsbG9jYXRlIGNvbnRl eHQgdmlhIG5mYV9jb250ZXh0X21ha2UoKQogICAoMikgU2V0IG1hdGNoU3RhcnRSb3cgPSBwb3MK ICAgKDMpIENyZWF0ZSBpbml0aWFsIHN0YXRlOiBlbGVtSWR4PTAgKGZpcnN0IHBhdHRlcm4gZWxl bWVudCksCiAgICAgICBjb3VudHM9YWxsIHplcm8KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL2V4ZWNSUFIuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNSUFIuYwppbmRleCA4 NjY0Y2Y3YWNjMy4uYTc2YmI5N2NiN2QgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L2V4ZWNSUFIuYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUlBSLmMKQEAgLTM5LDEx ICszOSwxMSBAQAogI2RlZmluZSBCSVROVU0oeCkJKCh4KSAlIEJJVFNfUEVSX0JJVE1BUFdPUkQp CiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIC0gTkZBIHN0YXRlIG1hbmFnZW1lbnQgKi8KLXN0 YXRpYyBSUFJORkFTdGF0ZSAqbmZhX3N0YXRlX2FsbG9jKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0 ZSk7CitzdGF0aWMgUlBSTkZBU3RhdGUgKm5mYV9zdGF0ZV9tYWtlKFdpbmRvd0FnZ1N0YXRlICp3 aW5zdGF0ZSk7CiBzdGF0aWMgdm9pZCBuZmFfc3RhdGVfZnJlZShXaW5kb3dBZ2dTdGF0ZSAqd2lu c3RhdGUsIFJQUk5GQVN0YXRlICpzdGF0ZSk7CiBzdGF0aWMgdm9pZCBuZmFfc3RhdGVfZnJlZV9s aXN0KFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgUlBSTkZBU3RhdGUgKmxpc3QpOwotc3RhdGlj IFJQUk5GQVN0YXRlICpuZmFfc3RhdGVfY3JlYXRlKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwg aW50MTYgZWxlbUlkeCwKLQkJCQkJCQkJCSBpbnQzMiAqY291bnRzLCBib29sIHNvdXJjZUFic29y YmFibGUpOworc3RhdGljIFJQUk5GQVN0YXRlICpuZmFfc3RhdGVfY2xvbmUoV2luZG93QWdnU3Rh dGUgKndpbnN0YXRlLCBpbnQxNiBlbGVtSWR4LAorCQkJCQkJCQkJaW50MzIgKmNvdW50cywgYm9v bCBzb3VyY2VBYnNvcmJhYmxlKTsKIHN0YXRpYyBib29sIG5mYV9zdGF0ZXNfZXF1YWwoV2luZG93 QWdnU3RhdGUgKndpbnN0YXRlLCBSUFJORkFTdGF0ZSAqczEsCiAJCQkJCQkJIFJQUk5GQVN0YXRl ICpzMik7CiBzdGF0aWMgYm9vbCBuZmFfYWRkX3N0YXRlX3VuaXF1ZShXaW5kb3dBZ2dTdGF0ZSAq d2luc3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0eCwKQEAgLTUyLDcgKzUyLDcgQEAgc3RhdGljIHZv aWQgbmZhX2FkZF9tYXRjaGVkX3N0YXRlKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgUlBSTkZB Q29udGV4dCAqY3R4LAogCQkJCQkJCQkgIFJQUk5GQVN0YXRlICpzdGF0ZSwgaW50NjQgbWF0Y2hF bmRSb3cpOwogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAtIE5GQSBjb250ZXh0IG1hbmFnZW1l bnQgKGludGVybmFsKSAqLwotc3RhdGljIFJQUk5GQUNvbnRleHQgKm5mYV9jb250ZXh0X2FsbG9j KFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSk7CitzdGF0aWMgUlBSTkZBQ29udGV4dCAqbmZhX2Nv bnRleHRfbWFrZShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUpOwogc3RhdGljIHZvaWQgbmZhX3Vu bGlua19jb250ZXh0KFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgUlBSTkZBQ29udGV4dCAqY3R4 KTsKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgLSBORkEgc3RhdGlzdGljcyAqLwpAQCAtMTg0 LDE0ICsxODQsMTQgQEAgc3RhdGljIHZvaWQgbmZhX2FkdmFuY2UoV2luZG93QWdnU3RhdGUgKndp bnN0YXRlLCBSUFJORkFDb250ZXh0ICpjdHgsCiAgKi8KIAogLyoKLSAqIG5mYV9zdGF0ZV9hbGxv YworICogbmZhX3N0YXRlX21ha2UKICAqCi0gKiBBbGxvY2F0ZSBhbiBORkEgc3RhdGUsIHJldXNp bmcgZnJvbSBmcmVlTGlzdCBpZiBhdmFpbGFibGUuCisgKiBNYWtlIGEgbmV3IFJQUk5GQVN0YXRl IHN0YXRlLCByZXVzaW5nIGZyb20gZnJlZUxpc3QgaWYgYXZhaWxhYmxlLgogICogZnJlZUxpc3Qg aXMgc3RvcmVkIGluIFdpbmRvd0FnZ1N0YXRlIGZvciByZXVzZSBhY3Jvc3MgbWF0Y2ggYXR0ZW1w dHMuCiAgKiBVc2VzIGZsZXhpYmxlIGFycmF5IG1lbWJlciBmb3IgY291bnRzW10uCiAgKi8KIHN0 YXRpYyBSUFJORkFTdGF0ZSAqCi1uZmFfc3RhdGVfYWxsb2MoV2luZG93QWdnU3RhdGUgKndpbnN0 YXRlKQorbmZhX3N0YXRlX21ha2UoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlKQogewogCWludAkJ CW5mYVN0YXRlU2l6ZTsKIAlSUFJORkFTdGF0ZSAqc3RhdGU7CkBAIC0yNTIsNyArMjUyLDcgQEAg bmZhX3N0YXRlX2ZyZWVfbGlzdChXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFJQUk5GQVN0YXRl ICpsaXN0KQogfQogCiAvKgotICogbmZhX3N0YXRlX2NyZWF0ZQorICogbmZhX3N0YXRlX2Nsb25l CiAgKgogICogQ3JlYXRlIGEgbmV3IHN0YXRlIHdpdGggZ2l2ZW4gZWxlbUlkeCBhbmQgY291bnRz LgogICogaXNBYnNvcmJhYmxlIGlzIGNvbXB1dGVkIGltbWVkaWF0ZWx5OiBpbmhlcml0ZWQgQU5E IG5ldyBlbGVtZW50J3MgZmxhZy4KQEAgLTI2MSwxMiArMjYxLDEyIEBAIG5mYV9zdGF0ZV9mcmVl X2xpc3QoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLCBSUFJORkFTdGF0ZSAqbGlzdCkKICAqIENh bGxlciBpcyByZXNwb25zaWJsZSBmb3IgbGlua2luZyB0aGUgcmV0dXJuZWQgc3RhdGUuCiAgKi8K IHN0YXRpYyBSUFJORkFTdGF0ZSAqCi1uZmFfc3RhdGVfY3JlYXRlKFdpbmRvd0FnZ1N0YXRlICp3 aW5zdGF0ZSwgaW50MTYgZWxlbUlkeCwKLQkJCQkgaW50MzIgKmNvdW50cywgYm9vbCBzb3VyY2VB YnNvcmJhYmxlKQorbmZhX3N0YXRlX2Nsb25lKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgaW50 MTYgZWxlbUlkeCwKKwkJCQlpbnQzMiAqY291bnRzLCBib29sIHNvdXJjZUFic29yYmFibGUpCiB7 CiAJUlBSUGF0dGVybiAqcGF0dGVybiA9IHdpbnN0YXRlLT5ycFBhdHRlcm47CiAJaW50CQkJbWF4 RGVwdGggPSBwYXR0ZXJuLT5tYXhEZXB0aDsKLQlSUFJORkFTdGF0ZSAqc3RhdGUgPSBuZmFfc3Rh dGVfYWxsb2Mod2luc3RhdGUpOworCVJQUk5GQVN0YXRlICpzdGF0ZSA9IG5mYV9zdGF0ZV9tYWtl KHdpbnN0YXRlKTsKIAlSUFJQYXR0ZXJuRWxlbWVudCAqZWxlbSA9ICZwYXR0ZXJuLT5lbGVtZW50 c1tlbGVtSWR4XTsKIAogCXN0YXRlLT5lbGVtSWR4ID0gZWxlbUlkeDsKQEAgLTM5MiwxMiArMzky LDEyIEBAIG5mYV9hZGRfbWF0Y2hlZF9zdGF0ZShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFJQ Uk5GQUNvbnRleHQgKmN0eCwKIH0KIAogLyoKLSAqIG5mYV9jb250ZXh0X2FsbG9jCisgKiBuZmFf Y29udGV4dF9tYWtlCiAgKgogICogQWxsb2NhdGUgYW4gTkZBIGNvbnRleHQsIHJldXNpbmcgZnJv bSBmcmVlIGxpc3QgaWYgYXZhaWxhYmxlLgogICovCiBzdGF0aWMgUlBSTkZBQ29udGV4dCAqCi1u ZmFfY29udGV4dF9hbGxvYyhXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUpCituZmFfY29udGV4dF9t YWtlKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSkKIHsKIAlSUFJORkFDb250ZXh0ICpjdHg7CiAK QEAgLTkwNCw4ICs5MDQsOCBAQCBuZmFfcm91dGVfdG9fZWxlbShXaW5kb3dBZ2dTdGF0ZSAqd2lu c3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0eCwKIAogCQkvKiBDcmVhdGUgc2tpcCBzdGF0ZSBiZWZv cmUgYWRkX3VuaXF1ZSwgd2hpY2ggbWF5IGZyZWUgc3RhdGUgKi8KIAkJaWYgKFJQUkVsZW1DYW5T a2lwKG5leHRFbGVtKSkKLQkJCXNraXBTdGF0ZSA9IG5mYV9zdGF0ZV9jcmVhdGUod2luc3RhdGUs IG5leHRFbGVtLT5uZXh0LAotCQkJCQkJCQkJCSBzdGF0ZS0+Y291bnRzLCBzdGF0ZS0+aXNBYnNv cmJhYmxlKTsKKwkJCXNraXBTdGF0ZSA9IG5mYV9zdGF0ZV9jbG9uZSh3aW5zdGF0ZSwgbmV4dEVs ZW0tPm5leHQsCisJCQkJCQkJCQkJc3RhdGUtPmNvdW50cywgc3RhdGUtPmlzQWJzb3JiYWJsZSk7 CiAKIAkJbmZhX2FkZF9zdGF0ZV91bmlxdWUod2luc3RhdGUsIGN0eCwgc3RhdGUpOwogCkBAIC05 NDIsOCArOTQyLDggQEAgbmZhX2FkdmFuY2VfYWx0KFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwg UlBSTkZBQ29udGV4dCAqY3R4LAogCQkJYnJlYWs7CiAKIAkJLyogQ3JlYXRlIGluZGVwZW5kZW50 IHN0YXRlIGZvciBlYWNoIGJyYW5jaCAqLwotCQluZXdTdGF0ZSA9IG5mYV9zdGF0ZV9jcmVhdGUo d2luc3RhdGUsIGFsdElkeCwKLQkJCQkJCQkJCXN0YXRlLT5jb3VudHMsIHN0YXRlLT5pc0Fic29y YmFibGUpOworCQluZXdTdGF0ZSA9IG5mYV9zdGF0ZV9jbG9uZSh3aW5zdGF0ZSwgYWx0SWR4LAor CQkJCQkJCQkgICBzdGF0ZS0+Y291bnRzLCBzdGF0ZS0+aXNBYnNvcmJhYmxlKTsKIAogCQkvKiBS ZWN1cnNpdmVseSBwcm9jZXNzIHRoaXMgYnJhbmNoIGJlZm9yZSBuZXh0ICovCiAJCW5mYV9hZHZh bmNlX3N0YXRlKHdpbnN0YXRlLCBjdHgsIG5ld1N0YXRlLCBjdXJyZW50UG9zKTsKQEAgLTk3NSw4 ICs5NzUsOCBAQCBuZmFfYWR2YW5jZV9iZWdpbihXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFJQ Uk5GQUNvbnRleHQgKmN0eCwKIAkvKiBPcHRpb25hbCBncm91cDogY3JlYXRlIHNraXAgcGF0aCAo YnV0IGRvbid0IHJvdXRlIHlldCkgKi8KIAlpZiAoZWxlbS0+bWluID09IDApCiAJewotCQlza2lw U3RhdGUgPSBuZmFfc3RhdGVfY3JlYXRlKHdpbnN0YXRlLCBlbGVtLT5qdW1wLAotCQkJCQkJCQkJ IHN0YXRlLT5jb3VudHMsIHN0YXRlLT5pc0Fic29yYmFibGUpOworCQlza2lwU3RhdGUgPSBuZmFf c3RhdGVfY2xvbmUod2luc3RhdGUsIGVsZW0tPmp1bXAsCisJCQkJCQkJCQlzdGF0ZS0+Y291bnRz LCBzdGF0ZS0+aXNBYnNvcmJhYmxlKTsKIAl9CiAKIAlpZiAoc2tpcFN0YXRlICE9IE5VTEwgJiYg UlBSRWxlbUlzUmVsdWN0YW50KGVsZW0pKQpAQCAtMTA1Myw4ICsxMDUzLDggQEAgbmZhX2FkdmFu Y2VfZW5kKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgUlBSTkZBQ29udGV4dCAqY3R4LAogCQkg Ki0tLS0tLS0tLS0KIAkJICovCiAJCWlmIChSUFJFbGVtQ2FuRW1wdHlMb29wKGVsZW0pKQotCQkJ ZmZTdGF0ZSA9IG5mYV9zdGF0ZV9jcmVhdGUod2luc3RhdGUsIHN0YXRlLT5lbGVtSWR4LAotCQkJ CQkJCQkJICAgc3RhdGUtPmNvdW50cywgc3RhdGUtPmlzQWJzb3JiYWJsZSk7CisJCQlmZlN0YXRl ID0gbmZhX3N0YXRlX2Nsb25lKHdpbnN0YXRlLCBzdGF0ZS0+ZWxlbUlkeCwKKwkJCQkJCQkJCSAg c3RhdGUtPmNvdW50cywgc3RhdGUtPmlzQWJzb3JiYWJsZSk7CiAKIAkJLyogUHJpbWFyeSBwYXRo OiBsb29wIGJhY2sgZm9yIHJlYWwgbWF0Y2hlcyAqLwogCQlmb3IgKGludCBkID0gZGVwdGggKyAx OyBkIDwgcGF0dGVybi0+bWF4RGVwdGg7IGQrKykKQEAgLTExMjIsOCArMTEyMiw4IEBAIG5mYV9h ZHZhbmNlX2VuZChXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0eCwK IAkJICogQ3JlYXRlIGV4aXQgc3RhdGUgZmlyc3QgKG5lZWQgb3JpZ2luYWwgY291bnRzIGJlZm9y ZSBtb2RpZnlpbmcKIAkJICogc3RhdGUpCiAJCSAqLwotCQlleGl0U3RhdGUgPSBuZmFfc3RhdGVf Y3JlYXRlKHdpbnN0YXRlLCBlbGVtLT5uZXh0LAotCQkJCQkJCQkJIHN0YXRlLT5jb3VudHMsIHN0 YXRlLT5pc0Fic29yYmFibGUpOworCQlleGl0U3RhdGUgPSBuZmFfc3RhdGVfY2xvbmUod2luc3Rh dGUsIGVsZW0tPm5leHQsCisJCQkJCQkJCQlzdGF0ZS0+Y291bnRzLCBzdGF0ZS0+aXNBYnNvcmJh YmxlKTsKIAkJZXhpdFN0YXRlLT5jb3VudHNbZGVwdGhdID0gMDsKIAkJbmV4dEVsZW0gPSAmZWxl bWVudHNbZXhpdFN0YXRlLT5lbGVtSWR4XTsKIApAQCAtMTIxMSw4ICsxMjExLDggQEAgbmZhX2Fk dmFuY2VfdmFyKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgUlBSTkZBQ29udGV4dCAqY3R4LAog CQkJUlBSTkZBU3RhdGUgKnNhdmVkTWF0Y2ggPSBjdHgtPm1hdGNoZWRTdGF0ZTsKIAogCQkJLyog Q2xvbmUgZm9yIGV4aXQsIG9yaWdpbmFsIHN0YXlzIGZvciBsb29wICovCi0JCQljbG9uZVN0YXRl ID0gbmZhX3N0YXRlX2NyZWF0ZSh3aW5zdGF0ZSwgZWxlbS0+bmV4dCwKLQkJCQkJCQkJCQkgIHN0 YXRlLT5jb3VudHMsIHN0YXRlLT5pc0Fic29yYmFibGUpOworCQkJY2xvbmVTdGF0ZSA9IG5mYV9z dGF0ZV9jbG9uZSh3aW5zdGF0ZSwgZWxlbS0+bmV4dCwKKwkJCQkJCQkJCQkgc3RhdGUtPmNvdW50 cywgc3RhdGUtPmlzQWJzb3JiYWJsZSk7CiAJCQljbG9uZVN0YXRlLT5jb3VudHNbZGVwdGhdID0g MDsKIAkJCW5leHRFbGVtID0gJmVsZW1lbnRzW2Nsb25lU3RhdGUtPmVsZW1JZHhdOwogCkBAIC0x MjQzLDggKzEyNDMsOCBAQCBuZmFfYWR2YW5jZV92YXIoV2luZG93QWdnU3RhdGUgKndpbnN0YXRl LCBSUFJORkFDb250ZXh0ICpjdHgsCiAJCWVsc2UKIAkJewogCQkJLyogQ2xvbmUgZm9yIGxvb3As IG9yaWdpbmFsIHVzZWQgZm9yIGV4aXQgKi8KLQkJCWNsb25lU3RhdGUgPSBuZmFfc3RhdGVfY3Jl YXRlKHdpbnN0YXRlLCBzdGF0ZS0+ZWxlbUlkeCwKLQkJCQkJCQkJCQkgIHN0YXRlLT5jb3VudHMs IHN0YXRlLT5pc0Fic29yYmFibGUpOworCQkJY2xvbmVTdGF0ZSA9IG5mYV9zdGF0ZV9jbG9uZSh3 aW5zdGF0ZSwgc3RhdGUtPmVsZW1JZHgsCisJCQkJCQkJCQkJIHN0YXRlLT5jb3VudHMsIHN0YXRl LT5pc0Fic29yYmFibGUpOwogCiAJCQkvKiBMb29wIGZpcnN0IChwcmVmZXJyZWQgZm9yIGdyZWVk eSkgKi8KIAkJCW5mYV9hZGRfc3RhdGVfdW5pcXVlKHdpbnN0YXRlLCBjdHgsIGNsb25lU3RhdGUp OwpAQCAtMTQzOSw5ICsxNDM5LDkgQEAgRXhlY1JQUlN0YXJ0Q29udGV4dChXaW5kb3dBZ2dTdGF0 ZSAqd2luc3RhdGUsIGludDY0IHN0YXJ0UG9zKQogCVJQUlBhdHRlcm4gKnBhdHRlcm4gPSB3aW5z dGF0ZS0+cnBQYXR0ZXJuOwogCVJQUlBhdHRlcm5FbGVtZW50ICplbGVtOwogCi0JY3R4ID0gbmZh X2NvbnRleHRfYWxsb2Mod2luc3RhdGUpOworCWN0eCA9IG5mYV9jb250ZXh0X21ha2Uod2luc3Rh dGUpOwogCWN0eC0+bWF0Y2hTdGFydFJvdyA9IHN0YXJ0UG9zOwotCWN0eC0+c3RhdGVzID0gbmZh X3N0YXRlX2FsbG9jKHdpbnN0YXRlKTsJLyogaW5pdGlhbCBzdGF0ZSBhdCBlbGVtIDAgKi8KKwlj dHgtPnN0YXRlcyA9IG5mYV9zdGF0ZV9tYWtlKHdpbnN0YXRlKTsgLyogaW5pdGlhbCBzdGF0ZSBh dCBlbGVtIDAgKi8KIAogCWVsZW0gPSAmcGF0dGVybi0+ZWxlbWVudHNbMF07CiAKZGlmZiAtLWdp dCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcnByX25mYS5vdXQgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3Jwcl9uZmEub3V0CmluZGV4IGExOWIyNmMzYjk0Li4yZTgxOWQ5NzczNCAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9ycHJfbmZhLm91dAorKysgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jwcl9uZmEub3V0CkBAIC0zODA2LDcgKzM4MDYsNyBA QCBXSU5ET1cgdyBBUyAoCiAKIC0tIE5vbi1hYnNvcmJhYmxlIGNvbnRleHQgZHVyaW5nIGFic29y cHRpb24KIC0tIFBhdHRlcm4gKEEgQikrIEM6IEEsQiBpbiBhYnNvcmJhYmxlIGdyb3VwLCBDIGlz IG5vdC4KLS0tIFdoZW4gRU5EIGV4aXRzIHRvIEMgdmlhIG5mYV9zdGF0ZV9jcmVhdGUsIGlzQWJz b3JiYWJsZSBiZWNvbWVzIGZhbHNlLgorLS0gV2hlbiBFTkQgZXhpdHMgdG8gQyB2aWEgbmZhX3N0 YXRlX2Nsb25lLCBpc0Fic29yYmFibGUgYmVjb21lcyBmYWxzZS4KIFdJVEggdGVzdF9ub25fYWJz b3JiYWJsZSBBUyAoCiAgICAgU0VMRUNUICogRlJPTSAoVkFMVUVTCiAgICAgICAgICgxLCBBUlJB WVsnQSddKSwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jwcl9uZmEuc3FsIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvcnByX25mYS5zcWwKaW5kZXggMWQyN2UwZGMwOWUuLjVkZGZh YTFmY2RlIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9ycHJfbmZhLnNxbAorKysg Yi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9ycHJfbmZhLnNxbApAQCAtMjc2MSw3ICsyNzYxLDcgQEAg V0lORE9XIHcgQVMgKAogCiAtLSBOb24tYWJzb3JiYWJsZSBjb250ZXh0IGR1cmluZyBhYnNvcnB0 aW9uCiAtLSBQYXR0ZXJuIChBIEIpKyBDOiBBLEIgaW4gYWJzb3JiYWJsZSBncm91cCwgQyBpcyBu b3QuCi0tLSBXaGVuIEVORCBleGl0cyB0byBDIHZpYSBuZmFfc3RhdGVfY3JlYXRlLCBpc0Fic29y YmFibGUgYmVjb21lcyBmYWxzZS4KKy0tIFdoZW4gRU5EIGV4aXRzIHRvIEMgdmlhIG5mYV9zdGF0 ZV9jbG9uZSwgaXNBYnNvcmJhYmxlIGJlY29tZXMgZmFsc2UuCiBXSVRIIHRlc3Rfbm9uX2Fic29y YmFibGUgQVMgKAogICAgIFNFTEVDVCAqIEZST00gKFZBTFVFUwogICAgICAgICAoMSwgQVJSQVlb J0EnXSksCi0tIAoyLjM0LjEKCg== --000000000000947d910653035072 Content-Type: application/octet-stream; name="v47-0001-remove-nfaStateSize-and-nfaVisitedNWords.no-cfbot" Content-Disposition: attachment; filename="v47-0001-remove-nfaStateSize-and-nfaVisitedNWords.no-cfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mprzgess2 RnJvbSA2ZjVjOWY4YjRjOTJkNzYxMGE4NmU5OTM1MjVlNGZiZDg3NDAxZWY0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IEZyaSwgMjkgTWF5IDIwMjYgMTI6Mjc6MTMgKzA4MDAKU3ViamVjdDogW1BBVENIIHY0 NyAxLzNdIHJlbW92ZSBuZmFTdGF0ZVNpemUgYW5kIG5mYVZpc2l0ZWROV29yZHMKClJlZmFjdG9y IHN0cnVjdCBXaW5kb3dBZ2dTdGF0ZTogUmVtb3ZlIHRoZSBuZmFTdGF0ZVNpemUgYW5kIG5mYVZp c2l0ZWROV29yZHMKZmllbGRzIGJlY2F1c2UgdGhleSBhcmUgY29uc3RhbnQsIGFuZCB3ZSBjYW4g ZWFzaWx5IGNvbXB1dGUgaXQuCi0tLQogc3JjL2JhY2tlbmQvZXhlY3V0b3IvUkVBRE1FLnJwciAg ICAgIHwgIDIgLS0KIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNSUFIuYyAgICAgICB8IDEyICsr KysrKystLS0tLQogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jIHwgMTAgKysr Ky0tLS0tLQogc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmggICAgICAgIHwgIDMgLS0tCiA0 IGZpbGVzIGNoYW5nZWQsIDExIGluc2VydGlvbnMoKyksIDE2IGRlbGV0aW9ucygtKQoKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL1JFQURNRS5ycHIgYi9zcmMvYmFja2VuZC9leGVj dXRvci9SRUFETUUucnByCmluZGV4IDJiZjc3MDNjNzc3Li4wNWUxNjA5YTY2NiAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvUkVBRE1FLnJwcgorKysgYi9zcmMvYmFja2VuZC9leGVj dXRvci9SRUFETUUucnByCkBAIC01MDgsNyArNTA4LDYgQEAgVi0zLiBSUFIgRmllbGRzIG9mIFdp bmRvd0FnZ1N0YXRlCiAgIG5mYVN0YXRlRnJlZSAgICAgICAgICAgICAgICAgIFJldXNlIHBvb2wg Zm9yIHN0YXRlcwogICBuZmFWYXJNYXRjaGVkICAgICAgICAgICAgICAgICBQZXItcm93IGNhY2hl OiB2YXJNYXRjaGVkW3ZhcklkXQogICBuZmFWaXNpdGVkRWxlbXMgICAgICAgICAgICAgICBCaXRt YXAgZm9yIGN5Y2xlIGRldGVjdGlvbgotICBuZmFTdGF0ZVNpemUgICAgICAgICAgICAgICAgICBQ cmVjb21wdXRlZCBzaXplIG9mIFJQUk5GQVN0YXRlCiAKIE1lbW9yeSBtYW5hZ2VtZW50OgogCkBA IC0xNDYxLDcgKzE0NjAsNiBAQCBBcHBlbmRpeCBCLiBEYXRhIFN0cnVjdHVyZSBSZWxhdGlvbnNo aXAgRGlhZ3JhbQogICAgIHwtLS0gZGVmaW5lQ2xhdXNlTGlzdDogTGlzdDxFeHByU3RhdGU+CiAg ICAgfC0tLSBuZmFWYXJNYXRjaGVkOiBib29sW10gKHBlci1yb3cgY2FjaGUpCiAgICAgfC0tLSBu ZmFWaXNpdGVkRWxlbXM6IGJpdG1hcHdvcmQqIChjeWNsZSBkZXRlY3Rpb24pCi0gICAgfC0tLSBu ZmFTdGF0ZVNpemU6IFNpemUgKHByZS1jYWxjdWxhdGVkIFJQUk5GQVN0YXRlIGFsbG9jYXRpb24g c2l6ZSkKICAgICB8LS0tIG5mYUNvbnRleHQgPC0+IG5mYUNvbnRleHRUYWlsIChkb3VibHktbGlu a2VkIGxpc3QpCiAgICAgfCAgICstLS0gUlBSTkZBQ29udGV4dAogICAgIHwgICAgICAgfC0tLSBz dGF0ZXM6IFJQUk5GQVN0YXRlKiAobGlua2VkIGxpc3QpCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9leGVjdXRvci9leGVjUlBSLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUlBSLmMKaW5k ZXggZjM4MWE4NDk2MWQuLjg2NjRjZjdhY2MzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVj dXRvci9leGVjUlBSLmMKKysrIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1JQUi5jCkBAIC0x OTMsMjMgKzE5MywyNSBAQCBzdGF0aWMgdm9pZCBuZmFfYWR2YW5jZShXaW5kb3dBZ2dTdGF0ZSAq d2luc3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0eCwKIHN0YXRpYyBSUFJORkFTdGF0ZSAqCiBuZmFf c3RhdGVfYWxsb2MoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlKQogeworCWludAkJCW5mYVN0YXRl U2l6ZTsKIAlSUFJORkFTdGF0ZSAqc3RhdGU7CiAKKwluZmFTdGF0ZVNpemUgPSBvZmZzZXRvZihS UFJORkFTdGF0ZSwgY291bnRzKSArIHNpemVvZihpbnQzMikgKiB3aW5zdGF0ZS0+cnBQYXR0ZXJu LT5tYXhEZXB0aDsKKwogCS8qIFRyeSB0byByZXVzZSBmcm9tIGZyZWUgbGlzdCBmaXJzdCAqLwog CWlmICh3aW5zdGF0ZS0+bmZhU3RhdGVGcmVlICE9IE5VTEwpCiAJewogCQlzdGF0ZSA9IHdpbnN0 YXRlLT5uZmFTdGF0ZUZyZWU7CiAJCXdpbnN0YXRlLT5uZmFTdGF0ZUZyZWUgPSBzdGF0ZS0+bmV4 dDsKKwkJbWVtc2V0KHN0YXRlLCAwLCBuZmFTdGF0ZVNpemUpOwogCX0KIAllbHNlCiAJewogCQkv KiBBbGxvY2F0ZSBpbiBwYXJ0aXRpb24gY29udGV4dCBmb3IgcHJvcGVyIGxpZmV0aW1lICovCi0J CXN0YXRlID0gTWVtb3J5Q29udGV4dEFsbG9jKHdpbnN0YXRlLT5wYXJ0Y29udGV4dCwgd2luc3Rh dGUtPm5mYVN0YXRlU2l6ZSk7CisJCXN0YXRlID0gTWVtb3J5Q29udGV4dEFsbG9jWmVybyh3aW5z dGF0ZS0+cGFydGNvbnRleHQsCisJCQkJCQkJCQkgICBuZmFTdGF0ZVNpemUpOwogCX0KIAotCS8q IEluaXRpYWxpemUgZW50aXJlIHN0YXRlIHRvIHplcm8gKi8KLQltZW1zZXQoc3RhdGUsIDAsIHdp bnN0YXRlLT5uZmFTdGF0ZVNpemUpOwotCiAJLyogVXBkYXRlIHN0YXRpc3RpY3MgKi8KIAl3aW5z dGF0ZS0+bmZhU3RhdGVzQWN0aXZlKys7CiAJd2luc3RhdGUtPm5mYVN0YXRlc1RvdGFsQ3JlYXRl ZCsrOwpAQCAtMTM5Niw3ICsxMzk4LDcgQEAgbmZhX2FkdmFuY2UoV2luZG93QWdnU3RhdGUgKndp bnN0YXRlLCBSUFJORkFDb250ZXh0ICpjdHgsIGludDY0IGN1cnJlbnRQb3MpCiAKIAkJLyogQ2xl YXIgdmlzaXRlZCBiaXRtYXAgYmVmb3JlIGVhY2ggc3RhdGUncyBERlMgZXhwYW5zaW9uICovCiAJ CW1lbXNldCh3aW5zdGF0ZS0+bmZhVmlzaXRlZEVsZW1zLCAwLAotCQkJICAgc2l6ZW9mKGJpdG1h cHdvcmQpICogd2luc3RhdGUtPm5mYVZpc2l0ZWROV29yZHMpOworCQkJICAgc2l6ZW9mKGJpdG1h cHdvcmQpICogKCh3aW5zdGF0ZS0+cnBQYXR0ZXJuLT5udW1FbGVtZW50cyAtIDEpIC8gQklUU19Q RVJfQklUTUFQV09SRCArIDEpKTsKIAogCQlzdGF0ZSA9IHN0YXRlczsKIAkJc3RhdGVzID0gc3Rh dGVzLT5uZXh0OwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0Fn Zy5jIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jCmluZGV4IGQ0ZDU3ZmZk Nzk1Li43NjgyYTEyNDAyYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdp bmRvd0FnZy5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVXaW5kb3dBZ2cuYwpAQCAt MzA1NiwxMiArMzA1NiwxMCBAQCBFeGVjSW5pdFdpbmRvd0FnZyhXaW5kb3dBZ2cgKm5vZGUsIEVT dGF0ZSAqZXN0YXRlLCBpbnQgZWZsYWdzKQogCS8qIENhbGN1bGF0ZSBORkEgc3RhdGUgc2l6ZSBh bmQgYWxsb2NhdGUgY3ljbGUgZGV0ZWN0aW9uIGJpdG1hcCAqLwogCWlmIChub2RlLT5ycFBhdHRl cm4gIT0gTlVMTCkKIAl7Ci0JCXdpbnN0YXRlLT5uZmFTdGF0ZVNpemUgPSBvZmZzZXRvZihSUFJO RkFTdGF0ZSwgY291bnRzKSArCi0JCQlzaXplb2YoaW50MzIpICogbm9kZS0+cnBQYXR0ZXJuLT5t YXhEZXB0aDsKLQkJd2luc3RhdGUtPm5mYVZpc2l0ZWROV29yZHMgPQotCQkJKG5vZGUtPnJwUGF0 dGVybi0+bnVtRWxlbWVudHMgLSAxKSAvIEJJVFNfUEVSX0JJVE1BUFdPUkQgKyAxOwotCQl3aW5z dGF0ZS0+bmZhVmlzaXRlZEVsZW1zID0gcGFsbG9jMChzaXplb2YoYml0bWFwd29yZCkgKgotCQkJ CQkJCQkJCQl3aW5zdGF0ZS0+bmZhVmlzaXRlZE5Xb3Jkcyk7CisJCWludAkJCW5mYVZpc2l0ZWRO V29yZHM7CisKKwkJbmZhVmlzaXRlZE5Xb3JkcyA9IChub2RlLT5ycFBhdHRlcm4tPm51bUVsZW1l bnRzIC0gMSkgLyBCSVRTX1BFUl9CSVRNQVBXT1JEICsgMTsKKwkJd2luc3RhdGUtPm5mYVZpc2l0 ZWRFbGVtcyA9IHBhbGxvYzAoc2l6ZW9mKGJpdG1hcHdvcmQpICogbmZhVmlzaXRlZE5Xb3Jkcyk7 CiAJfQogCiAJLyogU2V0IHVwIHJvdyBwYXR0ZXJuIHJlY29nbml0aW9uIERFRklORSBjbGF1c2Ug Ki8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL2V4ZWNub2Rlcy5oIGIvc3JjL2luY2x1 ZGUvbm9kZXMvZXhlY25vZGVzLmgKaW5kZXggMGNiMDFiYWE5NDkuLjNlZjAxMjdjMTA1IDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9u b2Rlcy9leGVjbm9kZXMuaApAQCAtMjY2Myw3ICsyNjYzLDYgQEAgdHlwZWRlZiBzdHJ1Y3QgV2lu ZG93QWdnU3RhdGUKIAkJCQkJCQkJCSAqIHRyYXZlcnNhbCkgKi8KIAlSUFJORkFDb250ZXh0ICpu ZmFDb250ZXh0RnJlZTsJLyogcmVjeWNsZWQgTkZBIGNvbnRleHQgbm9kZXMgKi8KIAlSUFJORkFT dGF0ZSAqbmZhU3RhdGVGcmVlOwkvKiByZWN5Y2xlZCBORkEgc3RhdGUgbm9kZXMgKi8KLQlTaXpl CQluZmFTdGF0ZVNpemU7CS8qIHByZS1jYWxjdWxhdGVkIFJQUk5GQVN0YXRlIHNpemUgKi8KIAli b29sCSAgICpuZmFWYXJNYXRjaGVkOwkvKiBwZXItcm93IGNhY2hlOiB2YXJNYXRjaGVkW3Zhcklk XSBmb3IgdmFySWQKIAkJCQkJCQkJICogPCBudW1EZWZpbmVzICovCiAJQml0bWFwc2V0ICAqZGVm aW5lTWF0Y2hTdGFydERlcGVuZGVudDsJLyogREVGSU5FIHZhcnMgbmVlZGluZyBwZXItY29udGV4 dApAQCAtMjY3MSw4ICsyNjcwLDYgQEAgdHlwZWRlZiBzdHJ1Y3QgV2luZG93QWdnU3RhdGUKIAkJ CQkJCQkJCQkJICogKG1hdGNoX3N0YXJ0LWRlcGVuZGVudCkgKi8KIAliaXRtYXB3b3JkICpuZmFW aXNpdGVkRWxlbXM7CS8qIGVsZW1JZHggdmlzaXRlZCBiaXRtYXAgZm9yIGN5Y2xlCiAJCQkJCQkJ CQkgKiBkZXRlY3Rpb24gKi8KLQlpbnQJCQluZmFWaXNpdGVkTldvcmRzOwkvKiBudW1iZXIgb2Yg Yml0bWFwd29yZHMgaW4KLQkJCQkJCQkJCSAqIG5mYVZpc2l0ZWRFbGVtcyAqLwogCWludDY0CQlu ZmFMYXN0UHJvY2Vzc2VkUm93OwkvKiBsYXN0IHJvdyBwcm9jZXNzZWQgYnkgTkZBICgtMSA9CiAJ CQkJCQkJCQkJICogbm9uZSkgKi8KIAotLSAKMi4zNC4xCgo= --000000000000947d910653035072 Content-Type: application/octet-stream; name="v47-0003-nfa-refactor-argument.no-cfbot" Content-Disposition: attachment; filename="v47-0003-nfa-refactor-argument.no-cfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mprzgesh0 RnJvbSAxMWEwYzMwNzgyZjQ1NmRjODgzZGNiZGU2OWIwMjUwMjY4OThkOTBmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IEZyaSwgMjkgTWF5IDIwMjYgMjM6MzQ6NTAgKzA4MDAKU3ViamVjdDogW1BBVENIIHY0 NyAzLzNdIG5mYSByZWZhY3RvciBhcmd1bWVudAoKVGhlIGZ1bmN0aW9ucyBuZmFfYWR2YW5jZV9h bHQsIG5mYV9hZHZhbmNlX2JlZ2luLCBuZmFfYWR2YW5jZV9lbmQsIGFuZApuZmFfYWR2YW5jZV92 YXIgY3VycmVudGx5IGFsbCB0YWtlIHRoZSBzYW1lIHR3byBwYXJhbWV0ZXJzOgooUlBSTkZBU3Rh dGUgKnN0YXRlLCBSUFJQYXR0ZXJuRWxlbWVudCAqZWxlbSkKCkhvd2V2ZXIgKFJQUlBhdHRlcm5F bGVtZW50ICplbGVtKSBjYW4gYWxyZWFkeSBiZSBkZXJpdmVkIGZyb20gKFJQUk5GQVN0YXRlICpz dGF0ZSkuClBhc3NpbmcgaXQgZXhwbGljaXRseSBpcyByZWR1bmRhbnQgYW5kIG1ha2UgaXQgZmVl bCBjb25mdXNpbmcuClNvIEkgcHJvcG9zZSB0byBlbW92ZSB0aGUgKFJQUlBhdHRlcm5FbGVtZW50 ICplbGVtKSBwYXJhbWV0ZXIgZnJvbSB0aGVzZSBmdW5jdGlvbnMuCi0tLQogc3JjL2JhY2tlbmQv ZXhlY3V0b3IvZXhlY1JQUi5jIHwgMzYgKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0t LQogMSBmaWxlIGNoYW5nZWQsIDE2IGluc2VydGlvbnMoKyksIDIwIGRlbGV0aW9ucygtKQoKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNSUFIuYyBiL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL2V4ZWNSUFIuYwppbmRleCBhNzZiYjk3Y2I3ZC4uYTgxZTQyNTMzN2QgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNSUFIuYworKysgYi9zcmMvYmFja2VuZC9leGVj dXRvci9leGVjUlBSLmMKQEAgLTc4LDE3ICs3OCwxMyBAQCBzdGF0aWMgdm9pZCBuZmFfcm91dGVf dG9fZWxlbShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0eCwKIAkJ CQkJCQkgIFJQUk5GQVN0YXRlICpzdGF0ZSwgUlBSUGF0dGVybkVsZW1lbnQgKm5leHRFbGVtLAog CQkJCQkJCSAgaW50NjQgY3VycmVudFBvcyk7CiBzdGF0aWMgdm9pZCBuZmFfYWR2YW5jZV9hbHQo V2luZG93QWdnU3RhdGUgKndpbnN0YXRlLCBSUFJORkFDb250ZXh0ICpjdHgsCi0JCQkJCQkJUlBS TkZBU3RhdGUgKnN0YXRlLCBSUFJQYXR0ZXJuRWxlbWVudCAqZWxlbSwKLQkJCQkJCQlpbnQ2NCBj dXJyZW50UG9zKTsKKwkJCQkJCQlSUFJORkFTdGF0ZSAqc3RhdGUsIGludDY0IGN1cnJlbnRQb3Mp Owogc3RhdGljIHZvaWQgbmZhX2FkdmFuY2VfYmVnaW4oV2luZG93QWdnU3RhdGUgKndpbnN0YXRl LCBSUFJORkFDb250ZXh0ICpjdHgsCi0JCQkJCQkJICBSUFJORkFTdGF0ZSAqc3RhdGUsIFJQUlBh dHRlcm5FbGVtZW50ICplbGVtLAotCQkJCQkJCSAgaW50NjQgY3VycmVudFBvcyk7CisJCQkJCQkJ ICBSUFJORkFTdGF0ZSAqc3RhdGUsIGludDY0IGN1cnJlbnRQb3MpOwogc3RhdGljIHZvaWQgbmZh X2FkdmFuY2VfZW5kKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgUlBSTkZBQ29udGV4dCAqY3R4 LAotCQkJCQkJCVJQUk5GQVN0YXRlICpzdGF0ZSwgUlBSUGF0dGVybkVsZW1lbnQgKmVsZW0sCi0J CQkJCQkJaW50NjQgY3VycmVudFBvcyk7CisJCQkJCQkJUlBSTkZBU3RhdGUgKnN0YXRlLCBpbnQ2 NCBjdXJyZW50UG9zKTsKIHN0YXRpYyB2b2lkIG5mYV9hZHZhbmNlX3ZhcihXaW5kb3dBZ2dTdGF0 ZSAqd2luc3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0eCwKLQkJCQkJCQlSUFJORkFTdGF0ZSAqc3Rh dGUsIFJQUlBhdHRlcm5FbGVtZW50ICplbGVtLAotCQkJCQkJCWludDY0IGN1cnJlbnRQb3MpOwor CQkJCQkJCVJQUk5GQVN0YXRlICpzdGF0ZSwgaW50NjQgY3VycmVudFBvcyk7CiBzdGF0aWMgdm9p ZCBuZmFfYWR2YW5jZShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0 eCwKIAkJCQkJCWludDY0IGN1cnJlbnRQb3MpOwogCkBAIC05MjUsMTEgKzkyMSwxMSBAQCBuZmFf cm91dGVfdG9fZWxlbShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0 eCwKICAqLwogc3RhdGljIHZvaWQKIG5mYV9hZHZhbmNlX2FsdChXaW5kb3dBZ2dTdGF0ZSAqd2lu c3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0eCwKLQkJCQlSUFJORkFTdGF0ZSAqc3RhdGUsIFJQUlBh dHRlcm5FbGVtZW50ICplbGVtLAotCQkJCWludDY0IGN1cnJlbnRQb3MpCisJCQkJUlBSTkZBU3Rh dGUgKnN0YXRlLCBpbnQ2NCBjdXJyZW50UG9zKQogewogCVJQUlBhdHRlcm4gKnBhdHRlcm4gPSB3 aW5zdGF0ZS0+cnBQYXR0ZXJuOwogCVJQUlBhdHRlcm5FbGVtZW50ICplbGVtZW50cyA9IHBhdHRl cm4tPmVsZW1lbnRzOworCVJQUlBhdHRlcm5FbGVtZW50ICplbGVtID0gJmVsZW1lbnRzW3N0YXRl LT5lbGVtSWR4XTsKIAlSUFJFbGVtSWR4CWFsdElkeCA9IGVsZW0tPm5leHQ7CiAKIAl3aGlsZSAo YWx0SWR4ID49IDAgJiYgYWx0SWR4IDwgcGF0dGVybi0+bnVtRWxlbWVudHMpCkBAIC05NjMsMTEg Kzk1OSwxMSBAQCBuZmFfYWR2YW5jZV9hbHQoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLCBSUFJO RkFDb250ZXh0ICpjdHgsCiAgKi8KIHN0YXRpYyB2b2lkCiBuZmFfYWR2YW5jZV9iZWdpbihXaW5k b3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFJQUk5GQUNvbnRleHQgKmN0eCwKLQkJCQkgIFJQUk5GQVN0 YXRlICpzdGF0ZSwgUlBSUGF0dGVybkVsZW1lbnQgKmVsZW0sCi0JCQkJICBpbnQ2NCBjdXJyZW50 UG9zKQorCQkJCSAgUlBSTkZBU3RhdGUgKnN0YXRlLCBpbnQ2NCBjdXJyZW50UG9zKQogewogCVJQ UlBhdHRlcm4gKnBhdHRlcm4gPSB3aW5zdGF0ZS0+cnBQYXR0ZXJuOwogCVJQUlBhdHRlcm5FbGVt ZW50ICplbGVtZW50cyA9IHBhdHRlcm4tPmVsZW1lbnRzOworCVJQUlBhdHRlcm5FbGVtZW50ICpl bGVtID0gJmVsZW1lbnRzW3N0YXRlLT5lbGVtSWR4XTsKIAlSUFJORkFTdGF0ZSAqc2tpcFN0YXRl ID0gTlVMTDsKIAogCXN0YXRlLT5jb3VudHNbZWxlbS0+ZGVwdGhdID0gMDsKQEAgLTEwMjQsMTEg KzEwMjAsMTEgQEAgbmZhX2FkdmFuY2VfYmVnaW4oV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLCBS UFJORkFDb250ZXh0ICpjdHgsCiAgKi8KIHN0YXRpYyB2b2lkCiBuZmFfYWR2YW5jZV9lbmQoV2lu ZG93QWdnU3RhdGUgKndpbnN0YXRlLCBSUFJORkFDb250ZXh0ICpjdHgsCi0JCQkJUlBSTkZBU3Rh dGUgKnN0YXRlLCBSUFJQYXR0ZXJuRWxlbWVudCAqZWxlbSwKLQkJCQlpbnQ2NCBjdXJyZW50UG9z KQorCQkJCVJQUk5GQVN0YXRlICpzdGF0ZSwgaW50NjQgY3VycmVudFBvcykKIHsKIAlSUFJQYXR0 ZXJuICpwYXR0ZXJuID0gd2luc3RhdGUtPnJwUGF0dGVybjsKIAlSUFJQYXR0ZXJuRWxlbWVudCAq ZWxlbWVudHMgPSBwYXR0ZXJuLT5lbGVtZW50czsKKwlSUFJQYXR0ZXJuRWxlbWVudCAqZWxlbSA9 ICZlbGVtZW50c1tzdGF0ZS0+ZWxlbUlkeF07CiAJaW50CQkJZGVwdGggPSBlbGVtLT5kZXB0aDsK IAlpbnQzMgkJY291bnQgPSBzdGF0ZS0+Y291bnRzW2RlcHRoXTsKIApAQCAtMTE3OSwxMSArMTE3 NSwxMSBAQCBuZmFfYWR2YW5jZV9lbmQoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLCBSUFJORkFD b250ZXh0ICpjdHgsCiAgKi8KIHN0YXRpYyB2b2lkCiBuZmFfYWR2YW5jZV92YXIoV2luZG93QWdn U3RhdGUgKndpbnN0YXRlLCBSUFJORkFDb250ZXh0ICpjdHgsCi0JCQkJUlBSTkZBU3RhdGUgKnN0 YXRlLCBSUFJQYXR0ZXJuRWxlbWVudCAqZWxlbSwKLQkJCQlpbnQ2NCBjdXJyZW50UG9zKQorCQkJ CVJQUk5GQVN0YXRlICpzdGF0ZSwgaW50NjQgY3VycmVudFBvcykKIHsKIAlSUFJQYXR0ZXJuICpw YXR0ZXJuID0gd2luc3RhdGUtPnJwUGF0dGVybjsKIAlSUFJQYXR0ZXJuRWxlbWVudCAqZWxlbWVu dHMgPSBwYXR0ZXJuLT5lbGVtZW50czsKKwlSUFJQYXR0ZXJuRWxlbWVudCAqZWxlbSA9ICZlbGVt ZW50c1tzdGF0ZS0+ZWxlbUlkeF07CiAJaW50CQkJZGVwdGggPSBlbGVtLT5kZXB0aDsKIAlpbnQz MgkJY291bnQgPSBzdGF0ZS0+Y291bnRzW2RlcHRoXTsKIAlib29sCQljYW5Mb29wID0gKGVsZW0t Pm1heCA9PSBSUFJfUVVBTlRJVFlfSU5GIHx8IGNvdW50IDwgZWxlbS0+bWF4KTsKQEAgLTEzNTQs MjAgKzEzNTAsMjAgQEAgbmZhX2FkdmFuY2Vfc3RhdGUoV2luZG93QWdnU3RhdGUgKndpbnN0YXRl LCBSUFJORkFDb250ZXh0ICpjdHgsCiAJCQlicmVhazsKIAogCQljYXNlIFJQUl9WQVJJRF9BTFQ6 Ci0JCQluZmFfYWR2YW5jZV9hbHQod2luc3RhdGUsIGN0eCwgc3RhdGUsIGVsZW0sIGN1cnJlbnRQ b3MpOworCQkJbmZhX2FkdmFuY2VfYWx0KHdpbnN0YXRlLCBjdHgsIHN0YXRlLCBjdXJyZW50UG9z KTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUlBSX1ZBUklEX0JFR0lOOgotCQkJbmZhX2FkdmFuY2Vf YmVnaW4od2luc3RhdGUsIGN0eCwgc3RhdGUsIGVsZW0sIGN1cnJlbnRQb3MpOworCQkJbmZhX2Fk dmFuY2VfYmVnaW4od2luc3RhdGUsIGN0eCwgc3RhdGUsIGN1cnJlbnRQb3MpOwogCQkJYnJlYWs7 CiAKIAkJY2FzZSBSUFJfVkFSSURfRU5EOgotCQkJbmZhX2FkdmFuY2VfZW5kKHdpbnN0YXRlLCBj dHgsIHN0YXRlLCBlbGVtLCBjdXJyZW50UG9zKTsKKwkJCW5mYV9hZHZhbmNlX2VuZCh3aW5zdGF0 ZSwgY3R4LCBzdGF0ZSwgY3VycmVudFBvcyk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgogCQkJ LyogVkFSIGVsZW1lbnQgKi8KLQkJCW5mYV9hZHZhbmNlX3Zhcih3aW5zdGF0ZSwgY3R4LCBzdGF0 ZSwgZWxlbSwgY3VycmVudFBvcyk7CisJCQluZmFfYWR2YW5jZV92YXIod2luc3RhdGUsIGN0eCwg c3RhdGUsIGN1cnJlbnRQb3MpOwogCQkJYnJlYWs7CiAJfQogfQotLSAKMi4zNC4xCgo= --000000000000947d910653035072--