From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x244.google.com (mail-oi1-x244.google.com [IPv6:2607:f8b0:4864:20::244]) by sourceware.org (Postfix) with ESMTPS id 97959387700C for ; Wed, 11 Mar 2020 16:17:38 +0000 (GMT) Received: by mail-oi1-x244.google.com with SMTP id p125so2420492oif.10 for ; Wed, 11 Mar 2020 09:17:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=A0SdllwWBcmabTahVnDUniHAJwe9Qug5na3jRaw54w8=; b=Lcjr+W57+bfgz2G6mx7QZFOqc+k+0fLefpz3l8OkzAA8xzMYwfYEmUwHQW7zs+h7fF wT9BL9PGCvxo0HCa4ebKgP6b2byyQpIgYj24IwgsYC7+azs7v8VezL2qv7hIwFV/5psZ K9bc5ZtTlACLsXx8s8tvh+n2ThLPWNI8vpdf23ldXp/Ho+DMFXzhHxwwkM4rPOrZVvqZ XaoAAvq0AxIMYSjYtaGZG80sdxiVlko02DRaDVwE1ySH5TGxB+CEv/oImN+kFDMf/Q7q sYeoXDuEQ+aMUL0fiCgvmwBohW0miWsH+AuxDyVDjEj3fYSSFgOAy76lo4XIkhreSBge sFcg== X-Gm-Message-State: ANhLgQ3s9Pgp3ooz3u/pz+i0n+6VUI1YNXRqdYiRC88j+4oFpOXthNA7 3QA38gvugL8rUhhjFQykV16Jz5zM0YnwSV6LjcU= X-Google-Smtp-Source: ADFU+vuA8HGKtBF+6Wexj8wmmlszp9HiE9KvRZJRuqkvMhsGJd1GdWD9Ce2bC8P7HOfLcGJkNCDJ8kQlThImVd2at10= X-Received: by 2002:aca:dec6:: with SMTP id v189mr2197077oig.156.1583943457719; Wed, 11 Mar 2020 09:17:37 -0700 (PDT) MIME-Version: 1.0 References: <20200310160528.303613-1-hjl.tools@gmail.com> <20200310160528.303613-2-hjl.tools@gmail.com> <6dcb50a3-d3ad-6abc-8a5f-703373df95a1@suse.com> In-Reply-To: <6dcb50a3-d3ad-6abc-8a5f-703373df95a1@suse.com> From: "H.J. Lu" Date: Wed, 11 Mar 2020 09:17:01 -0700 Message-ID: Subject: Re: [PATCH 1/2] i386: Generate lfence with load/indirect branch/ret [CVE-2020-0551] To: Jan Beulich Cc: Binutils , "Lu, Hongjiu" , Hongtao Liu Content-Type: multipart/mixed; boundary="000000000000246c3805a0969330" X-Spam-Status: No, score=-27.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Mar 2020 16:17:40 -0000 --000000000000246c3805a0969330 Content-Type: text/plain; charset="UTF-8" On Wed, Mar 11, 2020 at 3:55 AM Jan Beulich wrote: > > On 10.03.2020 17:05, H.J. Lu wrote: > > @@ -4311,6 +4333,291 @@ optimize_encoding (void) > > } > > } > > > > +/* Return non-zero for load instruction. */ > > + > > +static int > > +load_insn_p (void) > > +{ > > + unsigned int dest; > > + int any_vex_p = is_any_vex_encoding (&i.tm); > > + > > + if (!any_vex_p) > > + { > > + /* lea */ > > + if (i.tm.base_opcode == 0x8d) > > + return 0; > > Also include INVLPG, CLFLUSH etc, and maybe some prefetches here? > (I'll mention the LEA-like MPX insns as well, but I think I can > predict your reply.) Hongtao, can you look into it? > > + /* pop */ > > + if ((i.tm.base_opcode & 0xfffffff8) == 0x58 > > Mind using ~7 instead? Changed. > > + || (i.tm.base_opcode == 0x8f && i.tm.extension_opcode == 0)) > > + return 1; > > What about segment register POPs, POPF, POPA, ENTER, and LEAVE? We decided that ENTER and LEAVE are safe. Hongtao, can you look into others? > > + /* movs, cmps, lods, scas. */ > > + if ((i.tm.base_opcode >= 0xa4 && i.tm.base_opcode <= 0xa7) > > + || (i.tm.base_opcode >= 0xac && i.tm.base_opcode <= 0xaf)) > > This can be had with a single comparison: > > if ((i.tm.base_opcode | 0xb) == 0xaf) Changed. > > + return 1; > > + > > + /* outs */ > > + if (i.tm.base_opcode == 0x6e || i.tm.base_opcode == 0x6f) > > And here: > > if ((i.tm.base_opcode | 1) == 0x6f) > > Similar folding of comparisons may also be desirable further down. Changed, > Also, what about XLATB? What about implicit memory accesses done by Hongtao, can you look into it? > e.g. segment register loads? As to AMD-specific insns with implicit > memory operands (often accessed through rAX), should the doc > perhaps mention they're intentionally not covered? Yes, AMD specific insns are skipped. Hongtao, can you look into it? > > + return 1; > > + } > > + > > + /* No memory operand. */ > > + if (!i.mem_operands) > > + return 0; > > + > > + if (any_vex_p) > > + { > > + /* vldmxcsr. */ > > + if (i.tm.base_opcode == 0xae > > + && i.tm.opcode_modifier.vex > > + && i.tm.opcode_modifier.vexopcode == VEX0F > > + && i.tm.extension_opcode == 2) > > + return 1; > > + } > > + else > > + { > > + /* test, not, neg, mul, imul, div, idiv. */ > > + if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7) > > + && i.tm.extension_opcode != 1) > > + return 1; > > + > > + /* inc, dec. */ > > + if ((i.tm.base_opcode == 0xfe || i.tm.base_opcode == 0xff) > > + && i.tm.extension_opcode <= 1) > > + return 1; > > + > > + /* add, or, adc, sbb, and, sub, xor, cmp. */ > > + if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83) > > + return 1; > > + > > + /* bt, bts, btr, btc. */ > > + if (i.tm.base_opcode == 0xfba > > + && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7)) > > + return 1; > > + > > + /* rol, ror, rcl, rcr, shl/sal, shr, sar. */ > > + if ((i.tm.base_opcode == 0xc0 > > + || i.tm.base_opcode == 0xc1 > > + || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3)) > > + && i.tm.extension_opcode != 6) > > + return 1; > > + > > + /* cmpxchg8b, cmpxchg16b, xrstors. */ > > + if (i.tm.base_opcode == 0xfc7 > > + && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3)) > > + return 1; > > + > > + /* fxrstor, ldmxcsr, xrstor. */ > > + if (i.tm.base_opcode == 0xfae > > + && (i.tm.extension_opcode == 1 > > + || i.tm.extension_opcode == 2 > > + || i.tm.extension_opcode == 5)) > > + return 1; > > + > > + /* lgdt, lidt, lmsw. */ > > + if (i.tm.base_opcode == 0xf01 > > + && (i.tm.extension_opcode == 2 > > + || i.tm.extension_opcode == 3 > > + || i.tm.extension_opcode == 6)) > > + return 1; > > + > > + /* vmptrld */ > > + if (i.tm.base_opcode == 0xfc7 > > + && i.tm.extension_opcode == 6) > > + return 1; > > + > > + /* Check for x87 instructions. */ > > + if (i.tm.base_opcode >= 0xd8 && i.tm.base_opcode <= 0xdf) > > + { > > + /* Skip fst, fstp, fstenv, fstcw. */ > > + if (i.tm.base_opcode == 0xd9 > > + && (i.tm.extension_opcode == 2 > > + || i.tm.extension_opcode == 3 > > + || i.tm.extension_opcode == 6 > > + || i.tm.extension_opcode == 7)) > > + return 0; > > + > > + /* Skip fisttp, fist, fistp, fstp. */ > > + if (i.tm.base_opcode == 0xdb > > + && (i.tm.extension_opcode == 1 > > + || i.tm.extension_opcode == 2 > > + || i.tm.extension_opcode == 3 > > + || i.tm.extension_opcode == 7)) > > + return 0; > > + > > + /* Skip fisttp, fst, fstp, fsave, fstsw. */ > > + if (i.tm.base_opcode == 0xdd > > + && (i.tm.extension_opcode == 1 > > + || i.tm.extension_opcode == 2 > > + || i.tm.extension_opcode == 3 > > + || i.tm.extension_opcode == 6 > > + || i.tm.extension_opcode == 7)) > > + return 0; > > + > > + /* Skip fisttp, fist, fistp, fbstp, fistp. */ > > + if (i.tm.base_opcode == 0xdf > > + && (i.tm.extension_opcode == 1 > > + || i.tm.extension_opcode == 2 > > + || i.tm.extension_opcode == 3 > > + || i.tm.extension_opcode == 6 > > + || i.tm.extension_opcode == 7)) > > + return 0; > > + > > + return 1; > > + } > > + } > > + > > + dest = i.operands - 1; > > + > > + /* Check fake imm8 operand and 3 source operands. */ > > + if ((i.tm.opcode_modifier.immext > > + || i.tm.opcode_modifier.vexsources == VEX3SOURCES) > > + && i.types[dest].bitfield.imm8) > > + dest--; > > + > > + /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg, xadd */ > > + if (!any_vex_p > > + && (i.tm.base_opcode == 0x0 > > + || i.tm.base_opcode == 0x1 > > + || i.tm.base_opcode == 0x8 > > + || i.tm.base_opcode == 0x9 > > + || i.tm.base_opcode == 0x10 > > + || i.tm.base_opcode == 0x11 > > + || i.tm.base_opcode == 0x18 > > + || i.tm.base_opcode == 0x19 > > + || i.tm.base_opcode == 0x20 > > + || i.tm.base_opcode == 0x21 > > + || i.tm.base_opcode == 0x28 > > + || i.tm.base_opcode == 0x29 > > + || i.tm.base_opcode == 0x30 > > + || i.tm.base_opcode == 0x31 > > + || i.tm.base_opcode == 0x38 > > + || i.tm.base_opcode == 0x39 > > + || (i.tm.base_opcode >= 0x84 && i.tm.base_opcode <= 0x87) > > + || i.tm.base_opcode == 0xfc0 > > + || i.tm.base_opcode == 0xfc1)) > > + return 1; > > Don't quite a few of these fit very well with ... > Changed. > > + /* Check for load instruction. */ > > + return (i.types[dest].bitfield.class != ClassNone > > + || i.types[dest].bitfield.instance == Accum); > > ... this generic expression? It would seem to me that only TEST > and XCHG need special casing, for allowing either operand order. > Same seems to apply to quite a few of the special cases in the > big "else" block further up, and even its if() [vldmxcsr] part. Hongtao, can you look into it? > > +static void > > +insert_lfence_before (void) > > +{ > > + char *p; > > + > > + if (i.tm.base_opcode == 0xff > > + && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4)) > > Also exclude VEX- and alike encoded insn here again? I changed to: static void insert_lfence_before (void) { char *p; if (is_any_vex_encoding (&i.tm)) return; > > + { > > + /* Insert lfence before indirect branch if needed. */ > > + > > + if (lfence_before_indirect_branch == lfence_branch_none) > > + return; > > + > > + if (i.operands != 1) > > + abort (); > > + > > + if (i.reg_operands == 1) > > + { > > + /* Indirect branch via register. Don't insert lfence with > > + -mlfence-after-load=yes. */ > > + if (lfence_after_load > > + || lfence_before_indirect_branch == lfence_branch_memory) > > + return; > > + } > > + else if (i.mem_operands == 1 > > + && lfence_before_indirect_branch != lfence_branch_register) > > + { > > + as_warn (_("indirect branch `%s` over memory should be avoided"), > > + i.tm.name); > > Perhaps drop "branch" and replace "over memory" by "with memory operand"? Changed. > > + return; > > + } > > + else > > + return; > > + > > + if (last_insn.kind != last_insn_other > > + && last_insn.seg == now_seg) > > + { > > + as_warn_where (last_insn.file, last_insn.line, > > + _("`%s` skips -mlfence-before-indirect-branch on `%s`"), > > + last_insn.name, i.tm.name); > > + return; > > + } > > + > > + p = frag_more (3); > > + *p++ = 0xf; > > + *p++ = 0xae; > > + *p = 0xe8; > > + return; > > + } > > + > > + /* Output orl/notl and lfence before ret. */ > > May I suggest to either drop the insn suffixes here (and below), > or make them correctly reflect the code below (which may also > produce q- or w-suffixed insns)? Changed. > > + if (lfence_before_ret != lfence_before_ret_none > > + && (i.tm.base_opcode == 0xc2 > > + || i.tm.base_opcode == 0xc3 > > + || i.tm.base_opcode == 0xca > > + || i.tm.base_opcode == 0xcb)) > > + { > > + if (last_insn.kind != last_insn_other > > + && last_insn.seg == now_seg) > > + { > > + as_warn_where (last_insn.file, last_insn.line, > > + _("`%s` skips -mlfence-before-ret on `%s`"), > > + last_insn.name, i.tm.name); > > + return; > > + } > > + if (lfence_before_ret == lfence_before_ret_or) > > + { > > + /* orl: 0x830c2400. */ > > + p = frag_more ((flag_code == CODE_64BIT ? 1 : 0) + 4 + 3); > > + if (flag_code == CODE_64BIT) > > + *p++ = 0x48; > > Shouldn't this depend on RET's operand size? Likewise wouldn't you > also need to insert 0x66/0x67 in certain cases? Hongtao, can you look into it? > > + *p++ = 0x83; > > + *p++ = 0xc; > > + *p++ = 0x24; > > + *p++ = 0x0; > > + } > > + else > > + { > > + p = frag_more ((flag_code == CODE_64BIT ? 2 : 0) + 6 + 3); > > + /* notl: 0xf71424. */ > > + if (flag_code == CODE_64BIT) > > + *p++ = 0x48; > > + *p++ = 0xf7; > > + *p++ = 0x14; > > + *p++ = 0x24; > > + if (flag_code == CODE_64BIT) > > + *p++ = 0x48; > > + /* notl: 0xf71424. */ > > + *p++ = 0xf7; > > + *p++ = 0x14; > > + *p++ = 0x24; > > When reading the description I was wondering about the use of NOT. > I think the doc should mention that it's _two_ NOTs that get inserted, > as this is even more growth of code size than the OR variant. Is > there a performance reason for having this extra, more expensive (in > terms of code size) variant? Or is it rather because of the OR > variant clobbering EFLAGS (which ought to be called out in the doc)? > In which case - was it considered to use e.g. SHL with an immediate > of zero, thus having smaller code _and_ untouched EFLAGS (but of > course requiring at least an 80186, albeit the addressing mode > used requires a 386 anyway, which you don't seem to be checking > anywhere)? This is a very good suggestion. I will talk to our people. In meantime, I'd like to keep it as is since this version has been tested extensively. We can change it to SHL 0 later. > Also I guess the last comment above would better move two lines up? Changed. > > @@ -12668,6 +12986,41 @@ md_parse_option (int c, const char *arg) > > as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg); > > break; > > > > + case OPTION_MLFENCE_AFTER_LOAD: > > + if (strcasecmp (arg, "yes") == 0) > > + lfence_after_load = 1; > > + else if (strcasecmp (arg, "no") == 0) > > + lfence_after_load = 0; > > + else > > + as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg); > > + break; > > + > > + case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH: > > + if (strcasecmp (arg, "all") == 0) > > + lfence_before_indirect_branch = lfence_branch_all; > > I wonder whether this shouldn't also enable a safe lfence_before_ret > mode (i.e. not the OR one), for RET also being an indirect branch. Of > course care would need to be taken to avoid clobbering an already set > lfence_before_ret mode. Hongtao, can you look into it? > > @@ -13254,6 +13616,10 @@ i386_cons_align (int ignore ATTRIBUTE_UNUSED) > > last_insn.kind = last_insn_directive; > > last_insn.name = "constant directive"; > > last_insn.file = as_where (&last_insn.line); > > + if (lfence_before_ret != lfence_before_ret_none) > > + as_warn (_("constant directive skips -mlfence-before-ret")); > > + if (lfence_before_indirect_branch != lfence_branch_none) > > + as_warn (_("constant directive skips -mlfence-before-indirect-branch")); > > Could these be folded into a single warning, to avoid getting overly > verbose? > Changed. This is the patch I am checking in. -- H.J. --000000000000246c3805a0969330 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-i386-Generate-lfence-with-load-indirect-branch-ret-C.patch" Content-Disposition: attachment; filename="0001-i386-Generate-lfence-with-load-indirect-branch-ret-C.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_k7nj09100 RnJvbSBjNGI3N2I4YmQ2MWRmZGQxN2Q1MWY0ZTFjOTE3ODIzNGUxMTM5ZmQ2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiSC5KLiBMdSIgPGhqbC50b29sc0BnbWFpbC5jb20+CkRhdGU6 IFR1ZSwgMTAgTWFyIDIwMjAgMDg6Mjk6NTcgLTA3MDAKU3ViamVjdDogW1BBVENIXSBpMzg2OiBH ZW5lcmF0ZSBsZmVuY2Ugd2l0aCBsb2FkL2luZGlyZWN0IGJyYW5jaC9yZXQKIFtDVkUtMjAyMC0w NTUxXQoKQWRkIDMgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gZ2VuZXJhdGUgbGZlbmNlIGZvciBs b2FkLCBpbmRpcmVjdCBuZWFyCmJyYW5jaCBhbmQgcmV0IHRvIGhlbHAgbWl0aWdhdGU6CgpodHRw czovL3d3dy5pbnRlbC5jb20vY29udGVudC93d3cvdXMvZW4vc2VjdXJpdHktY2VudGVyL2Fkdmlz b3J5L2ludGVsLXNhLTAwMzM0Lmh0bWwKaHR0cDovL2N2ZS5taXRyZS5vcmcvY2dpLWJpbi9jdmVu YW1lLmNnaT9uYW1lPUNWRS0yMDIwLTA1NTEKCjEuIC1tbGZlbmNlLWFmdGVyLWxvYWQ9W25vfHll c106CiAgLW1sZmVuY2UtYWZ0ZXItbG9hZD15ZXMgZ2VuZXJhdGVzIGxmZW5jZSBhZnRlciBsb2Fk IGluc3RydWN0aW9ucy4KMi4gLW1sZmVuY2UtYmVmb3JlLWluZGlyZWN0LWJyYW5jaD1bbm9uZXxh bGx8bWVtb3J5fHJlZ2lzdGVyXToKICBhLiAtbWxmZW5jZS1iZWZvcmUtaW5kaXJlY3QtYnJhbmNo PWFsbCBnZW5lcmF0ZXMgbGZlbmNlIGJlZm9yZSBpbmRpcmVjdAogIG5lYXIgYnJhbmNoZXMgdmlh IHJlZ2lzdGVyIGFuZCBhIHdhcm5pbmcgYmVmb3JlIGluZGlyZWN0IG5lYXIgYnJhbmNoZXMKICB2 aWEgbWVtb3J5LgogIGIuIC1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2g9bWVtb3J5IGlz c3VlIGEgd2FybmluZyBiZWZvcmUKICBpbmRpcmVjdCBuZWFyIGJyYW5jaGVzIHZpYSBtZW1vcnku CiAgYy4gLW1sZmVuY2UtYmVmb3JlLWluZGlyZWN0LWJyYW5jaD1yZWdpc3RlciBnZW5lcmF0ZXMg bGZlbmNlIGJlZm9yZQogIGluZGlyZWN0IG5lYXIgYnJhbmNoZXMgdmlhIHJlZ2lzdGVyLgpOb3Rl IHRoYXQgbGZlbmNlIHdvbid0IGJlIGdlbmVyYXRlZCBiZWZvcmUgaW5kaXJlY3QgbmVhciBicmFu Y2hlcyB2aWEKcmVnaXN0ZXIgd2l0aCAtbWxmZW5jZS1hZnRlci1sb2FkPXllcyBzaW5jZSBsZmVu Y2Ugd2lsbCBiZSBnZW5lcmF0ZWQKYWZ0ZXIgbG9hZGluZyBicmFuY2ggdGFyZ2V0IHJlZ2lzdGVy LgozLiAtbWxmZW5jZS1iZWZvcmUtcmV0PVtub25lfG9yfG5vdF0KICBhLiAtbWxmZW5jZS1iZWZv cmUtcmV0PW9yIGdlbmVyYXRlcyBvciB3aXRoIGxmZW5jZSBiZWZvcmUgcmV0LgogIGIuIC1tbGZl bmNlLWJlZm9yZS1yZXQ9bm90IGdlbmVyYXRlcyBub3Qgd2l0aCBsZmVuY2UgYmVmb3JlIHJldC4K CkEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCBhbmQgbGZlbmNlIHdvbid0IGJlIGdlbmVyYXRlZCBi ZWZvcmUgaW5kaXJlY3QKbmVhciBicmFuY2ggYW5kIHJldCBpZiB0aGUgcHJldmlvdXMgaXRlbSBp cyBhIHByZWZpeCBvciBhIGNvbnN0YW50CmRpcmVjdGl2ZSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8g aGFyZGNvZGUgYW4gaW5zdHJ1Y3Rpb24sIHNpbmNlIHRoZXJlCmlzIG5vIGNsZWFyIGluc3RydWN0 aW9uIGJvdW5kYXJ5LgoKCSogY29uZmlnL3RjLWkzODYuYyAobGZlbmNlX2FmdGVyX2xvYWQpOiBO ZXcuCgkobGZlbmNlX2JlZm9yZV9pbmRpcmVjdF9icmFuY2hfa2luZCk6IE5ldy4KCShsZmVuY2Vf YmVmb3JlX2luZGlyZWN0X2JyYW5jaCk6IE5ldy4KCShsZmVuY2VfYmVmb3JlX3JldF9raW5kKTog TmV3LgoJKGxmZW5jZV9iZWZvcmVfcmV0KTogTmV3LgoJKGxhc3RfaW5zbik6IE5ldy4KCShsb2Fk X2luc25fcCk6IE5ldy4KCShpbnNlcnRfbGZlbmNlX2FmdGVyKTogTmV3LgoJKGluc2VydF9sZmVu Y2VfYmVmb3JlKTogTmV3LgoJKG1kX2Fzc2VtYmxlKTogQ2FsbCBpbnNlcnRfbGZlbmNlX2JlZm9y ZSBhbmQgaW5zZXJ0X2xmZW5jZV9hZnRlci4KCVNldCBsYXN0X2luc24uCgkoT1BUSU9OX01MRkVO Q0VfQUZURVJfTE9BRCk6IE5ldy4KCShPUFRJT05fTUxGRU5DRV9CRUZPUkVfSU5ESVJFQ1RfQlJB TkNIKTogTmV3LgoJKE9QVElPTl9NTEZFTkNFX0JFRk9SRV9SRVQpOiBOZXcuCgkobWRfbG9uZ29w dHMpOiBBZGQgLW1sZmVuY2UtYWZ0ZXItbG9hZD0sCgktbWxmZW5jZS1iZWZvcmUtaW5kaXJlY3Qt YnJhbmNoPSBhbmQgLW1sZmVuY2UtYmVmb3JlLXJldD0uCgkobWRfcGFyc2Vfb3B0aW9uKTogSGFu ZGxlIC1tbGZlbmNlLWFmdGVyLWxvYWQ9LAoJLW1sZmVuY2UtYmVmb3JlLWluZGlyZWN0LWJyYW5j aD0gYW5kIC1tbGZlbmNlLWJlZm9yZS1yZXQ9LgoJKG1kX3Nob3dfdXNhZ2UpOiBEaXNwbGF5IC1t bGZlbmNlLWFmdGVyLWxvYWQ9LAoJLW1sZmVuY2UtYmVmb3JlLWluZGlyZWN0LWJyYW5jaD0gYW5k IC1tbGZlbmNlLWJlZm9yZS1yZXQ9LgoJKGkzODZfY29uc19hbGlnbik6IE5ldy4KCSogY29uZmln L3RjLWkzODYuaCAoaTM4Nl9jb25zX2FsaWduKTogTmV3LgoJKG1kX2NvbnNfYWxpZ24pOiBOZXcu CgkqIGRvYy9jLWkzODYudGV4aTogRG9jdW1lbnQgLW1sZmVuY2UtYWZ0ZXItbG9hZD0sCgktbWxm ZW5jZS1iZWZvcmUtaW5kaXJlY3QtYnJhbmNoPSBhbmQgLW1sZmVuY2UtYmVmb3JlLXJldD0uCi0t LQogZ2FzL0NoYW5nZUxvZyAgICAgICAgfCAgMjggKysrKwogZ2FzL2NvbmZpZy90Yy1pMzg2LmMg fCAzNjYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQogZ2FzL2Rv Yy9jLWkzODYudGV4aSAgfCAgNDMgKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgNDM2IGluc2VydGlv bnMoKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9nYXMvQ2hhbmdlTG9nIGIvZ2FzL0No YW5nZUxvZwppbmRleCA4MzZjYjVjNmQ5Li5kNTgxY2MzZDQ3IDEwMDY0NAotLS0gYS9nYXMvQ2hh bmdlTG9nCisrKyBiL2dhcy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMSBAQAorMjAyMC0wMy0xMCAg SC5KLiBMdSAgPGhvbmdqaXUubHVAaW50ZWwuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChs ZmVuY2VfYWZ0ZXJfbG9hZCk6IE5ldy4KKwkobGZlbmNlX2JlZm9yZV9pbmRpcmVjdF9icmFuY2hf a2luZCk6IE5ldy4KKwkobGZlbmNlX2JlZm9yZV9pbmRpcmVjdF9icmFuY2gpOiBOZXcuCisJKGxm ZW5jZV9iZWZvcmVfcmV0X2tpbmQpOiBOZXcuCisJKGxmZW5jZV9iZWZvcmVfcmV0KTogTmV3Lgor CShsYXN0X2luc24pOiBOZXcuCisJKGxvYWRfaW5zbl9wKTogTmV3LgorCShpbnNlcnRfbGZlbmNl X2FmdGVyKTogTmV3LgorCShpbnNlcnRfbGZlbmNlX2JlZm9yZSk6IE5ldy4KKwkobWRfYXNzZW1i bGUpOiBDYWxsIGluc2VydF9sZmVuY2VfYmVmb3JlIGFuZCBpbnNlcnRfbGZlbmNlX2FmdGVyLgor CVNldCBsYXN0X2luc24uCisJKE9QVElPTl9NTEZFTkNFX0FGVEVSX0xPQUQpOiBOZXcuCisJKE9Q VElPTl9NTEZFTkNFX0JFRk9SRV9JTkRJUkVDVF9CUkFOQ0gpOiBOZXcuCisJKE9QVElPTl9NTEZF TkNFX0JFRk9SRV9SRVQpOiBOZXcuCisJKG1kX2xvbmdvcHRzKTogQWRkIC1tbGZlbmNlLWFmdGVy LWxvYWQ9LAorCS1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2g9IGFuZCAtbWxmZW5jZS1i ZWZvcmUtcmV0PS4KKwkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1tbGZlbmNlLWFmdGVyLWxv YWQ9LAorCS1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2g9IGFuZCAtbWxmZW5jZS1iZWZv cmUtcmV0PS4KKwkobWRfc2hvd191c2FnZSk6IERpc3BsYXkgLW1sZmVuY2UtYWZ0ZXItbG9hZD0s CisJLW1sZmVuY2UtYmVmb3JlLWluZGlyZWN0LWJyYW5jaD0gYW5kIC1tbGZlbmNlLWJlZm9yZS1y ZXQ9LgorCShpMzg2X2NvbnNfYWxpZ24pOiBOZXcuCisJKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2 X2NvbnNfYWxpZ24pOiBOZXcuCisJKG1kX2NvbnNfYWxpZ24pOiBOZXcuCisJKiBkb2MvYy1pMzg2 LnRleGk6IERvY3VtZW50IC1tbGZlbmNlLWFmdGVyLWxvYWQ9LAorCS1tbGZlbmNlLWJlZm9yZS1p bmRpcmVjdC1icmFuY2g9IGFuZCAtbWxmZW5jZS1iZWZvcmUtcmV0PS4KKwogMjAyMC0wMy0xMCAg QWxhbiBNb2RyYSAgPGFtb2RyYUBnbWFpbC5jb20+CiAKIAkqIGNvbmZpZy90Yy1jc2t5LmMgKGdl dF9vcGVyYW5kX3ZhbHVlKTogUmV3cml0ZSAxIDw8IDMxIGV4cHJlc3Npb25zCmRpZmYgLS1naXQg YS9nYXMvY29uZmlnL3RjLWkzODYuYyBiL2dhcy9jb25maWcvdGMtaTM4Ni5jCmluZGV4IGIwMjBm MzljODYuLjA5MDYzZjc4NGIgMTAwNjQ0Ci0tLSBhL2dhcy9jb25maWcvdGMtaTM4Ni5jCisrKyBi L2dhcy9jb25maWcvdGMtaTM4Ni5jCkBAIC02MjksNyArNjI5LDI5IEBAIHN0YXRpYyBpbnQgb21p dF9sb2NrX3ByZWZpeCA9IDA7CiAgICAibG9jayBhZGRsICQwLCAoJXtyZX1zcCkiLiAgKi8KIHN0 YXRpYyBpbnQgYXZvaWRfZmVuY2UgPSAwOwogCi0vKiBUeXBlIG9mIHRoZSBwcmV2aW91cyBpbnN0 cnVjdGlvbi4gICovCisvKiAxIGlmIGxmZW5jZSBzaG91bGQgYmUgaW5zZXJ0ZWQgYWZ0ZXIgZXZl cnkgbG9hZC4gICovCitzdGF0aWMgaW50IGxmZW5jZV9hZnRlcl9sb2FkID0gMDsKKworLyogTm9u LXplcm8gaWYgbGZlbmNlIHNob3VsZCBiZSBpbnNlcnRlZCBiZWZvcmUgaW5kaXJlY3QgYnJhbmNo LiAgKi8KK3N0YXRpYyBlbnVtIGxmZW5jZV9iZWZvcmVfaW5kaXJlY3RfYnJhbmNoX2tpbmQKKyAg eworICAgIGxmZW5jZV9icmFuY2hfbm9uZSA9IDAsCisgICAgbGZlbmNlX2JyYW5jaF9yZWdpc3Rl ciwKKyAgICBsZmVuY2VfYnJhbmNoX21lbW9yeSwKKyAgICBsZmVuY2VfYnJhbmNoX2FsbAorICB9 CitsZmVuY2VfYmVmb3JlX2luZGlyZWN0X2JyYW5jaDsKKworLyogTm9uLXplcm8gaWYgbGZlbmNl IHNob3VsZCBiZSBpbnNlcnRlZCBiZWZvcmUgcmV0LiAgKi8KK3N0YXRpYyBlbnVtIGxmZW5jZV9i ZWZvcmVfcmV0X2tpbmQKKyAgeworICAgIGxmZW5jZV9iZWZvcmVfcmV0X25vbmUgPSAwLAorICAg IGxmZW5jZV9iZWZvcmVfcmV0X25vdCwKKyAgICBsZmVuY2VfYmVmb3JlX3JldF9vcgorICB9Cits ZmVuY2VfYmVmb3JlX3JldDsKKworLyogVHlwZXMgb2YgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMg LmJ5dGUgb3IgcHJlZml4LiAgKi8KIHN0YXRpYyBzdHJ1Y3QKICAgewogICAgIHNlZ1Qgc2VnOwpA QCAtNDMxMSw2ICs0MzMzLDI4MyBAQCBvcHRpbWl6ZV9lbmNvZGluZyAodm9pZCkKICAgICB9CiB9 CiAKKy8qIFJldHVybiBub24temVybyBmb3IgbG9hZCBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRp YyBpbnQKK2xvYWRfaW5zbl9wICh2b2lkKQoreworICB1bnNpZ25lZCBpbnQgZGVzdDsKKyAgaW50 IGFueV92ZXhfcCA9IGlzX2FueV92ZXhfZW5jb2RpbmcgKCZpLnRtKTsKKyAgdW5zaWduZWQgaW50 IGJhc2Vfb3Bjb2RlID0gaS50bS5iYXNlX29wY29kZSB8IDE7CisKKyAgaWYgKCFhbnlfdmV4X3Ap CisgICAgeworICAgICAgLyogbGVhICAqLworICAgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0g MHg4ZCkKKwlyZXR1cm4gMDsKKworICAgICAgLyogcG9wICAqLworICAgICAgaWYgKChpLnRtLmJh c2Vfb3Bjb2RlICYgfjcpID09IDB4NTgKKwkgIHx8IChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4OGYg JiYgaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDApKQorCXJldHVybiAxOworCisgICAgICAvKiBt b3ZzLCBjbXBzLCBsb2RzLCBzY2FzLiAgKi8KKyAgICAgIGlmICgoaS50bS5iYXNlX29wY29kZSB8 IDB4YikgPT0gMHhhZikKKwlyZXR1cm4gMTsKKworICAgICAgLyogb3V0cyAqLworICAgICAgaWYg KGJhc2Vfb3Bjb2RlID09IDB4NmYpCisJcmV0dXJuIDE7CisgICAgfQorCisgIC8qIE5vIG1lbW9y eSBvcGVyYW5kLiAgKi8KKyAgaWYgKCFpLm1lbV9vcGVyYW5kcykKKyAgICByZXR1cm4gMDsKKwor ICBpZiAoYW55X3ZleF9wKQorICAgIHsKKyAgICAgIC8qIHZsZG14Y3NyLiAgKi8KKyAgICAgIGlm IChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4YWUKKwkgICYmIGkudG0ub3Bjb2RlX21vZGlmaWVyLnZl eAorCSAgJiYgaS50bS5vcGNvZGVfbW9kaWZpZXIudmV4b3Bjb2RlID09IFZFWDBGCisJICAmJiBp LnRtLmV4dGVuc2lvbl9vcGNvZGUgPT0gMikKKwlyZXR1cm4gMTsKKyAgICB9CisgIGVsc2UKKyAg ICB7CisgICAgICAvKiB0ZXN0LCBub3QsIG5lZywgbXVsLCBpbXVsLCBkaXYsIGlkaXYuICAqLwor ICAgICAgaWYgKChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZjYgfHwgaS50bS5iYXNlX29wY29kZSA9 PSAweGY3KQorCSAgJiYgaS50bS5leHRlbnNpb25fb3Bjb2RlICE9IDEpCisJcmV0dXJuIDE7CisK KyAgICAgIC8qIGluYywgZGVjLiAgKi8KKyAgICAgIGlmIChiYXNlX29wY29kZSA9PSAweGZmICYm IGkudG0uZXh0ZW5zaW9uX29wY29kZSA8PSAxKQorCXJldHVybiAxOworCisgICAgICAvKiBhZGQs IG9yLCBhZGMsIHNiYiwgYW5kLCBzdWIsIHhvciwgY21wLiAgKi8KKyAgICAgIGlmIChpLnRtLmJh c2Vfb3Bjb2RlID49IDB4ODAgJiYgaS50bS5iYXNlX29wY29kZSA8PSAweDgzKQorCXJldHVybiAx OworCisgICAgICAvKiBidCwgYnRzLCBidHIsIGJ0Yy4gICovCisgICAgICBpZiAoaS50bS5iYXNl X29wY29kZSA9PSAweGZiYQorCSAgJiYgKGkudG0uZXh0ZW5zaW9uX29wY29kZSA+PSA0ICYmIGku dG0uZXh0ZW5zaW9uX29wY29kZSA8PSA3KSkKKwlyZXR1cm4gMTsKKworICAgICAgLyogcm9sLCBy b3IsIHJjbCwgcmNyLCBzaGwvc2FsLCBzaHIsIHNhci4gKi8KKyAgICAgIGlmICgoYmFzZV9vcGNv ZGUgPT0gMHhjMQorCSAgIHx8IChpLnRtLmJhc2Vfb3Bjb2RlID49IDB4ZDAgJiYgaS50bS5iYXNl X29wY29kZSA8PSAweGQzKSkKKwkgICYmIGkudG0uZXh0ZW5zaW9uX29wY29kZSAhPSA2KQorCXJl dHVybiAxOworCisgICAgICAvKiBjbXB4Y2hnOGIsIGNtcHhjaGcxNmIsIHhyc3RvcnMuICAqLwor ICAgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYzcKKwkgICYmIChpLnRtLmV4dGVuc2lv bl9vcGNvZGUgPT0gMSB8fCBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPT0gMykpCisJcmV0dXJuIDE7 CisKKyAgICAgIC8qIGZ4cnN0b3IsIGxkbXhjc3IsIHhyc3Rvci4gICovCisgICAgICBpZiAoaS50 bS5iYXNlX29wY29kZSA9PSAweGZhZQorCSAgJiYgKGkudG0uZXh0ZW5zaW9uX29wY29kZSA9PSAx CisJICAgICAgfHwgaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDIKKwkgICAgICB8fCBpLnRtLmV4 dGVuc2lvbl9vcGNvZGUgPT0gNSkpCisJcmV0dXJuIDE7CisKKyAgICAgIC8qIGxnZHQsIGxpZHQs IGxtc3cuICAqLworICAgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmMDEKKwkgICYmIChp LnRtLmV4dGVuc2lvbl9vcGNvZGUgPT0gMgorCSAgICAgIHx8IGkudG0uZXh0ZW5zaW9uX29wY29k ZSA9PSAzCisJICAgICAgfHwgaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDYpKQorCXJldHVybiAx OworCisgICAgICAvKiB2bXB0cmxkICovCisgICAgICBpZiAoaS50bS5iYXNlX29wY29kZSA9PSAw eGZjNworCSAgJiYgaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDYpCisJcmV0dXJuIDE7CisKKyAg ICAgIC8qIENoZWNrIGZvciB4ODcgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgICAgIGlmIChpLnRtLmJh c2Vfb3Bjb2RlID49IDB4ZDggJiYgaS50bS5iYXNlX29wY29kZSA8PSAweGRmKQorCXsKKwkgIC8q IFNraXAgZnN0LCBmc3RwLCBmc3RlbnYsIGZzdGN3LiAgKi8KKwkgIGlmIChpLnRtLmJhc2Vfb3Bj b2RlID09IDB4ZDkKKwkgICAgICAmJiAoaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDIKKwkJICB8 fCBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPT0gMworCQkgIHx8IGkudG0uZXh0ZW5zaW9uX29wY29k ZSA9PSA2CisJCSAgfHwgaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDcpKQorCSAgICByZXR1cm4g MDsKKworCSAgLyogU2tpcCBmaXN0dHAsIGZpc3QsIGZpc3RwLCBmc3RwLiAgKi8KKwkgIGlmIChp LnRtLmJhc2Vfb3Bjb2RlID09IDB4ZGIKKwkgICAgICAmJiAoaS50bS5leHRlbnNpb25fb3Bjb2Rl ID09IDEKKwkJICB8fCBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPT0gMgorCQkgIHx8IGkudG0uZXh0 ZW5zaW9uX29wY29kZSA9PSAzCisJCSAgfHwgaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDcpKQor CSAgICByZXR1cm4gMDsKKworCSAgLyogU2tpcCBmaXN0dHAsIGZzdCwgZnN0cCwgZnNhdmUsIGZz dHN3LiAgKi8KKwkgIGlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZGQKKwkgICAgICAmJiAoaS50 bS5leHRlbnNpb25fb3Bjb2RlID09IDEKKwkJICB8fCBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPT0g MgorCQkgIHx8IGkudG0uZXh0ZW5zaW9uX29wY29kZSA9PSAzCisJCSAgfHwgaS50bS5leHRlbnNp b25fb3Bjb2RlID09IDYKKwkJICB8fCBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPT0gNykpCisJICAg IHJldHVybiAwOworCisJICAvKiBTa2lwIGZpc3R0cCwgZmlzdCwgZmlzdHAsIGZic3RwLCBmaXN0 cC4gICovCisJICBpZiAoaS50bS5iYXNlX29wY29kZSA9PSAweGRmCisJICAgICAgJiYgKGkudG0u ZXh0ZW5zaW9uX29wY29kZSA9PSAxCisJCSAgfHwgaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDIK KwkJICB8fCBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPT0gMworCQkgIHx8IGkudG0uZXh0ZW5zaW9u X29wY29kZSA9PSA2CisJCSAgfHwgaS50bS5leHRlbnNpb25fb3Bjb2RlID09IDcpKQorCSAgICBy ZXR1cm4gMDsKKworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICBkZXN0ID0gaS5vcGVyYW5k cyAtIDE7CisKKyAgLyogQ2hlY2sgZmFrZSBpbW04IG9wZXJhbmQgYW5kIDMgc291cmNlIG9wZXJh bmRzLiAgKi8KKyAgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllci5pbW1leHQKKyAgICAgICB8fCBp LnRtLm9wY29kZV9tb2RpZmllci52ZXhzb3VyY2VzID09IFZFWDNTT1VSQ0VTKQorICAgICAgJiYg aS50eXBlc1tkZXN0XS5iaXRmaWVsZC5pbW04KQorICAgIGRlc3QtLTsKKworICAvKiBhZGQsIG9y LCBhZGMsIHNiYiwgYW5kLCBzdWIsIHhvciwgY21wLCB0ZXN0LCB4Y2hnLCB4YWRkICAqLworICBp ZiAoIWFueV92ZXhfcAorICAgICAgJiYgKGJhc2Vfb3Bjb2RlID09IDB4MQorCSAgfHwgYmFzZV9v cGNvZGUgPT0gMHg5CisJICB8fCBiYXNlX29wY29kZSA9PSAweDExCisJICB8fCBiYXNlX29wY29k ZSA9PSAweDE5CisJICB8fCBiYXNlX29wY29kZSA9PSAweDIxCisJICB8fCBiYXNlX29wY29kZSA9 PSAweDI5CisJICB8fCBiYXNlX29wY29kZSA9PSAweDMxCisJICB8fCBiYXNlX29wY29kZSA9PSAw eDM5CisJICB8fCAoaS50bS5iYXNlX29wY29kZSA+PSAweDg0ICYmIGkudG0uYmFzZV9vcGNvZGUg PD0gMHg4NykKKwkgIHx8IGJhc2Vfb3Bjb2RlID09IDB4ZmMxKSkKKyAgICByZXR1cm4gMTsKKwor ICAvKiBDaGVjayBmb3IgbG9hZCBpbnN0cnVjdGlvbi4gICovCisgIHJldHVybiAoaS50eXBlc1tk ZXN0XS5iaXRmaWVsZC5jbGFzcyAhPSBDbGFzc05vbmUKKwkgIHx8IGkudHlwZXNbZGVzdF0uYml0 ZmllbGQuaW5zdGFuY2UgPT0gQWNjdW0pOworfQorCisvKiBPdXRwdXQgbGZlbmNlLCAweGZhZWU4 LCBhZnRlciBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitpbnNlcnRfbGZlbmNlX2Fm dGVyICh2b2lkKQoreworICBpZiAobGZlbmNlX2FmdGVyX2xvYWQgJiYgbG9hZF9pbnNuX3AgKCkp CisgICAgeworICAgICAgY2hhciAqcCA9IGZyYWdfbW9yZSAoMyk7CisgICAgICAqcCsrID0gMHhm OworICAgICAgKnArKyA9IDB4YWU7CisgICAgICAqcCA9IDB4ZTg7CisgICAgfQorfQorCisvKiBP dXRwdXQgbGZlbmNlLCAweGZhZWU4LCBiZWZvcmUgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMg dm9pZAoraW5zZXJ0X2xmZW5jZV9iZWZvcmUgKHZvaWQpCit7CisgIGNoYXIgKnA7CisKKyAgaWYg KGlzX2FueV92ZXhfZW5jb2RpbmcgKCZpLnRtKSkKKyAgICByZXR1cm47CisKKyAgaWYgKGkudG0u YmFzZV9vcGNvZGUgPT0gMHhmZgorICAgICAgJiYgKGkudG0uZXh0ZW5zaW9uX29wY29kZSA9PSAy IHx8IGkudG0uZXh0ZW5zaW9uX29wY29kZSA9PSA0KSkKKyAgICB7CisgICAgICAvKiBJbnNlcnQg bGZlbmNlIGJlZm9yZSBpbmRpcmVjdCBicmFuY2ggaWYgbmVlZGVkLiAgKi8KKworICAgICAgaWYg KGxmZW5jZV9iZWZvcmVfaW5kaXJlY3RfYnJhbmNoID09IGxmZW5jZV9icmFuY2hfbm9uZSkKKwly ZXR1cm47CisKKyAgICAgIGlmIChpLm9wZXJhbmRzICE9IDEpCisJYWJvcnQgKCk7CisKKyAgICAg IGlmIChpLnJlZ19vcGVyYW5kcyA9PSAxKQorCXsKKwkgIC8qIEluZGlyZWN0IGJyYW5jaCB2aWEg cmVnaXN0ZXIuICBEb24ndCBpbnNlcnQgbGZlbmNlIHdpdGgKKwkgICAgIC1tbGZlbmNlLWFmdGVy LWxvYWQ9eWVzLiAgKi8KKwkgIGlmIChsZmVuY2VfYWZ0ZXJfbG9hZAorCSAgICAgIHx8IGxmZW5j ZV9iZWZvcmVfaW5kaXJlY3RfYnJhbmNoID09IGxmZW5jZV9icmFuY2hfbWVtb3J5KQorCSAgICBy ZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoaS5tZW1fb3BlcmFuZHMgPT0gMQorCSAgICAgICAm JiBsZmVuY2VfYmVmb3JlX2luZGlyZWN0X2JyYW5jaCAhPSBsZmVuY2VfYnJhbmNoX3JlZ2lzdGVy KQorCXsKKwkgIGFzX3dhcm4gKF8oImluZGlyZWN0IGAlc2Agd2l0aCBtZW1vcnkgb3BlcmFuZCBz aG91bGQgYmUgYXZvaWRlZCIpLAorCQkgICBpLnRtLm5hbWUpOworCSAgcmV0dXJuOworCX0KKyAg ICAgIGVsc2UKKwlyZXR1cm47CisKKyAgICAgIGlmIChsYXN0X2luc24ua2luZCAhPSBsYXN0X2lu c25fb3RoZXIKKwkgICYmIGxhc3RfaW5zbi5zZWcgPT0gbm93X3NlZykKKwl7CisJICBhc193YXJu X3doZXJlIChsYXN0X2luc24uZmlsZSwgbGFzdF9pbnNuLmxpbmUsCisJCQkgXygiYCVzYCBza2lw cyAtbWxmZW5jZS1iZWZvcmUtaW5kaXJlY3QtYnJhbmNoIG9uIGAlc2AiKSwKKwkJCSBsYXN0X2lu c24ubmFtZSwgaS50bS5uYW1lKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIHAgPSBmcmFnX21v cmUgKDMpOworICAgICAgKnArKyA9IDB4ZjsKKyAgICAgICpwKysgPSAweGFlOworICAgICAgKnAg PSAweGU4OworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBPdXRwdXQgb3Ivbm90IGFuZCBs ZmVuY2UgYmVmb3JlIHJldC4gICovCisgIGlmIChsZmVuY2VfYmVmb3JlX3JldCAhPSBsZmVuY2Vf YmVmb3JlX3JldF9ub25lCisgICAgICAmJiAoaS50bS5iYXNlX29wY29kZSA9PSAweGMyCisJICB8 fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4YzMKKwkgIHx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhj YQorCSAgfHwgaS50bS5iYXNlX29wY29kZSA9PSAweGNiKSkKKyAgICB7CisgICAgICBpZiAobGFz dF9pbnNuLmtpbmQgIT0gbGFzdF9pbnNuX290aGVyCisJICAmJiBsYXN0X2luc24uc2VnID09IG5v d19zZWcpCisJeworCSAgYXNfd2Fybl93aGVyZSAobGFzdF9pbnNuLmZpbGUsIGxhc3RfaW5zbi5s aW5lLAorCQkJIF8oImAlc2Agc2tpcHMgLW1sZmVuY2UtYmVmb3JlLXJldCBvbiBgJXNgIiksCisJ CQkgbGFzdF9pbnNuLm5hbWUsIGkudG0ubmFtZSk7CisJICByZXR1cm47CisJfQorICAgICAgaWYg KGxmZW5jZV9iZWZvcmVfcmV0ID09IGxmZW5jZV9iZWZvcmVfcmV0X29yKQorCXsKKwkgIC8qIG9y bDogMHg4MzBjMjQwMC4gICovCisJICBwID0gZnJhZ19tb3JlICgoZmxhZ19jb2RlID09IENPREVf NjRCSVQgPyAxIDogMCkgKyA0ICsgMyk7CisJICBpZiAoZmxhZ19jb2RlID09IENPREVfNjRCSVQp CisJICAgICpwKysgPSAweDQ4OworCSAgKnArKyA9IDB4ODM7CisJICAqcCsrID0gMHhjOworCSAg KnArKyA9IDB4MjQ7CisJICAqcCsrID0gMHgwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwID0g ZnJhZ19tb3JlICgoZmxhZ19jb2RlID09IENPREVfNjRCSVQgPyAyIDogMCkgKyA2ICsgMyk7CisJ ICAvKiBub3RsOiAweGY3MTQyNC4gICovCisJICBpZiAoZmxhZ19jb2RlID09IENPREVfNjRCSVQp CisJICAgICpwKysgPSAweDQ4OworCSAgKnArKyA9IDB4Zjc7CisJICAqcCsrID0gMHgxNDsKKwkg ICpwKysgPSAweDI0OworCSAgLyogbm90bDogMHhmNzE0MjQuICAqLworCSAgaWYgKGZsYWdfY29k ZSA9PSBDT0RFXzY0QklUKQorCSAgICAqcCsrID0gMHg0ODsKKwkgICpwKysgPSAweGY3OworCSAg KnArKyA9IDB4MTQ7CisJICAqcCsrID0gMHgyNDsKKwl9CisgICAgICAqcCsrID0gMHhmOworICAg ICAgKnArKyA9IDB4YWU7CisgICAgICAqcCA9IDB4ZTg7CisgICAgfQorfQorCiAvKiBUaGlzIGlz IHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBMSU5FIHBvaW50 cyB0byBhCiAgICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24g aXMgc3VwcG9zZWQgdG8gZW1pdAogICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4g ICovCkBAIC00NjI4LDkgKzQ5MjcsMTMgQEAgbWRfYXNzZW1ibGUgKGNoYXIgKmxpbmUpCiAgIGlm IChpLnJleCAhPSAwKQogICAgIGFkZF9wcmVmaXggKFJFWF9PUENPREUgfCBpLnJleCk7CiAKKyAg aW5zZXJ0X2xmZW5jZV9iZWZvcmUgKCk7CisKICAgLyogV2UgYXJlIHJlYWR5IHRvIG91dHB1dCB0 aGUgaW5zbi4gICovCiAgIG91dHB1dF9pbnNuICgpOwogCisgIGluc2VydF9sZmVuY2VfYWZ0ZXIg KCk7CisKICAgbGFzdF9pbnNuLnNlZyA9IG5vd19zZWc7CiAKICAgaWYgKGkudG0ub3Bjb2RlX21v ZGlmaWVyLmlzcHJlZml4KQpAQCAtMTIyNTAsNiArMTI1NTMsOSBAQCBjb25zdCBjaGFyICptZF9z aG9ydG9wdHMgPSAicW5POjoiOwogI2RlZmluZSBPUFRJT05fTUFMSUdOX0JSQU5DSF9QUkVGSVhf U0laRSAoT1BUSU9OX01EX0JBU0UgKyAyOCkKICNkZWZpbmUgT1BUSU9OX01BTElHTl9CUkFOQ0gg KE9QVElPTl9NRF9CQVNFICsgMjkpCiAjZGVmaW5lIE9QVElPTl9NQlJBTkNIRVNfV0lUSF8zMkJf Qk9VTkRBUklFUyAoT1BUSU9OX01EX0JBU0UgKyAzMCkKKyNkZWZpbmUgT1BUSU9OX01MRkVOQ0Vf QUZURVJfTE9BRCAoT1BUSU9OX01EX0JBU0UgKyAzMSkKKyNkZWZpbmUgT1BUSU9OX01MRkVOQ0Vf QkVGT1JFX0lORElSRUNUX0JSQU5DSCAoT1BUSU9OX01EX0JBU0UgKyAzMikKKyNkZWZpbmUgT1BU SU9OX01MRkVOQ0VfQkVGT1JFX1JFVCAoT1BUSU9OX01EX0JBU0UgKyAzMykKIAogc3RydWN0IG9w dGlvbiBtZF9sb25nb3B0c1tdID0KIHsKQEAgLTEyMjg5LDYgKzEyNTk1LDEwIEBAIHN0cnVjdCBv cHRpb24gbWRfbG9uZ29wdHNbXSA9CiAgIHsibWFsaWduLWJyYW5jaC1wcmVmaXgtc2l6ZSIsIHJl cXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFMSUdOX0JSQU5DSF9QUkVGSVhfU0laRX0s CiAgIHsibWFsaWduLWJyYW5jaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFM SUdOX0JSQU5DSH0sCiAgIHsibWJyYW5jaGVzLXdpdGhpbi0zMkItYm91bmRhcmllcyIsIG5vX2Fy Z3VtZW50LCBOVUxMLCBPUFRJT05fTUJSQU5DSEVTX1dJVEhfMzJCX0JPVU5EQVJJRVN9LAorICB7 Im1sZmVuY2UtYWZ0ZXItbG9hZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUxG RU5DRV9BRlRFUl9MT0FEfSwKKyAgeyJtbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2giLCBy ZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwKKyAgIE9QVElPTl9NTEZFTkNFX0JFRk9SRV9JTkRJUkVD VF9CUkFOQ0h9LAorICB7Im1sZmVuY2UtYmVmb3JlLXJldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBO VUxMLCBPUFRJT05fTUxGRU5DRV9CRUZPUkVfUkVUfSwKICAgeyJtYW1kNjQiLCBub19hcmd1bWVu dCwgTlVMTCwgT1BUSU9OX01BTUQ2NH0sCiAgIHsibWludGVsNjQiLCBub19hcmd1bWVudCwgTlVM TCwgT1BUSU9OX01JTlRFTDY0fSwKICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQpAQCAt MTI2NjgsNiArMTI5NzgsNDEgQEAgbWRfcGFyc2Vfb3B0aW9uIChpbnQgYywgY29uc3QgY2hhciAq YXJnKQogICAgICAgICBhc19mYXRhbCAoXygiaW52YWxpZCAtbWZlbmNlLWFzLWxvY2stYWRkPSBv cHRpb246IGAlcyciKSwgYXJnKTsKICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBPUFRJT05fTUxG RU5DRV9BRlRFUl9MT0FEOgorICAgICAgaWYgKHN0cmNhc2VjbXAgKGFyZywgInllcyIpID09IDAp CisJbGZlbmNlX2FmdGVyX2xvYWQgPSAxOworICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoYXJn LCAibm8iKSA9PSAwKQorCWxmZW5jZV9hZnRlcl9sb2FkID0gMDsKKyAgICAgIGVsc2UKKyAgICAg ICAgYXNfZmF0YWwgKF8oImludmFsaWQgLW1sZmVuY2UtYWZ0ZXItbG9hZD0gb3B0aW9uOiBgJXMn IiksIGFyZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX01MRkVOQ0VfQkVGT1JF X0lORElSRUNUX0JSQU5DSDoKKyAgICAgIGlmIChzdHJjYXNlY21wIChhcmcsICJhbGwiKSA9PSAw KQorCWxmZW5jZV9iZWZvcmVfaW5kaXJlY3RfYnJhbmNoID0gbGZlbmNlX2JyYW5jaF9hbGw7Cisg ICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJtZW1vcnkiKSA9PSAwKQorCWxmZW5jZV9i ZWZvcmVfaW5kaXJlY3RfYnJhbmNoID0gbGZlbmNlX2JyYW5jaF9tZW1vcnk7CisgICAgICBlbHNl IGlmIChzdHJjYXNlY21wIChhcmcsICJyZWdpc3RlciIpID09IDApCisJbGZlbmNlX2JlZm9yZV9p bmRpcmVjdF9icmFuY2ggPSBsZmVuY2VfYnJhbmNoX3JlZ2lzdGVyOworICAgICAgZWxzZSBpZiAo c3RyY2FzZWNtcCAoYXJnLCAibm9uZSIpID09IDApCisJbGZlbmNlX2JlZm9yZV9pbmRpcmVjdF9i cmFuY2ggPSBsZmVuY2VfYnJhbmNoX25vbmU7CisgICAgICBlbHNlCisgICAgICAgIGFzX2ZhdGFs IChfKCJpbnZhbGlkIC1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2g9IG9wdGlvbjogYCVz JyIpLAorCQkgIGFyZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX01MRkVOQ0Vf QkVGT1JFX1JFVDoKKyAgICAgIGlmIChzdHJjYXNlY21wIChhcmcsICJvciIpID09IDApCisJbGZl bmNlX2JlZm9yZV9yZXQgPSBsZmVuY2VfYmVmb3JlX3JldF9vcjsKKyAgICAgIGVsc2UgaWYgKHN0 cmNhc2VjbXAgKGFyZywgIm5vdCIpID09IDApCisJbGZlbmNlX2JlZm9yZV9yZXQgPSBsZmVuY2Vf YmVmb3JlX3JldF9ub3Q7CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJub25lIikg PT0gMCkKKwlsZmVuY2VfYmVmb3JlX3JldCA9IGxmZW5jZV9iZWZvcmVfcmV0X25vbmU7CisgICAg ICBlbHNlCisgICAgICAgIGFzX2ZhdGFsIChfKCJpbnZhbGlkIC1tbGZlbmNlLWJlZm9yZS1yZXQ9 IG9wdGlvbjogYCVzJyIpLAorCQkgIGFyZyk7CisgICAgICBicmVhazsKKwogICAgIGNhc2UgT1BU SU9OX01SRUxBWF9SRUxPQ0FUSU9OUzoKICAgICAgIGlmIChzdHJjYXNlY21wIChhcmcsICJ5ZXMi KSA9PSAwKQogICAgICAgICBnZW5lcmF0ZV9yZWxheF9yZWxvY2F0aW9ucyA9IDE7CkBAIC0xMzAy NSw2ICsxMzM3MCwxNSBAQCBtZF9zaG93X3VzYWdlIChGSUxFICpzdHJlYW0pCiAgIC1tYnJhbmNo ZXMtd2l0aGluLTMyQi1ib3VuZGFyaWVzXG5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFs aWduIGJyYW5jaGVzIHdpdGhpbiAzMiBieXRlIGJvdW5kYXJ5XG4iKSk7CiAgIGZwcmludGYgKHN0 cmVhbSwgXygiXAorICAtbWxmZW5jZS1hZnRlci1sb2FkPVtub3x5ZXNdIChkZWZhdWx0OiBubylc blwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgbGZlbmNlIGFmdGVyIGxvYWRc biIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCisgIC1tbGZlbmNlLWJlZm9yZS1pbmRpcmVj dC1icmFuY2g9W25vbmV8YWxsfHJlZ2lzdGVyfG1lbW9yeV0gKGRlZmF1bHQ6IG5vbmUpXG5cCisg ICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGxmZW5jZSBiZWZvcmUgaW5kaXJlY3Qg bmVhciBicmFuY2hcbiIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCisgIC1tbGZlbmNlLWJl Zm9yZS1yZXQ9W25vbmV8b3J8bm90XSAoZGVmYXVsdDogbm9uZSlcblwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgZ2VuZXJhdGUgbGZlbmNlIGJlZm9yZSByZXRcbiIpKTsKKyAgZnByaW50ZiAo c3RyZWFtLCBfKCJcCiAgIC1tYW1kNjQgICAgICAgICAgICAgICAgIGFjY2VwdCBvbmx5IEFNRDY0 IElTQSBbZGVmYXVsdF1cbiIpKTsKICAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCiAgIC1taW50ZWw2 NCAgICAgICAgICAgICAgIGFjY2VwdCBvbmx5IEludGVsNjQgSVNBXG4iKSk7CkBAIC0xMzI1NCw2 ICsxMzYwOCwxNiBAQCBpMzg2X2NvbnNfYWxpZ24gKGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNF RCkKICAgICAgIGxhc3RfaW5zbi5raW5kID0gbGFzdF9pbnNuX2RpcmVjdGl2ZTsKICAgICAgIGxh c3RfaW5zbi5uYW1lID0gImNvbnN0YW50IGRpcmVjdGl2ZSI7CiAgICAgICBsYXN0X2luc24uZmls ZSA9IGFzX3doZXJlICgmbGFzdF9pbnNuLmxpbmUpOworICAgICAgaWYgKGxmZW5jZV9iZWZvcmVf cmV0ICE9IGxmZW5jZV9iZWZvcmVfcmV0X25vbmUpCisJeworCSAgaWYgKGxmZW5jZV9iZWZvcmVf aW5kaXJlY3RfYnJhbmNoICE9IGxmZW5jZV9icmFuY2hfbm9uZSkKKwkgICAgYXNfd2FybiAoXygi Y29uc3RhbnQgZGlyZWN0aXZlIHNraXBzIC1tbGZlbmNlLWJlZm9yZS1yZXQgIgorCQkgICAgICAg ImFuZCAtbWxmZW5jZS1iZWZvcmUtaW5kaXJlY3QtYnJhbmNoIikpOworCSAgZWxzZQorCSAgICBh c193YXJuIChfKCJjb25zdGFudCBkaXJlY3RpdmUgc2tpcHMgLW1sZmVuY2UtYmVmb3JlLXJldCIp KTsKKwl9CisgICAgICBlbHNlIGlmIChsZmVuY2VfYmVmb3JlX2luZGlyZWN0X2JyYW5jaCAhPSBs ZmVuY2VfYnJhbmNoX25vbmUpCisJYXNfd2FybiAoXygiY29uc3RhbnQgZGlyZWN0aXZlIHNraXBz IC1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2giKSk7CiAgICAgfQogfQogCmRpZmYgLS1n aXQgYS9nYXMvZG9jL2MtaTM4Ni50ZXhpIGIvZ2FzL2RvYy9jLWkzODYudGV4aQppbmRleCBjNTM2 NzU5Y2IzLi4xZGQ5OWY5MWJiIDEwMDY0NAotLS0gYS9nYXMvZG9jL2MtaTM4Ni50ZXhpCisrKyBi L2dhcy9kb2MvYy1pMzg2LnRleGkKQEAgLTQ2NCw2ICs0NjQsNDkgQEAgb24gYW4gaW5zdHJ1Y3Rp b24uICBJdCBpcyBlcXVpdmFsZW50IHRvCiBAb3B0aW9uey1tYWxpZ24tYnJhbmNoLXByZWZpeC1z aXplPTV9LgogVGhlIGRlZmF1bHQgZG9lc24ndCBhbGlnbiBicmFuY2hlcy4KIAorQGNpbmRleCBA c2FtcHstbWxmZW5jZS1hZnRlci1sb2FkPX0gb3B0aW9uLCBpMzg2CitAY2luZGV4IEBzYW1wey1t bGZlbmNlLWFmdGVyLWxvYWQ9fSBvcHRpb24sIHg4Ni02NAorQGl0ZW0gLW1sZmVuY2UtYWZ0ZXIt bG9hZD1AdmFye25vfQorQGl0ZW14IC1tbGZlbmNlLWFmdGVyLWxvYWQ9QHZhcnt5ZXN9CitUaGVz ZSBvcHRpb25zIGNvbnRyb2wgd2hldGhlciB0aGUgYXNzZW1ibGVyIHNob3VsZCBnZW5lcmF0ZSBs ZmVuY2UKK2FmdGVyIGxvYWQgaW5zdHJ1Y3Rpb25zLiAgQG9wdGlvbnstbWxmZW5jZS1hZnRlci1s b2FkPUB2YXJ7eWVzfX0gd2lsbAorZ2VuZXJhdGUgbGZlbmNlLiAgQG9wdGlvbnstbWxmZW5jZS1h ZnRlci1sb2FkPUB2YXJ7bm99fSB3aWxsIG5vdCBnZW5lcmF0ZQorbGZlbmNlLCB3aGljaCBpcyB0 aGUgZGVmYXVsdC4KKworQGNpbmRleCBAc2FtcHstbWxmZW5jZS1iZWZvcmUtaW5kaXJlY3QtYnJh bmNoPX0gb3B0aW9uLCBpMzg2CitAY2luZGV4IEBzYW1wey1tbGZlbmNlLWJlZm9yZS1pbmRpcmVj dC1icmFuY2g9fSBvcHRpb24sIHg4Ni02NAorQGl0ZW0gLW1sZmVuY2UtYmVmb3JlLWluZGlyZWN0 LWJyYW5jaD1AdmFye25vbmV9CitAaXRlbSAtbWxmZW5jZS1iZWZvcmUtaW5kaXJlY3QtYnJhbmNo PUB2YXJ7YWxsfQorQGl0ZW0gLW1sZmVuY2UtYmVmb3JlLWluZGlyZWN0LWJyYW5jaD1AdmFye3Jl Z2lzdGVyfQorQGl0ZW14IC1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2g9QHZhcnttZW1v cnl9CitUaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hldGhlciB0aGUgYXNzZW1ibGVyIHNob3VsZCBn ZW5lcmF0ZSBsZmVuY2UKK2FmdGVyIGluZGlyZWN0IG5lYXIgYnJhbmNoIGluc3RydWN0aW9ucy4K K0BvcHRpb257LW1sZmVuY2UtYmVmb3JlLWluZGlyZWN0LWJyYW5jaD1AdmFye2FsbH19IHdpbGwg Z2VuZXJhdGUgbGZlbmNlCithZnRlciBpbmRpcmVjdCBuZWFyIGJyYW5jaCB2aWEgcmVnaXN0ZXIg YW5kIGlzc3VlIGEgd2FybmluZyBiZWZvcmUKK2luZGlyZWN0IG5lYXIgYnJhbmNoIHZpYSBtZW1v cnkuCitAb3B0aW9uey1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2g9QHZhcntyZWdpc3Rl cn19IHdpbGwgZ2VuZXJhdGUKK2xmZW5jZSBhZnRlciBpbmRpcmVjdCBuZWFyIGJyYW5jaCB2aWEg cmVnaXN0ZXIuCitAb3B0aW9uey1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2g9QHZhcntt ZW1vcnl9fSB3aWxsIGlzc3VlIGEKK3dhcm5pbmcgYmVmb3JlIGluZGlyZWN0IG5lYXIgYnJhbmNo IHZpYSBtZW1vcnkuCitAb3B0aW9uey1tbGZlbmNlLWJlZm9yZS1pbmRpcmVjdC1icmFuY2g9QHZh cntub25lfX0gd2lsbCBub3QgZ2VuZXJhdGUKK2xmZW5jZSBub3IgaXNzdWUgd2FybmluZywgd2hp Y2ggaXMgdGhlIGRlZmF1bHQuICBOb3RlIHRoYXQgbGZlbmNlIHdvbid0CitiZSBnZW5lcmF0ZWQg YmVmb3JlIGluZGlyZWN0IG5lYXIgYnJhbmNoIHZpYSByZWdpc3RlciB3aXRoCitAb3B0aW9uey1t bGZlbmNlLWFmdGVyLWxvYWQ9QHZhcnt5ZXN9fSBzaW5jZSBsZmVuY2Ugd2lsbCBiZSBnZW5lcmF0 ZWQKK2FmdGVyIGxvYWRpbmcgYnJhbmNoIHRhcmdldCByZWdpc3Rlci4KKworQGNpbmRleCBAc2Ft cHstbWxmZW5jZS1iZWZvcmUtcmV0PX0gb3B0aW9uLCBpMzg2CitAY2luZGV4IEBzYW1wey1tbGZl bmNlLWJlZm9yZS1yZXQ9fSBvcHRpb24sIHg4Ni02NAorQGl0ZW0gLW1sZmVuY2UtYmVmb3JlLXJl dD1AdmFye25vbmV9CitAaXRlbSAtbWxmZW5jZS1iZWZvcmUtcmV0PUB2YXJ7b3J9CitAaXRlbXgg LW1sZmVuY2UtYmVmb3JlLXJldD1AdmFye25vdH0KK1RoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0 aGVyIHRoZSBhc3NlbWJsZXIgc2hvdWxkIGdlbmVyYXRlIGxmZW5jZQorYmVmb3JlIHJldC4gIEBv cHRpb257LW1sZmVuY2UtYmVmb3JlLXJldD1AdmFye29yfX0gd2lsbCBnZW5lcmF0ZQorZ2VuZXJh dGUgb3IgaW5zdHJ1Y3Rpb24gd2l0aCBsZmVuY2UuCitAb3B0aW9uey1tbGZlbmNlLWJlZm9yZS1y ZXQ9QHZhcntub3R9fSB3aWxsIGdlbmVyYXRlIG5vdCBpbnN0cnVjdGlvbgord2l0aCBsZmVuY2Uu CitAb3B0aW9uey1tbGZlbmNlLWJlZm9yZS1yZXQ9QHZhcntub25lfX0gd2lsbCBub3QgZ2VuZXJh dGUgbGZlbmNlLAord2hpY2ggaXMgdGhlIGRlZmF1bHQuCisKIEBjaW5kZXggQHNhbXB7LW14ODYt dXNlZC1ub3RlPX0gb3B0aW9uLCBpMzg2CiBAY2luZGV4IEBzYW1wey1teDg2LXVzZWQtbm90ZT19 IG9wdGlvbiwgeDg2LTY0CiBAaXRlbSAtbXg4Ni11c2VkLW5vdGU9QHZhcntub30KLS0gCjIuMjQu MQoK --000000000000246c3805a0969330--