From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56626) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X9IlK-0002gO-P5 for qemu-devel@nongnu.org; Mon, 21 Jul 2014 14:57:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X9Iku-0003mh-Vl for qemu-devel@nongnu.org; Mon, 21 Jul 2014 14:56:38 -0400 Received: from mail-la0-x236.google.com ([2a00:1450:4010:c03::236]:64116) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X9Ikt-0003mY-6r for qemu-devel@nongnu.org; Mon, 21 Jul 2014 14:56:12 -0400 Received: by mail-la0-f54.google.com with SMTP id el20so5170136lab.13 for ; Mon, 21 Jul 2014 11:56:09 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <53A72699.7080006@twiddle.net> From: =?UTF-8?B?SmF1bWUgTWFydMOt?= Date: Mon, 21 Jul 2014 20:55:48 +0200 Message-ID: Content-Type: multipart/alternative; boundary=089e013d161ef69dc704feb8a8ff Subject: Re: [Qemu-devel] PATCH for bugs 661696 and 1248376: target-i386: x87 exception pointers using TCG. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Richard Henderson Cc: Peter Maydell , mtosatti@redhat.com, gleb@redhat.com, mst , "riku.voipio" , qemu-devel@nongnu.org, quintela@redhat.com, vrozenfe@redhat.com, anthony , pbonzini@redhat.com, "alex.bennee" , afaerber@suse.de --089e013d161ef69dc704feb8a8ff Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hello, The patch in my previous email got corrupted due to gmail's limitation of 78 characters per line when sending plain text emails. I attach a new patch. Also you can pull the code from https://github.com/jmartif/qemu.git Please review and apply. Best regards, Jaume Signed-off-by: Jaume Marti Farriol (jaume.martif@gmail.com) diff --git a/linux-user/signal.c b/linux-user/signal.c index 1141054..73f8f6b 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -865,7 +865,7 @@ static void setup_sigcontext(struct target_sigcontext *sc, __put_user(env->regs[R_ESP], &sc->esp_at_signal); __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss); - cpu_x86_fsave(env, fpstate_addr, 1); + cpu_x86_fsave(env, fpstate_addr); fpstate->status =3D fpstate->sw; magic =3D 0xffff; __put_user(magic, &fpstate->magic); @@ -1068,7 +1068,7 @@ restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax) if (!access_ok(VERIFY_READ, fpstate_addr, sizeof(struct target_fpstate))) goto badframe; - cpu_x86_frstor(env, fpstate_addr, 1); + cpu_x86_frstor(env, fpstate_addr); } *peax =3D tswapl(sc->eax); diff --git a/target-i386/cpu.h b/target-i386/cpu.h index e634d83..4274ce3 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -819,10 +819,11 @@ typedef struct CPUX86State { uint16_t fpuc; uint8_t fptags[8]; /* 0 =3D valid, 1 =3D empty */ FPReg fpregs[8]; - /* KVM-only so far */ - uint16_t fpop; + uint32_t fpop; uint64_t fpip; uint64_t fpdp; + uint32_t fpcs; + uint32_t fpds; /* emulator internal variables */ float_status fp_status; @@ -1067,8 +1068,8 @@ floatx80 cpu_set_fp80(uint64_t mant, uint16_t upper); /* the following helpers are only usable in user mode simulation as they can trigger unexpected exceptions */ void cpu_x86_load_seg(CPUX86State *s, int seg_reg, int selector); -void cpu_x86_fsave(CPUX86State *s, target_ulong ptr, int data32); -void cpu_x86_frstor(CPUX86State *s, target_ulong ptr, int data32); +void cpu_x86_fsave(CPUX86State *s, target_ulong ptr); +void cpu_x86_frstor(CPUX86State *s, target_ulong ptr); /* you can call this signal handler from your SIGBUS and SIGSEGV signal handlers to inform the virtual CPU of exceptions. non zero diff --git a/target-i386/fpu_helper.c b/target-i386/fpu_helper.c index 1b2900d..6886031 100644 --- a/target-i386/fpu_helper.c +++ b/target-i386/fpu_helper.c @@ -56,6 +56,8 @@ #define floatx80_l2e make_floatx80(0x3fff, 0xb8aa3b295c17f0bcLL) #define floatx80_l2t make_floatx80(0x4000, 0xd49a784bcd1b8afeLL) +#define FPUS(env) ((env->fpus & ~0x3800) | ((env->fpstt & 0x7) << 11)) + static inline void fpush(CPUX86State *env) { env->fpstt =3D (env->fpstt - 1) & 7; @@ -604,6 +606,10 @@ void helper_fninit(CPUX86State *env) env->fptags[5] =3D 1; env->fptags[6] =3D 1; env->fptags[7] =3D 1; + env->fpip =3D 0; + env->fpcs =3D 0; + env->fpdp =3D 0; + env->fpds =3D 0; } /* BCD ops */ @@ -961,13 +967,13 @@ void helper_fxam_ST0(CPUX86State *env) } } -void helper_fstenv(CPUX86State *env, target_ulong ptr, int data32) +void helper_fstenv(CPUX86State *env, target_ulong ptr, int data32, + int protected_mode) { - int fpus, fptag, exp, i; + int fptag, exp, i; uint64_t mant; CPU_LDoubleU tmp; - fpus =3D (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; fptag =3D 0; for (i =3D 7; i >=3D 0; i--) { fptag <<=3D 2; @@ -987,83 +993,150 @@ void helper_fstenv(CPUX86State *env, target_ulong ptr, int data32) } } } + if (data32) { /* 32 bit */ - cpu_stl_data(env, ptr, env->fpuc); - cpu_stl_data(env, ptr + 4, fpus); - cpu_stl_data(env, ptr + 8, fptag); - cpu_stl_data(env, ptr + 12, 0); /* fpip */ - cpu_stl_data(env, ptr + 16, 0); /* fpcs */ - cpu_stl_data(env, ptr + 20, 0); /* fpoo */ - cpu_stl_data(env, ptr + 24, 0); /* fpos */ + cpu_stw_data(env, ptr, env->fpuc); + cpu_stw_data(env, ptr + 4, FPUS(env)); + cpu_stw_data(env, ptr + 8, fptag); + if (protected_mode) { + cpu_stl_data(env, ptr + 12, env->fpip); + cpu_stl_data(env, ptr + 16, + ((env->fpop & 0x7ff) << 16) | (env->fpcs & 0xffff)); + cpu_stl_data(env, ptr + 20, env->fpdp); + cpu_stl_data(env, ptr + 24, env->fpds); + } else { + /* Real mode */ + cpu_stl_data(env, ptr + 12, env->fpip); /* fpip[15..00] */ + cpu_stl_data(env, ptr + 16, ((((env->fpip >> 16) & 0xffff) << 12) | + (env->fpop & 0x7ff))); /* fpip[31..16], fpop */ + cpu_stl_data(env, ptr + 20, env->fpdp); /* fpdp[15..00] */ + cpu_stl_data(env, ptr + 24, + (env->fpdp >> 4) & 0xffff000); /* fpdp[31..16] */ + } } else { /* 16 bit */ cpu_stw_data(env, ptr, env->fpuc); - cpu_stw_data(env, ptr + 2, fpus); + cpu_stw_data(env, ptr + 2, FPUS(env)); cpu_stw_data(env, ptr + 4, fptag); - cpu_stw_data(env, ptr + 6, 0); - cpu_stw_data(env, ptr + 8, 0); - cpu_stw_data(env, ptr + 10, 0); - cpu_stw_data(env, ptr + 12, 0); + if (protected_mode) { + cpu_stw_data(env, ptr + 6, env->fpip); + cpu_stw_data(env, ptr + 8, env->fpcs); + cpu_stw_data(env, ptr + 10, env->fpdp); + cpu_stw_data(env, ptr + 12, env->fpds); + } else { + /* Real mode */ + cpu_stw_data(env, ptr + 6, env->fpip); /* fpip[15..0] */ + cpu_stw_data(env, ptr + 8, ((env->fpip >> 4) & 0xf000) | + (env->fpop & 0x7ff)); /* fpip[19..16], fpop */ + cpu_stw_data(env, ptr + 10, env->fpdp); /* fpdp[15..0] */ + cpu_stw_data(env, ptr + 12, + (env->fpdp >> 4) & 0xf000); /* fpdp[19..16] */ + } } + + env->fpip =3D 0; + env->fpcs =3D 0; + env->fpdp =3D 0; + env->fpds =3D 0; } -void helper_fldenv(CPUX86State *env, target_ulong ptr, int data32) +void helper_fldenv(CPUX86State *env, target_ulong ptr, int data32, + int protected_mode) { - int i, fpus, fptag; + int tmp, i, fpus, fptag; if (data32) { + /* 32 bit */ env->fpuc =3D cpu_lduw_data(env, ptr); fpus =3D cpu_lduw_data(env, ptr + 4); fptag =3D cpu_lduw_data(env, ptr + 8); + if (protected_mode) { + env->fpip =3D cpu_ldl_data(env, ptr + 12); + tmp =3D cpu_ldl_data(env, ptr + 16); + env->fpcs =3D tmp & 0xffff; + env->fpop =3D tmp >> 16; + env->fpdp =3D cpu_ldl_data(env, ptr + 20); + env->fpds =3D cpu_lduw_data(env, ptr + 24); + } else { + /* Real mode */ + tmp =3D cpu_ldl_data(env, ptr + 16); + env->fpip =3D ((tmp & 0xffff000) << 4) | + cpu_lduw_data(env, ptr + 12); + env->fpop =3D tmp & 0x7ff; + env->fpdp =3D (cpu_ldl_data(env, ptr + 24) << 4) | + cpu_lduw_data(env, ptr + 20); + } } else { + /* 16 bit */ env->fpuc =3D cpu_lduw_data(env, ptr); fpus =3D cpu_lduw_data(env, ptr + 2); fptag =3D cpu_lduw_data(env, ptr + 4); + if (protected_mode) { + /* Protected mode */ + env->fpip =3D cpu_lduw_data(env, ptr + 6); + env->fpcs =3D cpu_lduw_data(env, ptr + 8); + env->fpdp =3D cpu_lduw_data(env, ptr + 10); + env->fpds =3D cpu_lduw_data(env, ptr + 12); + } else { + /* Real mode */ + tmp =3D cpu_lduw_data(env, ptr + 8); + env->fpip =3D ((tmp & 0xf000) << 4) | cpu_lduw_data(env, ptr + 6); + env->fpop =3D tmp & 0x7ff; + env->fpdp =3D cpu_lduw_data(env, ptr + 12) << 4 | + cpu_lduw_data(env, ptr + 10); + } } + env->fpstt =3D (fpus >> 11) & 7; env->fpus =3D fpus & ~0x3800; for (i =3D 0; i < 8; i++) { env->fptags[i] =3D ((fptag & 3) =3D=3D 3); fptag >>=3D 2; } + + env->fpip &=3D 0xffffffff; + env->fpdp &=3D 0xffffffff; + if (!protected_mode) { + env->fpcs =3D 0; + env->fpds =3D 0; + } } -void helper_fsave(CPUX86State *env, target_ulong ptr, int data32) +void helper_fsave(CPUX86State *env, target_ulong ptr, int data32, + int protected_mode) { floatx80 tmp; int i; - helper_fstenv(env, ptr, data32); + helper_fstenv(env, ptr, data32, protected_mode); - ptr +=3D (14 << data32); + if (data32) { + ptr +=3D 28; + } else { + ptr +=3D 14; + } for (i =3D 0; i < 8; i++) { tmp =3D ST(i); helper_fstt(env, tmp, ptr); ptr +=3D 10; } - /* fninit */ - env->fpus =3D 0; - env->fpstt =3D 0; - env->fpuc =3D 0x37f; - env->fptags[0] =3D 1; - env->fptags[1] =3D 1; - env->fptags[2] =3D 1; - env->fptags[3] =3D 1; - env->fptags[4] =3D 1; - env->fptags[5] =3D 1; - env->fptags[6] =3D 1; - env->fptags[7] =3D 1; + helper_fninit(env); } -void helper_frstor(CPUX86State *env, target_ulong ptr, int data32) +void helper_frstor(CPUX86State *env, target_ulong ptr, int data32, + int protected_mode) { floatx80 tmp; int i; - helper_fldenv(env, ptr, data32); - ptr +=3D (14 << data32); + helper_fldenv(env, ptr, data32, protected_mode); + if (data32) { + ptr +=3D 28; + } else { + ptr +=3D 14; + } for (i =3D 0; i < 8; i++) { tmp =3D helper_fldt(env, ptr); @@ -1072,21 +1145,22 @@ void helper_frstor(CPUX86State *env, target_ulong ptr, int data32) } } -#if defined(CONFIG_USER_ONLY) -void cpu_x86_fsave(CPUX86State *env, target_ulong ptr, int data32) +#if defined(CONFIG_USER_ONLY) && defined(TARGET_I386) && TARGET_ABI_BITS =3D=3D 32 + +void cpu_x86_fsave(CPUX86State *env, target_ulong ptr) { - helper_fsave(env, ptr, data32); + helper_fsave(env, ptr, 1, 1); } -void cpu_x86_frstor(CPUX86State *env, target_ulong ptr, int data32) +void cpu_x86_frstor(CPUX86State *env, target_ulong ptr) { - helper_frstor(env, ptr, data32); + helper_frstor(env, ptr, 1, 1); } #endif -void helper_fxsave(CPUX86State *env, target_ulong ptr, int data64) +void helper_fxsave(CPUX86State *env, target_ulong ptr, int data32, int data64) { - int fpus, fptag, i, nb_xmm_regs; + int i, nb_xmm_regs, fptag; floatx80 tmp; target_ulong addr; @@ -1095,25 +1169,36 @@ void helper_fxsave(CPUX86State *env, target_ulong ptr, int data64) raise_exception(env, EXCP0D_GPF); } - fpus =3D (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; fptag =3D 0; for (i =3D 0; i < 8; i++) { fptag |=3D (env->fptags[i] << i); } + fptag ^=3D 0xff; + cpu_stw_data(env, ptr, env->fpuc); - cpu_stw_data(env, ptr + 2, fpus); - cpu_stw_data(env, ptr + 4, fptag ^ 0xff); + cpu_stw_data(env, ptr + 2, FPUS(env)); + cpu_stw_data(env, ptr + 4, fptag & 0xff); + cpu_stw_data(env, ptr + 6, env->fpop); + #ifdef TARGET_X86_64 if (data64) { - cpu_stq_data(env, ptr + 0x08, 0); /* rip */ - cpu_stq_data(env, ptr + 0x10, 0); /* rdp */ + /* 64 bit */ + cpu_stq_data(env, ptr + 8, env->fpip); + cpu_stq_data(env, ptr + 16, env->fpdp); } else #endif { - cpu_stl_data(env, ptr + 0x08, 0); /* eip */ - cpu_stl_data(env, ptr + 0x0c, 0); /* sel */ - cpu_stl_data(env, ptr + 0x10, 0); /* dp */ - cpu_stl_data(env, ptr + 0x14, 0); /* sel */ + if (data32) { + /* 32 bit */ + cpu_stl_data(env, ptr + 8, env->fpip); + cpu_stl_data(env, ptr + 16, env->fpdp); + } else { + /* 16 bit */ + cpu_stw_data(env, ptr + 8, env->fpip); + cpu_stw_data(env, ptr + 16, env->fpdp); + } + cpu_stw_data(env, ptr + 12, env->fpcs & 0xffff); + cpu_stw_data(env, ptr + 20, env->fpds & 0xffff); } addr =3D ptr + 0x20; @@ -1146,7 +1231,7 @@ void helper_fxsave(CPUX86State *env, target_ulong ptr, int data64) } } -void helper_fxrstor(CPUX86State *env, target_ulong ptr, int data64) +void helper_fxrstor(CPUX86State *env, target_ulong ptr, int data32, int data64) { int i, fpus, fptag, nb_xmm_regs; floatx80 tmp; @@ -1167,6 +1252,30 @@ void helper_fxrstor(CPUX86State *env, target_ulong ptr, int data64) env->fptags[i] =3D ((fptag >> i) & 1); } + env->fpop =3D (cpu_lduw_data(env, ptr + 6) >> 5) & 0x7ff; + +#ifdef TARGET_X86_64 + if (data64) { + /* 64 bit */ + env->fpip =3D cpu_ldq_data(env, ptr + 8); + env->fpdp =3D cpu_ldq_data(env, ptr + 16); + } else +#endif + { + if (data32) { + /* 32 bit */ + env->fpip =3D cpu_ldl_data(env, ptr + 8); + env->fpdp =3D cpu_ldl_data(env, ptr + 16); + } else { + /* 16 bit */ + env->fpip =3D cpu_lduw_data(env, ptr + 8); + env->fpdp =3D cpu_lduw_data(env, ptr + 16); + } + + env->fpcs =3D cpu_lduw_data(env, ptr + 12); + env->fpds =3D cpu_lduw_data(env, ptr + 20); + } + addr =3D ptr + 0x20; for (i =3D 0; i < 8; i++) { tmp =3D helper_fldt(env, addr); @@ -1195,6 +1304,11 @@ void helper_fxrstor(CPUX86State *env, target_ulong ptr, int data64) } } } + + if (!data64) { + env->fpip &=3D 0xffffffff; + env->fpdp &=3D 0xffffffff; + } } void cpu_get_fp80(uint64_t *pmant, uint16_t *pexp, floatx80 f) diff --git a/target-i386/helper.h b/target-i386/helper.h index 8eb0145..9c4fd22 100644 --- a/target-i386/helper.h +++ b/target-i386/helper.h @@ -183,12 +183,12 @@ DEF_HELPER_1(frndint, void, env) DEF_HELPER_1(fscale, void, env) DEF_HELPER_1(fsin, void, env) DEF_HELPER_1(fcos, void, env) -DEF_HELPER_3(fstenv, void, env, tl, int) -DEF_HELPER_3(fldenv, void, env, tl, int) -DEF_HELPER_3(fsave, void, env, tl, int) -DEF_HELPER_3(frstor, void, env, tl, int) -DEF_HELPER_3(fxsave, void, env, tl, int) -DEF_HELPER_3(fxrstor, void, env, tl, int) +DEF_HELPER_4(fstenv, void, env, tl, int, int) +DEF_HELPER_4(fldenv, void, env, tl, int, int) +DEF_HELPER_4(fsave, void, env, tl, int, int) +DEF_HELPER_4(frstor, void, env, tl, int, int) +DEF_HELPER_4(fxsave, void, env, tl, int, int) +DEF_HELPER_4(fxrstor, void, env, tl, int, int) DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RWG_SE, tl, tl) DEF_HELPER_FLAGS_1(ctz, TCG_CALL_NO_RWG_SE, tl, tl) diff --git a/target-i386/machine.c b/target-i386/machine.c index 16d2f6a..500f04f 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -397,7 +397,7 @@ static const VMStateDescription vmstate_fpop_ip_dp =3D = { .version_id =3D 1, .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { - VMSTATE_UINT16(env.fpop, X86CPU), + VMSTATE_UINT32(env.fpop, X86CPU), VMSTATE_UINT64(env.fpip, X86CPU), VMSTATE_UINT64(env.fpdp, X86CPU), VMSTATE_END_OF_LIST() diff --git a/target-i386/translate.c b/target-i386/translate.c index 6fcd824..8e490de 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -58,6 +58,9 @@ #endif //#define MACRO_TEST 1 +#define IS_PROTECTED_MODE(s) (s->pe && !s->vm86) +#define FP_EP_VALID 0x80000000 +#define FP_EP_INVALID 0 /* global register indexes */ static TCGv_ptr cpu_env; @@ -65,6 +68,11 @@ static TCGv cpu_A0; static TCGv cpu_cc_dst, cpu_cc_src, cpu_cc_src2, cpu_cc_srcT; static TCGv_i32 cpu_cc_op; static TCGv cpu_regs[CPU_NB_REGS]; +static TCGv_i32 cpu_fpop; +static TCGv cpu_fpip; +static TCGv cpu_fpdp; +static TCGv_i32 cpu_fpds; +static TCGv_i32 cpu_fpcs; /* local temps */ static TCGv cpu_T[2]; /* local register indexes (only used inside old micro ops) */ @@ -74,6 +82,9 @@ static TCGv_i32 cpu_tmp2_i32, cpu_tmp3_i32; static TCGv_i64 cpu_tmp1_i64; static uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; +static uint16_t gen_opc_fp_op[OPC_BUF_SIZE]; +static uint16_t gen_opc_fp_cs[OPC_BUF_SIZE]; +static target_ulong gen_opc_fp_ip[OPC_BUF_SIZE]; #include "exec/gen-icount.h" @@ -104,6 +115,10 @@ typedef struct DisasContext { int ss32; /* 32 bit stack segment */ CCOp cc_op; /* current CC operation */ bool cc_op_dirty; + uint16_t fp_op; + bool fp_ep_dirty; + target_ulong fp_ip; + uint16_t fp_cs; int addseg; /* non zero if either DS/ES/SS have a non zero base */ int f_st; /* currently unused */ int vm86; /* vm86 mode */ @@ -208,6 +223,62 @@ static const uint8_t cc_op_live[CC_OP_NB] =3D { [CC_OP_CLR] =3D 0, }; +static inline bool instr_is_x87_nc(int modrm, int b) +{ + int op, mod, rm; + switch (b) { + case 0xd8 ... 0xdf: + /* floats */ + op =3D ((b & 7) << 3) | ((modrm >> 3) & 7); + mod =3D (modrm >> 6) & 3; + rm =3D modrm & 7; + if (mod !=3D 3) { + /* memory */ + switch (op) { + case 0x0c: /* fldenv */ + case 0x0d: /* fldcw */ + case 0x0e: /* fstenv, fnstenv */ + case 0x0f: /* fstcw, fnstcw */ + case 0x2c: /* frstor */ + case 0x2e: /* fsave, fnsave */ + case 0x2f: /* fstsw, fnstsw */ + return false; + default: + return true; + } + } else { + /* register */ + switch (op) { + case 0x0a: + return false; /* fnop, Illegal op */ + case 0x0e: /* fdecstp, fincstp */ + case 0x28: /* ffree */ + return false; + case 0x1c: + switch (rm) { + case 1: /* feni */ + return true; + case 2: /* fclex, fnclex */ + case 3: /* finit, fninit */ + return false; + case 4: /* fsetpm */ + return true; + default: /* Illegal op */ + return false; + } + case 0x3c: + return false; /* fstsw, fnstsw, Illegal op */ + default: + return true; + } + } + /*case 0x9b: // fwait, wait + return false;*/ + default: + return false; + } +} + static void set_cc_op(DisasContext *s, CCOp op) { int dead; @@ -253,6 +324,23 @@ static void gen_update_cc_op(DisasContext *s) } } +static void set_ep(DisasContext *s, int fp_op, int fp_ip, int fp_cs) { + s->fp_op =3D FP_EP_VALID | fp_op; + s->fp_ip =3D fp_ip; + s->fp_cs =3D fp_cs; + s->fp_ep_dirty =3D true; +} + +static void gen_update_ep(DisasContext *s) +{ + if (s->fp_ep_dirty) { + tcg_gen_movi_i32(cpu_fpop, s->fp_op); + tcg_gen_movi_tl(cpu_fpip, s->fp_ip); + tcg_gen_movi_i32(cpu_fpcs, s->fp_cs); + s->fp_ep_dirty =3D false; + } +} + #ifdef TARGET_X86_64 #define NB_OP_SIZES 4 @@ -666,6 +754,7 @@ static void gen_check_io(DisasContext *s, TCGMemOp ot, target_ulong cur_eip, state_saved =3D 0; if (s->pe && (s->cpl > s->iopl || s->vm86)) { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(cur_eip); state_saved =3D 1; tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); @@ -686,6 +775,7 @@ static void gen_check_io(DisasContext *s, TCGMemOp ot, target_ulong cur_eip, if(s->flags & HF_SVMI_MASK) { if (!state_saved) { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(cur_eip); } svm_flags |=3D (1 << (4 + ot)); @@ -1097,6 +1187,7 @@ static inline void gen_jcc1(DisasContext *s, int b, int l1) CCPrepare cc =3D gen_prepare_cc(s, b, cpu_T[0]); gen_update_cc_op(s); + gen_update_ep(s); if (cc.mask !=3D -1) { tcg_gen_andi_tl(cpu_T[0], cc.reg, cc.mask); cc.reg =3D cpu_T[0]; @@ -1580,14 +1671,14 @@ static void gen_rot_rm_T1(DisasContext *s, TCGMemOp ot, int op1, int is_right) t0 =3D tcg_const_i32(0); t1 =3D tcg_temp_new_i32(); tcg_gen_trunc_tl_i32(t1, cpu_T[1]); - tcg_gen_movi_i32(cpu_tmp2_i32, CC_OP_ADCOX); + tcg_gen_movi_i32(cpu_tmp2_i32, CC_OP_ADCOX); tcg_gen_movi_i32(cpu_tmp3_i32, CC_OP_EFLAGS); tcg_gen_movcond_i32(TCG_COND_NE, cpu_cc_op, t1, t0, cpu_tmp2_i32, cpu_tmp3_i32); tcg_temp_free_i32(t0); tcg_temp_free_i32(t1); - /* The CC_OP value is no longer predictable. */ + /* The CC_OP value is no longer predictable. */ set_cc_op(s, CC_OP_DYNAMIC); } @@ -1863,7 +1954,7 @@ static void gen_shifti(DisasContext *s1, int op, TCGMemOp ot, int d, int c) } } -static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) +static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm, int b) { target_long disp; int havesib; @@ -1871,6 +1962,7 @@ static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) int index; int scale; int mod, rm, code, override, must_add_seg; + int curr_instr_is_x87_nc; TCGv sum; override =3D s->override; @@ -1950,6 +2042,13 @@ static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) tcg_gen_addi_tl(cpu_A0, sum, disp); } + curr_instr_is_x87_nc =3D instr_is_x87_nc(modrm, b); + if (curr_instr_is_x87_nc) { + tcg_gen_mov_tl(cpu_fpdp, cpu_A0); + if (s->aflag =3D=3D MO_32) { + tcg_gen_ext32u_tl(cpu_fpdp, cpu_fpdp); + } + } if (must_add_seg) { if (override < 0) { if (base =3D=3D R_EBP || base =3D=3D R_ESP) { @@ -1961,6 +2060,12 @@ static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUX86State, segs[override].base)); + + if (curr_instr_is_x87_nc) { + tcg_gen_ld_i32(cpu_fpds, cpu_env, + offsetof(CPUX86State, segs[override].selector)); + } + if (CODE64(s)) { if (s->aflag =3D=3D MO_32) { tcg_gen_ext32u_tl(cpu_A0, cpu_A0); @@ -1970,6 +2075,11 @@ static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) } tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0); + } else { + if (curr_instr_is_x87_nc) { + tcg_gen_ld_i32(cpu_fpds, cpu_env, + offsetof(CPUX86State, segs[R_DS].selector)); + } } if (s->aflag =3D=3D MO_32) { @@ -2039,8 +2149,22 @@ static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) override =3D R_DS; } } + if (instr_is_x87_nc(modrm, b)) { + tcg_gen_mov_tl(cpu_fpdp, cpu_A0); + tcg_gen_ld_i32(cpu_fpds, cpu_env, + offsetof(CPUX86State, segs[override].selector)); + } gen_op_addl_A0_seg(s, override); + } else { + if (instr_is_x87_nc(modrm, b)) { + tcg_gen_mov_tl(cpu_fpdp, cpu_A0); + tcg_gen_ld_i32(cpu_fpds, cpu_env, + offsetof(CPUX86State, segs[R_DS].selector)); + } } +#ifdef TARGET_X86_64 + tcg_gen_andi_tl(cpu_fpdp, cpu_fpdp, 0xffffffff); +#endif break; default: @@ -2130,7 +2254,7 @@ static void gen_add_A0_ds_seg(DisasContext *s) /* generate modrm memory load or store of 'reg'. TMP0 is used if reg =3D= =3D OR_TMP0 */ static void gen_ldst_modrm(CPUX86State *env, DisasContext *s, int modrm, - TCGMemOp ot, int reg, int is_store) + TCGMemOp ot, int reg, int is_store, int b) { int mod, rm; @@ -2147,7 +2271,7 @@ static void gen_ldst_modrm(CPUX86State *env, DisasContext *s, int modrm, gen_op_mov_reg_v(ot, reg, cpu_T[0]); } } else { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); if (is_store) { if (reg !=3D OR_TMP0) gen_op_mov_v_reg(ot, cpu_T[0], reg); @@ -2250,7 +2374,7 @@ static void gen_cmovcc1(CPUX86State *env, DisasContext *s, TCGMemOp ot, int b, { CCPrepare cc; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); cc =3D gen_prepare_cc(s, b, cpu_T[1]); if (cc.mask !=3D -1) { @@ -2297,6 +2421,7 @@ static void gen_movl_seg_T0(DisasContext *s, int seg_reg, target_ulong cur_eip) if (s->pe && !s->vm86) { /* XXX: optimize by finding processor state dynamically */ gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(cur_eip); tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); gen_helper_load_seg(cpu_env, tcg_const_i32(seg_reg), cpu_tmp2_i32)= ; @@ -2326,6 +2451,7 @@ gen_svm_check_intercept_param(DisasContext *s, target_ulong pc_start, if (likely(!(s->flags & HF_SVMI_MASK))) return; gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_svm_check_intercept_param(cpu_env, tcg_const_i32(type), tcg_const_i64(param)); @@ -2513,6 +2639,7 @@ static void gen_enter(DisasContext *s, int esp_addend, int level) static void gen_exception(DisasContext *s, int trapno, target_ulong cur_eip) { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(cur_eip); gen_helper_raise_exception(cpu_env, tcg_const_i32(trapno)); s->is_jmp =3D DISAS_TB_JUMP; @@ -2524,6 +2651,7 @@ static void gen_interrupt(DisasContext *s, int intno, target_ulong cur_eip, target_ulong next_eip) { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(cur_eip); gen_helper_raise_interrupt(cpu_env, tcg_const_i32(intno), tcg_const_i32(next_eip - cur_eip)); @@ -2533,6 +2661,7 @@ static void gen_interrupt(DisasContext *s, int intno, static void gen_debug(DisasContext *s, target_ulong cur_eip) { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(cur_eip); gen_helper_debug(cpu_env); s->is_jmp =3D DISAS_TB_JUMP; @@ -2543,6 +2672,7 @@ static void gen_debug(DisasContext *s, target_ulong cur_eip) static void gen_eob(DisasContext *s) { gen_update_cc_op(s); + gen_update_ep(s); if (s->tb->flags & HF_INHIBIT_IRQ_MASK) { gen_helper_reset_inhibit_irq(cpu_env); } @@ -2564,6 +2694,7 @@ static void gen_eob(DisasContext *s) static void gen_jmp_tb(DisasContext *s, target_ulong eip, int tb_num) { gen_update_cc_op(s); + gen_update_ep(s); set_cc_op(s, CC_OP_DYNAMIC); if (s->jmp_opt) { gen_goto_tb(s, tb_num, eip); @@ -3043,7 +3174,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x0e7: /* movntq */ if (mod =3D=3D 3) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_stq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); break; case 0x1e7: /* movntdq */ @@ -3051,20 +3182,20 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x12b: /* movntps */ if (mod =3D=3D 3) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_sto_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); break; case 0x3f0: /* lddqu */ if (mod =3D=3D 3) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); break; case 0x22b: /* movntss */ case 0x32b: /* movntsd */ if (mod =3D=3D 3) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); if (b1 & 1) { gen_stq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); } else { @@ -3076,13 +3207,13 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x6e: /* movd mm, ea */ #ifdef TARGET_X86_64 if (s->dflag =3D=3D MO_64) { - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0, b); tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,fpregs[reg].mmx)); } else #endif { - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0); - tcg_gen_addi_ptr(cpu_ptr0, cpu_env, + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0, b); + tcg_gen_addi_ptr(cpu_ptr0, cpu_env, offsetof(CPUX86State,fpregs[reg].mmx)); tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); gen_helper_movl_mm_T0_mmx(cpu_ptr0, cpu_tmp2_i32); @@ -3091,15 +3222,15 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x16e: /* movd xmm, ea */ #ifdef TARGET_X86_64 if (s->dflag =3D=3D MO_64) { - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0); - tcg_gen_addi_ptr(cpu_ptr0, cpu_env, + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0, b); + tcg_gen_addi_ptr(cpu_ptr0, cpu_env, offsetof(CPUX86State,xmm_regs[reg])); gen_helper_movq_mm_T0_xmm(cpu_ptr0, cpu_T[0]); } else #endif { - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0); - tcg_gen_addi_ptr(cpu_ptr0, cpu_env, + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0, b); + tcg_gen_addi_ptr(cpu_ptr0, cpu_env, offsetof(CPUX86State,xmm_regs[reg])); tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); gen_helper_movl_mm_T0_xmm(cpu_ptr0, cpu_tmp2_i32); @@ -3107,7 +3238,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x6f: /* movq mm, ea */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); } else { rm =3D (modrm & 7); @@ -3124,7 +3255,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x16f: /* movdqa xmm, ea */ case 0x26f: /* movdqu xmm, ea */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); } else { rm =3D (modrm & 7) | REX_B(s); @@ -3134,7 +3265,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x210: /* movss xmm, ea */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, MO_32, cpu_T[0], cpu_A0); tcg_gen_st32_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); tcg_gen_movi_tl(cpu_T[0], 0); @@ -3149,7 +3280,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x310: /* movsd xmm, ea */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(0))); tcg_gen_movi_tl(cpu_T[0], 0); @@ -3164,7 +3295,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x012: /* movlps */ case 0x112: /* movlpd */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(0))); } else { @@ -3176,7 +3307,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x212: /* movsldup */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); } else { rm =3D (modrm & 7) | REX_B(s); @@ -3192,7 +3323,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x312: /* movddup */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(0))); } else { @@ -3206,7 +3337,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x016: /* movhps */ case 0x116: /* movhpd */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(1))); } else { @@ -3218,7 +3349,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x216: /* movshdup */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); } else { rm =3D (modrm & 7) | REX_B(s); @@ -3256,34 +3387,34 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x7e: /* movd ea, mm */ #ifdef TARGET_X86_64 if (s->dflag =3D=3D MO_64) { - tcg_gen_ld_i64(cpu_T[0], cpu_env, + tcg_gen_ld_i64(cpu_T[0], cpu_env, offsetof(CPUX86State,fpregs[reg].mmx)); - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1, b); } else #endif { - tcg_gen_ld32u_tl(cpu_T[0], cpu_env, + tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,fpregs[reg].mmx.MMX_L(0))); - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1, b); } break; case 0x17e: /* movd ea, xmm */ #ifdef TARGET_X86_64 if (s->dflag =3D=3D MO_64) { - tcg_gen_ld_i64(cpu_T[0], cpu_env, + tcg_gen_ld_i64(cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0))); - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1, b); } else #endif { - tcg_gen_ld32u_tl(cpu_T[0], cpu_env, + tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1, b); } break; case 0x27e: /* movq xmm, ea */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(0))); } else { @@ -3295,7 +3426,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x7f: /* movq ea, mm */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_stq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); } else { rm =3D (modrm & 7); @@ -3310,7 +3441,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x17f: /* movdqa ea, xmm */ case 0x27f: /* movdqu ea, xmm */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_sto_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); } else { rm =3D (modrm & 7) | REX_B(s); @@ -3320,7 +3451,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x211: /* movss ea, xmm */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); gen_op_st_v(s, MO_32, cpu_T[0], cpu_A0); } else { @@ -3331,7 +3462,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x311: /* movsd ea, xmm */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_stq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(0))); } else { @@ -3343,7 +3474,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x013: /* movlps */ case 0x113: /* movlpd */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_stq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(0))); } else { @@ -3353,7 +3484,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x017: /* movhps */ case 0x117: /* movhpd */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_stq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(1))); } else { @@ -3417,7 +3548,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x12a: /* cvtpi2pd */ gen_helper_enter_mmx(cpu_env); if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); op2_offset =3D offsetof(CPUX86State,mmx_t0); gen_ldq_env_A0(s, op2_offset); } else { @@ -3440,7 +3571,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x22a: /* cvtsi2ss */ case 0x32a: /* cvtsi2sd */ ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); op1_offset =3D offsetof(CPUX86State,xmm_regs[reg]); tcg_gen_addi_ptr(cpu_ptr0, cpu_env, op1_offset); if (ot =3D=3D MO_32) { @@ -3462,7 +3593,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x12d: /* cvtpd2pi */ gen_helper_enter_mmx(cpu_env); if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); op2_offset =3D offsetof(CPUX86State,xmm_t0); gen_ldo_env_A0(s, op2_offset); } else { @@ -3493,7 +3624,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0x32d: /* cvtsd2si */ ot =3D mo_64_32(s->dflag); if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); if ((b >> 8) & 1) { gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_t0.XMM_Q(0))); } else { @@ -3525,7 +3656,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, case 0xc4: /* pinsrw */ case 0x1c4: s->rip_offset =3D 1; - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); val =3D cpu_ldub_code(env, s->pc++); if (b1) { val &=3D 7; @@ -3559,7 +3690,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, break; case 0x1d6: /* movq ea, xmm */ if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_stq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg].XMM_Q(0))); } else { @@ -3626,7 +3757,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, op2_offset =3D offsetof(CPUX86State,xmm_regs[rm | REX_B(s)]); } else { op2_offset =3D offsetof(CPUX86State,xmm_t0); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); switch (b) { case 0x20: case 0x30: /* pmovsxbw, pmovzxbw */ case 0x23: case 0x33: /* pmovsxwd, pmovzxwd */ @@ -3660,7 +3791,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); } else { op2_offset =3D offsetof(CPUX86State,mmx_t0); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldq_env_A0(s, op2_offset); } } @@ -3701,7 +3832,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, } tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_regs[reg]); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); gen_helper_crc32(cpu_T[0], cpu_tmp2_i32, cpu_T[0], tcg_const_i32(8 << ot)); @@ -3729,7 +3860,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, ot =3D MO_64; } - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); if ((b & 1) =3D=3D 0) { tcg_gen_qemu_ld_tl(cpu_T[0], cpu_A0, s->mem_index, ot | MO_BE); @@ -3747,7 +3878,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, goto illegal_op; } ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); tcg_gen_andc_tl(cpu_T[0], cpu_regs[s->vex_v], cpu_T[0]); gen_op_mov_reg_v(ot, reg, cpu_T[0]); gen_op_update1_cc(); @@ -3764,7 +3895,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, { TCGv bound, zero; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); /* Extract START, and shift the operand. Shifts larger than operand size get zeros. */ tcg_gen_ext8u_tl(cpu_A0, cpu_regs[s->vex_v]); @@ -3801,7 +3932,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, goto illegal_op; } ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); tcg_gen_ext8u_tl(cpu_T[1], cpu_regs[s->vex_v]); { TCGv bound =3D tcg_const_tl(ot =3D=3D MO_64 ? 63 : 31)= ; @@ -3828,7 +3959,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, goto illegal_op; } ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); switch (ot) { default: tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); @@ -3854,7 +3985,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, goto illegal_op; } ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); /* Note that by zero-extending the mask operand, we automatically handle zero-extending the result. */ if (ot =3D=3D MO_64) { @@ -3872,7 +4003,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, goto illegal_op; } ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); /* Note that by zero-extending the mask operand, we automatically handle zero-extending the result. */ if (ot =3D=3D MO_64) { @@ -3892,7 +4023,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, int end_op; ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); /* Re-use the carry-out from a previous round. */ TCGV_UNUSED(carry_in); @@ -3971,7 +4102,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, goto illegal_op; } ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); if (ot =3D=3D MO_64) { tcg_gen_andi_tl(cpu_T[1], cpu_regs[s->vex_v], 63); } else { @@ -4003,7 +4134,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, goto illegal_op; } ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); switch (reg & 7) { case 1: /* blsr By,Ey */ @@ -4062,7 +4193,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, ot =3D mo_64_32(s->dflag); rm =3D (modrm & 7) | REX_B(s); if (mod !=3D 3) - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); reg =3D ((modrm >> 3) & 7) | rex_r; val =3D cpu_ldub_code(env, s->pc++); switch (b) { @@ -4199,7 +4330,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, op2_offset =3D offsetof(CPUX86State,xmm_regs[rm | REX_B(s)]); } else { op2_offset =3D offsetof(CPUX86State,xmm_t0); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldo_env_A0(s, op2_offset); } } else { @@ -4208,7 +4339,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); } else { op2_offset =3D offsetof(CPUX86State,mmx_t0); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_ldq_env_A0(s, op2_offset); } } @@ -4242,7 +4373,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, goto illegal_op; } ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); b =3D cpu_ldub_code(env, s->pc++); if (ot =3D=3D MO_64) { tcg_gen_rotri_tl(cpu_T[0], cpu_T[0], b & 63); @@ -4278,7 +4409,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, if (mod !=3D 3) { int sz =3D 4; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); op2_offset =3D offsetof(CPUX86State,xmm_t0); switch (b) { @@ -4326,7 +4457,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, } else { op1_offset =3D offsetof(CPUX86State,fpregs[reg].mmx); if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); op2_offset =3D offsetof(CPUX86State,mmx_t0); gen_ldq_env_A0(s, op2_offset); } else { @@ -4404,6 +4535,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, int modrm, reg, rm, mod, op, opreg, val; target_ulong next_eip, tval; int rex_w, rex_r; + int fp_op, fp_ip, fp_cs; if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { tcg_gen_debug_insn_start(pc_start); @@ -4595,7 +4727,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, mod =3D (modrm >> 6) & 3; rm =3D (modrm & 7) | REX_B(s); if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); opreg =3D OR_TMP0; } else if (op =3D=3D OP_XORL && rm =3D=3D reg) { xor_zero: @@ -4616,7 +4748,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, reg =3D ((modrm >> 3) & 7) | rex_r; rm =3D (modrm & 7) | REX_B(s); if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, ot, cpu_T[1], cpu_A0); } else if (op =3D=3D OP_XORL && rm =3D=3D reg) { goto xor_zero; @@ -4655,7 +4787,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, s->rip_offset =3D 1; else s->rip_offset =3D insn_const_size(ot); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); opreg =3D OR_TMP0; } else { opreg =3D rm; @@ -4698,7 +4830,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, if (mod !=3D 3) { if (op =3D=3D 0) s->rip_offset =3D insn_const_size(ot); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, ot, cpu_T[0], cpu_A0); } else { gen_op_mov_v_reg(ot, cpu_T[0], rm); @@ -4906,7 +5038,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } } if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); if (op >=3D 2 && op !=3D 3 && op !=3D 5) gen_op_ld_v(s, ot, cpu_T[0], cpu_A0); } else { @@ -4946,6 +5078,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, do_lcall: if (s->pe && !s->vm86) { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); gen_helper_lcall_protected(cpu_env, cpu_tmp2_i32, cpu_T[1]= , @@ -4973,6 +5106,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, do_ljmp: if (s->pe && !s->vm86) { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); gen_helper_ljmp_protected(cpu_env, cpu_tmp2_i32, cpu_T[1], @@ -4998,7 +5132,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, modrm =3D cpu_ldub_code(env, s->pc++); reg =3D ((modrm >> 3) & 7) | rex_r; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); gen_op_mov_v_reg(ot, cpu_T[1], reg); gen_op_testl_T0_T1_cc(); set_cc_op(s, CC_OP_LOGICB + ot); @@ -5073,7 +5207,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, s->rip_offset =3D insn_const_size(ot); else if (b =3D=3D 0x6b) s->rip_offset =3D 1; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); if (b =3D=3D 0x69) { val =3D insn_get(env, s, ot); tcg_gen_movi_tl(cpu_T[1], val); @@ -5130,7 +5264,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_op_mov_reg_v(ot, reg, cpu_T[1]); gen_op_mov_reg_v(ot, rm, cpu_T[0]); } else { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_mov_v_reg(ot, cpu_T[0], reg); gen_op_ld_v(s, ot, cpu_T[1], cpu_A0); tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); @@ -5159,7 +5293,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, rm =3D (modrm & 7) | REX_B(s); gen_op_mov_v_reg(ot, t0, rm); } else { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); tcg_gen_mov_tl(a0, cpu_A0); gen_op_ld_v(s, ot, t0, a0); rm =3D 0; /* avoid warning */ @@ -5207,16 +5341,16 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, goto illegal_op; gen_jmp_im(pc_start - s->cs_base); gen_update_cc_op(s); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_helper_cmpxchg16b(cpu_env, cpu_A0); } else -#endif +#endif { if (!(s->cpuid_features & CPUID_CX8)) goto illegal_op; gen_jmp_im(pc_start - s->cs_base); gen_update_cc_op(s); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_helper_cmpxchg8b(cpu_env, cpu_A0); } set_cc_op(s, CC_OP_EFLAGS); @@ -5266,7 +5400,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } else { /* NOTE: order is important too for MMU exceptions */ s->popl_esp_hack =3D 1 << ot; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1, b); s->popl_esp_hack =3D 0; gen_pop_update(s, ot); } @@ -5352,7 +5486,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, reg =3D ((modrm >> 3) & 7) | rex_r; /* generate a generic store */ - gen_ldst_modrm(env, s, modrm, ot, reg, 1); + gen_ldst_modrm(env, s, modrm, ot, reg, 1, b); break; case 0xc6: case 0xc7: /* mov Ev, Iv */ @@ -5361,7 +5495,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, mod =3D (modrm >> 6) & 3; if (mod !=3D 3) { s->rip_offset =3D insn_const_size(ot); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); } val =3D insn_get(env, s, ot); tcg_gen_movi_tl(cpu_T[0], val); @@ -5377,7 +5511,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, modrm =3D cpu_ldub_code(env, s->pc++); reg =3D ((modrm >> 3) & 7) | rex_r; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); gen_op_mov_reg_v(ot, reg, cpu_T[0]); break; case 0x8e: /* mov seg, Gv */ @@ -5385,7 +5519,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, reg =3D (modrm >> 3) & 7; if (reg >=3D 6 || reg =3D=3D R_CS) goto illegal_op; - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); gen_movl_seg_T0(s, reg, pc_start - s->cs_base); if (reg =3D=3D R_SS) { /* if reg =3D=3D SS, inhibit interrupts/trace */ @@ -5408,7 +5542,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, goto illegal_op; gen_op_movl_T0_seg(reg); ot =3D mod =3D=3D 3 ? dflag : MO_16; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1, b); break; case 0x1b6: /* movzbS Gv, Eb */ @@ -5450,7 +5584,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } gen_op_mov_reg_v(d_ot, reg, cpu_T[0]); } else { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, s_ot, cpu_T[0], cpu_A0); gen_op_mov_reg_v(d_ot, reg, cpu_T[0]); } @@ -5468,7 +5602,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, s->override =3D -1; val =3D s->addseg; s->addseg =3D 0; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); s->addseg =3D val; gen_op_mov_reg_v(ot, reg, cpu_A0); break; @@ -5558,7 +5692,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_op_mov_reg_v(ot, rm, cpu_T[0]); gen_op_mov_reg_v(ot, reg, cpu_T[1]); } else { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_mov_v_reg(ot, cpu_T[0], reg); /* for xchg, lock is implicit */ if (!(prefixes & PREFIX_LOCK)) @@ -5593,7 +5727,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, mod =3D (modrm >> 6) & 3; if (mod =3D=3D 3) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, ot, cpu_T[1], cpu_A0); gen_add_A0_im(s, 1 << ot); /* load the segment first to handle exceptions properly */ @@ -5624,7 +5758,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, if (shift =3D=3D 2) { s->rip_offset =3D 1; } - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); opreg =3D OR_TMP0; } else { opreg =3D (modrm & 7) | REX_B(s); @@ -5674,7 +5808,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, rm =3D (modrm & 7) | REX_B(s); reg =3D ((modrm >> 3) & 7) | rex_r; if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); opreg =3D OR_TMP0; } else { opreg =3D rm; @@ -5705,7 +5839,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, op =3D ((b & 7) << 3) | ((modrm >> 3) & 7); if (mod !=3D 3) { /* memory op */ - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); switch(op) { case 0x00 ... 0x07: /* fxxxs */ case 0x10 ... 0x17: /* fixxxl */ @@ -5832,7 +5966,9 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, case 0x0c: /* fldenv mem */ gen_update_cc_op(s); gen_jmp_im(pc_start - s->cs_base); - gen_helper_fldenv(cpu_env, cpu_A0, tcg_const_i32(dflag - 1)); + gen_helper_fldenv(cpu_env, cpu_A0, + tcg_const_i32(dflag =3D=3D MO_32), + tcg_const_i32(IS_PROTECTED_MODE(s))); break; case 0x0d: /* fldcw mem */ tcg_gen_qemu_ld_i32(cpu_tmp2_i32, cpu_A0, @@ -5841,8 +5977,11 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, break; case 0x0e: /* fnstenv mem */ gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); - gen_helper_fstenv(cpu_env, cpu_A0, tcg_const_i32(dflag - 1)); + gen_helper_fstenv(cpu_env, cpu_A0, + tcg_const_i32(dflag =3D=3D MO_32), + tcg_const_i32(IS_PROTECTED_MODE(s))); break; case 0x0f: /* fnstcw mem */ gen_helper_fnstcw(cpu_tmp2_i32, cpu_env); @@ -5863,12 +6002,17 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, case 0x2c: /* frstor mem */ gen_update_cc_op(s); gen_jmp_im(pc_start - s->cs_base); - gen_helper_frstor(cpu_env, cpu_A0, tcg_const_i32(dflag - 1)); + gen_helper_frstor(cpu_env, cpu_A0, + tcg_const_i32(dflag =3D=3D MO_32), + tcg_const_i32(IS_PROTECTED_MODE(s))); break; case 0x2e: /* fnsave mem */ gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); - gen_helper_fsave(cpu_env, cpu_A0, tcg_const_i32(dflag - 1)); + gen_helper_fsave(cpu_env, cpu_A0, + tcg_const_i32(dflag =3D=3D MO_32), + tcg_const_i32(IS_PROTECTED_MODE(s))); break; case 0x2f: /* fnstsw mem */ gen_helper_fnstsw(cpu_tmp2_i32, cpu_env); @@ -6209,6 +6353,12 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, goto illegal_op; } } + if (instr_is_x87_nc(modrm, b)) { + fp_op =3D ((b & 0x7) << 8) | (modrm & 0xff); + fp_ip =3D pc_start - s->cs_base; + fp_cs =3D env->segs[R_CS].selector; + set_ep(s, fp_op, fp_ip, fp_cs); + } break; /************************/ /* string ops */ @@ -6393,6 +6543,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, do_lret: if (s->pe && !s->vm86) { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_lret_protected(cpu_env, tcg_const_i32(dflag - 1), tcg_const_i32(val)); @@ -6430,6 +6581,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } } else { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_iret_protected(cpu_env, tcg_const_i32(dflag - 1), tcg_const_i32(s->pc - s->cs_base)); @@ -6527,7 +6679,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, case 0x190 ... 0x19f: /* setcc Gv */ modrm =3D cpu_ldub_code(env, s->pc++); gen_setcc1(s, b, cpu_T[0]); - gen_ldst_modrm(env, s, modrm, MO_8, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, MO_8, OR_TMP0, 1, b); break; case 0x140 ... 0x14f: /* cmov Gv, Ev */ if (!(s->cpuid_features & CPUID_CMOV)) { @@ -6657,7 +6809,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, rm =3D (modrm & 7) | REX_B(s); if (mod !=3D 3) { s->rip_offset =3D 1; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, ot, cpu_T[0], cpu_A0); } else { gen_op_mov_v_reg(ot, cpu_T[0], rm); @@ -6688,7 +6840,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, rm =3D (modrm & 7) | REX_B(s); gen_op_mov_v_reg(MO_32, cpu_T[1], reg); if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); /* specific case: we need to add a displacement */ gen_exts(ot, cpu_T[1]); tcg_gen_sari_tl(cpu_tmp0, cpu_T[1], 3 + ot); @@ -6764,7 +6916,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, ot =3D dflag; modrm =3D cpu_ldub_code(env, s->pc++); reg =3D ((modrm >> 3) & 7) | rex_r; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); gen_extu(ot, cpu_T[0]); /* Note that lzcnt and tzcnt are in different extensions. */ @@ -6884,6 +7036,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); } else { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_fwait(cpu_env); } @@ -6903,6 +7056,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, if (CODE64(s)) goto illegal_op; gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_into(cpu_env, tcg_const_i32(s->pc - pc_start)); break; @@ -6967,7 +7121,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, if (mod =3D=3D 3) goto illegal_op; gen_op_mov_v_reg(ot, cpu_T[0], reg); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_jmp_im(pc_start - s->cs_base); tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); if (ot =3D=3D MO_16) { @@ -7095,6 +7249,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); } else { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_sysexit(cpu_env, tcg_const_i32(dflag - 1)); gen_eob(s); @@ -7104,6 +7259,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, case 0x105: /* syscall */ /* XXX: is it usable in real mode ? */ gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_syscall(cpu_env, tcg_const_i32(s->pc - pc_start)); gen_eob(s); @@ -7113,6 +7269,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); } else { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_sysret(cpu_env, tcg_const_i32(dflag - 1)); /* condition codes are modified only in long mode */ @@ -7133,6 +7290,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); } else { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_hlt(cpu_env, tcg_const_i32(s->pc - pc_start)); s->is_jmp =3D DISAS_TB_JUMP; @@ -7149,7 +7307,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_svm_check_intercept(s, pc_start, SVM_EXIT_LDTR_READ); tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,ldt.selector)); ot =3D mod =3D=3D 3 ? dflag : MO_16; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1, b); break; case 2: /* lldt */ if (!s->pe || s->vm86) @@ -7158,7 +7316,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); } else { gen_svm_check_intercept(s, pc_start, SVM_EXIT_LDTR_WRITE); - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); gen_jmp_im(pc_start - s->cs_base); tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); gen_helper_lldt(cpu_env, cpu_tmp2_i32); @@ -7170,7 +7328,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_svm_check_intercept(s, pc_start, SVM_EXIT_TR_READ); tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,tr.selector)); ot =3D mod =3D=3D 3 ? dflag : MO_16; - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1, b); break; case 3: /* ltr */ if (!s->pe || s->vm86) @@ -7179,7 +7337,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); } else { gen_svm_check_intercept(s, pc_start, SVM_EXIT_TR_WRITE); - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); gen_jmp_im(pc_start - s->cs_base); tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); gen_helper_ltr(cpu_env, cpu_tmp2_i32); @@ -7189,7 +7347,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, case 5: /* verw */ if (!s->pe || s->vm86) goto illegal_op; - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); gen_update_cc_op(s); if (op =3D=3D 4) { gen_helper_verr(cpu_env, cpu_T[0]); @@ -7212,7 +7370,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, if (mod =3D=3D 3) goto illegal_op; gen_svm_check_intercept(s, pc_start, SVM_EXIT_GDTR_READ); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State, gdt.limit)); gen_op_st_v(s, MO_16, cpu_T[0], cpu_A0); gen_add_A0_im(s, 2); @@ -7241,6 +7399,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, s->cpl !=3D 0) goto illegal_op; gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); gen_helper_mwait(cpu_env, tcg_const_i32(s->pc - pc_start)); gen_eob(s); @@ -7268,7 +7427,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } } else { /* sidt */ gen_svm_check_intercept(s, pc_start, SVM_EXIT_IDTR_READ); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State, idt.limit)); gen_op_st_v(s, MO_16, cpu_T[0], cpu_A0); gen_add_A0_im(s, 2); @@ -7371,7 +7530,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } else { gen_svm_check_intercept(s, pc_start, op=3D=3D2 ? SVM_EXIT_GDTR_WRITE : SVM_EXIT_IDTR_WRITE); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, MO_16, cpu_T[1], cpu_A0); gen_add_A0_im(s, 2); gen_op_ld_v(s, CODE64(s) + MO_32, cpu_T[0], cpu_A0); @@ -7394,14 +7553,14 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, #else tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,cr[0])); #endif - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 1); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 1, b); break; case 6: /* lmsw */ if (s->cpl !=3D 0) { gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); } else { gen_svm_check_intercept(s, pc_start, SVM_EXIT_WRITE_CR0); - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); gen_helper_lmsw(cpu_env, cpu_T[0]); gen_jmp_im(s->pc - s->cs_base); gen_eob(s); @@ -7413,8 +7572,9 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); } else { gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_helper_invlpg(cpu_env, cpu_A0); gen_jmp_im(s->pc - s->cs_base); gen_eob(s); @@ -7446,6 +7606,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, if (!(s->cpuid_ext2_features & CPUID_EXT2_RDTSCP)) goto illegal_op; gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); if (use_icount) gen_io_start(); @@ -7493,7 +7654,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } gen_op_mov_reg_v(d_ot, reg, cpu_T[0]); } else { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, MO_32 | MO_SIGN, cpu_T[0], cpu_A0); gen_op_mov_reg_v(d_ot, reg, cpu_T[0]); } @@ -7514,7 +7675,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, mod =3D (modrm >> 6) & 3; rm =3D modrm & 7; if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_op_ld_v(s, ot, t0, cpu_A0); a0 =3D tcg_temp_local_new(); tcg_gen_mov_tl(a0, cpu_A0); @@ -7556,7 +7717,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, ot =3D dflag !=3D MO_16 ? MO_32 : MO_16; modrm =3D cpu_ldub_code(env, s->pc++); reg =3D ((modrm >> 3) & 7) | rex_r; - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); t0 =3D tcg_temp_local_new(); gen_update_cc_op(s); if (b =3D=3D 0x102) { @@ -7584,7 +7745,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, case 3: /* prefetchnt0 */ if (mod =3D=3D 3) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); /* nothing more to do */ break; default: /* nop (multi byte) */ @@ -7624,6 +7785,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, case 4: case 8: gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); if (b & 2) { gen_op_mov_v_reg(ot, cpu_T[0], rm); @@ -7696,7 +7858,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, goto illegal_op; reg =3D ((modrm >> 3) & 7) | rex_r; /* generate a generic store */ - gen_ldst_modrm(env, s, modrm, ot, reg, 1); + gen_ldst_modrm(env, s, modrm, ot, reg, 1, b); break; case 0x1ae: modrm =3D cpu_ldub_code(env, s->pc++); @@ -7704,6 +7866,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, op =3D (modrm >> 3) & 7; switch(op) { case 0: /* fxsave */ + gen_update_ep(s); if (mod =3D=3D 3 || !(s->cpuid_features & CPUID_FXSR) || (s->prefix & PREFIX_LOCK)) goto illegal_op; @@ -7711,10 +7874,13 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); break; } - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(pc_start - s->cs_base); - gen_helper_fxsave(cpu_env, cpu_A0, tcg_const_i32(dflag =3D=3D MO_64)); + gen_helper_fxsave(cpu_env, cpu_A0, + tcg_const_i32(dflag =3D=3D MO_32), + tcg_const_i32(dflag =3D=3D MO_64)); break; case 1: /* fxrstor */ if (mod =3D=3D 3 || !(s->cpuid_features & CPUID_FXSR) || @@ -7724,10 +7890,12 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); break; } - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); gen_update_cc_op(s); gen_jmp_im(pc_start - s->cs_base); - gen_helper_fxrstor(cpu_env, cpu_A0, tcg_const_i32(dflag =3D=3D MO_64)); + gen_helper_fxrstor(cpu_env, cpu_A0, + tcg_const_i32(dflag =3D=3D MO_32), + tcg_const_i32(dflag =3D=3D MO_64)); break; case 2: /* ldmxcsr */ case 3: /* stmxcsr */ @@ -7738,7 +7906,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, if ((s->flags & HF_EM_MASK) || !(s->flags & HF_OSFXSR_MASK) || mod =3D=3D 3) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); if (op =3D=3D 2) { tcg_gen_qemu_ld_i32(cpu_tmp2_i32, cpu_A0, s->mem_index, MO_LEUL); @@ -7763,7 +7931,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, /* clflush */ if (!(s->cpuid_features & CPUID_CLFLUSH)) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); } break; default: @@ -7775,7 +7943,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, mod =3D (modrm >> 6) & 3; if (mod =3D=3D 3) goto illegal_op; - gen_lea_modrm(env, s, modrm); + gen_lea_modrm(env, s, modrm, b); /* ignore for now */ break; case 0x1aa: /* rsm */ @@ -7783,6 +7951,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, if (!(s->flags & HF_SMM_MASK)) goto illegal_op; gen_update_cc_op(s); + gen_update_ep(s); gen_jmp_im(s->pc - s->cs_base); gen_helper_rsm(cpu_env); gen_eob(s); @@ -7803,7 +7972,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, ot =3D mo_64_32(dflag); } - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); gen_helper_popcnt(cpu_T[0], cpu_env, cpu_T[0], tcg_const_i32(ot)); gen_op_mov_reg_v(ot, reg, cpu_T[0]); @@ -7880,6 +8049,17 @@ void optimize_flags_init(void) cpu_cc_src2 =3D tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, cc_src2), "cc_src2"); + cpu_fpop =3D tcg_global_mem_new_i32(TCG_AREG0, + offsetof(CPUX86State, fpop), "fpop")= ; + cpu_fpip =3D tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, fpip)= , + "fpip"); + cpu_fpdp =3D tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, fpdp)= , + "fpdp"); + cpu_fpds =3D tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUX86State, fpds), + "fpds"); + cpu_fpcs =3D tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUX86State, fpcs), + "fpcs"); + for (i =3D 0; i < CPU_NB_REGS; ++i) { cpu_regs[i] =3D tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, regs[i]), @@ -7924,6 +8104,8 @@ static inline void gen_intermediate_code_internal(X86CPU *cpu, dc->singlestep_enabled =3D cs->singlestep_enabled; dc->cc_op =3D CC_OP_DYNAMIC; dc->cc_op_dirty =3D false; + dc->fp_op =3D FP_EP_INVALID; + dc->fp_ep_dirty =3D false; dc->cs_base =3D cs_base; dc->tb =3D tb; dc->popl_esp_hack =3D 0; @@ -7997,6 +8179,9 @@ static inline void gen_intermediate_code_internal(X86CPU *cpu, } tcg_ctx.gen_opc_pc[lj] =3D pc_ptr; gen_opc_cc_op[lj] =3D dc->cc_op; + gen_opc_fp_op[lj] =3D dc->fp_op; + gen_opc_fp_ip[lj] =3D dc->fp_ip; + gen_opc_fp_cs[lj] =3D dc->fp_cs; tcg_ctx.gen_opc_instr_start[lj] =3D 1; tcg_ctx.gen_opc_icount[lj] =3D num_insns; } @@ -8080,6 +8265,7 @@ void gen_intermediate_code_pc(CPUX86State *env, TranslationBlock *tb) void restore_state_to_opc(CPUX86State *env, TranslationBlock *tb, int pc_pos) { int cc_op; + uint16_t fp_op; #ifdef DEBUG_DISAS if (qemu_loglevel_mask(CPU_LOG_TB_OP)) { int i; @@ -8099,4 +8285,10 @@ void restore_state_to_opc(CPUX86State *env, TranslationBlock *tb, int pc_pos) cc_op =3D gen_opc_cc_op[pc_pos]; if (cc_op !=3D CC_OP_DYNAMIC) env->cc_op =3D cc_op; + fp_op =3D gen_opc_fp_op[pc_pos]; + if (fp_op & FP_EP_VALID) { + tcg_gen_movi_i32(cpu_fpop, fp_op); + tcg_gen_movi_tl(cpu_fpip, gen_opc_fp_ip[pc_pos]); + tcg_gen_movi_i32(cpu_fpcs, gen_opc_fp_cs[pc_pos]); + } } On Sat, Jul 19, 2014 at 2:36 AM, Jaume Mart=C3=AD = wrote: > Hello, > > I attach a patch with the fix for the issues pointed out by Richard. > Maybe it would be useful to have the option to disabled this feature > at compile time, for performance reasons. > Please review and apply. > > Best regards, > Jaume > > Signed-off-by: Jaume Marti Farriol (jaume.martif@gmail.com) > diff --git a/linux-user/signal.c b/linux-user/signal.c > index 1141054..73f8f6b 100644 > --- a/linux-user/signal.c > +++ b/linux-user/signal.c > @@ -865,7 +865,7 @@ static void setup_sigcontext(struct target_sigcontext > *sc, > __put_user(env->regs[R_ESP], &sc->esp_at_signal); > __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss); > > - cpu_x86_fsave(env, fpstate_addr, 1); > + cpu_x86_fsave(env, fpstate_addr); > fpstate->status =3D fpstate->sw; > magic =3D 0xffff; > __put_user(magic, &fpstate->magic); > @@ -1068,7 +1068,7 @@ restore_sigcontext(CPUX86State *env, struct > target_sigcontext *sc, int *peax) > if (!access_ok(VERIFY_READ, fpstate_addr, > sizeof(struct target_fpstate))) > goto badframe; > - cpu_x86_frstor(env, fpstate_addr, 1); > + cpu_x86_frstor(env, fpstate_addr); > } > > *peax =3D tswapl(sc->eax); > diff --git a/target-i386/cpu.h b/target-i386/cpu.h > index e634d83..4274ce3 100644 > --- a/target-i386/cpu.h > +++ b/target-i386/cpu.h > @@ -819,10 +819,11 @@ typedef struct CPUX86State { > uint16_t fpuc; > uint8_t fptags[8]; /* 0 =3D valid, 1 =3D empty */ > FPReg fpregs[8]; > - /* KVM-only so far */ > - uint16_t fpop; > + uint32_t fpop; > uint64_t fpip; > uint64_t fpdp; > + uint32_t fpcs; > + uint32_t fpds; > > /* emulator internal variables */ > float_status fp_status; > @@ -1067,8 +1068,8 @@ floatx80 cpu_set_fp80(uint64_t mant, uint16_t upper= ); > /* the following helpers are only usable in user mode simulation as > they can trigger unexpected exceptions */ > void cpu_x86_load_seg(CPUX86State *s, int seg_reg, int selector); > -void cpu_x86_fsave(CPUX86State *s, target_ulong ptr, int data32); > -void cpu_x86_frstor(CPUX86State *s, target_ulong ptr, int data32); > +void cpu_x86_fsave(CPUX86State *s, target_ulong ptr); > +void cpu_x86_frstor(CPUX86State *s, target_ulong ptr); > > /* you can call this signal handler from your SIGBUS and SIGSEGV > signal handlers to inform the virtual CPU of exceptions. non zero > diff --git a/target-i386/fpu_helper.c b/target-i386/fpu_helper.c > index 1b2900d..6886031 100644 > --- a/target-i386/fpu_helper.c > +++ b/target-i386/fpu_helper.c > @@ -56,6 +56,8 @@ > #define floatx80_l2e make_floatx80(0x3fff, 0xb8aa3b295c17f0bcLL) > #define floatx80_l2t make_floatx80(0x4000, 0xd49a784bcd1b8afeLL) > > +#define FPUS(env) ((env->fpus & ~0x3800) | ((env->fpstt & 0x7) << 11)) > + > static inline void fpush(CPUX86State *env) > { > env->fpstt =3D (env->fpstt - 1) & 7; > @@ -604,6 +606,10 @@ void helper_fninit(CPUX86State *env) > env->fptags[5] =3D 1; > env->fptags[6] =3D 1; > env->fptags[7] =3D 1; > + env->fpip =3D 0; > + env->fpcs =3D 0; > + env->fpdp =3D 0; > + env->fpds =3D 0; > } > > /* BCD ops */ > @@ -961,13 +967,13 @@ void helper_fxam_ST0(CPUX86State *env) > } > } > > -void helper_fstenv(CPUX86State *env, target_ulong ptr, int data32) > +void helper_fstenv(CPUX86State *env, target_ulong ptr, int data32, > + int protected_mode) > { > - int fpus, fptag, exp, i; > + int fptag, exp, i; > uint64_t mant; > CPU_LDoubleU tmp; > > - fpus =3D (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; > fptag =3D 0; > for (i =3D 7; i >=3D 0; i--) { > fptag <<=3D 2; > @@ -987,83 +993,150 @@ void helper_fstenv(CPUX86State *env, > target_ulong ptr, int data32) > } > } > } > + > if (data32) { > /* 32 bit */ > - cpu_stl_data(env, ptr, env->fpuc); > - cpu_stl_data(env, ptr + 4, fpus); > - cpu_stl_data(env, ptr + 8, fptag); > - cpu_stl_data(env, ptr + 12, 0); /* fpip */ > - cpu_stl_data(env, ptr + 16, 0); /* fpcs */ > - cpu_stl_data(env, ptr + 20, 0); /* fpoo */ > - cpu_stl_data(env, ptr + 24, 0); /* fpos */ > + cpu_stw_data(env, ptr, env->fpuc); > + cpu_stw_data(env, ptr + 4, FPUS(env)); > + cpu_stw_data(env, ptr + 8, fptag); > + if (protected_mode) { > + cpu_stl_data(env, ptr + 12, env->fpip); > + cpu_stl_data(env, ptr + 16, > + ((env->fpop & 0x7ff) << 16) | (env->fpcs & > 0xffff)); > + cpu_stl_data(env, ptr + 20, env->fpdp); > + cpu_stl_data(env, ptr + 24, env->fpds); > + } else { > + /* Real mode */ > + cpu_stl_data(env, ptr + 12, env->fpip); /* fpip[15..00] */ > + cpu_stl_data(env, ptr + 16, ((((env->fpip >> 16) & 0xffff) <= < > 12) | > + (env->fpop & 0x7ff))); /* fpip[31..16], fpop */ > + cpu_stl_data(env, ptr + 20, env->fpdp); /* fpdp[15..00] */ > + cpu_stl_data(env, ptr + 24, > + (env->fpdp >> 4) & 0xffff000); /* fpdp[31..16] *= / > + } > } else { > /* 16 bit */ > cpu_stw_data(env, ptr, env->fpuc); > - cpu_stw_data(env, ptr + 2, fpus); > + cpu_stw_data(env, ptr + 2, FPUS(env)); > cpu_stw_data(env, ptr + 4, fptag); > - cpu_stw_data(env, ptr + 6, 0); > - cpu_stw_data(env, ptr + 8, 0); > - cpu_stw_data(env, ptr + 10, 0); > - cpu_stw_data(env, ptr + 12, 0); > + if (protected_mode) { > + cpu_stw_data(env, ptr + 6, env->fpip); > + cpu_stw_data(env, ptr + 8, env->fpcs); > + cpu_stw_data(env, ptr + 10, env->fpdp); > + cpu_stw_data(env, ptr + 12, env->fpds); > + } else { > + /* Real mode */ > + cpu_stw_data(env, ptr + 6, env->fpip); /* fpip[15..0] */ > + cpu_stw_data(env, ptr + 8, ((env->fpip >> 4) & 0xf000) | > + (env->fpop & 0x7ff)); /* fpip[19..16], fpop */ > + cpu_stw_data(env, ptr + 10, env->fpdp); /* fpdp[15..0] */ > + cpu_stw_data(env, ptr + 12, > + (env->fpdp >> 4) & 0xf000); /* fpdp[19..16] */ > + } > } > + > + env->fpip =3D 0; > + env->fpcs =3D 0; > + env->fpdp =3D 0; > + env->fpds =3D 0; > } > > -void helper_fldenv(CPUX86State *env, target_ulong ptr, int data32) > +void helper_fldenv(CPUX86State *env, target_ulong ptr, int data32, > + int protected_mode) > { > - int i, fpus, fptag; > + int tmp, i, fpus, fptag; > > if (data32) { > + /* 32 bit */ > env->fpuc =3D cpu_lduw_data(env, ptr); > fpus =3D cpu_lduw_data(env, ptr + 4); > fptag =3D cpu_lduw_data(env, ptr + 8); > + if (protected_mode) { > + env->fpip =3D cpu_ldl_data(env, ptr + 12); > + tmp =3D cpu_ldl_data(env, ptr + 16); > + env->fpcs =3D tmp & 0xffff; > + env->fpop =3D tmp >> 16; > + env->fpdp =3D cpu_ldl_data(env, ptr + 20); > + env->fpds =3D cpu_lduw_data(env, ptr + 24); > + } else { > + /* Real mode */ > + tmp =3D cpu_ldl_data(env, ptr + 16); > + env->fpip =3D ((tmp & 0xffff000) << 4) | > + cpu_lduw_data(env, ptr + 12); > + env->fpop =3D tmp & 0x7ff; > + env->fpdp =3D (cpu_ldl_data(env, ptr + 24) << 4) | > + cpu_lduw_data(env, ptr + 20); > + } > } else { > + /* 16 bit */ > env->fpuc =3D cpu_lduw_data(env, ptr); > fpus =3D cpu_lduw_data(env, ptr + 2); > fptag =3D cpu_lduw_data(env, ptr + 4); > + if (protected_mode) { > + /* Protected mode */ > + env->fpip =3D cpu_lduw_data(env, ptr + 6); > + env->fpcs =3D cpu_lduw_data(env, ptr + 8); > + env->fpdp =3D cpu_lduw_data(env, ptr + 10); > + env->fpds =3D cpu_lduw_data(env, ptr + 12); > + } else { > + /* Real mode */ > + tmp =3D cpu_lduw_data(env, ptr + 8); > + env->fpip =3D ((tmp & 0xf000) << 4) | cpu_lduw_data(env, ptr= + > 6); > + env->fpop =3D tmp & 0x7ff; > + env->fpdp =3D cpu_lduw_data(env, ptr + 12) << 4 | > + cpu_lduw_data(env, ptr + 10); > + } > } > + > env->fpstt =3D (fpus >> 11) & 7; > env->fpus =3D fpus & ~0x3800; > for (i =3D 0; i < 8; i++) { > env->fptags[i] =3D ((fptag & 3) =3D=3D 3); > fptag >>=3D 2; > } > + > + env->fpip &=3D 0xffffffff; > + env->fpdp &=3D 0xffffffff; > + if (!protected_mode) { > + env->fpcs =3D 0; > + env->fpds =3D 0; > + } > } > > -void helper_fsave(CPUX86State *env, target_ulong ptr, int data32) > +void helper_fsave(CPUX86State *env, target_ulong ptr, int data32, > + int protected_mode) > { > floatx80 tmp; > int i; > > - helper_fstenv(env, ptr, data32); > + helper_fstenv(env, ptr, data32, protected_mode); > > - ptr +=3D (14 << data32); > + if (data32) { > + ptr +=3D 28; > + } else { > + ptr +=3D 14; > + } > for (i =3D 0; i < 8; i++) { > tmp =3D ST(i); > helper_fstt(env, tmp, ptr); > ptr +=3D 10; > } > > - /* fninit */ > - env->fpus =3D 0; > - env->fpstt =3D 0; > - env->fpuc =3D 0x37f; > - env->fptags[0] =3D 1; > - env->fptags[1] =3D 1; > - env->fptags[2] =3D 1; > - env->fptags[3] =3D 1; > - env->fptags[4] =3D 1; > - env->fptags[5] =3D 1; > - env->fptags[6] =3D 1; > - env->fptags[7] =3D 1; > + helper_fninit(env); > } > > -void helper_frstor(CPUX86State *env, target_ulong ptr, int data32) > +void helper_frstor(CPUX86State *env, target_ulong ptr, int data32, > + int protected_mode) > { > floatx80 tmp; > int i; > > - helper_fldenv(env, ptr, data32); > - ptr +=3D (14 << data32); > + helper_fldenv(env, ptr, data32, protected_mode); > + if (data32) { > + ptr +=3D 28; > + } else { > + ptr +=3D 14; > + } > > for (i =3D 0; i < 8; i++) { > tmp =3D helper_fldt(env, ptr); > @@ -1072,21 +1145,22 @@ void helper_frstor(CPUX86State *env, > target_ulong ptr, int data32) > } > } > > -#if defined(CONFIG_USER_ONLY) > -void cpu_x86_fsave(CPUX86State *env, target_ulong ptr, int data32) > +#if defined(CONFIG_USER_ONLY) && defined(TARGET_I386) && TARGET_ABI_BITS > =3D=3D 32 > + > +void cpu_x86_fsave(CPUX86State *env, target_ulong ptr) > { > - helper_fsave(env, ptr, data32); > + helper_fsave(env, ptr, 1, 1); > } > > -void cpu_x86_frstor(CPUX86State *env, target_ulong ptr, int data32) > +void cpu_x86_frstor(CPUX86State *env, target_ulong ptr) > { > - helper_frstor(env, ptr, data32); > + helper_frstor(env, ptr, 1, 1); > } > #endif > > -void helper_fxsave(CPUX86State *env, target_ulong ptr, int data64) > +void helper_fxsave(CPUX86State *env, target_ulong ptr, int data32, int > data64) > { > - int fpus, fptag, i, nb_xmm_regs; > + int i, nb_xmm_regs, fptag; > floatx80 tmp; > target_ulong addr; > > @@ -1095,25 +1169,36 @@ void helper_fxsave(CPUX86State *env, > target_ulong ptr, int data64) > raise_exception(env, EXCP0D_GPF); > } > > - fpus =3D (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; > fptag =3D 0; > for (i =3D 0; i < 8; i++) { > fptag |=3D (env->fptags[i] << i); > } > + fptag ^=3D 0xff; > + > cpu_stw_data(env, ptr, env->fpuc); > - cpu_stw_data(env, ptr + 2, fpus); > - cpu_stw_data(env, ptr + 4, fptag ^ 0xff); > + cpu_stw_data(env, ptr + 2, FPUS(env)); > + cpu_stw_data(env, ptr + 4, fptag & 0xff); > + cpu_stw_data(env, ptr + 6, env->fpop); > + > #ifdef TARGET_X86_64 > if (data64) { > - cpu_stq_data(env, ptr + 0x08, 0); /* rip */ > - cpu_stq_data(env, ptr + 0x10, 0); /* rdp */ > + /* 64 bit */ > + cpu_stq_data(env, ptr + 8, env->fpip); > + cpu_stq_data(env, ptr + 16, env->fpdp); > } else > #endif > { > - cpu_stl_data(env, ptr + 0x08, 0); /* eip */ > - cpu_stl_data(env, ptr + 0x0c, 0); /* sel */ > - cpu_stl_data(env, ptr + 0x10, 0); /* dp */ > - cpu_stl_data(env, ptr + 0x14, 0); /* sel */ > + if (data32) { > + /* 32 bit */ > + cpu_stl_data(env, ptr + 8, env->fpip); > + cpu_stl_data(env, ptr + 16, env->fpdp); > + } else { > + /* 16 bit */ > + cpu_stw_data(env, ptr + 8, env->fpip); > + cpu_stw_data(env, ptr + 16, env->fpdp); > + } > + cpu_stw_data(env, ptr + 12, env->fpcs & 0xffff); > + cpu_stw_data(env, ptr + 20, env->fpds & 0xffff); > } > > addr =3D ptr + 0x20; > @@ -1146,7 +1231,7 @@ void helper_fxsave(CPUX86State *env, > target_ulong ptr, int data64) > } > } > > -void helper_fxrstor(CPUX86State *env, target_ulong ptr, int data64) > +void helper_fxrstor(CPUX86State *env, target_ulong ptr, int data32, int > data64) > { > int i, fpus, fptag, nb_xmm_regs; > floatx80 tmp; > @@ -1167,6 +1252,30 @@ void helper_fxrstor(CPUX86State *env, > target_ulong ptr, int data64) > env->fptags[i] =3D ((fptag >> i) & 1); > } > > + env->fpop =3D (cpu_lduw_data(env, ptr + 6) >> 5) & 0x7ff; > + > +#ifdef TARGET_X86_64 > + if (data64) { > + /* 64 bit */ > + env->fpip =3D cpu_ldq_data(env, ptr + 8); > + env->fpdp =3D cpu_ldq_data(env, ptr + 16); > + } else > +#endif > + { > + if (data32) { > + /* 32 bit */ > + env->fpip =3D cpu_ldl_data(env, ptr + 8); > + env->fpdp =3D cpu_ldl_data(env, ptr + 16); > + } else { > + /* 16 bit */ > + env->fpip =3D cpu_lduw_data(env, ptr + 8); > + env->fpdp =3D cpu_lduw_data(env, ptr + 16); > + } > + > + env->fpcs =3D cpu_lduw_data(env, ptr + 12); > + env->fpds =3D cpu_lduw_data(env, ptr + 20); > + } > + > addr =3D ptr + 0x20; > for (i =3D 0; i < 8; i++) { > tmp =3D helper_fldt(env, addr); > @@ -1195,6 +1304,11 @@ void helper_fxrstor(CPUX86State *env, > target_ulong ptr, int data64) > } > } > } > + > + if (!data64) { > + env->fpip &=3D 0xffffffff; > + env->fpdp &=3D 0xffffffff; > + } > } > > void cpu_get_fp80(uint64_t *pmant, uint16_t *pexp, floatx80 f) > diff --git a/target-i386/helper.h b/target-i386/helper.h > index 8eb0145..9c4fd22 100644 > --- a/target-i386/helper.h > +++ b/target-i386/helper.h > @@ -183,12 +183,12 @@ DEF_HELPER_1(frndint, void, env) > DEF_HELPER_1(fscale, void, env) > DEF_HELPER_1(fsin, void, env) > DEF_HELPER_1(fcos, void, env) > -DEF_HELPER_3(fstenv, void, env, tl, int) > -DEF_HELPER_3(fldenv, void, env, tl, int) > -DEF_HELPER_3(fsave, void, env, tl, int) > -DEF_HELPER_3(frstor, void, env, tl, int) > -DEF_HELPER_3(fxsave, void, env, tl, int) > -DEF_HELPER_3(fxrstor, void, env, tl, int) > +DEF_HELPER_4(fstenv, void, env, tl, int, int) > +DEF_HELPER_4(fldenv, void, env, tl, int, int) > +DEF_HELPER_4(fsave, void, env, tl, int, int) > +DEF_HELPER_4(frstor, void, env, tl, int, int) > +DEF_HELPER_4(fxsave, void, env, tl, int, int) > +DEF_HELPER_4(fxrstor, void, env, tl, int, int) > > DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RWG_SE, tl, tl) > DEF_HELPER_FLAGS_1(ctz, TCG_CALL_NO_RWG_SE, tl, tl) > diff --git a/target-i386/machine.c b/target-i386/machine.c > index 16d2f6a..500f04f 100644 > --- a/target-i386/machine.c > +++ b/target-i386/machine.c > @@ -397,7 +397,7 @@ static const VMStateDescription vmstate_fpop_ip_dp = =3D { > .version_id =3D 1, > .minimum_version_id =3D 1, > .fields =3D (VMStateField[]) { > - VMSTATE_UINT16(env.fpop, X86CPU), > + VMSTATE_UINT32(env.fpop, X86CPU), > VMSTATE_UINT64(env.fpip, X86CPU), > VMSTATE_UINT64(env.fpdp, X86CPU), > VMSTATE_END_OF_LIST() > diff --git a/target-i386/translate.c b/target-i386/translate.c > index 6fcd824..8e490de 100644 > --- a/target-i386/translate.c > +++ b/target-i386/translate.c > @@ -58,6 +58,9 @@ > #endif > > //#define MACRO_TEST 1 > +#define IS_PROTECTED_MODE(s) (s->pe && !s->vm86) > +#define FP_EP_VALID 0x80000000 > +#define FP_EP_INVALID 0 > > /* global register indexes */ > static TCGv_ptr cpu_env; > @@ -65,6 +68,11 @@ static TCGv cpu_A0; > static TCGv cpu_cc_dst, cpu_cc_src, cpu_cc_src2, cpu_cc_srcT; > static TCGv_i32 cpu_cc_op; > static TCGv cpu_regs[CPU_NB_REGS]; > +static TCGv_i32 cpu_fpop; > +static TCGv cpu_fpip; > +static TCGv cpu_fpdp; > +static TCGv_i32 cpu_fpds; > +static TCGv_i32 cpu_fpcs; > /* local temps */ > static TCGv cpu_T[2]; > /* local register indexes (only used inside old micro ops) */ > @@ -74,6 +82,9 @@ static TCGv_i32 cpu_tmp2_i32, cpu_tmp3_i32; > static TCGv_i64 cpu_tmp1_i64; > > static uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; > +static uint16_t gen_opc_fp_op[OPC_BUF_SIZE]; > +static uint16_t gen_opc_fp_cs[OPC_BUF_SIZE]; > +static target_ulong gen_opc_fp_ip[OPC_BUF_SIZE]; > > #include "exec/gen-icount.h" > > @@ -104,6 +115,10 @@ typedef struct DisasContext { > int ss32; /* 32 bit stack segment */ > CCOp cc_op; /* current CC operation */ > bool cc_op_dirty; > + uint16_t fp_op; > + bool fp_ep_dirty; > + target_ulong fp_ip; > + uint16_t fp_cs; > int addseg; /* non zero if either DS/ES/SS have a non zero base */ > int f_st; /* currently unused */ > int vm86; /* vm86 mode */ > @@ -208,6 +223,62 @@ static const uint8_t cc_op_live[CC_OP_NB] =3D { > [CC_OP_CLR] =3D 0, > }; > > +static inline bool instr_is_x87_nc(int modrm, int b) > +{ > + int op, mod, rm; > + switch (b) { > + case 0xd8 ... 0xdf: > + /* floats */ > + op =3D ((b & 7) << 3) | ((modrm >> 3) & 7); > + mod =3D (modrm >> 6) & 3; > + rm =3D modrm & 7; > + if (mod !=3D 3) { > + /* memory */ > + switch (op) { > + case 0x0c: /* fldenv */ > + case 0x0d: /* fldcw */ > + case 0x0e: /* fstenv, fnstenv */ > + case 0x0f: /* fstcw, fnstcw */ > + case 0x2c: /* frstor */ > + case 0x2e: /* fsave, fnsave */ > + case 0x2f: /* fstsw, fnstsw */ > + return false; > + default: > + return true; > + } > + } else { > + /* register */ > + switch (op) { > + case 0x0a: > + return false; /* fnop, Illegal op */ > + case 0x0e: /* fdecstp, fincstp */ > + case 0x28: /* ffree */ > + return false; > + case 0x1c: > + switch (rm) { > + case 1: /* feni */ > + return true; > + case 2: /* fclex, fnclex */ > + case 3: /* finit, fninit */ > + return false; > + case 4: /* fsetpm */ > + return true; > + default: /* Illegal op */ > + return false; > + } > + case 0x3c: > + return false; /* fstsw, fnstsw, Illegal op */ > + default: > + return true; > + } > + } > + /*case 0x9b: // fwait, wait > + return false;*/ > + default: > + return false; > + } > +} > + > static void set_cc_op(DisasContext *s, CCOp op) > { > int dead; > @@ -253,6 +324,23 @@ static void gen_update_cc_op(DisasContext *s) > } > } > > +static void set_ep(DisasContext *s, int fp_op, int fp_ip, int fp_cs) { > + s->fp_op =3D FP_EP_VALID | fp_op; > + s->fp_ip =3D fp_ip; > + s->fp_cs =3D fp_cs; > + s->fp_ep_dirty =3D true; > +} > + > +static void gen_update_ep(DisasContext *s) > +{ > + if (s->fp_ep_dirty) { > + tcg_gen_movi_i32(cpu_fpop, s->fp_op); > + tcg_gen_movi_tl(cpu_fpip, s->fp_ip); > + tcg_gen_movi_i32(cpu_fpcs, s->fp_cs); > + s->fp_ep_dirty =3D false; > + } > +} > + > #ifdef TARGET_X86_64 > > #define NB_OP_SIZES 4 > @@ -666,6 +754,7 @@ static void gen_check_io(DisasContext *s, TCGMemOp > ot, target_ulong cur_eip, > state_saved =3D 0; > if (s->pe && (s->cpl > s->iopl || s->vm86)) { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(cur_eip); > state_saved =3D 1; > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > @@ -686,6 +775,7 @@ static void gen_check_io(DisasContext *s, TCGMemOp > ot, target_ulong cur_eip, > if(s->flags & HF_SVMI_MASK) { > if (!state_saved) { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(cur_eip); > } > svm_flags |=3D (1 << (4 + ot)); > @@ -1097,6 +1187,7 @@ static inline void gen_jcc1(DisasContext *s, int > b, int l1) > CCPrepare cc =3D gen_prepare_cc(s, b, cpu_T[0]); > > gen_update_cc_op(s); > + gen_update_ep(s); > if (cc.mask !=3D -1) { > tcg_gen_andi_tl(cpu_T[0], cc.reg, cc.mask); > cc.reg =3D cpu_T[0]; > @@ -1580,14 +1671,14 @@ static void gen_rot_rm_T1(DisasContext *s, > TCGMemOp ot, int op1, int is_right) > t0 =3D tcg_const_i32(0); > t1 =3D tcg_temp_new_i32(); > tcg_gen_trunc_tl_i32(t1, cpu_T[1]); > - tcg_gen_movi_i32(cpu_tmp2_i32, CC_OP_ADCOX); > + tcg_gen_movi_i32(cpu_tmp2_i32, CC_OP_ADCOX); > tcg_gen_movi_i32(cpu_tmp3_i32, CC_OP_EFLAGS); > tcg_gen_movcond_i32(TCG_COND_NE, cpu_cc_op, t1, t0, > cpu_tmp2_i32, cpu_tmp3_i32); > tcg_temp_free_i32(t0); > tcg_temp_free_i32(t1); > > - /* The CC_OP value is no longer predictable. */ > + /* The CC_OP value is no longer predictable. */ > set_cc_op(s, CC_OP_DYNAMIC); > } > > @@ -1863,7 +1954,7 @@ static void gen_shifti(DisasContext *s1, int op, > TCGMemOp ot, int d, int c) > } > } > > -static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) > +static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm, > int b) > { > target_long disp; > int havesib; > @@ -1871,6 +1962,7 @@ static void gen_lea_modrm(CPUX86State *env, > DisasContext *s, int modrm) > int index; > int scale; > int mod, rm, code, override, must_add_seg; > + int curr_instr_is_x87_nc; > TCGv sum; > > override =3D s->override; > @@ -1950,6 +2042,13 @@ static void gen_lea_modrm(CPUX86State *env, > DisasContext *s, int modrm) > tcg_gen_addi_tl(cpu_A0, sum, disp); > } > > + curr_instr_is_x87_nc =3D instr_is_x87_nc(modrm, b); > + if (curr_instr_is_x87_nc) { > + tcg_gen_mov_tl(cpu_fpdp, cpu_A0); > + if (s->aflag =3D=3D MO_32) { > + tcg_gen_ext32u_tl(cpu_fpdp, cpu_fpdp); > + } > + } > if (must_add_seg) { > if (override < 0) { > if (base =3D=3D R_EBP || base =3D=3D R_ESP) { > @@ -1961,6 +2060,12 @@ static void gen_lea_modrm(CPUX86State *env, > DisasContext *s, int modrm) > > tcg_gen_ld_tl(cpu_tmp0, cpu_env, > offsetof(CPUX86State, segs[override].base)); > + > + if (curr_instr_is_x87_nc) { > + tcg_gen_ld_i32(cpu_fpds, cpu_env, > + offsetof(CPUX86State, > segs[override].selector)); > + } > + > if (CODE64(s)) { > if (s->aflag =3D=3D MO_32) { > tcg_gen_ext32u_tl(cpu_A0, cpu_A0); > @@ -1970,6 +2075,11 @@ static void gen_lea_modrm(CPUX86State *env, > DisasContext *s, int modrm) > } > > tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0); > + } else { > + if (curr_instr_is_x87_nc) { > + tcg_gen_ld_i32(cpu_fpds, cpu_env, > + offsetof(CPUX86State, segs[R_DS].selector)= ); > + } > } > > if (s->aflag =3D=3D MO_32) { > @@ -2039,8 +2149,22 @@ static void gen_lea_modrm(CPUX86State *env, > DisasContext *s, int modrm) > override =3D R_DS; > } > } > + if (instr_is_x87_nc(modrm, b)) { > + tcg_gen_mov_tl(cpu_fpdp, cpu_A0); > + tcg_gen_ld_i32(cpu_fpds, cpu_env, > + offsetof(CPUX86State, > segs[override].selector)); > + } > gen_op_addl_A0_seg(s, override); > + } else { > + if (instr_is_x87_nc(modrm, b)) { > + tcg_gen_mov_tl(cpu_fpdp, cpu_A0); > + tcg_gen_ld_i32(cpu_fpds, cpu_env, > + offsetof(CPUX86State, segs[R_DS].selector)= ); > + } > } > +#ifdef TARGET_X86_64 > + tcg_gen_andi_tl(cpu_fpdp, cpu_fpdp, 0xffffffff); > +#endif > break; > > default: > @@ -2130,7 +2254,7 @@ static void gen_add_A0_ds_seg(DisasContext *s) > /* generate modrm memory load or store of 'reg'. TMP0 is used if reg =3D= =3D > OR_TMP0 */ > static void gen_ldst_modrm(CPUX86State *env, DisasContext *s, int modrm, > - TCGMemOp ot, int reg, int is_store) > + TCGMemOp ot, int reg, int is_store, int b) > { > int mod, rm; > > @@ -2147,7 +2271,7 @@ static void gen_ldst_modrm(CPUX86State *env, > DisasContext *s, int modrm, > gen_op_mov_reg_v(ot, reg, cpu_T[0]); > } > } else { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > if (is_store) { > if (reg !=3D OR_TMP0) > gen_op_mov_v_reg(ot, cpu_T[0], reg); > @@ -2250,7 +2374,7 @@ static void gen_cmovcc1(CPUX86State *env, > DisasContext *s, TCGMemOp ot, int b, > { > CCPrepare cc; > > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > > cc =3D gen_prepare_cc(s, b, cpu_T[1]); > if (cc.mask !=3D -1) { > @@ -2297,6 +2421,7 @@ static void gen_movl_seg_T0(DisasContext *s, int > seg_reg, target_ulong cur_eip) > if (s->pe && !s->vm86) { > /* XXX: optimize by finding processor state dynamically */ > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(cur_eip); > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > gen_helper_load_seg(cpu_env, tcg_const_i32(seg_reg), > cpu_tmp2_i32); > @@ -2326,6 +2451,7 @@ gen_svm_check_intercept_param(DisasContext *s, > target_ulong pc_start, > if (likely(!(s->flags & HF_SVMI_MASK))) > return; > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_svm_check_intercept_param(cpu_env, tcg_const_i32(type), > tcg_const_i64(param)); > @@ -2513,6 +2639,7 @@ static void gen_enter(DisasContext *s, int > esp_addend, int level) > static void gen_exception(DisasContext *s, int trapno, target_ulong > cur_eip) > { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(cur_eip); > gen_helper_raise_exception(cpu_env, tcg_const_i32(trapno)); > s->is_jmp =3D DISAS_TB_JUMP; > @@ -2524,6 +2651,7 @@ static void gen_interrupt(DisasContext *s, int intn= o, > target_ulong cur_eip, target_ulong next_eip) > { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(cur_eip); > gen_helper_raise_interrupt(cpu_env, tcg_const_i32(intno), > tcg_const_i32(next_eip - cur_eip)); > @@ -2533,6 +2661,7 @@ static void gen_interrupt(DisasContext *s, int intn= o, > static void gen_debug(DisasContext *s, target_ulong cur_eip) > { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(cur_eip); > gen_helper_debug(cpu_env); > s->is_jmp =3D DISAS_TB_JUMP; > @@ -2543,6 +2672,7 @@ static void gen_debug(DisasContext *s, > target_ulong cur_eip) > static void gen_eob(DisasContext *s) > { > gen_update_cc_op(s); > + gen_update_ep(s); > if (s->tb->flags & HF_INHIBIT_IRQ_MASK) { > gen_helper_reset_inhibit_irq(cpu_env); > } > @@ -2564,6 +2694,7 @@ static void gen_eob(DisasContext *s) > static void gen_jmp_tb(DisasContext *s, target_ulong eip, int tb_num) > { > gen_update_cc_op(s); > + gen_update_ep(s); > set_cc_op(s, CC_OP_DYNAMIC); > if (s->jmp_opt) { > gen_goto_tb(s, tb_num, eip); > @@ -3043,7 +3174,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x0e7: /* movntq */ > if (mod =3D=3D 3) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_stq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); > break; > case 0x1e7: /* movntdq */ > @@ -3051,20 +3182,20 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x12b: /* movntps */ > if (mod =3D=3D 3) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_sto_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); > break; > case 0x3f0: /* lddqu */ > if (mod =3D=3D 3) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); > break; > case 0x22b: /* movntss */ > case 0x32b: /* movntsd */ > if (mod =3D=3D 3) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > if (b1 & 1) { > gen_stq_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); > } else { > @@ -3076,13 +3207,13 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x6e: /* movd mm, ea */ > #ifdef TARGET_X86_64 > if (s->dflag =3D=3D MO_64) { > - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0, b); > tcg_gen_st_tl(cpu_T[0], cpu_env, > offsetof(CPUX86State,fpregs[reg].mmx)); > } else > #endif > { > - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0); > - tcg_gen_addi_ptr(cpu_ptr0, cpu_env, > + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0, b); > + tcg_gen_addi_ptr(cpu_ptr0, cpu_env, > offsetof(CPUX86State,fpregs[reg].mmx)); > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > gen_helper_movl_mm_T0_mmx(cpu_ptr0, cpu_tmp2_i32); > @@ -3091,15 +3222,15 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x16e: /* movd xmm, ea */ > #ifdef TARGET_X86_64 > if (s->dflag =3D=3D MO_64) { > - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0); > - tcg_gen_addi_ptr(cpu_ptr0, cpu_env, > + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0, b); > + tcg_gen_addi_ptr(cpu_ptr0, cpu_env, > offsetof(CPUX86State,xmm_regs[reg])); > gen_helper_movq_mm_T0_xmm(cpu_ptr0, cpu_T[0]); > } else > #endif > { > - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0); > - tcg_gen_addi_ptr(cpu_ptr0, cpu_env, > + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0, b); > + tcg_gen_addi_ptr(cpu_ptr0, cpu_env, > offsetof(CPUX86State,xmm_regs[reg])); > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > gen_helper_movl_mm_T0_xmm(cpu_ptr0, cpu_tmp2_i32); > @@ -3107,7 +3238,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x6f: /* movq mm, ea */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)= ); > } else { > rm =3D (modrm & 7); > @@ -3124,7 +3255,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x16f: /* movdqa xmm, ea */ > case 0x26f: /* movdqu xmm, ea */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); > } else { > rm =3D (modrm & 7) | REX_B(s); > @@ -3134,7 +3265,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x210: /* movss xmm, ea */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, MO_32, cpu_T[0], cpu_A0); > tcg_gen_st32_tl(cpu_T[0], cpu_env, > offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); > tcg_gen_movi_tl(cpu_T[0], 0); > @@ -3149,7 +3280,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x310: /* movsd xmm, ea */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(0))); > tcg_gen_movi_tl(cpu_T[0], 0); > @@ -3164,7 +3295,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x012: /* movlps */ > case 0x112: /* movlpd */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(0))); > } else { > @@ -3176,7 +3307,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x212: /* movsldup */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); > } else { > rm =3D (modrm & 7) | REX_B(s); > @@ -3192,7 +3323,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x312: /* movddup */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(0))); > } else { > @@ -3206,7 +3337,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x016: /* movhps */ > case 0x116: /* movhpd */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(1))); > } else { > @@ -3218,7 +3349,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x216: /* movshdup */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); > } else { > rm =3D (modrm & 7) | REX_B(s); > @@ -3256,34 +3387,34 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x7e: /* movd ea, mm */ > #ifdef TARGET_X86_64 > if (s->dflag =3D=3D MO_64) { > - tcg_gen_ld_i64(cpu_T[0], cpu_env, > + tcg_gen_ld_i64(cpu_T[0], cpu_env, > offsetof(CPUX86State,fpregs[reg].mmx)); > - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1, b); > } else > #endif > { > - tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > + tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > > offsetof(CPUX86State,fpregs[reg].mmx.MMX_L(0))); > - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1, b); > } > break; > case 0x17e: /* movd ea, xmm */ > #ifdef TARGET_X86_64 > if (s->dflag =3D=3D MO_64) { > - tcg_gen_ld_i64(cpu_T[0], cpu_env, > + tcg_gen_ld_i64(cpu_T[0], cpu_env, > > offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0))); > - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1, b); > } else > #endif > { > - tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > + tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > > offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); > - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1, b); > } > break; > case 0x27e: /* movq xmm, ea */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(0))); > } else { > @@ -3295,7 +3426,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x7f: /* movq ea, mm */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_stq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)= ); > } else { > rm =3D (modrm & 7); > @@ -3310,7 +3441,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x17f: /* movdqa ea, xmm */ > case 0x27f: /* movdqu ea, xmm */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_sto_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); > } else { > rm =3D (modrm & 7) | REX_B(s); > @@ -3320,7 +3451,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x211: /* movss ea, xmm */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); > gen_op_st_v(s, MO_32, cpu_T[0], cpu_A0); > } else { > @@ -3331,7 +3462,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x311: /* movsd ea, xmm */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_stq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(0))); > } else { > @@ -3343,7 +3474,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x013: /* movlps */ > case 0x113: /* movlpd */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_stq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(0))); > } else { > @@ -3353,7 +3484,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x017: /* movhps */ > case 0x117: /* movhpd */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_stq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(1))); > } else { > @@ -3417,7 +3548,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x12a: /* cvtpi2pd */ > gen_helper_enter_mmx(cpu_env); > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > op2_offset =3D offsetof(CPUX86State,mmx_t0); > gen_ldq_env_A0(s, op2_offset); > } else { > @@ -3440,7 +3571,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x22a: /* cvtsi2ss */ > case 0x32a: /* cvtsi2sd */ > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > op1_offset =3D offsetof(CPUX86State,xmm_regs[reg]); > tcg_gen_addi_ptr(cpu_ptr0, cpu_env, op1_offset); > if (ot =3D=3D MO_32) { > @@ -3462,7 +3593,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x12d: /* cvtpd2pi */ > gen_helper_enter_mmx(cpu_env); > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > op2_offset =3D offsetof(CPUX86State,xmm_t0); > gen_ldo_env_A0(s, op2_offset); > } else { > @@ -3493,7 +3624,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0x32d: /* cvtsd2si */ > ot =3D mo_64_32(s->dflag); > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > if ((b >> 8) & 1) { > gen_ldq_env_A0(s, offsetof(CPUX86State, > xmm_t0.XMM_Q(0))); > } else { > @@ -3525,7 +3656,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > case 0xc4: /* pinsrw */ > case 0x1c4: > s->rip_offset =3D 1; > - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); > val =3D cpu_ldub_code(env, s->pc++); > if (b1) { > val &=3D 7; > @@ -3559,7 +3690,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > break; > case 0x1d6: /* movq ea, xmm */ > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_stq_env_A0(s, offsetof(CPUX86State, > xmm_regs[reg].XMM_Q(0))); > } else { > @@ -3626,7 +3757,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > op2_offset =3D offsetof(CPUX86State,xmm_regs[rm | > REX_B(s)]); > } else { > op2_offset =3D offsetof(CPUX86State,xmm_t0); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > switch (b) { > case 0x20: case 0x30: /* pmovsxbw, pmovzxbw */ > case 0x23: case 0x33: /* pmovsxwd, pmovzxwd */ > @@ -3660,7 +3791,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); > } else { > op2_offset =3D offsetof(CPUX86State,mmx_t0); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldq_env_A0(s, op2_offset); > } > } > @@ -3701,7 +3832,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > } > > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_regs[reg]); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > gen_helper_crc32(cpu_T[0], cpu_tmp2_i32, > cpu_T[0], tcg_const_i32(8 << ot)); > > @@ -3729,7 +3860,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > ot =3D MO_64; > } > > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > if ((b & 1) =3D=3D 0) { > tcg_gen_qemu_ld_tl(cpu_T[0], cpu_A0, > s->mem_index, ot | MO_BE); > @@ -3747,7 +3878,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > goto illegal_op; > } > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > tcg_gen_andc_tl(cpu_T[0], cpu_regs[s->vex_v], cpu_T[0]); > gen_op_mov_reg_v(ot, reg, cpu_T[0]); > gen_op_update1_cc(); > @@ -3764,7 +3895,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > { > TCGv bound, zero; > > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > /* Extract START, and shift the operand. > Shifts larger than operand size get zeros. */ > tcg_gen_ext8u_tl(cpu_A0, cpu_regs[s->vex_v]); > @@ -3801,7 +3932,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > goto illegal_op; > } > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > tcg_gen_ext8u_tl(cpu_T[1], cpu_regs[s->vex_v]); > { > TCGv bound =3D tcg_const_tl(ot =3D=3D MO_64 ? 63 : 3= 1); > @@ -3828,7 +3959,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > goto illegal_op; > } > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > switch (ot) { > default: > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > @@ -3854,7 +3985,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > goto illegal_op; > } > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > /* Note that by zero-extending the mask operand, we > automatically handle zero-extending the result. */ > if (ot =3D=3D MO_64) { > @@ -3872,7 +4003,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > goto illegal_op; > } > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > /* Note that by zero-extending the mask operand, we > automatically handle zero-extending the result. */ > if (ot =3D=3D MO_64) { > @@ -3892,7 +4023,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > int end_op; > > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > > /* Re-use the carry-out from a previous round. */ > TCGV_UNUSED(carry_in); > @@ -3971,7 +4102,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > goto illegal_op; > } > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > if (ot =3D=3D MO_64) { > tcg_gen_andi_tl(cpu_T[1], cpu_regs[s->vex_v], 63); > } else { > @@ -4003,7 +4134,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > goto illegal_op; > } > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > > switch (reg & 7) { > case 1: /* blsr By,Ey */ > @@ -4062,7 +4193,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > ot =3D mo_64_32(s->dflag); > rm =3D (modrm & 7) | REX_B(s); > if (mod !=3D 3) > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > reg =3D ((modrm >> 3) & 7) | rex_r; > val =3D cpu_ldub_code(env, s->pc++); > switch (b) { > @@ -4199,7 +4330,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > op2_offset =3D offsetof(CPUX86State,xmm_regs[rm | > REX_B(s)]); > } else { > op2_offset =3D offsetof(CPUX86State,xmm_t0); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldo_env_A0(s, op2_offset); > } > } else { > @@ -4208,7 +4339,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); > } else { > op2_offset =3D offsetof(CPUX86State,mmx_t0); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_ldq_env_A0(s, op2_offset); > } > } > @@ -4242,7 +4373,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > goto illegal_op; > } > ot =3D mo_64_32(s->dflag); > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > b =3D cpu_ldub_code(env, s->pc++); > if (ot =3D=3D MO_64) { > tcg_gen_rotri_tl(cpu_T[0], cpu_T[0], b & 63); > @@ -4278,7 +4409,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > if (mod !=3D 3) { > int sz =3D 4; > > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > op2_offset =3D offsetof(CPUX86State,xmm_t0); > > switch (b) { > @@ -4326,7 +4457,7 @@ static void gen_sse(CPUX86State *env, > DisasContext *s, int b, > } else { > op1_offset =3D offsetof(CPUX86State,fpregs[reg].mmx); > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > op2_offset =3D offsetof(CPUX86State,mmx_t0); > gen_ldq_env_A0(s, op2_offset); > } else { > @@ -4404,6 +4535,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > int modrm, reg, rm, mod, op, opreg, val; > target_ulong next_eip, tval; > int rex_w, rex_r; > + int fp_op, fp_ip, fp_cs; > > if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT)))= { > tcg_gen_debug_insn_start(pc_start); > @@ -4595,7 +4727,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > mod =3D (modrm >> 6) & 3; > rm =3D (modrm & 7) | REX_B(s); > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > opreg =3D OR_TMP0; > } else if (op =3D=3D OP_XORL && rm =3D=3D reg) { > xor_zero: > @@ -4616,7 +4748,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > reg =3D ((modrm >> 3) & 7) | rex_r; > rm =3D (modrm & 7) | REX_B(s); > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, ot, cpu_T[1], cpu_A0); > } else if (op =3D=3D OP_XORL && rm =3D=3D reg) { > goto xor_zero; > @@ -4655,7 +4787,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > s->rip_offset =3D 1; > else > s->rip_offset =3D insn_const_size(ot); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > opreg =3D OR_TMP0; > } else { > opreg =3D rm; > @@ -4698,7 +4830,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > if (mod !=3D 3) { > if (op =3D=3D 0) > s->rip_offset =3D insn_const_size(ot); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, ot, cpu_T[0], cpu_A0); > } else { > gen_op_mov_v_reg(ot, cpu_T[0], rm); > @@ -4906,7 +5038,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > } > } > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > if (op >=3D 2 && op !=3D 3 && op !=3D 5) > gen_op_ld_v(s, ot, cpu_T[0], cpu_A0); > } else { > @@ -4946,6 +5078,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > do_lcall: > if (s->pe && !s->vm86) { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > gen_helper_lcall_protected(cpu_env, cpu_tmp2_i32, > cpu_T[1], > @@ -4973,6 +5106,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > do_ljmp: > if (s->pe && !s->vm86) { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > gen_helper_ljmp_protected(cpu_env, cpu_tmp2_i32, cpu_T[1= ], > @@ -4998,7 +5132,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > modrm =3D cpu_ldub_code(env, s->pc++); > reg =3D ((modrm >> 3) & 7) | rex_r; > > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > gen_op_mov_v_reg(ot, cpu_T[1], reg); > gen_op_testl_T0_T1_cc(); > set_cc_op(s, CC_OP_LOGICB + ot); > @@ -5073,7 +5207,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > s->rip_offset =3D insn_const_size(ot); > else if (b =3D=3D 0x6b) > s->rip_offset =3D 1; > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > if (b =3D=3D 0x69) { > val =3D insn_get(env, s, ot); > tcg_gen_movi_tl(cpu_T[1], val); > @@ -5130,7 +5264,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_op_mov_reg_v(ot, reg, cpu_T[1]); > gen_op_mov_reg_v(ot, rm, cpu_T[0]); > } else { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_mov_v_reg(ot, cpu_T[0], reg); > gen_op_ld_v(s, ot, cpu_T[1], cpu_A0); > tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); > @@ -5159,7 +5293,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > rm =3D (modrm & 7) | REX_B(s); > gen_op_mov_v_reg(ot, t0, rm); > } else { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > tcg_gen_mov_tl(a0, cpu_A0); > gen_op_ld_v(s, ot, t0, a0); > rm =3D 0; /* avoid warning */ > @@ -5207,16 +5341,16 @@ static target_ulong disas_insn(CPUX86State > *env, DisasContext *s, > goto illegal_op; > gen_jmp_im(pc_start - s->cs_base); > gen_update_cc_op(s); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_helper_cmpxchg16b(cpu_env, cpu_A0); > } else > -#endif > +#endif > { > if (!(s->cpuid_features & CPUID_CX8)) > goto illegal_op; > gen_jmp_im(pc_start - s->cs_base); > gen_update_cc_op(s); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_helper_cmpxchg8b(cpu_env, cpu_A0); > } > set_cc_op(s, CC_OP_EFLAGS); > @@ -5266,7 +5400,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > } else { > /* NOTE: order is important too for MMU exceptions */ > s->popl_esp_hack =3D 1 << ot; > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1, b); > s->popl_esp_hack =3D 0; > gen_pop_update(s, ot); > } > @@ -5352,7 +5486,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > reg =3D ((modrm >> 3) & 7) | rex_r; > > /* generate a generic store */ > - gen_ldst_modrm(env, s, modrm, ot, reg, 1); > + gen_ldst_modrm(env, s, modrm, ot, reg, 1, b); > break; > case 0xc6: > case 0xc7: /* mov Ev, Iv */ > @@ -5361,7 +5495,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > mod =3D (modrm >> 6) & 3; > if (mod !=3D 3) { > s->rip_offset =3D insn_const_size(ot); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > } > val =3D insn_get(env, s, ot); > tcg_gen_movi_tl(cpu_T[0], val); > @@ -5377,7 +5511,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > modrm =3D cpu_ldub_code(env, s->pc++); > reg =3D ((modrm >> 3) & 7) | rex_r; > > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > gen_op_mov_reg_v(ot, reg, cpu_T[0]); > break; > case 0x8e: /* mov seg, Gv */ > @@ -5385,7 +5519,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > reg =3D (modrm >> 3) & 7; > if (reg >=3D 6 || reg =3D=3D R_CS) > goto illegal_op; > - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); > gen_movl_seg_T0(s, reg, pc_start - s->cs_base); > if (reg =3D=3D R_SS) { > /* if reg =3D=3D SS, inhibit interrupts/trace */ > @@ -5408,7 +5542,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > goto illegal_op; > gen_op_movl_T0_seg(reg); > ot =3D mod =3D=3D 3 ? dflag : MO_16; > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1, b); > break; > > case 0x1b6: /* movzbS Gv, Eb */ > @@ -5450,7 +5584,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > } > gen_op_mov_reg_v(d_ot, reg, cpu_T[0]); > } else { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, s_ot, cpu_T[0], cpu_A0); > gen_op_mov_reg_v(d_ot, reg, cpu_T[0]); > } > @@ -5468,7 +5602,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > s->override =3D -1; > val =3D s->addseg; > s->addseg =3D 0; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > s->addseg =3D val; > gen_op_mov_reg_v(ot, reg, cpu_A0); > break; > @@ -5558,7 +5692,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_op_mov_reg_v(ot, rm, cpu_T[0]); > gen_op_mov_reg_v(ot, reg, cpu_T[1]); > } else { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_mov_v_reg(ot, cpu_T[0], reg); > /* for xchg, lock is implicit */ > if (!(prefixes & PREFIX_LOCK)) > @@ -5593,7 +5727,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > mod =3D (modrm >> 6) & 3; > if (mod =3D=3D 3) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, ot, cpu_T[1], cpu_A0); > gen_add_A0_im(s, 1 << ot); > /* load the segment first to handle exceptions properly */ > @@ -5624,7 +5758,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > if (shift =3D=3D 2) { > s->rip_offset =3D 1; > } > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > opreg =3D OR_TMP0; > } else { > opreg =3D (modrm & 7) | REX_B(s); > @@ -5674,7 +5808,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > rm =3D (modrm & 7) | REX_B(s); > reg =3D ((modrm >> 3) & 7) | rex_r; > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > opreg =3D OR_TMP0; > } else { > opreg =3D rm; > @@ -5705,7 +5839,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > op =3D ((b & 7) << 3) | ((modrm >> 3) & 7); > if (mod !=3D 3) { > /* memory op */ > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > switch(op) { > case 0x00 ... 0x07: /* fxxxs */ > case 0x10 ... 0x17: /* fixxxl */ > @@ -5832,7 +5966,9 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > case 0x0c: /* fldenv mem */ > gen_update_cc_op(s); > gen_jmp_im(pc_start - s->cs_base); > - gen_helper_fldenv(cpu_env, cpu_A0, tcg_const_i32(dflag - > 1)); > + gen_helper_fldenv(cpu_env, cpu_A0, > + tcg_const_i32(dflag =3D=3D MO_32), > + tcg_const_i32(IS_PROTECTED_MODE(s))); > break; > case 0x0d: /* fldcw mem */ > tcg_gen_qemu_ld_i32(cpu_tmp2_i32, cpu_A0, > @@ -5841,8 +5977,11 @@ static target_ulong disas_insn(CPUX86State > *env, DisasContext *s, > break; > case 0x0e: /* fnstenv mem */ > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > - gen_helper_fstenv(cpu_env, cpu_A0, tcg_const_i32(dflag - > 1)); > + gen_helper_fstenv(cpu_env, cpu_A0, > + tcg_const_i32(dflag =3D=3D MO_32), > + tcg_const_i32(IS_PROTECTED_MODE(s))); > break; > case 0x0f: /* fnstcw mem */ > gen_helper_fnstcw(cpu_tmp2_i32, cpu_env); > @@ -5863,12 +6002,17 @@ static target_ulong disas_insn(CPUX86State > *env, DisasContext *s, > case 0x2c: /* frstor mem */ > gen_update_cc_op(s); > gen_jmp_im(pc_start - s->cs_base); > - gen_helper_frstor(cpu_env, cpu_A0, tcg_const_i32(dflag - > 1)); > + gen_helper_frstor(cpu_env, cpu_A0, > + tcg_const_i32(dflag =3D=3D MO_32), > + tcg_const_i32(IS_PROTECTED_MODE(s))); > break; > case 0x2e: /* fnsave mem */ > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > - gen_helper_fsave(cpu_env, cpu_A0, tcg_const_i32(dflag - > 1)); > + gen_helper_fsave(cpu_env, cpu_A0, > + tcg_const_i32(dflag =3D=3D MO_32), > + tcg_const_i32(IS_PROTECTED_MODE(s))); > break; > case 0x2f: /* fnstsw mem */ > gen_helper_fnstsw(cpu_tmp2_i32, cpu_env); > @@ -6209,6 +6353,12 @@ static target_ulong disas_insn(CPUX86State > *env, DisasContext *s, > goto illegal_op; > } > } > + if (instr_is_x87_nc(modrm, b)) { > + fp_op =3D ((b & 0x7) << 8) | (modrm & 0xff); > + fp_ip =3D pc_start - s->cs_base; > + fp_cs =3D env->segs[R_CS].selector; > + set_ep(s, fp_op, fp_ip, fp_cs); > + } > break; > /************************/ > /* string ops */ > @@ -6393,6 +6543,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > do_lret: > if (s->pe && !s->vm86) { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_lret_protected(cpu_env, tcg_const_i32(dflag - 1), > tcg_const_i32(val)); > @@ -6430,6 +6581,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > } > } else { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_iret_protected(cpu_env, tcg_const_i32(dflag - 1), > tcg_const_i32(s->pc - s->cs_base))= ; > @@ -6527,7 +6679,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > case 0x190 ... 0x19f: /* setcc Gv */ > modrm =3D cpu_ldub_code(env, s->pc++); > gen_setcc1(s, b, cpu_T[0]); > - gen_ldst_modrm(env, s, modrm, MO_8, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, MO_8, OR_TMP0, 1, b); > break; > case 0x140 ... 0x14f: /* cmov Gv, Ev */ > if (!(s->cpuid_features & CPUID_CMOV)) { > @@ -6657,7 +6809,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > rm =3D (modrm & 7) | REX_B(s); > if (mod !=3D 3) { > s->rip_offset =3D 1; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, ot, cpu_T[0], cpu_A0); > } else { > gen_op_mov_v_reg(ot, cpu_T[0], rm); > @@ -6688,7 +6840,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > rm =3D (modrm & 7) | REX_B(s); > gen_op_mov_v_reg(MO_32, cpu_T[1], reg); > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > /* specific case: we need to add a displacement */ > gen_exts(ot, cpu_T[1]); > tcg_gen_sari_tl(cpu_tmp0, cpu_T[1], 3 + ot); > @@ -6764,7 +6916,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > ot =3D dflag; > modrm =3D cpu_ldub_code(env, s->pc++); > reg =3D ((modrm >> 3) & 7) | rex_r; > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > gen_extu(ot, cpu_T[0]); > > /* Note that lzcnt and tzcnt are in different extensions. */ > @@ -6884,6 +7036,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); > } else { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_fwait(cpu_env); > } > @@ -6903,6 +7056,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > if (CODE64(s)) > goto illegal_op; > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_into(cpu_env, tcg_const_i32(s->pc - pc_start)); > break; > @@ -6967,7 +7121,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > if (mod =3D=3D 3) > goto illegal_op; > gen_op_mov_v_reg(ot, cpu_T[0], reg); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_jmp_im(pc_start - s->cs_base); > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > if (ot =3D=3D MO_16) { > @@ -7095,6 +7249,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); > } else { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_sysexit(cpu_env, tcg_const_i32(dflag - 1)); > gen_eob(s); > @@ -7104,6 +7259,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > case 0x105: /* syscall */ > /* XXX: is it usable in real mode ? */ > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_syscall(cpu_env, tcg_const_i32(s->pc - pc_start)); > gen_eob(s); > @@ -7113,6 +7269,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); > } else { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_sysret(cpu_env, tcg_const_i32(dflag - 1)); > /* condition codes are modified only in long mode */ > @@ -7133,6 +7290,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); > } else { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_hlt(cpu_env, tcg_const_i32(s->pc - pc_start)); > s->is_jmp =3D DISAS_TB_JUMP; > @@ -7149,7 +7307,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_svm_check_intercept(s, pc_start, SVM_EXIT_LDTR_READ); > tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > offsetof(CPUX86State,ldt.selector)); > ot =3D mod =3D=3D 3 ? dflag : MO_16; > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1, b); > break; > case 2: /* lldt */ > if (!s->pe || s->vm86) > @@ -7158,7 +7316,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); > } else { > gen_svm_check_intercept(s, pc_start, SVM_EXIT_LDTR_WRITE= ); > - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); > gen_jmp_im(pc_start - s->cs_base); > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > gen_helper_lldt(cpu_env, cpu_tmp2_i32); > @@ -7170,7 +7328,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_svm_check_intercept(s, pc_start, SVM_EXIT_TR_READ); > tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > offsetof(CPUX86State,tr.selector)); > ot =3D mod =3D=3D 3 ? dflag : MO_16; > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1, b); > break; > case 3: /* ltr */ > if (!s->pe || s->vm86) > @@ -7179,7 +7337,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); > } else { > gen_svm_check_intercept(s, pc_start, SVM_EXIT_TR_WRITE); > - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); > gen_jmp_im(pc_start - s->cs_base); > tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); > gen_helper_ltr(cpu_env, cpu_tmp2_i32); > @@ -7189,7 +7347,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > case 5: /* verw */ > if (!s->pe || s->vm86) > goto illegal_op; > - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); > gen_update_cc_op(s); > if (op =3D=3D 4) { > gen_helper_verr(cpu_env, cpu_T[0]); > @@ -7212,7 +7370,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > if (mod =3D=3D 3) > goto illegal_op; > gen_svm_check_intercept(s, pc_start, SVM_EXIT_GDTR_READ); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > tcg_gen_ld32u_tl(cpu_T[0], cpu_env, offsetof(CPUX86State, > gdt.limit)); > gen_op_st_v(s, MO_16, cpu_T[0], cpu_A0); > gen_add_A0_im(s, 2); > @@ -7241,6 +7399,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > s->cpl !=3D 0) > goto illegal_op; > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > gen_helper_mwait(cpu_env, tcg_const_i32(s->pc - > pc_start)); > gen_eob(s); > @@ -7268,7 +7427,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > } > } else { /* sidt */ > gen_svm_check_intercept(s, pc_start, SVM_EXIT_IDTR_READ)= ; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > offsetof(CPUX86State, idt.limit)); > gen_op_st_v(s, MO_16, cpu_T[0], cpu_A0); > gen_add_A0_im(s, 2); > @@ -7371,7 +7530,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > } else { > gen_svm_check_intercept(s, pc_start, > op=3D=3D2 ? SVM_EXIT_GDTR_WRITE = : > SVM_EXIT_IDTR_WRITE); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, MO_16, cpu_T[1], cpu_A0); > gen_add_A0_im(s, 2); > gen_op_ld_v(s, CODE64(s) + MO_32, cpu_T[0], cpu_A0); > @@ -7394,14 +7553,14 @@ static target_ulong disas_insn(CPUX86State > *env, DisasContext *s, > #else > tcg_gen_ld32u_tl(cpu_T[0], cpu_env, > offsetof(CPUX86State,cr[0])); > #endif > - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 1); > + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 1, b); > break; > case 6: /* lmsw */ > if (s->cpl !=3D 0) { > gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); > } else { > gen_svm_check_intercept(s, pc_start, SVM_EXIT_WRITE_CR0)= ; > - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); > gen_helper_lmsw(cpu_env, cpu_T[0]); > gen_jmp_im(s->pc - s->cs_base); > gen_eob(s); > @@ -7413,8 +7572,9 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); > } else { > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_helper_invlpg(cpu_env, cpu_A0); > gen_jmp_im(s->pc - s->cs_base); > gen_eob(s); > @@ -7446,6 +7606,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > if (!(s->cpuid_ext2_features & CPUID_EXT2_RDTSCP)) > goto illegal_op; > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > if (use_icount) > gen_io_start(); > @@ -7493,7 +7654,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > } > gen_op_mov_reg_v(d_ot, reg, cpu_T[0]); > } else { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, MO_32 | MO_SIGN, cpu_T[0], cpu_A0); > gen_op_mov_reg_v(d_ot, reg, cpu_T[0]); > } > @@ -7514,7 +7675,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > mod =3D (modrm >> 6) & 3; > rm =3D modrm & 7; > if (mod !=3D 3) { > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_op_ld_v(s, ot, t0, cpu_A0); > a0 =3D tcg_temp_local_new(); > tcg_gen_mov_tl(a0, cpu_A0); > @@ -7556,7 +7717,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > ot =3D dflag !=3D MO_16 ? MO_32 : MO_16; > modrm =3D cpu_ldub_code(env, s->pc++); > reg =3D ((modrm >> 3) & 7) | rex_r; > - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0, b); > t0 =3D tcg_temp_local_new(); > gen_update_cc_op(s); > if (b =3D=3D 0x102) { > @@ -7584,7 +7745,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > case 3: /* prefetchnt0 */ > if (mod =3D=3D 3) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > /* nothing more to do */ > break; > default: /* nop (multi byte) */ > @@ -7624,6 +7785,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > case 4: > case 8: > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > if (b & 2) { > gen_op_mov_v_reg(ot, cpu_T[0], rm); > @@ -7696,7 +7858,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > goto illegal_op; > reg =3D ((modrm >> 3) & 7) | rex_r; > /* generate a generic store */ > - gen_ldst_modrm(env, s, modrm, ot, reg, 1); > + gen_ldst_modrm(env, s, modrm, ot, reg, 1, b); > break; > case 0x1ae: > modrm =3D cpu_ldub_code(env, s->pc++); > @@ -7704,6 +7866,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > op =3D (modrm >> 3) & 7; > switch(op) { > case 0: /* fxsave */ > + gen_update_ep(s); > if (mod =3D=3D 3 || !(s->cpuid_features & CPUID_FXSR) || > (s->prefix & PREFIX_LOCK)) > goto illegal_op; > @@ -7711,10 +7874,13 @@ static target_ulong disas_insn(CPUX86State > *env, DisasContext *s, > gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); > break; > } > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(pc_start - s->cs_base); > - gen_helper_fxsave(cpu_env, cpu_A0, tcg_const_i32(dflag =3D= =3D > MO_64)); > + gen_helper_fxsave(cpu_env, cpu_A0, > + tcg_const_i32(dflag =3D=3D MO_32), > + tcg_const_i32(dflag =3D=3D MO_64)); > break; > case 1: /* fxrstor */ > if (mod =3D=3D 3 || !(s->cpuid_features & CPUID_FXSR) || > @@ -7724,10 +7890,12 @@ static target_ulong disas_insn(CPUX86State > *env, DisasContext *s, > gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); > break; > } > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > gen_update_cc_op(s); > gen_jmp_im(pc_start - s->cs_base); > - gen_helper_fxrstor(cpu_env, cpu_A0, tcg_const_i32(dflag =3D= =3D > MO_64)); > + gen_helper_fxrstor(cpu_env, cpu_A0, > + tcg_const_i32(dflag =3D=3D MO_32), > + tcg_const_i32(dflag =3D=3D MO_64)); > break; > case 2: /* ldmxcsr */ > case 3: /* stmxcsr */ > @@ -7738,7 +7906,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > if ((s->flags & HF_EM_MASK) || !(s->flags & HF_OSFXSR_MASK) = || > mod =3D=3D 3) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > if (op =3D=3D 2) { > tcg_gen_qemu_ld_i32(cpu_tmp2_i32, cpu_A0, > s->mem_index, MO_LEUL); > @@ -7763,7 +7931,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > /* clflush */ > if (!(s->cpuid_features & CPUID_CLFLUSH)) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > } > break; > default: > @@ -7775,7 +7943,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > mod =3D (modrm >> 6) & 3; > if (mod =3D=3D 3) > goto illegal_op; > - gen_lea_modrm(env, s, modrm); > + gen_lea_modrm(env, s, modrm, b); > /* ignore for now */ > break; > case 0x1aa: /* rsm */ > @@ -7783,6 +7951,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > if (!(s->flags & HF_SMM_MASK)) > goto illegal_op; > gen_update_cc_op(s); > + gen_update_ep(s); > gen_jmp_im(s->pc - s->cs_base); > gen_helper_rsm(cpu_env); > gen_eob(s); > @@ -7803,7 +7972,7 @@ static target_ulong disas_insn(CPUX86State *env, > DisasContext *s, > ot =3D mo_64_32(dflag); > } > > - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); > + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0, b); > gen_helper_popcnt(cpu_T[0], cpu_env, cpu_T[0], tcg_const_i32(ot)= ); > gen_op_mov_reg_v(ot, reg, cpu_T[0]); > > @@ -7880,6 +8049,17 @@ void optimize_flags_init(void) > cpu_cc_src2 =3D tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, > cc_src2), > "cc_src2"); > > + cpu_fpop =3D tcg_global_mem_new_i32(TCG_AREG0, > + offsetof(CPUX86State, fpop), > "fpop"); > + cpu_fpip =3D tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, fpi= p), > + "fpip"); > + cpu_fpdp =3D tcg_global_mem_new(TCG_AREG0, offsetof(CPUX86State, fpd= p), > + "fpdp"); > + cpu_fpds =3D tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUX86State, > fpds), > + "fpds"); > + cpu_fpcs =3D tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUX86State, > fpcs), > + "fpcs"); > + > for (i =3D 0; i < CPU_NB_REGS; ++i) { > cpu_regs[i] =3D tcg_global_mem_new(TCG_AREG0, > offsetof(CPUX86State, regs[i]), > @@ -7924,6 +8104,8 @@ static inline void > gen_intermediate_code_internal(X86CPU *cpu, > dc->singlestep_enabled =3D cs->singlestep_enabled; > dc->cc_op =3D CC_OP_DYNAMIC; > dc->cc_op_dirty =3D false; > + dc->fp_op =3D FP_EP_INVALID; > + dc->fp_ep_dirty =3D false; > dc->cs_base =3D cs_base; > dc->tb =3D tb; > dc->popl_esp_hack =3D 0; > @@ -7997,6 +8179,9 @@ static inline void > gen_intermediate_code_internal(X86CPU *cpu, > } > tcg_ctx.gen_opc_pc[lj] =3D pc_ptr; > gen_opc_cc_op[lj] =3D dc->cc_op; > + gen_opc_fp_op[lj] =3D dc->fp_op; > + gen_opc_fp_ip[lj] =3D dc->fp_ip; > + gen_opc_fp_cs[lj] =3D dc->fp_cs; > tcg_ctx.gen_opc_instr_start[lj] =3D 1; > tcg_ctx.gen_opc_icount[lj] =3D num_insns; > } > @@ -8080,6 +8265,7 @@ void gen_intermediate_code_pc(CPUX86State *env, > TranslationBlock *tb) > void restore_state_to_opc(CPUX86State *env, TranslationBlock *tb, int > pc_pos) > { > int cc_op; > + uint16_t fp_op; > #ifdef DEBUG_DISAS > if (qemu_loglevel_mask(CPU_LOG_TB_OP)) { > int i; > @@ -8099,4 +8285,10 @@ void restore_state_to_opc(CPUX86State *env, > TranslationBlock *tb, int pc_pos) > cc_op =3D gen_opc_cc_op[pc_pos]; > if (cc_op !=3D CC_OP_DYNAMIC) > env->cc_op =3D cc_op; > + fp_op =3D gen_opc_fp_op[pc_pos]; > + if (fp_op & FP_EP_VALID) { > + tcg_gen_movi_i32(cpu_fpop, fp_op); > + tcg_gen_movi_tl(cpu_fpip, gen_opc_fp_ip[pc_pos]); > + tcg_gen_movi_i32(cpu_fpcs, gen_opc_fp_cs[pc_pos]); > + } > } > > On Sun, Jun 22, 2014 at 9:17 PM, Jaume Mart=C3=AD > wrote: > > Thanks Richard for your feedback. I am going to correct the patch and > > resubmit it. > > > > Best regards, > > Jaume > > > > On Sun, Jun 22, 2014 at 8:55 PM, Richard Henderson > wrote: > >> On 06/22/2014 07:55 AM, Jaume Mart=C3=AD wrote: > >>> - cpu_x86_fsave(env, fpstate_addr, 1); > >>> - fpstate->status =3D fpstate->sw; > >>> - magic =3D 0xffff; > >>> + cpu_x86_fsave(env, fpstate_addr); > >>> + fpstate->status =3D fpstate->sw; > >>> + magic =3D 0xffff; > >> > >> This patch needs to be split into format fixes and the actual change t= o > be > >> reviewed. > >> > >>> - /* KVM-only so far */ > >>> - uint16_t fpop; > >>> + union { > >>> + uint32_t tcg; > >>> + uint16_t kvm; > >>> + } fpop; > >> > >> This is highly questionable. > >> > >>> .fields =3D (VMStateField[]) { > >>> - VMSTATE_UINT16(env.fpop, X86CPU), > >>> + VMSTATE_UINT16(env.fpop.kvm, X86CPU), > >> > >> You're breaking save/restore in tcg. KVM is not required for migratio= n. > >> > >>> + if (non_control_x87_instr(modrm, b)) { > >>> + tcg_gen_movi_i32(cpu_fpop, ((b & 0x7) << 8) | (modrm & > 0xff)); > >>> + tcg_gen_movi_tl(cpu_fpip, pc_start - s->cs_base); > >>> + tcg_gen_movi_i32(cpu_fpcs, env->segs[R_CS].selector); > >>> + } > >> > >> I strongly suspect you can implement this feature without having to ad= d > 3 > >> (largely redundant) register writes to every x87 instruction executed. > >> > >> See how restore_state_to_opc works to compute the value of CC_OP durin= g > >> translation. You can do the same thing to recover these three values. > >> > >> You do have to sync these values before normal exits from the TB, but > you only > >> have to do that once, not once for every insn executed. See > gen_update_cc_op. > >> > >> > >> r~ > --=20 Jaume --089e013d161ef69dc704feb8a8ff Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+SGVsbG8sPGRpdj48YnI+PC9kaXY+PGRpdj5UaGUgcGF0Y2ggaW4gbXkg cHJldmlvdXMgZW1haWwgZ290IGNvcnJ1cHRlZCBkdWUgdG8gZ21haWwmIzM5O3MgbGltaXRhdGlv biBvZiA3OCBjaGFyYWN0ZXJzIHBlciBsaW5lIHdoZW4gc2VuZGluZyBwbGFpbiB0ZXh0IGVtYWls cy48L2Rpdj48ZGl2PkkgYXR0YWNoIGEgbmV3IHBhdGNoLiBBbHNvIHlvdSBjYW4gcHVsbCB0aGUg Y29kZSBmcm9twqA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vam1hcnRpZi9xZW11LmdpdCI+ aHR0cHM6Ly9naXRodWIuY29tL2ptYXJ0aWYvcWVtdS5naXQ8L2E+PC9kaXY+DQoNCjxkaXY+UGxl YXNlIHJldmlldyBhbmQgYXBwbHkuPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+QmVzdCBy ZWdhcmRzLDwvZGl2PjxkaXY+SmF1bWU8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxzcGFuIHN0 eWxlPSJjb2xvcjpyZ2IoODAsMCw4MCk7Zm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJpZjtmb250 LXNpemU6MTNweCI+U2lnbmVkLW9mZi1ieTogSmF1bWUgTWFydGkgRmFycmlvbCAoPC9zcGFuPjxh IGhyZWY9Im1haWx0bzpqYXVtZS5tYXJ0aWZAZ21haWwuY29tIiBzdHlsZT0iZm9udC1mYW1pbHk6 YXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTNweCI+amF1bWUubWFydGlmQGdtYWlsLmNvbTwv YT48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDgwLDAsODApO2ZvbnQtZmFtaWx5OmFyaWFsLHNhbnMt c2VyaWY7Zm9udC1zaXplOjEzcHgiPik8L3NwYW4+PGJyPg0KDQo8L2Rpdj48ZGl2PjxkaXY+ZGlm ZiAtLWdpdCBhL2xpbnV4LXVzZXIvc2lnbmFsLmMgYi9saW51eC11c2VyL3NpZ25hbC5jPC9kaXY+ PGRpdj5pbmRleCAxMTQxMDU0Li43M2Y4ZjZiIDEwMDY0NDwvZGl2PjxkaXY+LS0tIGEvbGludXgt dXNlci9zaWduYWwuYzwvZGl2PjxkaXY+KysrIGIvbGludXgtdXNlci9zaWduYWwuYzwvZGl2Pjxk aXY+QEAgLTg2NSw3ICs4NjUsNyBAQCBzdGF0aWMgdm9pZCBzZXR1cF9zaWdjb250ZXh0KHN0cnVj dCB0YXJnZXRfc2lnY29udGV4dCAqc2MsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqBfX3B1dF91c2Vy KGVudi0mZ3Q7cmVnc1tSX0VTUF0sICZhbXA7c2MtJmd0O2VzcF9hdF9zaWduYWwpOzwvZGl2Pjxk aXY+wqAgwqAgwqBfX3B1dF91c2VyKGVudi0mZ3Q7c2Vnc1tSX1NTXS5zZWxlY3RvciwgKHVuc2ln bmVkIGludCAqKSZhbXA7c2MtJmd0O3NzKTs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4tIMKgIMKg IMKgIMKgY3B1X3g4Nl9mc2F2ZShlbnYsIGZwc3RhdGVfYWRkciwgMSk7PC9kaXY+DQoNCjxkaXY+ KyDCoCDCoCDCoCDCoGNwdV94ODZfZnNhdmUoZW52LCBmcHN0YXRlX2FkZHIpOzwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqBmcHN0YXRlLSZndDtzdGF0dXMgPSBmcHN0YXRlLSZndDtzdzs8L2Rpdj48 ZGl2PsKgIMKgIMKgIMKgIMKgbWFnaWMgPSAweGZmZmY7PC9kaXY+PGRpdj7CoCDCoCDCoF9fcHV0 X3VzZXIobWFnaWMsICZhbXA7ZnBzdGF0ZS0mZ3Q7bWFnaWMpOzwvZGl2PjxkaXY+QEAgLTEwNjgs NyArMTA2OCw3IEBAIHJlc3RvcmVfc2lnY29udGV4dChDUFVYODZTdGF0ZSAqZW52LCBzdHJ1Y3Qg dGFyZ2V0X3NpZ2NvbnRleHQgKnNjLCBpbnQgKnBlYXgpPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnBzdGF0ZV9hZGRy LMKgPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBzaXplb2Yoc3RydWN0IHRhcmdldF9mcHN0YXRlKSkpPC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gYmFkZnJhbWU7PC9kaXY+PGRpdj4tIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3g4Nl9mcnN0b3IoZW52LCBmcHN0YXRlX2FkZHIsIDEp OzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjcHVfeDg2X2Zyc3Rvcihl bnYsIGZwc3RhdGVfYWRkcik7PC9kaXY+PGRpdj7CoDxzcGFuIGNsYXNzPSIiIHN0eWxlPSJ3aGl0 ZS1zcGFjZTpwcmUiPgk8L3NwYW4+fTwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PsKgIMKgIMKgIMKg IMKgKnBlYXggPSB0c3dhcGwoc2MtJmd0O2VheCk7PC9kaXY+PGRpdj5kaWZmIC0tZ2l0IGEvdGFy Z2V0LWkzODYvY3B1LmggYi90YXJnZXQtaTM4Ni9jcHUuaDwvZGl2Pg0KDQo8ZGl2PmluZGV4IGU2 MzRkODMuLjQyNzRjZTMgMTAwNjQ0PC9kaXY+PGRpdj4tLS0gYS90YXJnZXQtaTM4Ni9jcHUuaDwv ZGl2PjxkaXY+KysrIGIvdGFyZ2V0LWkzODYvY3B1Lmg8L2Rpdj48ZGl2PkBAIC04MTksMTAgKzgx OSwxMSBAQCB0eXBlZGVmIHN0cnVjdCBDUFVYODZTdGF0ZSB7PC9kaXY+PGRpdj7CoCDCoCDCoHVp bnQxNl90IGZwdWM7PC9kaXY+PGRpdj7CoCDCoCDCoHVpbnQ4X3QgZnB0YWdzWzhdOyDCoCAvKiAw ID0gdmFsaWQsIDEgPSBlbXB0eSAqLzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgRlBSZWcgZnByZWdz WzhdOzwvZGl2PjxkaXY+LSDCoCDCoC8qIEtWTS1vbmx5IHNvIGZhciAqLzwvZGl2PjxkaXY+LSDC oCDCoHVpbnQxNl90IGZwb3A7PC9kaXY+PGRpdj4rIMKgIMKgdWludDMyX3QgZnBvcDs8L2Rpdj48 ZGl2PsKgIMKgIMKgdWludDY0X3QgZnBpcDs8L2Rpdj48ZGl2PsKgIMKgIMKgdWludDY0X3QgZnBk cDs8L2Rpdj48ZGl2PisgwqAgwqB1aW50MzJfdCBmcGNzOzwvZGl2PjxkaXY+DQoNCisgwqAgwqB1 aW50MzJfdCBmcGRzOzwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PsKgIMKgIMKgLyogZW11bGF0b3Ig aW50ZXJuYWwgdmFyaWFibGVzICovPC9kaXY+PGRpdj7CoCDCoCDCoGZsb2F0X3N0YXR1cyBmcF9z dGF0dXM7PC9kaXY+PGRpdj5AQCAtMTA2Nyw4ICsxMDY4LDggQEAgZmxvYXR4ODAgY3B1X3NldF9m cDgwKHVpbnQ2NF90IG1hbnQsIHVpbnQxNl90IHVwcGVyKTs8L2Rpdj48ZGl2PsKgLyogdGhlIGZv bGxvd2luZyBoZWxwZXJzIGFyZSBvbmx5IHVzYWJsZSBpbiB1c2VyIG1vZGUgc2ltdWxhdGlvbiBh czwvZGl2Pg0KDQo8ZGl2PsKgIMKgIHRoZXkgY2FuIHRyaWdnZXIgdW5leHBlY3RlZCBleGNlcHRp b25zICovPC9kaXY+PGRpdj7CoHZvaWQgY3B1X3g4Nl9sb2FkX3NlZyhDUFVYODZTdGF0ZSAqcywg aW50IHNlZ19yZWcsIGludCBzZWxlY3Rvcik7PC9kaXY+PGRpdj4tdm9pZCBjcHVfeDg2X2ZzYXZl KENQVVg4NlN0YXRlICpzLCB0YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTMyKTs8L2Rpdj48ZGl2 Pi12b2lkIGNwdV94ODZfZnJzdG9yKENQVVg4NlN0YXRlICpzLCB0YXJnZXRfdWxvbmcgcHRyLCBp bnQgZGF0YTMyKTs8L2Rpdj4NCg0KPGRpdj4rdm9pZCBjcHVfeDg2X2ZzYXZlKENQVVg4NlN0YXRl ICpzLCB0YXJnZXRfdWxvbmcgcHRyKTs8L2Rpdj48ZGl2Pit2b2lkIGNwdV94ODZfZnJzdG9yKENQ VVg4NlN0YXRlICpzLCB0YXJnZXRfdWxvbmcgcHRyKTs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj7C oC8qIHlvdSBjYW4gY2FsbCB0aGlzIHNpZ25hbCBoYW5kbGVyIGZyb20geW91ciBTSUdCVVMgYW5k IFNJR1NFR1Y8L2Rpdj48ZGl2Pg0KDQrCoCDCoCBzaWduYWwgaGFuZGxlcnMgdG8gaW5mb3JtIHRo ZSB2aXJ0dWFsIENQVSBvZiBleGNlcHRpb25zLiBub24gemVybzwvZGl2PjxkaXY+ZGlmZiAtLWdp dCBhL3RhcmdldC1pMzg2L2ZwdV9oZWxwZXIuYyBiL3RhcmdldC1pMzg2L2ZwdV9oZWxwZXIuYzwv ZGl2PjxkaXY+aW5kZXggMWIyOTAwZC4uNjg4NjAzMSAxMDA2NDQ8L2Rpdj48ZGl2Pi0tLSBhL3Rh cmdldC1pMzg2L2ZwdV9oZWxwZXIuYzwvZGl2Pg0KDQo8ZGl2PisrKyBiL3RhcmdldC1pMzg2L2Zw dV9oZWxwZXIuYzwvZGl2PjxkaXY+QEAgLTU2LDYgKzU2LDggQEA8L2Rpdj48ZGl2PsKgI2RlZmlu ZSBmbG9hdHg4MF9sMmUgbWFrZV9mbG9hdHg4MCgweDNmZmYsIDB4YjhhYTNiMjk1YzE3ZjBiY0xM KTwvZGl2PjxkaXY+wqAjZGVmaW5lIGZsb2F0eDgwX2wydCBtYWtlX2Zsb2F0eDgwKDB4NDAwMCwg MHhkNDlhNzg0YmNkMWI4YWZlTEwpPC9kaXY+DQoNCjxkaXY+wqA8L2Rpdj48ZGl2PisjZGVmaW5l IEZQVVMoZW52KSAoKGVudi0mZ3Q7ZnB1cyAmYW1wOyB+MHgzODAwKSB8ICgoZW52LSZndDtmcHN0 dCAmYW1wOyAweDcpICZsdDsmbHQ7IDExKSk8L2Rpdj48ZGl2Pis8L2Rpdj48ZGl2PsKgc3RhdGlj IGlubGluZSB2b2lkIGZwdXNoKENQVVg4NlN0YXRlICplbnYpPC9kaXY+PGRpdj7CoHs8L2Rpdj48 ZGl2PsKgIMKgIMKgZW52LSZndDtmcHN0dCA9IChlbnYtJmd0O2Zwc3R0IC0gMSkgJmFtcDsgNzs8 L2Rpdj4NCg0KPGRpdj5AQCAtNjA0LDYgKzYwNiwxMCBAQCB2b2lkIGhlbHBlcl9mbmluaXQoQ1BV WDg2U3RhdGUgKmVudik8L2Rpdj48ZGl2PsKgIMKgIMKgZW52LSZndDtmcHRhZ3NbNV0gPSAxOzwv ZGl2PjxkaXY+wqAgwqAgwqBlbnYtJmd0O2ZwdGFnc1s2XSA9IDE7PC9kaXY+PGRpdj7CoCDCoCDC oGVudi0mZ3Q7ZnB0YWdzWzddID0gMTs8L2Rpdj48ZGl2PisgwqAgwqBlbnYtJmd0O2ZwaXAgPSAw OzwvZGl2PjxkaXY+DQorIMKgIMKgZW52LSZndDtmcGNzID0gMDs8L2Rpdj4NCjxkaXY+KyDCoCDC oGVudi0mZ3Q7ZnBkcCA9IDA7PC9kaXY+PGRpdj4rIMKgIMKgZW52LSZndDtmcGRzID0gMDs8L2Rp dj48ZGl2PsKgfTwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PsKgLyogQkNEIG9wcyAqLzwvZGl2Pjxk aXY+QEAgLTk2MSwxMyArOTY3LDEzIEBAIHZvaWQgaGVscGVyX2Z4YW1fU1QwKENQVVg4NlN0YXRl ICplbnYpPC9kaXY+PGRpdj7CoCDCoCDCoH08L2Rpdj48ZGl2PsKgfTwvZGl2PjxkaXY+DQoNCsKg PC9kaXY+PGRpdj4tdm9pZCBoZWxwZXJfZnN0ZW52KENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91 bG9uZyBwdHIsIGludCBkYXRhMzIpPC9kaXY+PGRpdj4rdm9pZCBoZWxwZXJfZnN0ZW52KENQVVg4 NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIsPC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGludCBwcm90ZWN0ZWRfbW9kZSk8L2Rpdj48ZGl2PsKg ezwvZGl2Pg0KDQo8ZGl2Pi0gwqAgwqBpbnQgZnB1cywgZnB0YWcsIGV4cCwgaTs8L2Rpdj48ZGl2 PisgwqAgwqBpbnQgZnB0YWcsIGV4cCwgaTs8L2Rpdj48ZGl2PsKgIMKgIMKgdWludDY0X3QgbWFu dDs8L2Rpdj48ZGl2PsKgIMKgIMKgQ1BVX0xEb3VibGVVIHRtcDs8L2Rpdj48ZGl2PsKgPC9kaXY+ PGRpdj4tIMKgIMKgZnB1cyA9IChlbnYtJmd0O2ZwdXMgJmFtcDsgfjB4MzgwMCkgfCAoZW52LSZn dDtmcHN0dCAmYW1wOyAweDcpICZsdDsmbHQ7IDExOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgZnB0 YWcgPSAwOzwvZGl2PjxkaXY+wqAgwqAgwqBmb3IgKGkgPSA3OyBpICZndDs9IDA7IGktLSkgezwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBmcHRhZyAmbHQ7Jmx0Oz0gMjs8L2Rpdj48ZGl2PkBAIC05 ODcsODMgKzk5MywxNTAgQEAgdm9pZCBoZWxwZXJfZnN0ZW52KENQVVg4NlN0YXRlICplbnYsIHRh cmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIpPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oH08L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PsKgIMKgIMKgfTwvZGl2 PjxkaXY+KzwvZGl2PjxkaXY+wqAgwqAgwqBpZiAoZGF0YTMyKSB7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoC8qIDMyIGJpdCAqLzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoGNwdV9zdGxfZGF0YShl bnYsIHB0ciwgZW52LSZndDtmcHVjKTs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqBjcHVfc3RsX2Rh dGEoZW52LCBwdHIgKyA0LCBmcHVzKTs8L2Rpdj4NCg0KPGRpdj4tIMKgIMKgIMKgIMKgY3B1X3N0 bF9kYXRhKGVudiwgcHRyICsgOCwgZnB0YWcpOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoGNwdV9z dGxfZGF0YShlbnYsIHB0ciArIDEyLCAwKTsgLyogZnBpcCAqLzwvZGl2PjxkaXY+LSDCoCDCoCDC oCDCoGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDE2LCAwKTsgLyogZnBjcyAqLzwvZGl2PjxkaXY+ LSDCoCDCoCDCoCDCoGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDIwLCAwKTsgLyogZnBvbyAqLzwv ZGl2Pg0KDQo8ZGl2Pi0gwqAgwqAgwqAgwqBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAyNCwgMCk7 IC8qIGZwb3MgKi88L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBjcHVfc3R3X2RhdGEoZW52LCBwdHIs IGVudi0mZ3Q7ZnB1Yyk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgY3B1X3N0d19kYXRhKGVudiwg cHRyICsgNCwgRlBVUyhlbnYpKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBjcHVfc3R3X2RhdGEo ZW52LCBwdHIgKyA4LCBmcHRhZyk7PC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDCoGlmIChwcm90 ZWN0ZWRfbW9kZSkgezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNwdV9zdGxfZGF0YShl bnYsIHB0ciArIDEyLCBlbnYtJmd0O2ZwaXApOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDC oGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDE2LDwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCgoZW52LSZndDtmcG9wICZhbXA7IDB4N2ZmKSAmbHQ7Jmx0OyAx NikgfCAoZW52LSZndDtmcGNzICZhbXA7IDB4ZmZmZikpOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAg wqAgwqAgwqAgwqBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAyMCwgZW52LSZndDtmcGRwKTs8L2Rp dj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAyNCwgZW52 LSZndDtmcGRzKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoC8qIFJlYWwgbW9kZSDCoCovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKg IMKgIMKgY3B1X3N0bF9kYXRhKGVudiwgcHRyICsgMTIsIGVudi0mZ3Q7ZnBpcCk7IC8qIGZwaXBb MTUuLjAwXSAqLzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBjcHVfc3RsX2RhdGEo ZW52LCBwdHIgKyAxNiwgKCgoKGVudi0mZ3Q7ZnBpcCAmZ3Q7Jmd0OyAxNikgJmFtcDsgMHhmZmZm KSAmbHQ7Jmx0OyAxMikgfDwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoChlbnYtJmd0O2Zwb3AgJmFtcDsgMHg3ZmYpKSk7IC8qIGZwaXBbMzEuLjE2XSwgZnBv cCAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNwdV9zdGxfZGF0YShlbnYsIHB0ciAr IDIwLCBlbnYtJmd0O2ZwZHApOyAvKiBmcGRwWzE1Li4wMF0gKi88L2Rpdj4NCg0KPGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgY3B1X3N0bF9kYXRhKGVudiwgcHRyICsgMjQsPC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGVudi0mZ3Q7ZnBkcCAmZ3Q7Jmd0OyA0 KSAmYW1wOyAweGZmZmYwMDApOyAvKiBmcGRwWzMxLi4xNl0gKi88L2Rpdj48ZGl2PisgwqAgwqAg wqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oC8qIDE2IGJpdCAqLzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgY3B1X3N0d19kYXRhKGVu diwgcHRyLCBlbnYtJmd0O2ZwdWMpOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0 YShlbnYsIHB0ciArIDIsIGZwdXMpOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0 YShlbnYsIHB0ciArIDIsIEZQVVMoZW52KSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGNwdV9z dHdfZGF0YShlbnYsIHB0ciArIDQsIGZwdGFnKTs8L2Rpdj4NCg0KPGRpdj4tIMKgIMKgIMKgIMKg Y3B1X3N0d19kYXRhKGVudiwgcHRyICsgNiwgMCk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgY3B1 X3N0d19kYXRhKGVudiwgcHRyICsgOCwgMCk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgY3B1X3N0 d19kYXRhKGVudiwgcHRyICsgMTAsIDApOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoGNwdV9zdHdf ZGF0YShlbnYsIHB0ciArIDEyLCAwKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBpZiAocHJvdGVj dGVkX21vZGUpIHs8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3N0d19kYXRh KGVudiwgcHRyICsgNiwgZW52LSZndDtmcGlwKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAg wqBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyA4LCBlbnYtJmd0O2ZwY3MpOzwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDEwLCBlbnYtJmd0O2ZwZHAp OzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDEy LCBlbnYtJmd0O2ZwZHMpOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2 PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoC8qIFJlYWwgbW9kZSDCoCovPC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgNiwgZW52LSZndDtmcGlwKTsg LyogZnBpcFsxNS4uMF0gKi88L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBjcHVfc3R3X2Rh dGEoZW52LCBwdHIgKyA4LCAoKGVudi0mZ3Q7ZnBpcCAmZ3Q7Jmd0OyA0KSAmYW1wOyAweGYwMDAp IHw8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGVu di0mZ3Q7ZnBvcCAmYW1wOyAweDdmZikpOyAvKiBmcGlwWzE5Li4xNl0sIGZwb3AgKi88L2Rpdj48 ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyAxMCwgZW52LSZn dDtmcGRwKTsgLyogZnBkcFsxNS4uMF0gKi88L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBj cHVfc3R3X2RhdGEoZW52LCBwdHIgKyAxMiw8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgKGVudi0mZ3Q7ZnBkcCAmZ3Q7Jmd0OyA0KSAmYW1wOyAweGYw MDApOyAvKiBmcGRwWzE5Li4xNl0gKi88L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqB9PC9kaXY+PGRp dj7CoCDCoCDCoH08L2Rpdj48ZGl2Pis8L2Rpdj48ZGl2PisgwqAgwqBlbnYtJmd0O2ZwaXAgPSAw OzwvZGl2PjxkaXY+KyDCoCDCoGVudi0mZ3Q7ZnBjcyA9IDA7PC9kaXY+PGRpdj4rIMKgIMKgZW52 LSZndDtmcGRwID0gMDs8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgZW52LSZndDtmcGRzID0gMDs8L2Rp dj48ZGl2PsKgfTwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2Pi12b2lkIGhlbHBlcl9mbGRlbnYoQ1BV WDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMik8L2Rpdj48ZGl2Pit2 b2lkIGhlbHBlcl9mbGRlbnYoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50 IGRhdGEzMiw8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaW50IHByb3Rl Y3RlZF9tb2RlKTwvZGl2Pg0KDQo8ZGl2PsKgezwvZGl2PjxkaXY+LSDCoCDCoGludCBpLCBmcHVz LCBmcHRhZzs8L2Rpdj48ZGl2PisgwqAgwqBpbnQgdG1wLCBpLCBmcHVzLCBmcHRhZzs8L2Rpdj48 ZGl2PsKgPC9kaXY+PGRpdj7CoCDCoCDCoGlmIChkYXRhMzIpIHs8L2Rpdj48ZGl2PisgwqAgwqAg wqAgwqAvKiAzMiBiaXQgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgZW52LSZndDtmcHVjID0g Y3B1X2xkdXdfZGF0YShlbnYsIHB0cik7PC9kaXY+DQo8ZGl2Pg0KwqAgwqAgwqAgwqAgwqBmcHVz ID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDQpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBm cHRhZyA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyA4KTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAg wqBpZiAocHJvdGVjdGVkX21vZGUpIHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBlbnYt Jmd0O2ZwaXAgPSBjcHVfbGRsX2RhdGEoZW52LCBwdHIgKyAxMik7PC9kaXY+PGRpdj4rIMKgIMKg IMKgIMKgIMKgIMKgdG1wID0gY3B1X2xkbF9kYXRhKGVudiwgcHRyICsgMTYpOzwvZGl2Pg0KDQo8 ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwY3MgPSB0bXAgJmFtcDsgMHhmZmZmOzwv ZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBvcCA9IHRtcCAmZ3Q7Jmd0OyAx Njs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwZHAgPSBjcHVfbGRsX2Rh dGEoZW52LCBwdHIgKyAyMCk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtm cGRzID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDI0KTs8L2Rpdj4NCg0KPGRpdj4rIMKgIMKg IMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAvKiBSZWFsIG1vZGUg Ki88L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqB0bXAgPSBjcHVfbGRsX2RhdGEoZW52LCBw dHIgKyAxNik7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGlwID0gKCh0 bXAgJmFtcDsgMHhmZmZmMDAwKSAmbHQ7Jmx0OyA0KSB8PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDEyKTs8L2Rp dj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcG9wID0gdG1wICZhbXA7IDB4 N2ZmOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBkcCA9IChjcHVfbGRs X2RhdGEoZW52LCBwdHIgKyAyNCkgJmx0OyZsdDsgNCkgfDwvZGl2PjxkaXY+KyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyAyMCk7PC9k aXY+PGRpdj4rIMKgIMKgIMKgIMKgfTwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgfSBlbHNlIHs8L2Rp dj48ZGl2PisgwqAgwqAgwqAgwqAvKiAxNiBiaXQgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg ZW52LSZndDtmcHVjID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0cik7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoGZwdXMgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyICsgMik7PC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoGZwdGFnID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDQpOzwvZGl2Pg0KDQo8 ZGl2PisgwqAgwqAgwqAgwqBpZiAocHJvdGVjdGVkX21vZGUpIHs8L2Rpdj48ZGl2PisgwqAgwqAg wqAgwqAgwqAgwqAvKiBQcm90ZWN0ZWQgbW9kZSDCoCovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKg IMKgIMKgZW52LSZndDtmcGlwID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDYpOzwvZGl2Pjxk aXY+KyDCoCDCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBjcyA9IGNwdV9sZHV3X2RhdGEoZW52LCBw dHIgKyA4KTs8L2Rpdj4NCjxkaXY+DQorIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGRwID0g Y3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDEwKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAg wqBlbnYtJmd0O2ZwZHMgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyICsgMTIpOzwvZGl2PjxkaXY+ KyDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgLyogUmVh bCBtb2RlIMKgKi88L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqB0bXAgPSBjcHVfbGR1d19k YXRhKGVudiwgcHRyICsgOCk7PC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGVudi0m Z3Q7ZnBpcCA9ICgodG1wICZhbXA7IDB4ZjAwMCkgJmx0OyZsdDsgNCkgfCBjcHVfbGR1d19kYXRh KGVudiwgcHRyICsgNik7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcG9w ID0gdG1wICZhbXA7IDB4N2ZmOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7 ZnBkcCA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyAxMikgJmx0OyZsdDsgNCB8PC9kaXY+DQoN CjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNwdV9sZHV3X2RhdGEo ZW52LCBwdHIgKyAxMCk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqAgwqAg wqB9PC9kaXY+PGRpdj4rPC9kaXY+PGRpdj7CoCDCoCDCoGVudi0mZ3Q7ZnBzdHQgPSAoZnB1cyAm Z3Q7Jmd0OyAxMSkgJmFtcDsgNzs8L2Rpdj48ZGl2PsKgIMKgIMKgZW52LSZndDtmcHVzID0gZnB1 cyAmYW1wOyB+MHgzODAwOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgZm9yIChpID0gMDsgaSAmbHQ7 IDg7IGkrKykgezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwdGFnc1tpXSA9ICgo ZnB0YWcgJmFtcDsgMykgPT0gMyk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGZwdGFnICZndDsm Z3Q7PSAyOzwvZGl2PjxkaXY+wqAgwqAgwqB9PC9kaXY+PGRpdj4rPC9kaXY+PGRpdj4rIMKgIMKg ZW52LSZndDtmcGlwICZhbXA7PSAweGZmZmZmZmZmOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqBlbnYt Jmd0O2ZwZHAgJmFtcDs9IDB4ZmZmZmZmZmY7PC9kaXY+PGRpdj4rIMKgIMKgaWYgKCFwcm90ZWN0 ZWRfbW9kZSkgezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBjcyA9IDA7PC9kaXY+ PGRpdj4rIMKgIMKgIMKgIMKgZW52LSZndDtmcGRzID0gMDs8L2Rpdj48ZGl2PisgwqAgwqB9PC9k aXY+PGRpdj7CoH08L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4tdm9pZCBoZWxwZXJfZnNhdmUoQ1BV WDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMik8L2Rpdj4NCg0KPGRp dj4rdm9pZCBoZWxwZXJfZnNhdmUoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwg aW50IGRhdGEzMiw8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpbnQgcHJv dGVjdGVkX21vZGUpPC9kaXY+PGRpdj7CoHs8L2Rpdj48ZGl2PsKgIMKgIMKgZmxvYXR4ODAgdG1w OzwvZGl2PjxkaXY+wqAgwqAgwqBpbnQgaTs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4tIMKgIMKg aGVscGVyX2ZzdGVudihlbnYsIHB0ciwgZGF0YTMyKTs8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgaGVs cGVyX2ZzdGVudihlbnYsIHB0ciwgZGF0YTMyLCBwcm90ZWN0ZWRfbW9kZSk7PC9kaXY+PGRpdj7C oDwvZGl2PjxkaXY+LSDCoCDCoHB0ciArPSAoMTQgJmx0OyZsdDsgZGF0YTMyKTs8L2Rpdj48ZGl2 PisgwqAgwqBpZiAoZGF0YTMyKSB7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgcHRyICs9IDI4Ozwv ZGl2PjxkaXY+KyDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgcHRyICs9IDE0 OzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoGZvciAoaSA9IDA7IGkg Jmx0OyA4OyBpKyspIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgdG1wID0gU1QoaSk7PC9kaXY+ PGRpdj7CoCDCoCDCoCDCoCDCoGhlbHBlcl9mc3R0KGVudiwgdG1wLCBwdHIpOzwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqBwdHIgKz0gMTA7PC9kaXY+PGRpdj7CoCDCoCDCoH08L2Rpdj48ZGl2PsKg PC9kaXY+PGRpdj4tIMKgIMKgLyogZm5pbml0ICovPC9kaXY+DQoNCjxkaXY+LSDCoCDCoGVudi0m Z3Q7ZnB1cyA9IDA7PC9kaXY+PGRpdj4tIMKgIMKgZW52LSZndDtmcHN0dCA9IDA7PC9kaXY+PGRp dj4tIMKgIMKgZW52LSZndDtmcHVjID0gMHgzN2Y7PC9kaXY+PGRpdj4tIMKgIMKgZW52LSZndDtm cHRhZ3NbMF0gPSAxOzwvZGl2PjxkaXY+LSDCoCDCoGVudi0mZ3Q7ZnB0YWdzWzFdID0gMTs8L2Rp dj48ZGl2Pi0gwqAgwqBlbnYtJmd0O2ZwdGFnc1syXSA9IDE7PC9kaXY+PGRpdj4NCg0KLSDCoCDC oGVudi0mZ3Q7ZnB0YWdzWzNdID0gMTs8L2Rpdj48ZGl2Pi0gwqAgwqBlbnYtJmd0O2ZwdGFnc1s0 XSA9IDE7PC9kaXY+PGRpdj4tIMKgIMKgZW52LSZndDtmcHRhZ3NbNV0gPSAxOzwvZGl2PjxkaXY+ LSDCoCDCoGVudi0mZ3Q7ZnB0YWdzWzZdID0gMTs8L2Rpdj48ZGl2Pi0gwqAgwqBlbnYtJmd0O2Zw dGFnc1s3XSA9IDE7PC9kaXY+PGRpdj4rIMKgIMKgaGVscGVyX2ZuaW5pdChlbnYpOzwvZGl2Pg0K PGRpdj4NCsKgfTwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2Pi12b2lkIGhlbHBlcl9mcnN0b3IoQ1BV WDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMik8L2Rpdj48ZGl2Pit2 b2lkIGhlbHBlcl9mcnN0b3IoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50 IGRhdGEzMiw8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaW50IHByb3Rl Y3RlZF9tb2RlKTwvZGl2Pg0KDQo8ZGl2PsKgezwvZGl2PjxkaXY+wqAgwqAgwqBmbG9hdHg4MCB0 bXA7PC9kaXY+PGRpdj7CoCDCoCDCoGludCBpOzwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2Pi0gwqAg wqBoZWxwZXJfZmxkZW52KGVudiwgcHRyLCBkYXRhMzIpOzwvZGl2PjxkaXY+LSDCoCDCoHB0ciAr PSAoMTQgJmx0OyZsdDsgZGF0YTMyKTs8L2Rpdj48ZGl2PisgwqAgwqBoZWxwZXJfZmxkZW52KGVu diwgcHRyLCBkYXRhMzIsIHByb3RlY3RlZF9tb2RlKTs8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgaWYg KGRhdGEzMikgezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoHB0ciArPSAyODs8L2Rpdj48ZGl2Pisg wqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoHB0ciArPSAxNDs8L2Rpdj48ZGl2 PisgwqAgwqB9PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+wqAgwqAgwqBmb3IgKGkgPSAwOyBpICZs dDsgODsgaSsrKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoHRtcCA9IGhlbHBlcl9mbGR0KGVu diwgcHRyKTs8L2Rpdj4NCg0KPGRpdj5AQCAtMTA3MiwyMSArMTE0NSwyMiBAQCB2b2lkIGhlbHBl cl9mcnN0b3IoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMik8 L2Rpdj48ZGl2PsKgIMKgIMKgfTwvZGl2PjxkaXY+wqB9PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+ LSNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpPC9kaXY+PGRpdj4tdm9pZCBjcHVfeDg2X2Zz YXZlKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIpPC9kaXY+ DQoNCjxkaXY+KyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpICZhbXA7JmFtcDsgZGVmaW5l ZChUQVJHRVRfSTM4NikgJmFtcDsmYW1wOyBUQVJHRVRfQUJJX0JJVFMgPT0gMzI8L2Rpdj48ZGl2 Pis8L2Rpdj48ZGl2Pit2b2lkIGNwdV94ODZfZnNhdmUoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0 X3Vsb25nIHB0cik8L2Rpdj48ZGl2PsKgezwvZGl2PjxkaXY+LSDCoCDCoGhlbHBlcl9mc2F2ZShl bnYsIHB0ciwgZGF0YTMyKTs8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgaGVscGVyX2ZzYXZlKGVudiwg cHRyLCAxLCAxKTs8L2Rpdj48ZGl2PsKgfTwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2Pi12b2lkIGNw dV94ODZfZnJzdG9yKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRh MzIpPC9kaXY+PGRpdj4rdm9pZCBjcHVfeDg2X2Zyc3RvcihDUFVYODZTdGF0ZSAqZW52LCB0YXJn ZXRfdWxvbmcgcHRyKTwvZGl2PjxkaXY+DQoNCsKgezwvZGl2PjxkaXY+LSDCoCDCoGhlbHBlcl9m cnN0b3IoZW52LCBwdHIsIGRhdGEzMik7PC9kaXY+PGRpdj4rIMKgIMKgaGVscGVyX2Zyc3Rvcihl bnYsIHB0ciwgMSwgMSk7PC9kaXY+PGRpdj7CoH08L2Rpdj48ZGl2PsKgI2VuZGlmPC9kaXY+PGRp dj7CoDwvZGl2PjxkaXY+LXZvaWQgaGVscGVyX2Z4c2F2ZShDUFVYODZTdGF0ZSAqZW52LCB0YXJn ZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTY0KTwvZGl2Pg0KDQo8ZGl2Pit2b2lkIGhlbHBlcl9meHNh dmUoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMiwgaW50IGRh dGE2NCk8L2Rpdj48ZGl2PsKgezwvZGl2PjxkaXY+LSDCoCDCoGludCBmcHVzLCBmcHRhZywgaSwg bmJfeG1tX3JlZ3M7PC9kaXY+PGRpdj4rIMKgIMKgaW50IGksIG5iX3htbV9yZWdzLCBmcHRhZzs8 L2Rpdj48ZGl2PsKgIMKgIMKgZmxvYXR4ODAgdG1wOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgdGFy Z2V0X3Vsb25nIGFkZHI7PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+QEAgLTEwOTUsMjUgKzExNjks MzYgQEAgdm9pZCBoZWxwZXJfZnhzYXZlKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBw dHIsIGludCBkYXRhNjQpPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoHJhaXNlX2V4Y2VwdGlvbihl bnYsIEVYQ1AwRF9HUEYpOzwvZGl2PjxkaXY+wqAgwqAgwqB9PC9kaXY+PGRpdj4NCg0KwqA8L2Rp dj48ZGl2Pi0gwqAgwqBmcHVzID0gKGVudi0mZ3Q7ZnB1cyAmYW1wOyB+MHgzODAwKSB8IChlbnYt Jmd0O2Zwc3R0ICZhbXA7IDB4NykgJmx0OyZsdDsgMTE7PC9kaXY+PGRpdj7CoCDCoCDCoGZwdGFn ID0gMDs8L2Rpdj48ZGl2PsKgIMKgIMKgZm9yIChpID0gMDsgaSAmbHQ7IDg7IGkrKykgezwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqBmcHRhZyB8PSAoZW52LSZndDtmcHRhZ3NbaV0gJmx0OyZsdDsg aSk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqB9PC9kaXY+PGRpdj4rIMKgIMKgZnB0YWcgXj0gMHhm Zjs8L2Rpdj48ZGl2Pis8L2Rpdj48ZGl2PsKgIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyLCBl bnYtJmd0O2ZwdWMpOzwvZGl2PjxkaXY+LSDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDIs IGZwdXMpOzwvZGl2PjxkaXY+LSDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDQsIGZwdGFn IF4gMHhmZik7PC9kaXY+PGRpdj4NCg0KKyDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDIs IEZQVVMoZW52KSk7PC9kaXY+PGRpdj4rIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgNCwg ZnB0YWcgJmFtcDsgMHhmZik7PC9kaXY+PGRpdj4rIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRy ICsgNiwgZW52LSZndDtmcG9wKTs8L2Rpdj48ZGl2Pis8L2Rpdj48ZGl2PsKgI2lmZGVmIFRBUkdF VF9YODZfNjQ8L2Rpdj48ZGl2PsKgIMKgIMKgaWYgKGRhdGE2NCkgezwvZGl2Pg0KDQo8ZGl2Pi0g wqAgwqAgwqAgwqBjcHVfc3RxX2RhdGEoZW52LCBwdHIgKyAweDA4LCAwKTsgLyogcmlwICovPC9k aXY+PGRpdj4tIMKgIMKgIMKgIMKgY3B1X3N0cV9kYXRhKGVudiwgcHRyICsgMHgxMCwgMCk7IC8q IHJkcCAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoC8qIDY0IGJpdCAqLzwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoGNwdV9zdHFfZGF0YShlbnYsIHB0ciArIDgsIGVudi0mZ3Q7ZnBpcCk7PC9kaXY+ PGRpdj4NCg0KKyDCoCDCoCDCoCDCoGNwdV9zdHFfZGF0YShlbnYsIHB0ciArIDE2LCBlbnYtJmd0 O2ZwZHApOzwvZGl2PjxkaXY+wqAgwqAgwqB9IGVsc2U8L2Rpdj48ZGl2PsKgI2VuZGlmPC9kaXY+ PGRpdj7CoCDCoCDCoHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqBjcHVfc3RsX2RhdGEoZW52LCBw dHIgKyAweDA4LCAwKTsgLyogZWlwICovPC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgY3B1X3N0bF9k YXRhKGVudiwgcHRyICsgMHgwYywgMCk7IC8qIHNlbCDCoCovPC9kaXY+DQoNCjxkaXY+LSDCoCDC oCDCoCDCoGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDB4MTAsIDApOyAvKiBkcCAqLzwvZGl2Pjxk aXY+LSDCoCDCoCDCoCDCoGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDB4MTQsIDApOyAvKiBzZWwg wqAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoGlmIChkYXRhMzIpIHs8L2Rpdj48ZGl2PisgwqAg wqAgwqAgwqAgwqAgwqAvKiAzMiBiaXQgKi88L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBj cHVfc3RsX2RhdGEoZW52LCBwdHIgKyA4LCBlbnYtJmd0O2ZwaXApOzwvZGl2Pg0KDQo8ZGl2Pisg wqAgwqAgwqAgwqAgwqAgwqBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAxNiwgZW52LSZndDtmcGRw KTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDC oCDCoCDCoC8qIDE2IGJpdCAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNwdV9zdHdf ZGF0YShlbnYsIHB0ciArIDgsIGVudi0mZ3Q7ZnBpcCk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKg IMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgMTYsIGVudi0mZ3Q7ZnBkcCk7PC9kaXY+DQoN CjxkaXY+KyDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBjcHVfc3R3X2RhdGEo ZW52LCBwdHIgKyAxMiwgZW52LSZndDtmcGNzICZhbXA7IDB4ZmZmZik7PC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgMjAsIGVudi0mZ3Q7ZnBkcyAmYW1wOyAw eGZmZmYpOzwvZGl2PjxkaXY+wqAgwqAgwqB9PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+wqAgwqAg wqBhZGRyID0gcHRyICsgMHgyMDs8L2Rpdj4NCg0KPGRpdj5AQCAtMTE0Niw3ICsxMjMxLDcgQEAg dm9pZCBoZWxwZXJfZnhzYXZlKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGlu dCBkYXRhNjQpPC9kaXY+PGRpdj7CoCDCoCDCoH08L2Rpdj48ZGl2PsKgfTwvZGl2PjxkaXY+wqA8 L2Rpdj48ZGl2Pi12b2lkIGhlbHBlcl9meHJzdG9yKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91 bG9uZyBwdHIsIGludCBkYXRhNjQpPC9kaXY+DQo8ZGl2Pg0KK3ZvaWQgaGVscGVyX2Z4cnN0b3Io Q1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMiwgaW50IGRhdGE2 NCk8L2Rpdj48ZGl2PsKgezwvZGl2PjxkaXY+wqAgwqAgwqBpbnQgaSwgZnB1cywgZnB0YWcsIG5i X3htbV9yZWdzOzwvZGl2PjxkaXY+wqAgwqAgwqBmbG9hdHg4MCB0bXA7PC9kaXY+PGRpdj5AQCAt MTE2Nyw2ICsxMjUyLDMwIEBAIHZvaWQgaGVscGVyX2Z4cnN0b3IoQ1BVWDg2U3RhdGUgKmVudiwg dGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGE2NCk8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDC oGVudi0mZ3Q7ZnB0YWdzW2ldID0gKChmcHRhZyAmZ3Q7Jmd0OyBpKSAmYW1wOyAxKTs8L2Rpdj48 ZGl2PsKgIMKgIMKgfTwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PisgwqAgwqBlbnYtJmd0O2Zwb3Ag PSAoY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDYpICZndDsmZ3Q7IDUpICZhbXA7IDB4N2ZmOzwv ZGl2PjxkaXY+KzwvZGl2PjxkaXY+KyNpZmRlZiBUQVJHRVRfWDg2XzY0PC9kaXY+DQoNCjxkaXY+ KyDCoCDCoGlmIChkYXRhNjQpIHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAvKiA2NCBiaXQgKi88 L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwaXAgPSBjcHVfbGRxX2RhdGEoZW52LCBw dHIgKyA4KTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwZHAgPSBjcHVfbGRxX2Rh dGEoZW52LCBwdHIgKyAxNik7PC9kaXY+PGRpdj4rIMKgIMKgfSBlbHNlPC9kaXY+PGRpdj4rI2Vu ZGlmPC9kaXY+DQoNCjxkaXY+KyDCoCDCoHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBpZiAoZGF0 YTMyKSB7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgLyogMzIgYml0ICovPC9kaXY+PGRp dj4rIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGlwID0gY3B1X2xkbF9kYXRhKGVudiwgcHRy ICsgOCk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGRwID0gY3B1X2xk bF9kYXRhKGVudiwgcHRyICsgMTYpOzwvZGl2PjxkaXY+DQoNCisgwqAgwqAgwqAgwqB9IGVsc2Ug ezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoC8qIDE2IGJpdCAqLzwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBpcCA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyA4 KTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwZHAgPSBjcHVfbGR1d19k YXRhKGVudiwgcHRyICsgMTYpOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2Pg0K KzwvZGl2Pg0KPGRpdj4rIMKgIMKgIMKgIMKgZW52LSZndDtmcGNzID0gY3B1X2xkdXdfZGF0YShl bnYsIHB0ciArIDEyKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwZHMgPSBjcHVf bGR1d19kYXRhKGVudiwgcHRyICsgMjApOzwvZGl2PjxkaXY+KyDCoCDCoH08L2Rpdj48ZGl2Pis8 L2Rpdj48ZGl2PsKgIMKgIMKgYWRkciA9IHB0ciArIDB4MjA7PC9kaXY+PGRpdj7CoCDCoCDCoGZv ciAoaSA9IDA7IGkgJmx0OyA4OyBpKyspIHs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoHRt cCA9IGhlbHBlcl9mbGR0KGVudiwgYWRkcik7PC9kaXY+PGRpdj5AQCAtMTE5NSw2ICsxMzA0LDEx IEBAIHZvaWQgaGVscGVyX2Z4cnN0b3IoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0 ciwgaW50IGRhdGE2NCk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoH08L2Rpdj48ZGl2Pis8L2Rpdj4NCg0K PGRpdj4rIMKgIMKgaWYgKCFkYXRhNjQpIHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBlbnYtJmd0 O2ZwaXAgJmFtcDs9IDB4ZmZmZmZmZmY7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgZW52LSZndDtm cGRwICZhbXA7PSAweGZmZmZmZmZmOzwvZGl2PjxkaXY+KyDCoCDCoH08L2Rpdj48ZGl2PsKgfTwv ZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PsKgdm9pZCBjcHVfZ2V0X2ZwODAodWludDY0X3QgKnBtYW50 LCB1aW50MTZfdCAqcGV4cCwgZmxvYXR4ODAgZik8L2Rpdj4NCg0KPGRpdj5kaWZmIC0tZ2l0IGEv dGFyZ2V0LWkzODYvaGVscGVyLmggYi90YXJnZXQtaTM4Ni9oZWxwZXIuaDwvZGl2PjxkaXY+aW5k ZXggOGViMDE0NS4uOWM0ZmQyMiAxMDA2NDQ8L2Rpdj48ZGl2Pi0tLSBhL3RhcmdldC1pMzg2L2hl bHBlci5oPC9kaXY+PGRpdj4rKysgYi90YXJnZXQtaTM4Ni9oZWxwZXIuaDwvZGl2PjxkaXY+QEAg LTE4MywxMiArMTgzLDEyIEBAIERFRl9IRUxQRVJfMShmcm5kaW50LCB2b2lkLCBlbnYpPC9kaXY+ DQoNCjxkaXY+wqBERUZfSEVMUEVSXzEoZnNjYWxlLCB2b2lkLCBlbnYpPC9kaXY+PGRpdj7CoERF Rl9IRUxQRVJfMShmc2luLCB2b2lkLCBlbnYpPC9kaXY+PGRpdj7CoERFRl9IRUxQRVJfMShmY29z LCB2b2lkLCBlbnYpPC9kaXY+PGRpdj4tREVGX0hFTFBFUl8zKGZzdGVudiwgdm9pZCwgZW52LCB0 bCwgaW50KTwvZGl2PjxkaXY+LURFRl9IRUxQRVJfMyhmbGRlbnYsIHZvaWQsIGVudiwgdGwsIGlu dCk8L2Rpdj4NCg0KPGRpdj4tREVGX0hFTFBFUl8zKGZzYXZlLCB2b2lkLCBlbnYsIHRsLCBpbnQp PC9kaXY+PGRpdj4tREVGX0hFTFBFUl8zKGZyc3Rvciwgdm9pZCwgZW52LCB0bCwgaW50KTwvZGl2 PjxkaXY+LURFRl9IRUxQRVJfMyhmeHNhdmUsIHZvaWQsIGVudiwgdGwsIGludCk8L2Rpdj48ZGl2 Pi1ERUZfSEVMUEVSXzMoZnhyc3Rvciwgdm9pZCwgZW52LCB0bCwgaW50KTwvZGl2PjxkaXY+K0RF Rl9IRUxQRVJfNChmc3RlbnYsIHZvaWQsIGVudiwgdGwsIGludCwgaW50KTwvZGl2Pg0KDQo8ZGl2 PitERUZfSEVMUEVSXzQoZmxkZW52LCB2b2lkLCBlbnYsIHRsLCBpbnQsIGludCk8L2Rpdj48ZGl2 PitERUZfSEVMUEVSXzQoZnNhdmUsIHZvaWQsIGVudiwgdGwsIGludCwgaW50KTwvZGl2PjxkaXY+ K0RFRl9IRUxQRVJfNChmcnN0b3IsIHZvaWQsIGVudiwgdGwsIGludCwgaW50KTwvZGl2PjxkaXY+ K0RFRl9IRUxQRVJfNChmeHNhdmUsIHZvaWQsIGVudiwgdGwsIGludCwgaW50KTwvZGl2Pg0KDQo8 ZGl2PitERUZfSEVMUEVSXzQoZnhyc3Rvciwgdm9pZCwgZW52LCB0bCwgaW50LCBpbnQpPC9kaXY+ PGRpdj7CoDwvZGl2PjxkaXY+wqBERUZfSEVMUEVSX0ZMQUdTXzEoY2x6LCBUQ0dfQ0FMTF9OT19S V0dfU0UsIHRsLCB0bCk8L2Rpdj48ZGl2PsKgREVGX0hFTFBFUl9GTEFHU18xKGN0eiwgVENHX0NB TExfTk9fUldHX1NFLCB0bCwgdGwpPC9kaXY+PGRpdj5kaWZmIC0tZ2l0IGEvdGFyZ2V0LWkzODYv bWFjaGluZS5jIGIvdGFyZ2V0LWkzODYvbWFjaGluZS5jPC9kaXY+DQoNCjxkaXY+aW5kZXggMTZk MmY2YS4uNTAwZjA0ZiAxMDA2NDQ8L2Rpdj48ZGl2Pi0tLSBhL3RhcmdldC1pMzg2L21hY2hpbmUu YzwvZGl2PjxkaXY+KysrIGIvdGFyZ2V0LWkzODYvbWFjaGluZS5jPC9kaXY+PGRpdj5AQCAtMzk3 LDcgKzM5Nyw3IEBAIHN0YXRpYyBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gdm1zdGF0ZV9mcG9w X2lwX2RwID0gezwvZGl2PjxkaXY+wqAgwqAgwqAudmVyc2lvbl9pZCA9IDEsPC9kaXY+DQoNCjxk aXY+wqAgwqAgwqAubWluaW11bV92ZXJzaW9uX2lkID0gMSw8L2Rpdj48ZGl2PsKgIMKgIMKgLmZp ZWxkcyA9IChWTVN0YXRlRmllbGRbXSkgezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoFZNU1RBVEVf VUlOVDE2KGVudi5mcG9wLCBYODZDUFUpLDwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoFZNU1RBVEVf VUlOVDMyKGVudi5mcG9wLCBYODZDUFUpLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBWTVNUQVRF X1VJTlQ2NChlbnYuZnBpcCwgWDg2Q1BVKSw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoFZN U1RBVEVfVUlOVDY0KGVudi5mcGRwLCBYODZDUFUpLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBW TVNUQVRFX0VORF9PRl9MSVNUKCk8L2Rpdj48ZGl2PmRpZmYgLS1naXQgYS90YXJnZXQtaTM4Ni90 cmFuc2xhdGUuYyBiL3RhcmdldC1pMzg2L3RyYW5zbGF0ZS5jPC9kaXY+PGRpdj5pbmRleCA2ZmNk ODI0Li44ZTQ5MGRlIDEwMDY0NDwvZGl2PjxkaXY+LS0tIGEvdGFyZ2V0LWkzODYvdHJhbnNsYXRl LmM8L2Rpdj4NCg0KPGRpdj4rKysgYi90YXJnZXQtaTM4Ni90cmFuc2xhdGUuYzwvZGl2PjxkaXY+ QEAgLTU4LDYgKzU4LDkgQEA8L2Rpdj48ZGl2PsKgI2VuZGlmPC9kaXY+PGRpdj7CoDwvZGl2Pjxk aXY+wqAvLyNkZWZpbmUgTUFDUk9fVEVTVCDCoCAxPC9kaXY+PGRpdj4rI2RlZmluZSBJU19QUk9U RUNURURfTU9ERShzKSAocy0mZ3Q7cGUgJmFtcDsmYW1wOyAhcy0mZ3Q7dm04Nik8L2Rpdj48ZGl2 PisjZGVmaW5lIEZQX0VQX1ZBTElEIDB4ODAwMDAwMDA8L2Rpdj4NCg0KPGRpdj4rI2RlZmluZSBG UF9FUF9JTlZBTElEIDA8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj7CoC8qIGdsb2JhbCByZWdpc3Rl ciBpbmRleGVzICovPC9kaXY+PGRpdj7CoHN0YXRpYyBUQ0d2X3B0ciBjcHVfZW52OzwvZGl2Pjxk aXY+QEAgLTY1LDYgKzY4LDExIEBAIHN0YXRpYyBUQ0d2IGNwdV9BMDs8L2Rpdj48ZGl2PsKgc3Rh dGljIFRDR3YgY3B1X2NjX2RzdCwgY3B1X2NjX3NyYywgY3B1X2NjX3NyYzIsIGNwdV9jY19zcmNU OzwvZGl2Pg0KDQo8ZGl2PsKgc3RhdGljIFRDR3ZfaTMyIGNwdV9jY19vcDs8L2Rpdj48ZGl2PsKg c3RhdGljIFRDR3YgY3B1X3JlZ3NbQ1BVX05CX1JFR1NdOzwvZGl2PjxkaXY+K3N0YXRpYyBUQ0d2 X2kzMiBjcHVfZnBvcDs8L2Rpdj48ZGl2PitzdGF0aWMgVENHdiBjcHVfZnBpcDs8L2Rpdj48ZGl2 PitzdGF0aWMgVENHdiBjcHVfZnBkcDs8L2Rpdj48ZGl2PitzdGF0aWMgVENHdl9pMzIgY3B1X2Zw ZHM7PC9kaXY+DQoNCjxkaXY+K3N0YXRpYyBUQ0d2X2kzMiBjcHVfZnBjczs8L2Rpdj48ZGl2PsKg LyogbG9jYWwgdGVtcHMgKi88L2Rpdj48ZGl2PsKgc3RhdGljIFRDR3YgY3B1X1RbMl07PC9kaXY+ PGRpdj7CoC8qIGxvY2FsIHJlZ2lzdGVyIGluZGV4ZXMgKG9ubHkgdXNlZCBpbnNpZGUgb2xkIG1p Y3JvIG9wcykgKi88L2Rpdj48ZGl2PkBAIC03NCw2ICs4Miw5IEBAIHN0YXRpYyBUQ0d2X2kzMiBj cHVfdG1wMl9pMzIsIGNwdV90bXAzX2kzMjs8L2Rpdj4NCg0KPGRpdj7CoHN0YXRpYyBUQ0d2X2k2 NCBjcHVfdG1wMV9pNjQ7PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+wqBzdGF0aWMgdWludDhfdCBn ZW5fb3BjX2NjX29wW09QQ19CVUZfU0laRV07PC9kaXY+PGRpdj4rc3RhdGljIHVpbnQxNl90IGdl bl9vcGNfZnBfb3BbT1BDX0JVRl9TSVpFXTs8L2Rpdj48ZGl2PitzdGF0aWMgdWludDE2X3QgZ2Vu X29wY19mcF9jc1tPUENfQlVGX1NJWkVdOzwvZGl2Pg0KPGRpdj4NCitzdGF0aWMgdGFyZ2V0X3Vs b25nIGdlbl9vcGNfZnBfaXBbT1BDX0JVRl9TSVpFXTs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj7C oCNpbmNsdWRlICZxdW90O2V4ZWMvZ2VuLWljb3VudC5oJnF1b3Q7PC9kaXY+PGRpdj7CoDwvZGl2 PjxkaXY+QEAgLTEwNCw2ICsxMTUsMTAgQEAgdHlwZWRlZiBzdHJ1Y3QgRGlzYXNDb250ZXh0IHs8 L2Rpdj48ZGl2PsKgIMKgIMKgaW50IHNzMzI7IMKgIC8qIDMyIGJpdCBzdGFjayBzZWdtZW50ICov PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqBDQ09wIGNjX29wOyDCoC8qIGN1cnJlbnQgQ0Mgb3BlcmF0 aW9uICovPC9kaXY+PGRpdj7CoCDCoCDCoGJvb2wgY2Nfb3BfZGlydHk7PC9kaXY+PGRpdj4rIMKg IMKgdWludDE2X3QgZnBfb3A7PC9kaXY+PGRpdj4rIMKgIMKgYm9vbCBmcF9lcF9kaXJ0eTs8L2Rp dj48ZGl2PisgwqAgwqB0YXJnZXRfdWxvbmcgZnBfaXA7PC9kaXY+PGRpdj4rIMKgIMKgdWludDE2 X3QgZnBfY3M7PC9kaXY+PGRpdj4NCg0KwqAgwqAgwqBpbnQgYWRkc2VnOyAvKiBub24gemVybyBp ZiBlaXRoZXIgRFMvRVMvU1MgaGF2ZSBhIG5vbiB6ZXJvIGJhc2UgKi88L2Rpdj48ZGl2PsKgIMKg IMKgaW50IGZfc3Q7IMKgIC8qIGN1cnJlbnRseSB1bnVzZWQgKi88L2Rpdj48ZGl2PsKgIMKgIMKg aW50IHZtODY7IMKgIC8qIHZtODYgbW9kZSAqLzwvZGl2PjxkaXY+QEAgLTIwOCw2ICsyMjMsNjIg QEAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2Nfb3BfbGl2ZVtDQ19PUF9OQl0gPSB7PC9kaXY+DQoN CjxkaXY+wqAgwqAgwqBbQ0NfT1BfQ0xSXSA9IDAsPC9kaXY+PGRpdj7CoH07PC9kaXY+PGRpdj7C oDwvZGl2PjxkaXY+K3N0YXRpYyBpbmxpbmUgYm9vbCBpbnN0cl9pc194ODdfbmMoaW50IG1vZHJt LCBpbnQgYik8L2Rpdj48ZGl2Pit7PC9kaXY+PGRpdj4rIMKgIMKgaW50IG9wLCBtb2QsIHJtOzwv ZGl2PjxkaXY+KyDCoCDCoHN3aXRjaCAoYikgezwvZGl2PjxkaXY+KyDCoCDCoGNhc2UgMHhkOCAu Li4gMHhkZjo8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgLyogZmxvYXRzICovPC9kaXY+PGRp dj4rIMKgIMKgIMKgIMKgb3AgPSAoKGIgJmFtcDsgNykgJmx0OyZsdDsgMykgfCAoKG1vZHJtICZn dDsmZ3Q7IDMpICZhbXA7IDcpOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoG1vZCA9IChtb2RybSAm Z3Q7Jmd0OyA2KSAmYW1wOyAzOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoHJtID0gbW9kcm0gJmFt cDsgNzs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj4NCg0KPGRp dj4rIMKgIMKgIMKgIMKgIMKgIMKgLyogbWVtb3J5ICovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKg IMKgIMKgc3dpdGNoIChvcCkgezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgw YzogLyogZmxkZW52ICovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAweDBkOiAv KiBmbGRjdyAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgwZTogLyogZnN0 ZW52LCBmbnN0ZW52ICovPC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgw ZjogLyogZnN0Y3csIGZuc3RjdyAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNhc2Ug MHgyYzogLyogZnJzdG9yICovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAweDJl OiAvKiBmc2F2ZSwgZm5zYXZlICovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAw eDJmOiAvKiBmc3RzdywgZm5zdHN3ICovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgcmV0dXJuIGZhbHNlOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBkZWZhdWx0 OjwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiB0cnVlOzwvZGl2Pjxk aXY+KyDCoCDCoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqB9IGVsc2Ugezwv ZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoC8qIHJlZ2lzdGVyICovPC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgc3dpdGNoIChvcCkgezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDC oGNhc2UgMHgwYTo8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJu IGZhbHNlOyAvKiBmbm9wLCBJbGxlZ2FsIG9wICovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKg IMKgY2FzZSAweDBlOiAvKiBmZGVjc3RwLCBmaW5jc3RwICovPC9kaXY+PGRpdj4rIMKgIMKgIMKg IMKgIMKgIMKgY2FzZSAweDI4OiAvKiBmZnJlZSAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHJldHVybiBmYWxzZTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBjYXNl IDB4MWM6PC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHN3aXRjaCAocm0p IHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDE6IC8qIGZlbmkgKi88 L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gdHJ1ZTs8L2Rp dj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDI6IC8qIGZjbGV4LCBmbmNsZXgg Ki88L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDM6IC8qIGZpbml0LCBm bmluaXQgKi88L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0 dXJuIGZhbHNlOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgNDogLyog ZnNldHBtICovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJu IHRydWU7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGVmYXVsdDogLyogSWxs ZWdhbCBvcCAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVy biBmYWxzZTs8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2Pjxk aXY+KyDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgzYzo8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqByZXR1cm4gZmFsc2U7IC8qIGZzdHN3LCBmbnN0c3csIElsbGVnYWwgb3AgKi88 L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBkZWZhdWx0OjwvZGl2PjxkaXY+KyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHJldHVybiB0cnVlOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDC oH08L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+KyDCoCDCoC8qY2FzZSAw eDliOiAvLyBmd2FpdCwgd2FpdDwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoHJldHVybiBmYWxzZTsq LzwvZGl2PjxkaXY+KyDCoCDCoGRlZmF1bHQ6PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgcmV0dXJu IGZhbHNlOzwvZGl2PjxkaXY+KyDCoCDCoH08L2Rpdj48ZGl2Pit9PC9kaXY+PGRpdj4rPC9kaXY+ PGRpdj7CoHN0YXRpYyB2b2lkIHNldF9jY19vcChEaXNhc0NvbnRleHQgKnMsIENDT3Agb3ApPC9k aXY+DQoNCjxkaXY+wqB7PC9kaXY+PGRpdj7CoCDCoCDCoGludCBkZWFkOzwvZGl2PjxkaXY+QEAg LTI1Myw2ICszMjQsMjMgQEAgc3RhdGljIHZvaWQgZ2VuX3VwZGF0ZV9jY19vcChEaXNhc0NvbnRl eHQgKnMpPC9kaXY+PGRpdj7CoCDCoCDCoH08L2Rpdj48ZGl2PsKgfTwvZGl2PjxkaXY+wqA8L2Rp dj48ZGl2PitzdGF0aWMgdm9pZCBzZXRfZXAoRGlzYXNDb250ZXh0ICpzLCBpbnQgZnBfb3AsIGlu dCBmcF9pcCwgaW50IGZwX2NzKSB7PC9kaXY+DQoNCjxkaXY+KyDCoCDCoHMtJmd0O2ZwX29wID0g RlBfRVBfVkFMSUQgfCBmcF9vcDs8L2Rpdj48ZGl2PisgwqAgwqBzLSZndDtmcF9pcCA9IGZwX2lw OzwvZGl2PjxkaXY+KyDCoCDCoHMtJmd0O2ZwX2NzID0gZnBfY3M7PC9kaXY+PGRpdj4rIMKgIMKg cy0mZ3Q7ZnBfZXBfZGlydHkgPSB0cnVlOzwvZGl2PjxkaXY+K308L2Rpdj48ZGl2Pis8L2Rpdj48 ZGl2PitzdGF0aWMgdm9pZCBnZW5fdXBkYXRlX2VwKERpc2FzQ29udGV4dCAqcyk8L2Rpdj4NCg0K PGRpdj4rezwvZGl2PjxkaXY+KyDCoCDCoGlmIChzLSZndDtmcF9lcF9kaXJ0eSkgezwvZGl2Pjxk aXY+KyDCoCDCoCDCoCDCoHRjZ19nZW5fbW92aV9pMzIoY3B1X2Zwb3AsIHMtJmd0O2ZwX29wKTs8 L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqB0Y2dfZ2VuX21vdmlfdGwoY3B1X2ZwaXAsIHMtJmd0O2Zw X2lwKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9mcGNzLCBz LSZndDtmcF9jcyk7PC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDCoHMtJmd0O2ZwX2VwX2RpcnR5 ID0gZmFsc2U7PC9kaXY+PGRpdj4rIMKgIMKgfTwvZGl2PjxkaXY+K308L2Rpdj48ZGl2Pis8L2Rp dj48ZGl2PsKgI2lmZGVmIFRBUkdFVF9YODZfNjQ8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj7CoCNk ZWZpbmUgTkJfT1BfU0laRVMgNDwvZGl2PjxkaXY+QEAgLTY2Niw2ICs3NTQsNyBAQCBzdGF0aWMg dm9pZCBnZW5fY2hlY2tfaW8oRGlzYXNDb250ZXh0ICpzLCBUQ0dNZW1PcCBvdCwgdGFyZ2V0X3Vs b25nIGN1cl9laXAsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqBzdGF0ZV9zYXZlZCA9IDA7PC9kaXY+ PGRpdj7CoCDCoCDCoGlmIChzLSZndDtwZSAmYW1wOyZhbXA7IChzLSZndDtjcGwgJmd0OyBzLSZn dDtpb3BsIHx8IHMtJmd0O3ZtODYpKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGdlbl91cGRh dGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShjdXJfZWlwKTs8L2Rpdj4NCg0KPGRpdj7C oCDCoCDCoCDCoCDCoHN0YXRlX3NhdmVkID0gMTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgdGNn X2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7PC9kaXY+PGRpdj5AQCAt Njg2LDYgKzc3NSw3IEBAIHN0YXRpYyB2b2lkIGdlbl9jaGVja19pbyhEaXNhc0NvbnRleHQgKnMs IFRDR01lbU9wIG90LCB0YXJnZXRfdWxvbmcgY3VyX2VpcCw8L2Rpdj48ZGl2PsKgIMKgIMKgaWYo cy0mZ3Q7ZmxhZ3MgJmFtcDsgSEZfU1ZNSV9NQVNLKSB7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAg wqAgwqBpZiAoIXN0YXRlX3NhdmVkKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdl bl91cGRhdGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0 ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShjdXJfZWlw KTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBzdm1f ZmxhZ3MgfD0gKDEgJmx0OyZsdDsgKDQgKyBvdCkpOzwvZGl2Pg0KDQo8ZGl2PkBAIC0xMDk3LDYg KzExODcsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2pjYzEoRGlzYXNDb250ZXh0ICpzLCBp bnQgYiwgaW50IGwxKTwvZGl2PjxkaXY+wqAgwqAgwqBDQ1ByZXBhcmUgY2MgPSBnZW5fcHJlcGFy ZV9jYyhzLCBiLCBjcHVfVFswXSk7PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+wqAgwqAgwqBnZW5f dXBkYXRlX2NjX29wKHMpOzwvZGl2PjxkaXY+KyDCoCDCoGdlbl91cGRhdGVfZXAocyk7PC9kaXY+ DQoNCjxkaXY+wqAgwqAgwqBpZiAoY2MubWFzayAhPSAtMSkgezwvZGl2PjxkaXY+wqAgwqAgwqAg wqAgwqB0Y2dfZ2VuX2FuZGlfdGwoY3B1X1RbMF0sIGNjLnJlZywgY2MubWFzayk7PC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoGNjLnJlZyA9IGNwdV9UWzBdOzwvZGl2PjxkaXY+QEAgLTE1ODAsMTQg KzE2NzEsMTQgQEAgc3RhdGljIHZvaWQgZ2VuX3JvdF9ybV9UMShEaXNhc0NvbnRleHQgKnMsIFRD R01lbU9wIG90LCBpbnQgb3AxLCBpbnQgaXNfcmlnaHQpPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqB0 MCA9IHRjZ19jb25zdF9pMzIoMCk7PC9kaXY+PGRpdj7CoCDCoCDCoHQxID0gdGNnX3RlbXBfbmV3 X2kzMigpOzwvZGl2PjxkaXY+wqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMih0MSwgY3B1X1Rb MV0pOzwvZGl2PjxkaXY+LSDCoCDCoHRjZ19nZW5fbW92aV9pMzIoY3B1X3RtcDJfaTMyLCBDQ19P UF9BRENPWCk7wqA8L2Rpdj48ZGl2PisgwqAgwqB0Y2dfZ2VuX21vdmlfaTMyKGNwdV90bXAyX2kz MiwgQ0NfT1BfQURDT1gpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgdGNnX2dlbl9tb3ZpX2kzMihj cHVfdG1wM19pMzIsIENDX09QX0VGTEFHUyk7PC9kaXY+PGRpdj7CoCDCoCDCoHRjZ19nZW5fbW92 Y29uZF9pMzIoVENHX0NPTkRfTkUsIGNwdV9jY19vcCwgdDEsIHQwLDwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjcHVfdG1wMl9pMzIsIGNwdV90bXAzX2kz Mik7PC9kaXY+PGRpdj7CoCDCoCDCoHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTs8L2Rpdj4NCg0KPGRp dj7CoCDCoCDCoHRjZ190ZW1wX2ZyZWVfaTMyKHQxKTs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4t IMKgIMKgLyogVGhlIENDX09QIHZhbHVlIGlzIG5vIGxvbmdlciBwcmVkaWN0YWJsZS4gwqAqL8Kg PC9kaXY+PGRpdj4rIMKgIMKgLyogVGhlIENDX09QIHZhbHVlIGlzIG5vIGxvbmdlciBwcmVkaWN0 YWJsZS4gwqAqLzwvZGl2PjxkaXY+wqAgwqAgwqBzZXRfY2Nfb3AocywgQ0NfT1BfRFlOQU1JQyk7 PC9kaXY+DQoNCjxkaXY+wqB9PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+QEAgLTE4NjMsNyArMTk1 NCw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zaGlmdGkoRGlzYXNDb250ZXh0ICpzMSwgaW50IG9wLCBU Q0dNZW1PcCBvdCwgaW50IGQsIGludCBjKTwvZGl2PjxkaXY+wqAgwqAgwqB9PC9kaXY+PGRpdj7C oH08L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4tc3RhdGljIHZvaWQgZ2VuX2xlYV9tb2RybShDUFVY ODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBtb2RybSk8L2Rpdj4NCg0KPGRpdj4r c3RhdGljIHZvaWQgZ2VuX2xlYV9tb2RybShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQg KnMsIGludCBtb2RybSwgaW50IGIpPC9kaXY+PGRpdj7CoHs8L2Rpdj48ZGl2PsKgIMKgIMKgdGFy Z2V0X2xvbmcgZGlzcDs8L2Rpdj48ZGl2PsKgIMKgIMKgaW50IGhhdmVzaWI7PC9kaXY+PGRpdj5A QCAtMTg3MSw2ICsxOTYyLDcgQEAgc3RhdGljIHZvaWQgZ2VuX2xlYV9tb2RybShDUFVYODZTdGF0 ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBtb2RybSk8L2Rpdj4NCg0KPGRpdj7CoCDCoCDC oGludCBpbmRleDs8L2Rpdj48ZGl2PsKgIMKgIMKgaW50IHNjYWxlOzwvZGl2PjxkaXY+wqAgwqAg wqBpbnQgbW9kLCBybSwgY29kZSwgb3ZlcnJpZGUsIG11c3RfYWRkX3NlZzs8L2Rpdj48ZGl2Pisg wqAgwqBpbnQgY3Vycl9pbnN0cl9pc194ODdfbmM7PC9kaXY+PGRpdj7CoCDCoCDCoFRDR3Ygc3Vt OzwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PsKgIMKgIMKgb3ZlcnJpZGUgPSBzLSZndDtvdmVycmlk ZTs8L2Rpdj4NCg0KPGRpdj5AQCAtMTk1MCw2ICsyMDQyLDEzIEBAIHN0YXRpYyB2b2lkIGdlbl9s ZWFfbW9kcm0oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCBpbnQgbW9kcm0pPC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fYWRkaV90bChjcHVfQTAsIHN1bSwg ZGlzcCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4r IMKgIMKgIMKgIMKgY3Vycl9pbnN0cl9pc194ODdfbmMgPSBpbnN0cl9pc194ODdfbmMobW9kcm0s IGIpOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqBpZiAoY3Vycl9pbnN0cl9pc194ODdfbmMp IHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX21vdl90bChjcHVfZnBkcCwg Y3B1X0EwKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBpZiAocy0mZ3Q7YWZsYWcgPT0g TU9fMzIpIHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2V4dDMy dV90bChjcHVfZnBkcCwgY3B1X2ZwZHApOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAg wqB9PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBpZiAo bXVzdF9hZGRfc2VnKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChvdmVycmlk ZSAmbHQ7IDApIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGJhc2Ug PT0gUl9FQlAgfHwgYmFzZSA9PSBSX0VTUCkgezwvZGl2PjxkaXY+QEAgLTE5NjEsNiArMjA2MCwx MiBAQCBzdGF0aWMgdm9pZCBnZW5fbGVhX21vZHJtKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29u dGV4dCAqcywgaW50IG1vZHJtKTwvZGl2Pg0KDQo8ZGl2PsKgPC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoHRjZ19nZW5fbGRfdGwoY3B1X3RtcDAsIGNwdV9lbnYsPC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9mZnNldG9mKENQVVg4NlN0YXRl LCBzZWdzW292ZXJyaWRlXS5iYXNlKSk7PC9kaXY+PGRpdj4rPC9kaXY+PGRpdj4rIMKgIMKgIMKg IMKgIMKgIMKgaWYgKGN1cnJfaW5zdHJfaXNfeDg3X25jKSB7PC9kaXY+PGRpdj4rIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZF9pMzIoY3B1X2ZwZHMsIGNwdV9lbnYsPC9kaXY+DQoN CjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9mZnNl dG9mKENQVVg4NlN0YXRlLCBzZWdzW292ZXJyaWRlXS5zZWxlY3RvcikpOzwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2Pis8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgaWYgKENPREU2NChzKSkgezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp ZiAocy0mZ3Q7YWZsYWcgPT0gTU9fMzIpIHs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fZXh0MzJ1X3RsKGNwdV9BMCwgY3B1X0EwKTs8L2Rpdj48 ZGl2PkBAIC0xOTcwLDYgKzIwNzUsMTEgQEAgc3RhdGljIHZvaWQgZ2VuX2xlYV9tb2RybShDUFVY ODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBtb2RybSk8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgdGNnX2dlbl9hZGRfdGwoY3B1X0EwLCBjcHVfQTAsIGNwdV90bXAwKTs8L2Rpdj4NCg0KPGRp dj4rIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBpZiAo Y3Vycl9pbnN0cl9pc194ODdfbmMpIHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB0Y2dfZ2VuX2xkX2kzMihjcHVfZnBkcywgY3B1X2Vudiw8L2Rpdj48ZGl2PisgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvZmZzZXRvZihDUFVYODZTdGF0ZSwg c2Vnc1tSX0RTXS5zZWxlY3RvcikpOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqB9 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoGlmIChzLSZndDthZmxhZyA9PSBNT18zMikgezwvZGl2PjxkaXY+QEAgLTIwMzksOCAr MjE0OSwyMiBAQCBzdGF0aWMgdm9pZCBnZW5fbGVhX21vZHJtKENQVVg4NlN0YXRlICplbnYsIERp c2FzQ29udGV4dCAqcywgaW50IG1vZHJtKTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBvdmVycmlkZSA9IFJfRFM7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2Pisg wqAgwqAgwqAgwqAgwqAgwqBpZiAoaW5zdHJfaXNfeDg3X25jKG1vZHJtLCBiKSkgezwvZGl2Pjxk aXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbW92X3RsKGNwdV9mcGRwLCBjcHVf QTApOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbGRfaTMyKGNw dV9mcGRzLCBjcHVfZW52LDwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBvZmZzZXRvZihDUFVYODZTdGF0ZSwgc2Vnc1tvdmVycmlkZV0u c2VsZWN0b3IpKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9hZGRsX0EwX3NlZyhzLCBvdmVycmlkZSk7PC9kaXY+PGRp dj4rIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBpZiAo aW5zdHJfaXNfeDg3X25jKG1vZHJtLCBiKSkgezwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB0Y2dfZ2VuX21vdl90bChjcHVfZnBkcCwgY3B1X0EwKTs8L2Rpdj48ZGl2Pisg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2xkX2kzMihjcHVfZnBkcywgY3B1X2Vudiw8 L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBv ZmZzZXRvZihDUFVYODZTdGF0ZSwgc2Vnc1tSX0RTXS5zZWxlY3RvcikpOzwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoH08L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2 PisjaWZkZWYgVEFSR0VUX1g4Nl82NDwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoHRjZ19nZW5fYW5k aV90bChjcHVfZnBkcCwgY3B1X2ZwZHAsIDB4ZmZmZmZmZmYpOzwvZGl2PjxkaXY+KyNlbmRpZjwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBicmVhazs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj7CoCDC oCDCoGRlZmF1bHQ6PC9kaXY+PGRpdj5AQCAtMjEzMCw3ICsyMjU0LDcgQEAgc3RhdGljIHZvaWQg Z2VuX2FkZF9BMF9kc19zZWcoRGlzYXNDb250ZXh0ICpzKTwvZGl2Pg0KDQo8ZGl2PsKgLyogZ2Vu ZXJhdGUgbW9kcm0gbWVtb3J5IGxvYWQgb3Igc3RvcmUgb2YgJiMzOTtyZWcmIzM5Oy4gVE1QMCBp cyB1c2VkIGlmIHJlZyA9PTwvZGl2PjxkaXY+wqAgwqAgT1JfVE1QMCAqLzwvZGl2PjxkaXY+wqBz dGF0aWMgdm9pZCBnZW5fbGRzdF9tb2RybShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQg KnMsIGludCBtb2RybSw8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgVENHTWVtT3Agb3QsIGludCByZWcsIGludCBpc19zdG9yZSk8L2Rpdj4NCg0KPGRp dj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFRDR01lbU9wIG90LCBp bnQgcmVnLCBpbnQgaXNfc3RvcmUsIGludCBiKTwvZGl2PjxkaXY+wqB7PC9kaXY+PGRpdj7CoCDC oCDCoGludCBtb2QsIHJtOzwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PkBAIC0yMTQ3LDcgKzIyNzEs NyBAQCBzdGF0aWMgdm9pZCBnZW5fbGRzdF9tb2RybShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0Nv bnRleHQgKnMsIGludCBtb2RybSw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9vcF9tb3ZfcmVnX3Yob3QsIHJlZywgY3B1X1RbMF0pOzwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj4tIMKgIMKgIMKg IMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBn ZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBp ZiAoaXNfc3RvcmUpIHs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChyZWcg IT0gT1JfVE1QMCk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX21v dl92X3JlZyhvdCwgY3B1X1RbMF0sIHJlZyk7PC9kaXY+PGRpdj5AQCAtMjI1MCw3ICsyMzc0LDcg QEAgc3RhdGljIHZvaWQgZ2VuX2Ntb3ZjYzEoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0 ICpzLCBUQ0dNZW1PcCBvdCwgaW50IGIsPC9kaXY+PGRpdj4NCg0KwqB7PC9kaXY+PGRpdj7CoCDC oCDCoENDUHJlcGFyZSBjYzs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4tIMKgIMKgZ2VuX2xkc3Rf bW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2PjxkaXY+KyDCoCDCoGdl bl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwLCBiKTs8L2Rpdj48ZGl2 PsKgPC9kaXY+PGRpdj7CoCDCoCDCoGNjID0gZ2VuX3ByZXBhcmVfY2MocywgYiwgY3B1X1RbMV0p OzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgaWYgKGNjLm1hc2sgIT0gLTEpIHs8L2Rpdj48ZGl2PkBA IC0yMjk3LDYgKzI0MjEsNyBAQCBzdGF0aWMgdm9pZCBnZW5fbW92bF9zZWdfVDAoRGlzYXNDb250 ZXh0ICpzLCBpbnQgc2VnX3JlZywgdGFyZ2V0X3Vsb25nIGN1cl9laXApPC9kaXY+PGRpdj7CoCDC oCDCoGlmIChzLSZndDtwZSAmYW1wOyZhbXA7ICFzLSZndDt2bTg2KSB7PC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoC8qIFhYWDogb3B0aW1pemUgYnkgZmluZGluZyBwcm9jZXNzb3Igc3RhdGUgZHlu YW1pY2FsbHkgKi88L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Ao cyk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShjdXJfZWlwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg dGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfbG9hZF9zZWcoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihz ZWdfcmVnKSwgY3B1X3RtcDJfaTMyKTs8L2Rpdj4NCg0KPGRpdj5AQCAtMjMyNiw2ICsyNDUxLDcg QEAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oRGlzYXNDb250ZXh0ICpzLCB0YXJnZXRf dWxvbmcgcGNfc3RhcnQsPC9kaXY+PGRpdj7CoCDCoCDCoGlmIChsaWtlbHkoIShzLSZndDtmbGFn cyAmYW1wOyBIRl9TVk1JX01BU0spKSk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgcmV0dXJuOzwv ZGl2PjxkaXY+wqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzwvZGl2Pg0KDQo8ZGl2PisgwqAg wqBnZW5fdXBkYXRlX2VwKHMpOzwvZGl2PjxkaXY+wqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0 IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+PGRpdj7CoCDCoCDCoGdlbl9oZWxwZXJfc3ZtX2NoZWNr X2ludGVyY2VwdF9wYXJhbShjcHVfZW52LCB0Y2dfY29uc3RfaTMyKHR5cGUpLDwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgdGNnX2NvbnN0X2k2NChwYXJhbSkpOzwvZGl2Pg0KDQo8ZGl2PkBAIC0yNTEzLDYgKzI2 MzksNyBAQCBzdGF0aWMgdm9pZCBnZW5fZW50ZXIoRGlzYXNDb250ZXh0ICpzLCBpbnQgZXNwX2Fk ZGVuZCwgaW50IGxldmVsKTwvZGl2PjxkaXY+wqBzdGF0aWMgdm9pZCBnZW5fZXhjZXB0aW9uKERp c2FzQ29udGV4dCAqcywgaW50IHRyYXBubywgdGFyZ2V0X3Vsb25nIGN1cl9laXApPC9kaXY+PGRp dj7CoHs8L2Rpdj48ZGl2PsKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rpdj4NCg0KPGRp dj4rIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgZ2VuX2ptcF9pbShj dXJfZWlwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgZ2VuX2hlbHBlcl9yYWlzZV9leGNlcHRpb24oY3B1 X2VudiwgdGNnX2NvbnN0X2kzMih0cmFwbm8pKTs8L2Rpdj48ZGl2PsKgIMKgIMKgcy0mZ3Q7aXNf am1wID0gRElTQVNfVEJfSlVNUDs8L2Rpdj48ZGl2PkBAIC0yNTI0LDYgKzI2NTEsNyBAQCBzdGF0 aWMgdm9pZCBnZW5faW50ZXJydXB0KERpc2FzQ29udGV4dCAqcywgaW50IGludG5vLDwvZGl2Pg0K DQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGFyZ2V0X3Vs b25nIGN1cl9laXAsIHRhcmdldF91bG9uZyBuZXh0X2VpcCk8L2Rpdj48ZGl2PsKgezwvZGl2Pjxk aXY+wqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzwvZGl2PjxkaXY+KyDCoCDCoGdlbl91cGRh dGVfZXAocyk7PC9kaXY+PGRpdj7CoCDCoCDCoGdlbl9qbXBfaW0oY3VyX2VpcCk7PC9kaXY+PGRp dj7CoCDCoCDCoGdlbl9oZWxwZXJfcmFpc2VfaW50ZXJydXB0KGNwdV9lbnYsIHRjZ19jb25zdF9p MzIoaW50bm8pLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHRjZ19jb25zdF9pMzIobmV4dF9laXAgLSBjdXJfZWlwKSk7PC9kaXY+ PGRpdj5AQCAtMjUzMyw2ICsyNjYxLDcgQEAgc3RhdGljIHZvaWQgZ2VuX2ludGVycnVwdChEaXNh c0NvbnRleHQgKnMsIGludCBpbnRubyw8L2Rpdj48ZGl2PsKgc3RhdGljIHZvaWQgZ2VuX2RlYnVn KERpc2FzQ29udGV4dCAqcywgdGFyZ2V0X3Vsb25nIGN1cl9laXApPC9kaXY+DQoNCjxkaXY+wqB7 PC9kaXY+PGRpdj7CoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKgIMKg Z2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgZ2VuX2ptcF9pbShjdXJfZWlwKTs8 L2Rpdj48ZGl2PsKgIMKgIMKgZ2VuX2hlbHBlcl9kZWJ1ZyhjcHVfZW52KTs8L2Rpdj48ZGl2PsKg IMKgIMKgcy0mZ3Q7aXNfam1wID0gRElTQVNfVEJfSlVNUDs8L2Rpdj48ZGl2PkBAIC0yNTQzLDYg KzI2NzIsNyBAQCBzdGF0aWMgdm9pZCBnZW5fZGVidWcoRGlzYXNDb250ZXh0ICpzLCB0YXJnZXRf dWxvbmcgY3VyX2VpcCk8L2Rpdj4NCg0KPGRpdj7CoHN0YXRpYyB2b2lkIGdlbl9lb2IoRGlzYXND b250ZXh0ICpzKTwvZGl2PjxkaXY+wqB7PC9kaXY+PGRpdj7CoCDCoCDCoGdlbl91cGRhdGVfY2Nf b3Aocyk7PC9kaXY+PGRpdj4rIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKg IMKgaWYgKHMtJmd0O3RiLSZndDtmbGFncyAmYW1wOyBIRl9JTkhJQklUX0lSUV9NQVNLKSB7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfcmVzZXRfaW5oaWJpdF9pcnEoY3B1X2Vu dik7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqB9PC9kaXY+PGRpdj5AQCAtMjU2NCw2ICsyNjk0LDcg QEAgc3RhdGljIHZvaWQgZ2VuX2VvYihEaXNhc0NvbnRleHQgKnMpPC9kaXY+PGRpdj7CoHN0YXRp YyB2b2lkIGdlbl9qbXBfdGIoRGlzYXNDb250ZXh0ICpzLCB0YXJnZXRfdWxvbmcgZWlwLCBpbnQg dGJfbnVtKTwvZGl2PjxkaXY+wqB7PC9kaXY+PGRpdj7CoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Ao cyk7PC9kaXY+PGRpdj4NCg0KKyDCoCDCoGdlbl91cGRhdGVfZXAocyk7PC9kaXY+PGRpdj7CoCDC oCDCoHNldF9jY19vcChzLCBDQ19PUF9EWU5BTUlDKTs8L2Rpdj48ZGl2PsKgIMKgIMKgaWYgKHMt Jmd0O2ptcF9vcHQpIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgZ2VuX2dvdG9fdGIocywgdGJf bnVtLCBlaXApOzwvZGl2PjxkaXY+QEAgLTMwNDMsNyArMzE3NCw3IEBAIHN0YXRpYyB2b2lkIGdl bl9zc2UoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8L2Rpdj4NCg0K PGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgwZTc6IC8qIG1vdm50cSAqLzwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kID09IDMpPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqBn ZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDC oGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fc3RxX2Vudl9BMChzLCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgZnByZWdz W3JlZ10ubW14KSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqBjYXNlIDB4MWU3OiAvKiBtb3ZudGRxICovPC9kaXY+PGRpdj5AQCAt MzA1MSwyMCArMzE4MiwyMCBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYs IERpc2FzQ29udGV4dCAqcywgaW50IGIsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqBjYXNl IDB4MTJiOiAvKiBtb3ZudHBzICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmICht b2QgPT0gMyk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2Fs X29wOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBt b2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMs IG1vZHJtLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9zdG9fZW52 X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLCB4bW1fcmVnc1tyZWddKSk7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBjYXNlIDB4 M2YwOiAvKiBsZGRxdSAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kID09 IDMpPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8 L2Rpdj4NCg0KPGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1v ZHJtKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywg bW9kcm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRvX2Vudl9BMChz LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgeG1tX3JlZ3NbcmVnXSkpOzwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqBicmVhazs8L2Rpdj48ZGl2Pg0KDQrCoCDCoCDCoCDCoCDCoGNhc2UgMHgy MmI6IC8qIG1vdm50c3MgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAweDMyYjogLyog bW92bnRzZCAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kID09IDMpPC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj48 ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2 PjxkaXY+DQoNCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0s IGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoYjEgJmFtcDsgMSkgezwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fc3RxX2Vudl9BMChzLCBvZmZzZXRv ZihDUFVYODZTdGF0ZSwgeG1tX3JlZ3NbcmVnXSkpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+QEAgLTMwNzYsMTMgKzMyMDcsMTMgQEAgc3RhdGljIHZv aWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2 Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAweDZlOiAvKiBtb3ZkIG1tLCBlYSAqLzwvZGl2 PjxkaXY+wqAjaWZkZWYgVEFSR0VUX1g4Nl82NDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqBpZiAocy0mZ3Q7ZGZsYWcgPT0gTU9fNjQpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT182NCwgT1JfVE1QMCwgMCk7 PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBz LCBtb2RybSwgTU9fNjQsIE9SX1RNUDAsIDAsIGIpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9zdF90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2Yo Q1BVWDg2U3RhdGUsZnByZWdzW3JlZ10ubW14KSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoH0gZWxzZTwvZGl2PjxkaXY+wqAjZW5kaWY8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVu diwgcywgbW9kcm0sIE1PXzMyLCBPUl9UTVAwLCAwKTs8L2Rpdj4NCg0KPGRpdj4tIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2VudizCoDwvZGl2 PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9k cm0sIE1PXzMyLCBPUl9UTVAwLCAwLCBiKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVfZW52LDwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgb2Zmc2V0b2YoQ1BV WDg2U3RhdGUsZnByZWdzW3JlZ10ubW14KSk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9UWzBdKTs8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9tb3ZsX21tX1Qw X21teChjcHVfcHRyMCwgY3B1X3RtcDJfaTMyKTs8L2Rpdj48ZGl2PkBAIC0zMDkxLDE1ICszMjIy LDE1IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0 ICpzLCBpbnQgYiw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgxNmU6IC8qIG1v dmQgeG1tLCBlYSAqLzwvZGl2PjxkaXY+wqAjaWZkZWYgVEFSR0VUX1g4Nl82NDwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocy0mZ3Q7ZGZsYWcgPT0gTU9fNjQpIHs8L2Rpdj48ZGl2 Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBN T182NCwgT1JfVE1QMCwgMCk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNn X2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2VudizCoDwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT182NCwgT1Jf VE1QMCwgMCwgYik7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9h ZGRpX3B0cihjcHVfcHRyMCwgY3B1X2Vudiw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9y ZWdzW3JlZ10pKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9o ZWxwZXJfbW92cV9tbV9UMF94bW0oY3B1X3B0cjAsIGNwdV9UWzBdKTs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgfSBlbHNlPC9kaXY+PGRpdj7CoCNlbmRpZjwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqB7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xk c3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMzIsIE9SX1RNUDAsIDApOzwvZGl2Pg0KDQo8ZGl2 Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVf ZW52LMKgPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0o ZW52LCBzLCBtb2RybSwgTU9fMzIsIE9SX1RNUDAsIDAsIGIpOzwvZGl2PjxkaXY+KyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsPC9kaXY+ PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBv ZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddKSk7PC9kaXY+DQoNCjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNw dV9UWzBdKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9t b3ZsX21tX1QwX3htbShjcHVfcHRyMCwgY3B1X3RtcDJfaTMyKTs8L2Rpdj48ZGl2PkBAIC0zMTA3 LDcgKzMyMzgsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2Fz Q29udGV4dCAqcywgaW50IGIsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVh azs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAweDZmOiAvKiBtb3ZxIG1tLCBlYSAqLzwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2 PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2Ry bSwgYik7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRxX2Vu dl9BMChzLCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgZnByZWdzW3JlZ10ubW14KSk7PC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHJtID0gKG1vZHJtICZhbXA7IDcpOzwvZGl2PjxkaXY+QEAgLTMxMjQsNyArMzI1 NSw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0 ICpzLCBpbnQgYiw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgxNmY6IC8qIG1v dmRxYSB4bW0sIGVhICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgyNmY6IC8qIG1v dmRxdSB4bW0sIGVhICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0g MykgezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52 LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9t b2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZG9fZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLCB4bW1fcmVnc1ty ZWddKSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJtID0gKG1vZHJtICZhbXA7IDcpIHwgUkVYX0Iocyk7 PC9kaXY+PGRpdj5AQCAtMzEzNCw3ICszMjY1LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVY ODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2Pg0KDQo8ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgYnJlYWs7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgyMTA6 IC8qIG1vdnNzIHhtbSwgZWEgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1v ZCAhPSAzKSB7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2Ry bShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX29wX2xkX3YocywgTU9fMzIsIGNwdV9UWzBdLCBjcHVfQTApOzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3N0MzJfdGwoY3B1X1RbMF0s IGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMCkpKTs8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZpX3RsKGNwdV9U WzBdLCAwKTs8L2Rpdj4NCg0KPGRpdj5AQCAtMzE0OSw3ICszMjgwLDcgQEAgc3RhdGljIHZvaWQg Z2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgY2Fz ZSAweDMxMDogLyogbW92c2QgeG1tLCBlYSAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRxX2Vudl9BMChzLCBvZmZzZXRvZihDUFVYODZTdGF0 ZSw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTs8L2Rpdj48ZGl2 PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZpX3RsKGNwdV9UWzBdLCAwKTs8 L2Rpdj4NCg0KPGRpdj5AQCAtMzE2NCw3ICszMjk1LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShD UFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqBjYXNlIDB4MDEyOiAvKiBtb3ZscHMgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg Y2FzZSAweDExMjogLyogbW92bHBkICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlm IChtb2QgIT0gMykgezwvZGl2Pg0KDQo8ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9sZHFfZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLDwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgeG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOzwvZGl2Pg0KDQo8ZGl2 PsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PkBAIC0zMTc2LDcgKzMzMDcs NyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAq cywgaW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqBjYXNlIDB4MjEyOiAvKiBtb3ZzbGR1cCAqLzwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj4NCg0KPGRpdj4tIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2PisgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRvX2Vudl9BMChzLCBvZmZzZXRv ZihDUFVYODZTdGF0ZSwgeG1tX3JlZ3NbcmVnXSkpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqB9IGVsc2UgezwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcm0g PSAobW9kcm0gJmFtcDsgNykgfCBSRVhfQihzKTs8L2Rpdj48ZGl2PkBAIC0zMTkyLDcgKzMzMjMs NyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAq cywgaW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqBjYXNlIDB4MzEyOiAvKiBtb3ZkZHVwICovPC9kaXY+DQoNCjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+ PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHFfZW52X0EwKHMsIG9mZnNldG9m KENQVVg4NlN0YXRlLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHhtbV9yZWdzW3JlZ10uWE1NX1Eo MCkpKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PkBA IC0zMjA2LDcgKzMzMzcsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYs IERpc2FzQ29udGV4dCAqcywgaW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgw MTY6IC8qIG1vdmhwcyAqLzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAweDExNjog LyogbW92aHBkICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykg ezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2Ry bShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2xkcV9lbnZfQTAocywgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsPC9kaXY+DQoNCjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgeG1tX3JlZ3NbcmVnXS5YTU1fUSgxKSkpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+QEAgLTMyMTgsNyArMzM0OSw3IEBAIHN0YXRpYyB2b2lk IGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8L2Rpdj48 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAg wqBjYXNlIDB4MjE2OiAvKiBtb3ZzaGR1cCAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9sZG9fZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLCB4 bW1fcmVnc1tyZWddKSk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ug ezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBybSA9IChtb2RybSAmYW1wOyA3 KSB8IFJFWF9CKHMpOzwvZGl2PjxkaXY+QEAgLTMyNTYsMzQgKzMzODcsMzQgQEAgc3RhdGljIHZv aWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqBjYXNlIDB4N2U6IC8qIG1vdmQgZWEsIG1tICovPC9kaXY+DQoN CjxkaXY+wqAjaWZkZWYgVEFSR0VUX1g4Nl82NDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqBpZiAocy0mZ3Q7ZGZsYWcgPT0gTU9fNjQpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqB0Y2dfZ2VuX2xkX2k2NChjcHVfVFswXSwgY3B1X2VudizCoDwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbGRfaTY0KGNwdV9UWzBdLCBjcHVfZW52LDwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg b2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZ10ubW14KSk7PC9kaXY+DQoNCjxkaXY+LSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE1PXzY0 LCBPUl9UTVAwLCAxKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRz dF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT182NCwgT1JfVE1QMCwgMSwgYik7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZTwvZGl2PjxkaXY+wqAjZW5kaWY8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgezwvZGl2Pg0KDQo8ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LMKgPC9kaXY+PGRpdj4rIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZDMydV90bChjcHVfVFswXSwgY3B1X2Vudiw8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IG9mZnNldG9mKENQVVg4NlN0YXRlLGZwcmVnc1tyZWddLm1teC5NTVhfTCgwKSkpOzwvZGl2Pg0K PGRpdj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1v ZHJtLCBNT18zMiwgT1JfVE1QMCwgMSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMzIsIE9SX1RNUDAsIDEsIGIpOzwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoGJyZWFrOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBjYXNlIDB4MTdlOiAvKiBtb3ZkIGVh LCB4bW0gKi88L2Rpdj4NCg0KPGRpdj7CoCNpZmRlZiBUQVJHRVRfWDg2XzY0PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoGlmIChzLSZndDtkZmxhZyA9PSBNT182NCkgezwvZGl2PjxkaXY+ LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbGRfaTY0KGNwdV9UWzBdLCBjcHVfZW52 LMKgPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZF9pNjQoY3B1 X1RbMF0sIGNwdV9lbnYsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9R KDApKSk7PC9kaXY+DQoNCjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21v ZHJtKGVudiwgcywgbW9kcm0sIE1PXzY0LCBPUl9UTVAwLCAxKTs8L2Rpdj48ZGl2PisgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT182NCwgT1Jf VE1QMCwgMSwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZTwvZGl2Pjxk aXY+wqAjZW5kaWY8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgezwvZGl2Pg0KDQo8ZGl2 Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVf ZW52LMKgPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZDMydV90 bChjcHVfVFswXSwgY3B1X2Vudiw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3Jl Z10uWE1NX0woMCkpKTs8L2Rpdj48ZGl2Pg0KDQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMzIsIE9SX1RNUDAsIDEpOzwvZGl2PjxkaXY+ KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE1P XzMyLCBPUl9UTVAwLCAxLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg Y2FzZSAweDI3ZTogLyogbW92cSB4bW0sIGVhICovPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAg wqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHFfZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0 YXRlLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTs8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PkBAIC0zMjk1LDcg KzM0MjYsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29u dGV4dCAqcywgaW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2 Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAweDdmOiAvKiBtb3ZxIGVhLCBtbSAqLzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2Pjxk aXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwg Yik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9zdHFfZW52X0EwKHMs IG9mZnNldG9mKENQVVg4NlN0YXRlLCBmcHJlZ3NbcmVnXS5tbXgpKTs8L2Rpdj4NCg0KPGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHJtID0gKG1vZHJtICZhbXA7IDcpOzwvZGl2PjxkaXY+QEAgLTMzMTAsNyArMzQ0MSw3 IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpz LCBpbnQgYiw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAweDE3ZjogLyogbW92ZHFhIGVh LCB4bW0gKi88L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgyN2Y6IC8qIG1vdmRx dSBlYSwgeG1tICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykg ezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2Ry bShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX3N0b19lbnZfQTAocywgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHhtbV9yZWdzW3JlZ10pKTs8 L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJtID0gKG1vZHJtICZhbXA7IDcpIHwgUkVYX0Iocyk7PC9k aXY+PGRpdj5AQCAtMzMyMCw3ICszNDUxLDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZT dGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAg wqAgwqAgwqBicmVhazs8L2Rpdj48ZGl2Pg0KDQrCoCDCoCDCoCDCoCDCoGNhc2UgMHgyMTE6IC8q IG1vdnNzIGVhLCB4bW0gKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAh PSAzKSB7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShl bnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVh X21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZT dGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDApKSk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5fb3Bfc3RfdihzLCBNT18zMiwgY3B1X1RbMF0sIGNwdV9BMCk7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj5AQCAtMzMzMSw3 ICszNDYyLDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0Nv bnRleHQgKnMsIGludCBiLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8L2Rp dj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgzMTE6IC8qIG1vdnNkIGVhLCB4bW0gKi88 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PC9kaXY+PGRpdj4t IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rp dj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9k cm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fc3RxX2Vudl9B MChzLCBvZmZzZXRvZihDUFVYODZTdGF0ZSw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB4bW1fcmVn c1tyZWddLlhNTV9RKDApKSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7 PC9kaXY+PGRpdj5AQCAtMzM0Myw3ICszNDc0LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVY ODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2PjxkaXY+wqAgwqAgwqAg wqAgwqBjYXNlIDB4MDEzOiAvKiBtb3ZscHMgKi88L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDC oGNhc2UgMHgxMTM6IC8qIG1vdmxwZCAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBp ZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVh X21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl9zdHFfZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLDwvZGl2 Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTs8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PkBAIC0zMzUzLDcgKzM0ODQsNyBA QCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywg aW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgwMTc6IC8qIG1vdmhwcyAqLzwv ZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAweDExNzogLyogbW92aHBkICovPC9kaXY+ PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezwvZGl2PjxkaXY+LSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRp dj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBi KTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3N0cV9lbnZfQTAocywg b2Zmc2V0b2YoQ1BVWDg2U3RhdGUsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgeG1tX3JlZ3NbcmVn XS5YTU1fUSgxKSkpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2 PjxkaXY+QEAgLTM0MTcsNyArMzU0OCw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3Rh dGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg Y2FzZSAweDEyYTogLyogY3Z0cGkycGQgKi88L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9oZWxwZXJfZW50ZXJfbW14KGNwdV9lbnYpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAg wqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxt bXhfdDApOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkcV9l bnZfQTAocywgb3AyX29mZnNldCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxz ZSB7PC9kaXY+PGRpdj5AQCAtMzQ0MCw3ICszNTcxLDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShD UFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqBjYXNlIDB4MjJhOiAvKiBjdnRzaTJzcyAqLzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKg IMKgIMKgY2FzZSAweDMyYTogLyogY3Z0c2kyc2QgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgb3QgPSBtb182NF8zMihzLSZndDtkZmxhZyk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2 PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90 LCBPUl9UTVAwLCAwLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoG9wMV9v ZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddKTs8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2Vudiwgb3Ax X29mZnNldCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChvdCA9PSBNT18zMikg ezwvZGl2PjxkaXY+QEAgLTM0NjIsNyArMzU5Myw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BV WDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8L2Rpdj4NCg0KPGRpdj7CoCDC oCDCoCDCoCDCoGNhc2UgMHgxMmQ6IC8qIGN2dHBkMnBpICovPC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9oZWxwZXJfZW50ZXJfbW14KGNwdV9lbnYpOzwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+DQoN CjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BV WDg2U3RhdGUseG1tX3QwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xkb19lbnZfQTAocywgb3AyX29mZnNldCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oH0gZWxzZSB7PC9kaXY+PGRpdj5AQCAtMzQ5Myw3ICszNjI0LDcgQEAgc3RhdGljIHZvaWQgZ2Vu X3NzZShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2Pg0KDQo8 ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAweDMyZDogLyogY3Z0c2Qyc2kgKi88L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb182NF8zMihzLSZndDtkZmxhZyk7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rp dj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICgoYiAmZ3Q7Jmd0OyA4KSAm YW1wOyAxKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9s ZHFfZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLCB4bW1fdDAuWE1NX1EoMCkpKTs8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PkBAIC0z NTI1LDcgKzM2NTYsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERp c2FzQ29udGV4dCAqcywgaW50IGIsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqBjYXNlIDB4 YzQ6IC8qIHBpbnNydyAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBjYXNlIDB4MWM0OjwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBzLSZndDtyaXBfb2Zmc2V0ID0gMTs8L2Rpdj48ZGl2 Pi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT18xNiwg T1JfVE1QMCwgMCk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0o ZW52LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RNUDAsIDAsIGIpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgdmFsID0gY3B1X2xkdWJfY29kZShlbnYsIHMtJmd0O3BjKyspOzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoYjEpIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdmFsICZhbXA7PSA3OzwvZGl2PjxkaXY+QEAgLTM1NTksNyArMzY5MCw3 IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpz LCBpbnQgYiw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqBjYXNlIDB4MWQ2OiAvKiBtb3ZxIGVhLCB4bW0gKi88L2Rpdj48ZGl2 PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PC9kaXY+PGRpdj4tIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2Pisg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwv ZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3N0cV9lbnZfQTAocywg b2Zmc2V0b2YoQ1BVWDg2U3RhdGUsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB4bW1fcmVnc1tyZWddLlhN TV9RKDApKSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRp dj5AQCAtMzYyNiw3ICszNzU3LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAq ZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgb3AyX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9y ZWdzW3JtIHwgUkVYX0IocyldKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg fSBlbHNlIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3AyX29m ZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV90MCk7PC9kaXY+PGRpdj4tIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj4N Cg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYs IHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg c3dpdGNoIChiKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNh c2UgMHgyMDogY2FzZSAweDMwOiAvKiBwbW92c3hidywgcG1vdnp4YncgKi88L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAweDIzOiBjYXNlIDB4MzM6IC8qIHBt b3ZzeHdkLCBwbW92enh3ZCAqLzwvZGl2Pg0KDQo8ZGl2PkBAIC0zNjYwLDcgKzM3OTEsNyBAQCBz dGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgaW50 IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wMl9vZmZzZXQg PSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3Nbcm1dLm1teCk7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxtbXhfdDApOzwv ZGl2Pg0KDQo8ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJt KGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHFfZW52X0EwKHMsIG9wMl9vZmZzZXQpOzwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj4NCg0KwqAgwqAgwqAgwqAg wqAgwqAgwqB9PC9kaXY+PGRpdj5AQCAtMzcwMSw3ICszODMyLDcgQEAgc3RhdGljIHZvaWQgZ2Vu X3NzZShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNw dV9yZWdzW3JlZ10pOzwvZGl2Pg0KDQo8ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCk7PC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9S X1RNUDAsIDAsIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVs cGVyX2NyYzMyKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIsPC9kaXY+PGRpdj4NCg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY3B1X1RbMF0sIHRjZ19j b25zdF9pMzIoOCAmbHQ7Jmx0OyBvdCkpOzwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PkBAIC0zNzI5 LDcgKzM4NjAsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2Fz Q29udGV4dCAqcywgaW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoG90ID0gTU9fNjQ7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9 PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFf bW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgaWYgKChiICZhbXA7IDEpID09IDApIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9xZW11X2xkX3RsKGNwdV9UWzBdLCBjcHVfQTAs PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgcy0mZ3Q7bWVtX2luZGV4LCBvdCB8IE1PX0JFKTs8L2Rpdj48ZGl2 PkBAIC0zNzQ3LDcgKzM4NzgsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICpl bnYsIERpc2FzQ29udGV4dCAqcywgaW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBt b182NF8zMihzLSZndDtkZmxhZyk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2PjxkaXY+ KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90 LCBPUl9UTVAwLCAwLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oHRjZ19nZW5fYW5kY190bChjcHVfVFswXSwgY3B1X3JlZ3Nbcy0mZ3Q7dmV4X3ZdLCBjcHVfVFsw XSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3ZfcmVnX3Yo b3QsIHJlZywgY3B1X1RbMF0pOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fb3BfdXBkYXRlMV9jYygpOzwvZGl2PjxkaXY+QEAgLTM3NjQsNyArMzg5NSw3IEBAIHN0YXRp YyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8 L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVENHdiBib3VuZCwgemVybzs8L2Rpdj48ZGl2PsKg PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0o ZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAw LCAwLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8q IEV4dHJhY3QgU1RBUlQsIGFuZCBzaGlmdCB0aGUgb3BlcmFuZC48L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFNoaWZ0cyBsYXJnZXIgdGhhbiBvcGVyYW5kIHNp emUgZ2V0IHplcm9zLiDCoCovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHRjZ19nZW5fZXh0OHVfdGwoY3B1X0EwLCBjcHVfcmVnc1tzLSZndDt2ZXhfdl0pOzwvZGl2 Pg0KDQo8ZGl2PkBAIC0zODAxLDcgKzM5MzIsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4 NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgaW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBv dCA9IG1vXzY0XzMyKHMtJmd0O2RmbGFnKTs8L2Rpdj4NCg0KPGRpdj4tIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwv ZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywg bW9kcm0sIG90LCBPUl9UTVAwLCAwLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgdGNnX2dlbl9leHQ4dV90bChjcHVfVFsxXSwgY3B1X3JlZ3Nbcy0mZ3Q7dmV4X3ZdKTs8 L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVENHdiBib3VuZCA9IHRjZ19jb25zdF90bChvdCA9 PSBNT182NCA/IDYzIDogMzEpOzwvZGl2PjxkaXY+QEAgLTM4MjgsNyArMzk1OSw3IEBAIHN0YXRp YyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29w OzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvdCA9IG1vXzY0XzMyKHMtJmd0O2RmbGFnKTs8L2Rpdj48 ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJt LCBvdCwgT1JfVE1QMCwgMCk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAsIGIpOzwvZGl2Pg0KDQo8 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3dpdGNoIChvdCkgezwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZWZhdWx0OjwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9U WzBdKTs8L2Rpdj48ZGl2PkBAIC0zODU0LDcgKzM5ODUsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3Nl KENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgaW50IGIsPC9kaXY+DQoNCjxkaXY+ wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgb3QgPSBtb182NF8zMihzLSZndDtkZmxhZyk7PC9kaXY+PGRpdj4tIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAs IDApOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVu diwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoC8qIE5vdGUgdGhhdCBieSB6ZXJvLWV4dGVuZGluZyB0aGUgbWFzayBv cGVyYW5kLCB3ZTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYXV0b21h dGljYWxseSBoYW5kbGUgemVyby1leHRlbmRpbmcgdGhlIHJlc3VsdC4gwqAqLzwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAob3QgPT0gTU9fNjQpIHs8L2Rpdj48ZGl2PkBA IC0zODcyLDcgKzQwMDMsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYs IERpc2FzQ29udGV4dCAqcywgaW50IGIsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH08L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb182 NF8zMihzLSZndDtkZmxhZyk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBP Ul9UTVAwLCAwLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8q IE5vdGUgdGhhdCBieSB6ZXJvLWV4dGVuZGluZyB0aGUgbWFzayBvcGVyYW5kLCB3ZTwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYXV0b21hdGljYWxseSBoYW5kbGUgemVy by1leHRlbmRpbmcgdGhlIHJlc3VsdC4gwqAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBpZiAob3QgPT0gTU9fNjQpIHs8L2Rpdj48ZGl2PkBAIC0zODkyLDcgKzQwMjMsNyBA QCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywg aW50IGIsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpbnQg ZW5kX29wOzwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgb3QgPSBtb182NF8zMihzLSZndDtkZmxhZyk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RN UDAsIDApOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0 X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwLCBiKTs8L2Rpdj4NCg0KPGRpdj7C oDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBSZS11c2UgdGhl IGNhcnJ5LW91dCBmcm9tIGEgcHJldmlvdXMgcm91bmQuIMKgKi88L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVENHVl9VTlVTRUQoY2FycnlfaW4pOzwvZGl2PjxkaXY+ QEAgLTM5NzEsNyArNDEwMiw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVu diwgRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvdCA9IG1v XzY0XzMyKHMtJmd0O2RmbGFnKTs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCk7PC9kaXY+PGRpdj4r IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3Qs IE9SX1RNUDAsIDAsIGIpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg aWYgKG90ID09IE1PXzY0KSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHRjZ19nZW5fYW5kaV90bChjcHVfVFsxXSwgY3B1X3JlZ3Nbcy0mZ3Q7dmV4X3ZdLCA2Myk7 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj5A QCAtNDAwMyw3ICs0MTM0LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52 LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG90ID0gbW9f NjRfMzIocy0mZ3Q7ZGZsYWcpOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdl bl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTs8L2Rpdj48ZGl2Pisg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwg T1JfVE1QMCwgMCwgYik7PC9kaXY+DQoNCjxkaXY+wqA8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgc3dpdGNoIChyZWcgJmFtcDsgNykgezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBjYXNlIDE6IC8qIGJsc3IgQnksRXkgKi88L2Rpdj48ZGl2PkBAIC00MDYy LDcgKzQxOTMsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2Fz Q29udGV4dCAqcywgaW50IGIsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG90 ID0gbW9fNjRfMzIocy0mZ3Q7ZGZsYWcpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgcm0gPSAobW9kcm0gJmFtcDsgNykgfCBSRVhfQihzKTs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKTwvZGl2PjxkaXY+LSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRp dj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1v ZHJtLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlZyA9ICgo bW9kcm0gJmd0OyZndDsgMykgJmFtcDsgNykgfCByZXhfcjs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdmFsID0gY3B1X2xkdWJfY29kZShlbnYsIHMtJmd0O3BjKyspOzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzd2l0Y2ggKGIpIHs8L2Rpdj48ZGl2PkBA IC00MTk5LDcgKzQzMzAsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYs IERpc2FzQ29udGV4dCAqcywgaW50IGIsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nb cm0gfCBSRVhfQihzKV0pOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVs c2UgezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcDJfb2Zmc2V0 ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3QwKTs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2Pg0KDQo8 ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywg bW9kcm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGRvX2Vudl9BMChzLCBvcDJfb2Zmc2V0KTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgfTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+ QEAgLTQyMDgsNyArNDMzOSw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVu diwgRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3Nb cm1dLm1teCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wMl9vZmZzZXQgPSBvZmZz ZXRvZihDUFVYODZTdGF0ZSxtbXhfdDApOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+DQoNCjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwg Yik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHFfZW52 X0EwKHMsIG9wMl9vZmZzZXQpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PkBAIC00MjQyLDcgKzQz NzMsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4 dCAqcywgaW50IGIsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnb3RvIGlsbGVnYWxfb3A7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb182NF8zMihzLSZndDtk ZmxhZyk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0o ZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwLCBi KTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGIgPSBjcHVfbGR1Yl9j b2RlKGVudiwgcy0mZ3Q7cGMrKyk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlmIChvdCA9PSBNT182NCkgezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqB0Y2dfZ2VuX3JvdHJpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgYiAmYW1wOyA2Myk7PC9k aXY+PGRpdj5AQCAtNDI3OCw3ICs0NDA5LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZT dGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBiLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKg IMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGludCBzeiA9IDQ7PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3AyX29mZnNldCA9IG9mZnNldG9mKENQVVg4 NlN0YXRlLHhtbV90MCk7PC9kaXY+DQoNCjxkaXY+wqA8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgc3dpdGNoIChiKSB7PC9kaXY+PGRpdj5AQCAtNDMyNiw3ICs0NDU3LDcgQEAg c3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGlu dCBiLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+wqAgwqAgwqAg wqAgwqAgwqAgwqBvcDFfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZ10u bW14KTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezwv ZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBt b2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShl bnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3Ay X29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLG1teF90MCk7PC9kaXY+DQoNCjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRxX2Vudl9BMChzLCBvcDJfb2Zmc2V0KTs8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PkBAIC00NDA0LDYg KzQ1MzUsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVu diwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+wqAgwqAgwqBpbnQgbW9kcm0sIHJlZywgcm0s IG1vZCwgb3AsIG9wcmVnLCB2YWw7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqB0YXJnZXRfdWxvbmcg bmV4dF9laXAsIHR2YWw7PC9kaXY+PGRpdj7CoCDCoCDCoGludCByZXhfdywgcmV4X3I7PC9kaXY+ PGRpdj4rIMKgIMKgaW50IGZwX29wLCBmcF9pcCwgZnBfY3M7PC9kaXY+PGRpdj7CoDwvZGl2Pjxk aXY+wqAgwqAgwqBpZiAodW5saWtlbHkocWVtdV9sb2dsZXZlbF9tYXNrKENQVV9MT0dfVEJfT1Ag fCBDUFVfTE9HX1RCX09QX09QVCkpKSB7PC9kaXY+PGRpdj4NCsKgIMKgIMKgIMKgIMKgdGNnX2dl bl9kZWJ1Z19pbnNuX3N0YXJ0KHBjX3N0YXJ0KTs8L2Rpdj4NCjxkaXY+QEAgLTQ1OTUsNyArNDcy Nyw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBE aXNhc0NvbnRleHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1vZCA9 IChtb2RybSAmZ3Q7Jmd0OyA2KSAmYW1wOyAzOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBybSA9IChtb2RybSAmYW1wOyA3KSB8IFJFWF9CKHMpOzwvZGl2PjxkaXY+DQoNCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PC9kaXY+PGRpdj4tIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rp dj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwg cywgbW9kcm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBv cHJlZyA9IE9SX1RNUDA7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxz ZSBpZiAob3AgPT0gT1BfWE9STCAmYW1wOyZhbXA7IHJtID09IHJlZykgezwvZGl2Pg0KDQo8ZGl2 PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgeG9yX3plcm86PC9kaXY+PGRpdj5AQCAtNDYxNiw3 ICs0NzQ4LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICpl bnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg cmVnID0gKChtb2RybSAmZ3Q7Jmd0OyAzKSAmYW1wOyA3KSB8IHJleF9yOzwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBybSA9IChtb2RybSAmYW1wOyA3KSB8IFJFWF9CKHMpOzwv ZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PC9k aXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYs IHMsIG1vZHJtKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5fb3BfbGRfdihzLCBvdCwgY3B1X1RbMV0sIGNwdV9BMCk7PC9kaXY+ DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2UgaWYgKG9wID09IE9QX1hP UkwgJmFtcDsmYW1wOyBybSA9PSByZWcpIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ290byB4b3JfemVybzs8L2Rpdj48ZGl2PkBAIC00NjU1LDcgKzQ3ODcsNyBA QCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXND b250ZXh0ICpzLDwvZGl2Pg0KPGRpdj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg cy0mZ3Q7cmlwX29mZnNldCA9IDE7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGVsc2U8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7cmlw X29mZnNldCA9IGluc25fY29uc3Rfc2l6ZShvdCk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2PisgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2Pg0K DQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3ByZWcgPSBPUl9UTVAwOzwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBvcHJlZyA9IHJtOzwvZGl2PjxkaXY+QEAgLTQ2OTgsNyArNDgzMCw3IEBAIHN0 YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRl eHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezwvZGl2Pg0KDQo8 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG9wID09IDApPC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHMtJmd0O3JpcF9vZmZzZXQgPSBpbnNuX2NvbnN0X3NpemUob3QpOzwv ZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7 PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJt LCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX2xkX3Yocywgb3QsIGNw dV9UWzBdLCBjcHVfQTApOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl92X3JlZyhvdCwgY3B1X1RbMF0s IHJtKTs8L2Rpdj48ZGl2PkBAIC00OTA2LDcgKzUwMzgsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25n IGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoH08L2Rpdj4NCg0K PGRpdj7CoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKG9wICZndDs9IDIgJmFtcDsmYW1wOyBvcCAhPSAzICZhbXA7JmFt cDsgb3AgIT0gNSk8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9v cF9sZF92KHMsIG90LCBjcHVfVFswXSwgY3B1X0EwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg fSBlbHNlIHs8L2Rpdj48ZGl2PkBAIC00OTQ2LDYgKzUwNzgsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vs b25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqBkb19sY2FsbDo8L2Rpdj4NCjxkaXY+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoGlmIChzLSZndDtwZSAmYW1wOyZhbXA7ICFzLSZndDt2bTg2KSB7PC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwv ZGl2PjxkaXY+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fdHJ1bmNfdGxfaTMy KGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOzwvZGl2Pg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9oZWxwZXJfbGNhbGxfcHJvdGVjdGVkKGNwdV9lbnYsIGNwdV90bXAyX2kzMiwg Y3B1X1RbMV0sPC9kaXY+PGRpdj5AQCAtNDk3Myw2ICs1MTA2LDcgQEAgc3RhdGljIHRhcmdldF91 bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48 ZGl2PsKgIMKgIMKgIMKgIMKgZG9fbGptcDo8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKg aWYgKHMtJmd0O3BlICZhbXA7JmFtcDsgIXMtJmd0O3ZtODYpIHs8L2Rpdj4NCg0KPGRpdj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihj cHVfdG1wMl9pMzIsIGNwdV9UWzBdKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9oZWxwZXJfbGptcF9wcm90ZWN0ZWQoY3B1X2VudiwgY3B1X3RtcDJfaTMyLCBj cHVfVFsxXSw8L2Rpdj48ZGl2PkBAIC00OTk4LDcgKzUxMzIsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vs b25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLSZndDtwYysrKTs8 L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoHJlZyA9ICgobW9kcm0gJmd0OyZndDsgMykgJmFt cDsgNykgfCByZXhfcjs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgZ2VuX2xk c3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2PjxkaXY+KyDCoCDC oCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwLCBiKTs8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl92X3JlZyhvdCwgY3B1X1RbMV0sIHJl Zyk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqBnZW5fb3BfdGVzdGxfVDBfVDFfY2MoKTs8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgc2V0X2NjX29wKHMsIENDX09QX0xPR0lDQiArIG90KTs8 L2Rpdj48ZGl2PkBAIC01MDczLDcgKzUyMDcsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2Fz X2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqBzLSZndDtyaXBfb2Zmc2V0ID0gaW5zbl9jb25zdF9zaXplKG90KTs8L2Rp dj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGVsc2UgaWYgKGIgPT0gMHg2Yik8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7cmlwX29mZnNldCA9IDE7PC9kaXY+PGRpdj4tIMKgIMKg IMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2 PjxkaXY+KyDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9U TVAwLCAwLCBiKTs8L2Rpdj48ZGl2Pg0KDQrCoCDCoCDCoCDCoCDCoGlmIChiID09IDB4NjkpIHs8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgdmFsID0gaW5zbl9nZXQoZW52LCBzLCBvdCk7 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbW92aV90bChjcHVfVFsxXSwg dmFsKTs8L2Rpdj48ZGl2PkBAIC01MTMwLDcgKzUyNjQsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25n IGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2Pg0KDQo8 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl9yZWdfdihvdCwgcmVnLCBjcHVfVFsx XSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3ZfcmVnX3Yob3QsIHJt LCBjcHVfVFswXSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj4t IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2 PisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2 Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl92X3JlZyhvdCwgY3B1X1Rb MF0sIHJlZyk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9sZF92KHMsIG90 LCBjcHVfVFsxXSwgY3B1X0EwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dl bl9hZGRfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7PC9kaXY+PGRpdj5AQCAtNTE1 OSw3ICs1MjkzLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRl ICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHJtID0gKG1vZHJtICZhbXA7IDcpIHwgUkVYX0Iocyk7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3Zfdl9yZWcob3QsIHQwLCBybSk7PC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2PisgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2Pg0K DQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZfdGwoYTAsIGNwdV9B MCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9sZF92KHMsIG90 LCB0MCwgYTApOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBybSA9IDA7IC8q IGF2b2lkIHdhcm5pbmcgKi88L2Rpdj48ZGl2PkBAIC01MjA3LDE2ICs1MzQxLDE2IEBAIHN0YXRp YyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQg KnMsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxf b3A7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBz LSZndDtjc19iYXNlKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9j Y19vcChzKTs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwg cywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52 LCBzLCBtb2RybSwgYik7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVs cGVyX2NtcHhjaGcxNmIoY3B1X2VudiwgY3B1X0EwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg fSBlbHNlPC9kaXY+PGRpdj4tI2VuZGlmIMKgIMKgIMKgIMKgPC9kaXY+PGRpdj4rI2VuZGlmPC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYg KCEocy0mZ3Q7Y3B1aWRfZmVhdHVyZXMgJmFtcDsgQ1BVSURfQ1g4KSk8L2Rpdj4NCg0KPGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzwvZGl2PjxkaXY+ LSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRp dj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rp dj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfY21weGNoZzhiKGNwdV9l bnYsIGNwdV9BMCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgc2V0X2NjX29wKHMsIENDX09QX0VGTEFHUyk7PC9kaXY+PGRpdj5AQCAtNTI2Niw3ICs1 NDAwLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYs IERpc2FzQ29udGV4dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoC8qIE5PVEU6IG9yZGVyIGlzIGltcG9ydGFudCB0 b28gZm9yIE1NVSBleGNlcHRpb25zICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoHMt Jmd0O3BvcGxfZXNwX2hhY2sgPSAxICZsdDsmbHQ7IG90OzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAxKTs8L2Rp dj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2Ry bSwgb3QsIE9SX1RNUDAsIDEsIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBzLSZn dDtwb3BsX2VzcF9oYWNrID0gMDs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3Bv cF91cGRhdGUocywgb3QpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj5AQCAt NTM1Miw3ICs1NDg2LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0 YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoHJl ZyA9ICgobW9kcm0gJmd0OyZndDsgMykgJmFtcDsgNykgfCByZXhfcjs8L2Rpdj48ZGl2PsKgPC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoC8qIGdlbmVyYXRlIGEgZ2VuZXJpYyBzdG9yZSAqLzwvZGl2 PjxkaXY+LSDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCByZWcs IDEpOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0s IG90LCByZWcsIDEsIGIpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgYnJlYWs7PC9kaXY+ PGRpdj7CoCDCoCDCoGNhc2UgMHhjNjo8L2Rpdj48ZGl2PsKgIMKgIMKgY2FzZSAweGM3OiAvKiBt b3YgRXYsIEl2ICovPC9kaXY+PGRpdj5AQCAtNTM2MSw3ICs1NDk1LDcgQEAgc3RhdGljIHRhcmdl dF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgbW9kID0gKG1vZHJtICZndDsmZ3Q7IDYpICZhbXA7IDM7PC9k aXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgcy0mZ3Q7cmlwX29mZnNldCA9IGluc25fY29uc3Rfc2l6ZShvdCk7PC9k aXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8 L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0s IGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqB9PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAg wqB2YWwgPSBpbnNuX2dldChlbnYsIHMsIG90KTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgdGNn X2dlbl9tb3ZpX3RsKGNwdV9UWzBdLCB2YWwpOzwvZGl2PjxkaXY+QEAgLTUzNzcsNyArNTUxMSw3 IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNh c0NvbnRleHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoG1vZHJtID0gY3B1X2xkdWJfY29k ZShlbnYsIHMtJmd0O3BjKyspOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgcmVnID0gKCht b2RybSAmZ3Q7Jmd0OyAzKSAmYW1wOyA3KSB8IHJleF9yOzwvZGl2PjxkaXY+wqA8L2Rpdj48ZGl2 Pi0gwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwg MCk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwg b3QsIE9SX1RNUDAsIDAsIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBnZW5fb3BfbW92X3Jl Z192KG90LCByZWcsIGNwdV9UWzBdKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGJyZWFr OzwvZGl2PjxkaXY+wqAgwqAgwqBjYXNlIDB4OGU6IC8qIG1vdiBzZWcsIEd2ICovPC9kaXY+PGRp dj5AQCAtNTM4NSw3ICs1NTE5LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQ VVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg cmVnID0gKG1vZHJtICZndDsmZ3Q7IDMpICZhbXA7IDc7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAg wqAgwqBpZiAocmVnICZndDs9IDYgfHwgcmVnID09IFJfQ1MpPC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqBnZW5fbGRz dF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT18xNiwgT1JfVE1QMCwgMCk7PC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RNUDAsIDAs IGIpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgZ2VuX21vdmxfc2VnX1QwKHMsIHJlZywg cGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgaWYgKHJl ZyA9PSBSX1NTKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoC8qIGlmIHJlZyA9PSBT UywgaW5oaWJpdCBpbnRlcnJ1cHRzL3RyYWNlICovPC9kaXY+PGRpdj5AQCAtNTQwOCw3ICs1NTQy LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERp c2FzQ29udGV4dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxs ZWdhbF9vcDs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdmxfVDBfc2VnKHJlZyk7 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoG90ID0gbW9kID09IDMgPyBkZmxhZyA6IE1PXzE2Ozwv ZGl2PjxkaXY+LSDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBP Ul9UTVAwLCAxKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMs IG1vZHJtLCBvdCwgT1JfVE1QMCwgMSwgYik7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqBi cmVhazs8L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj7CoCDCoCDCoGNhc2UgMHgxYjY6IC8qIG1vdnpi UyBHdiwgRWIgKi88L2Rpdj48ZGl2PkBAIC01NDUwLDcgKzU1ODQsNyBAQCBzdGF0aWMgdGFyZ2V0 X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl9vcF9tb3ZfcmVnX3YoZF9vdCwgcmVnLCBjcHVfVFswXSk7PC9kaXY+ DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+LSDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4r IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX2xkX3Yocywgc19vdCwg Y3B1X1RbMF0sIGNwdV9BMCk7PC9kaXY+PGRpdj4NCg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fb3BfbW92X3JlZ192KGRfb3QsIHJlZywgY3B1X1RbMF0pOzwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj5AQCAtNTQ2OCw3ICs1NjAyLDcgQEAgc3RhdGljIHRh cmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgcy0mZ3Q7b3ZlcnJpZGUgPSAtMTs8L2Rpdj4NCg0KPGRp dj7CoCDCoCDCoCDCoCDCoHZhbCA9IHMtJmd0O2FkZHNlZzs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKg IMKgcy0mZ3Q7YWRkc2VnID0gMDs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJt KGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52 LCBzLCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoHMtJmd0O2FkZHNlZyA9IHZh bDs8L2Rpdj48ZGl2Pg0KDQrCoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3ZfcmVnX3Yob3QsIHJlZywg Y3B1X0EwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgYnJlYWs7PC9kaXY+PGRpdj5AQCAtNTU1 OCw3ICs1NjkyLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRl ICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X29wX21vdl9yZWdfdihvdCwgcm0sIGNwdV9UWzBdKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9vcF9tb3ZfcmVnX3Yob3QsIHJlZywgY3B1X1RbMV0pOzwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9s ZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX29wX21vdl92X3JlZyhvdCwgY3B1X1RbMF0sIHJlZyk7PC9kaXY+DQoNCjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAvKiBmb3IgeGNoZywgbG9jayBpcyBpbXBsaWNpdCAqLzwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoIShwcmVmaXhlcyAmYW1wOyBQUkVGSVhfTE9DSykp PC9kaXY+PGRpdj5AQCAtNTU5Myw3ICs1NzI3LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNh c19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgbW9kID0gKG1vZHJtICZndDsmZ3Q7IDYpICZhbXA7IDM7PC9kaXY+DQoNCjxkaXY+ wqAgwqAgwqAgwqAgwqBpZiAobW9kID09IDMpPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVu diwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGdlbl9vcF9sZF92KHMsIG90LCBj cHVfVFsxXSwgY3B1X0EwKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGdlbl9hZGRfQTBf aW0ocywgMSAmbHQ7Jmx0OyBvdCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoC8qIGxvYWQgdGhl IHNlZ21lbnQgZmlyc3QgdG8gaGFuZGxlIGV4Y2VwdGlvbnMgcHJvcGVybHkgKi88L2Rpdj48ZGl2 PkBAIC01NjI0LDcgKzU3NTgsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BV WDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKHNoaWZ0ID09IDIpIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7cmlwX29mZnNldCA9IDE7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+DQoNCjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcHJlZyA9IE9SX1RNUDA7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oG9wcmVnID0gKG1vZHJtICZhbXA7IDcpIHwgUkVYX0Iocyk7PC9kaXY+PGRpdj5AQCAtNTY3NCw3 ICs1ODA4LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICpl bnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoHJtID0gKG1v ZHJtICZhbXA7IDcpIHwgUkVYX0Iocyk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoHJlZyA9ICgo bW9kcm0gJmd0OyZndDsgMykgJmFtcDsgNykgfCByZXhfcjs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKg IMKgaWYgKG1vZCAhPSAzKSB7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9t b2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVh X21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgb3ByZWcgPSBPUl9UTVAwOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqB9IGVsc2UgezwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBvcHJlZyA9IHJtOzwvZGl2PjxkaXY+QEAgLTU3MDUs NyArNTgzOSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAq ZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoG9wID0gKChiICZh bXA7IDcpICZsdDsmbHQ7IDMpIHwgKChtb2RybSAmZ3Q7Jmd0OyAzKSAmYW1wOyA3KTs8L2Rpdj4N Cg0KPGRpdj7CoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezwvZGl2PjxkaXY+wqAgwqAgwqAg wqAgwqAgwqAgwqAvKiBtZW1vcnkgb3AgKi88L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqBn ZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDC oGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoHN3aXRjaChvcCkgezwvZGl2PjxkaXY+DQoNCsKgIMKgIMKgIMKgIMKgIMKgIMKgY2Fz ZSAweDAwIC4uLiAweDA3OiAvKiBmeHh4cyAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqBjYXNlIDB4MTAgLi4uIDB4MTc6IC8qIGZpeHh4bCAqLzwvZGl2PjxkaXY+QEAgLTU4MzIsNyAr NTk2Niw5IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52 LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgw YzogLyogZmxkZW52IG1lbSAqLzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2PjxkaXY+LSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfZmxkZW52KGNwdV9lbnYsIGNwdV9BMCwgdGNn X2NvbnN0X2kzMihkZmxhZyAtIDEpKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5faGVscGVyX2ZsZGVudihjcHVfZW52LCBjcHVfQTAsPC9kaXY+DQoNCjxkaXY+KyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19jb25zdF9p MzIoZGZsYWcgPT0gTU9fMzIpLDwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19jb25zdF9pMzIoSVNfUFJPVEVDVEVEX01PREUo cykpKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgwZDogLyogZmxkY3cgbWVtICovPC9kaXY+DQoN CjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3FlbXVfbGRfaTMyKGNwdV90 bXAyX2kzMiwgY3B1X0EwLDwvZGl2PjxkaXY+QEAgLTU4NDEsOCArNTk3NywxMSBAQCBzdGF0aWMg dGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpz LDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAweDBlOiAvKiBmbnN0ZW52IG1lbSAqLzwvZGl2Pg0KDQo8 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rpdj48 ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2VwKHMpOzwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0mZ3Q7Y3Nf YmFzZSk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9mc3Rl bnYoY3B1X2VudiwgY3B1X0EwLCB0Y2dfY29uc3RfaTMyKGRmbGFnIC0gMSkpOzwvZGl2Pg0KDQo8 ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2ZzdGVudihjcHVfZW52LCBj cHVfQTAsPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgdGNnX2NvbnN0X2kzMihkZmxhZyA9PSBNT18zMiksPC9kaXY+PGRpdj4rIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2NvbnN0 X2kzMihJU19QUk9URUNURURfTU9ERShzKSkpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgYnJlYWs7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgw ZjogLyogZm5zdGN3IG1lbSAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5faGVscGVyX2Zuc3RjdyhjcHVfdG1wMl9pMzIsIGNwdV9lbnYpOzwvZGl2PjxkaXY+QEAgLTU4 NjMsMTIgKzYwMDIsMTcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0 YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoGNhc2UgMHgyYzogLyogZnJzdG9yIG1lbSAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+PGRp dj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9mcnN0b3IoY3B1X2VudiwgY3B1 X0EwLCB0Y2dfY29uc3RfaTMyKGRmbGFnIC0gMSkpOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2Zyc3RvcihjcHVfZW52LCBjcHVfQTAsPC9kaXY+PGRp dj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNn X2NvbnN0X2kzMihkZmxhZyA9PSBNT18zMiksPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2NvbnN0X2kzMihJU19QUk9URUNU RURfTU9ERShzKSkpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJl YWs7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgyZTogLyogZm5zYXZlIG1l bSAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29w KHMpOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQg LSBzLSZndDtjc19iYXNlKTs8L2Rpdj4NCg0KPGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2hlbHBlcl9mc2F2ZShjcHVfZW52LCBjcHVfQTAsIHRjZ19jb25zdF9pMzIoZGZsYWcgLSAx KSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9mc2F2ZShj cHVfZW52LCBjcHVfQTAsPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHRjZ19jb25zdF9pMzIoZGZsYWcgPT0gTU9fMzIpLDwvZGl2Pg0K DQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg dGNnX2NvbnN0X2kzMihJU19QUk9URUNURURfTU9ERShzKSkpOzwvZGl2PjxkaXY+wqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBicmVhazs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgY2Fz ZSAweDJmOiAvKiBmbnN0c3cgbWVtICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9oZWxwZXJfZm5zdHN3KGNwdV90bXAyX2kzMiwgY3B1X2Vudik7PC9kaXY+DQoNCjxk aXY+QEAgLTYyMDksNiArNjM1MywxMiBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24o Q1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoH08L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoGlm IChpbnN0cl9pc194ODdfbmMobW9kcm0sIGIpKSB7PC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDC oCDCoCDCoGZwX29wID0gKChiICZhbXA7IDB4NykgJmx0OyZsdDsgOCkgfCAobW9kcm0gJmFtcDsg MHhmZik7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZnBfaXAgPSBwY19zdGFydCAtIHMt Jmd0O2NzX2Jhc2U7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZnBfY3MgPSBlbnYtJmd0 O3NlZ3NbUl9DU10uc2VsZWN0b3I7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgc2V0X2Vw KHMsIGZwX29wLCBmcF9pcCwgZnBfY3MpOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqB9PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAvKioq KioqKioqKioqKioqKioqKioqKioqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAvKiBzdHJpbmcg b3BzICovPC9kaXY+PGRpdj5AQCAtNjM5Myw2ICs2NTQzLDcgQEAgc3RhdGljIHRhcmdldF91bG9u ZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj4NCg0K PGRpdj7CoCDCoCDCoGRvX2xyZXQ6PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGlmIChzLSZndDtw ZSAmYW1wOyZhbXA7ICFzLSZndDt2bTg2KSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oGdlbl91cGRhdGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3Vw ZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19z dGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2hlbHBlcl9scmV0X3Byb3RlY3RlZChjcHVfZW52LCB0Y2dfY29uc3RfaTMyKGRmbGFnIC0g MSksPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHRjZ19jb25zdF9pMzIodmFsKSk7PC9kaXY+PGRpdj5AQCAtNjQzMCw2 ICs2NTgxLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICpl bnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH08 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fdXBkYXRlX2VwKHMpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2lt KHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oGdlbl9oZWxwZXJfaXJldF9wcm90ZWN0ZWQoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihkZmxhZyAt IDEpLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2NvbnN0X2kzMihzLSZndDtwYyAtIHMtJmd0O2NzX2Jh c2UpKTs8L2Rpdj48ZGl2PkBAIC02NTI3LDcgKzY2NzksNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25n IGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+ wqAgwqAgwqBjYXNlIDB4MTkwIC4uLiAweDE5ZjogLyogc2V0Y2MgR3YgKi88L2Rpdj4NCg0KPGRp dj7CoCDCoCDCoCDCoCDCoG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtJmd0O3BjKyspOzwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBnZW5fc2V0Y2MxKHMsIGIsIGNwdV9UWzBdKTs8L2Rpdj48 ZGl2Pi0gwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT184LCBPUl9U TVAwLCAxKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1v ZHJtLCBNT184LCBPUl9UTVAwLCAxLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGJy ZWFrOzwvZGl2PjxkaXY+wqAgwqAgwqBjYXNlIDB4MTQwIC4uLiAweDE0ZjogLyogY21vdiBHdiwg RXYgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgaWYgKCEocy0mZ3Q7Y3B1aWRfZmVhdHVyZXMg JmFtcDsgQ1BVSURfQ01PVikpIHs8L2Rpdj48ZGl2PkBAIC02NjU3LDcgKzY4MDksNyBAQCBzdGF0 aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0 ICpzLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgcm0gPSAobW9kcm0gJmFtcDsgNykgfCBS RVhfQihzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoCDCoCDCoHMtJmd0O3JpcF9vZmZzZXQgPSAxOzwvZGl2PjxkaXY+LSDC oCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4r IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj4N Cg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9sZF92KHMsIG90LCBjcHVfVFswXSwg Y3B1X0EwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl92X3JlZyhvdCwgY3B1X1RbMF0sIHJtKTs8L2Rpdj48 ZGl2PkBAIC02Njg4LDcgKzY4NDAsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24o Q1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKg IMKgIMKgcm0gPSAobW9kcm0gJmFtcDsgNykgfCBSRVhfQihzKTs8L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgZ2VuX29wX21vdl92X3JlZyhNT18zMiwgY3B1X1RbMV0sIHJlZyk7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDC oGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDC oCDCoCDCoCDCoCDCoC8qIHNwZWNpZmljIGNhc2U6IHdlIG5lZWQgdG8gYWRkIGEgZGlzcGxhY2Vt ZW50ICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9leHRzKG90LCBjcHVfVFsx XSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fc2FyaV90bChjcHVfdG1w MCwgY3B1X1RbMV0sIDMgKyBvdCk7PC9kaXY+PGRpdj5AQCAtNjc2NCw3ICs2OTE2LDcgQEAgc3Rh dGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4 dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoG90ID0gZGZsYWc7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtJmd0O3BjKyspOzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqByZWcgPSAoKG1vZHJtICZndDsmZ3Q7IDMpICZhbXA7IDcpIHwg cmV4X3I7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2Ry bSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2PjxkaXY+DQoNCisgwqAgwqAgwqAgwqBnZW5fbGRzdF9t b2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCwgYik7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoGdlbl9leHR1KG90LCBjcHVfVFswXSk7PC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqAvKiBOb3RlIHRoYXQgbHpjbnQgYW5kIHR6Y250IGFyZSBpbiBkaWZmZXJlbnQg ZXh0ZW5zaW9ucy4gwqAqLzwvZGl2PjxkaXY+QEAgLTY4ODQsNiArNzAzNiw3IEBAIHN0YXRpYyB0 YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMs PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZXhjZXB0aW9uKHMsIEVYQ1Aw N19QUkVYLCBwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAg wqB9IGVsc2UgezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29w KHMpOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PC9kaXY+ PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19i YXNlKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfZndhaXQo Y3B1X2Vudik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PkBAIC02OTAzLDYg KzcwNTYsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVu diwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBpZiAoQ09ERTY0KHMp KTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PC9kaXY+DQoN CjxkaXY+wqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzwvZGl2PjxkaXY+KyDCoCDC oCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGdlbl9qbXBf aW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgZ2Vu X2hlbHBlcl9pbnRvKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIocy0mZ3Q7cGMgLSBwY19zdGFydCkp OzwvZGl2PjxkaXY+DQrCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2Pg0KPGRpdj5AQCAtNjk2Nyw3 ICs3MTIxLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICpl bnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgaWYgKG1vZCA9PSAz KTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3Zfdl9yZWcob3QsIGNwdV9UWzBdLCByZWcpOzwvZGl2 Pg0KDQo8ZGl2Pi0gwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2 PjxkaXY+KyDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9kaXY+ PGRpdj7CoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMy LCBjcHVfVFswXSk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqBpZiAob3QgPT0gTU9fMTYp IHs8L2Rpdj48ZGl2PkBAIC03MDk1LDYgKzcyNDksNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRp c2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0g cy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+PGRpdj4NCsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj4N CjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzwvZGl2PjxkaXY+ KyDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8L2Rpdj48ZGl2 PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9zeXNleGl0KGNwdV9lbnYsIHRjZ19jb25z dF9pMzIoZGZsYWcgLSAxKSk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f ZW9iKHMpOzwvZGl2PjxkaXY+QEAgLTcxMDQsNiArNzI1OSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxv bmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+PGRp dj7CoCDCoCDCoGNhc2UgMHgxMDU6IC8qIHN5c2NhbGwgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKg IMKgLyogWFhYOiBpcyBpdCB1c2FibGUgaW4gcmVhbCBtb2RlID8gKi88L2Rpdj4NCg0KPGRpdj7C oCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKg Z2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19z dGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBnZW5faGVscGVy X3N5c2NhbGwoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLSZndDtwYyAtIHBjX3N0YXJ0KSk7PC9k aXY+PGRpdj4NCg0KwqAgwqAgwqAgwqAgwqBnZW5fZW9iKHMpOzwvZGl2PjxkaXY+QEAgLTcxMTMs NiArNzI2OSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAq ZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9l eGNlcHRpb24ocywgRVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8L2Rpdj48 ZGl2PsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShw Y19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5faGVscGVyX3N5c3JldChjcHVfZW52LCB0Y2dfY29uc3RfaTMyKGRmbGFnIC0gMSkpOzwvZGl2 Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgLyogY29uZGl0aW9uIGNvZGVzIGFyZSBtb2Rp ZmllZCBvbmx5IGluIGxvbmcgbW9kZSAqLzwvZGl2PjxkaXY+QEAgLTcxMzMsNiArNzI5MCw3IEBA IHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0Nv bnRleHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9leGNlcHRpb24ocywg RVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8L2Rpdj4NCg0KPGRpdj7CoCDC oCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRh dGVfY2Nfb3Aocyk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChz KTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMt Jmd0O2NzX2Jhc2UpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2hs dChjcHVfZW52LCB0Y2dfY29uc3RfaTMyKHMtJmd0O3BjIC0gcGNfc3RhcnQpKTs8L2Rpdj4NCg0K PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoHMtJmd0O2lzX2ptcCA9IERJU0FTX1RCX0pVTVA7PC9k aXY+PGRpdj5AQCAtNzE0OSw3ICs3MzA3LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19p bnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElU X0xEVFJfUkVBRCk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2xk MzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxsZHQuc2VsZWN0 b3IpKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb2QgPT0gMyA/IGRmbGFn IDogTU9fMTY7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52 LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDEpOzwvZGl2Pg0KPGRpdj4NCisgwqAgwqAgwqAgwqAg wqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMSwgYik7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAg wqBjYXNlIDI6IC8qIGxsZHQgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKCFz LSZndDtwZSB8fCBzLSZndDt2bTg2KTwvZGl2PjxkaXY+QEAgLTcxNTgsNyArNzMxNiw3IEBAIHN0 YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRl eHQgKnMsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZXhjZXB0 aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9zdm1fY2hlY2tfaW50ZXJjZXB0KHMsIHBjX3N0YXJ0LCBTVk1fRVhJVF9MRFRS X1dSSVRFKTs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2Ry bShlbnYsIHMsIG1vZHJtLCBNT18xNiwgT1JfVE1QMCwgMCk7PC9kaXY+DQoNCjxkaXY+KyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE1PXzE2LCBP Ul9UTVAwLCAwLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2pt cF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9UWzBdKTs8 L2Rpdj48ZGl2Pg0KDQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfbGxkdChj cHVfZW52LCBjcHVfdG1wMl9pMzIpOzwvZGl2PjxkaXY+QEAgLTcxNzAsNyArNzMyOCw3IEBAIHN0 YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRl eHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9zdm1fY2hlY2tfaW50ZXJj ZXB0KHMsIHBjX3N0YXJ0LCBTVk1fRVhJVF9UUl9SRUFEKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDC oCDCoCDCoCDCoCDCoHRjZ19nZW5fbGQzMnVfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9m KENQVVg4NlN0YXRlLHRyLnNlbGVjdG9yKSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oG90ID0gbW9kID09IDMgPyBkZmxhZyA6IE1PXzE2OzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDC oCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAxKTs8L2Rpdj48 ZGl2Pg0KDQorIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwg b3QsIE9SX1RNUDAsIDEsIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgY2FzZSAzOiAvKiBsdHIgKi88L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKCFzLSZndDtwZSB8fCBzLSZndDt2bTg2KTwvZGl2PjxkaXY+QEAg LTcxNzksNyArNzMzNyw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZT dGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0mZ3Q7 Y3NfYmFzZSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9zdm1fY2hlY2tfaW50ZXJjZXB0KHMsIHBj X3N0YXJ0LCBTVk1fRVhJVF9UUl9XUklURSk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RNUDAsIDApOzwv ZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYs IHMsIG1vZHJtLCBNT18xNiwgT1JfVE1QMCwgMCwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8L2Rpdj48 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3Rt cDJfaTMyLCBjcHVfVFswXSk7PC9kaXY+PGRpdj4NCg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5faGVscGVyX2x0cihjcHVfZW52LCBjcHVfdG1wMl9pMzIpOzwvZGl2PjxkaXY+QEAgLTcx ODksNyArNzM0Nyw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0 ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgNTog LyogdmVydyAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoIXMtJmd0O3BlIHx8 IHMtJmd0O3ZtODYpPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3Rv IGlsbGVnYWxfb3A7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0o ZW52LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RNUDAsIDApOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE1PXzE2LCBPUl9UTVAwLCAwLCBi KTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rp dj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChvcCA9PSA0KSB7PC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfdmVycihjcHVfZW52LCBjcHVfVFsw XSk7PC9kaXY+PGRpdj5AQCAtNzIxMiw3ICs3MzcwLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBk aXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCA9PSAzKTwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCwgU1ZNX0VYSVRfR0RUUl9S RUFEKTs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywg bW9kcm0pOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSwgYik7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2xk MzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgZ2R0LmxpbWl0 KSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9zdF92KHMsIE1PXzE2LCBj cHVfVFswXSwgY3B1X0EwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2FkZF9B MF9pbShzLCAyKTs8L2Rpdj48ZGl2PkBAIC03MjQxLDYgKzczOTksNyBAQCBzdGF0aWMgdGFyZ2V0 X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2 Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7Y3Bs ICE9IDApPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdv dG8gaWxsZWdhbF9vcDs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fdXBkYXRlX2VwKHMpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+DQoNCjxk aXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX213YWl0KGNwdV9l bnYsIHRjZ19jb25zdF9pMzIocy0mZ3Q7cGMgLSBwY19zdGFydCkpOzwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZW9iKHMpOzwvZGl2PjxkaXY+QEAgLTcyNjgs NyArNzQyNyw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAq ZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqB9PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7IC8qIHNpZHQgKi88 L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3N2bV9jaGVja19pbnRlcmNl cHQocywgcGNfc3RhcnQsIFNWTV9FWElUX0lEVFJfUkVBRCk7PC9kaXY+PGRpdj4tIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj48ZGl2Pisg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwv ZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZDMydV90bChj cHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGlkdC5saW1pdCkpOzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3Bfc3RfdihzLCBNT18xNiwgY3B1 X1RbMF0sIGNwdV9BMCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9h ZGRfQTBfaW0ocywgMik7PC9kaXY+PGRpdj5AQCAtNzM3MSw3ICs3NTMwLDcgQEAgc3RhdGljIHRh cmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8 L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PC9kaXY+PGRpdj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9zdm1fY2hlY2tfaW50ZXJjZXB0KHMsIHBjX3N0YXJ0 LDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBvcD09MiA/IFNWTV9FWElUX0dEVFJfV1JJVEUgOiBTVk1fRVhJVF9J RFRSX1dSSVRFKTs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21v ZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2Pg0KDQo8ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5fb3BfbGRfdihzLCBNT18xNiwgY3B1X1RbMV0sIGNwdV9BMCk7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9hZGRfQTBfaW0ocywgMik7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9sZF92KHMsIENPREU2NChz KSArIE1PXzMyLCBjcHVfVFswXSwgY3B1X0EwKTs8L2Rpdj4NCg0KPGRpdj5AQCAtNzM5NCwxNCAr NzU1MywxNCBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVu diwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+wqAjZWxzZTwvZGl2PjxkaXY+wqAgwqAgwqAg wqAgwqAgwqAgwqB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihD UFVYODZTdGF0ZSxjclswXSkpOzwvZGl2PjxkaXY+wqAjZW5kaWY8L2Rpdj4NCg0KPGRpdj4tIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RN UDAsIDEpOzwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwg cywgbW9kcm0sIE1PXzE2LCBPUl9UTVAwLCAxLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgYnJlYWs7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGNhc2UgNjogLyogbG1zdyAqLzwv ZGl2PjxkaXY+DQoNCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHMtJmd0O2NwbCAhPSAwKSB7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9leGNlcHRpb24ocywgRVhDUDBE X0dQRiwgcGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3N2 bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX1dSSVRFX0NSMCk7PC9kaXY+ DQoNCjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywg bW9kcm0sIE1PXzE2LCBPUl9UTVAwLCAwKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT18xNiwgT1JfVE1QMCwgMCwgYik7 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfbG1zdyhjcHVf ZW52LCBjcHVfVFswXSk7PC9kaXY+DQo8ZGl2Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fam1wX2ltKHMtJmd0O3BjIC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9lb2Iocyk7PC9kaXY+PGRpdj5AQCAtNzQxMyw4ICs3NTcyLDkg QEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2Fz Q29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2 Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rpdj48 ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2VwKHMpOzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0 IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+PGRpdj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9pbnZscGco Y3B1X2VudiwgY3B1X0EwKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX2ptcF9pbShzLSZndDtwYyAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZW9iKHMpOzwvZGl2Pg0KDQo8ZGl2PkBAIC03 NDQ2LDYgKzc2MDYsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3Rh dGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAoIShzLSZndDtjcHVpZF9leHQyX2ZlYXR1cmVzICZhbXA7IENQVUlEX0VY VDJfUkRUU0NQKSk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ290byBpbGxlZ2FsX29wOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2VwKHMpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICh1c2VfaWNvdW50KTwv ZGl2PjxkaXY+DQoNCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2lv X3N0YXJ0KCk7PC9kaXY+PGRpdj5AQCAtNzQ5Myw3ICs3NjU0LDcgQEAgc3RhdGljIHRhcmdldF91 bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fb3BfbW92X3JlZ192KGRfb3QsIHJlZywgY3B1X1RbMF0pOzwvZGl2Pg0K DQo8ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8L2Rpdj48ZGl2Pi0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2PjxkaXY+KyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9sZF92KHMsIE1PXzMyIHwg TU9fU0lHTiwgY3B1X1RbMF0sIGNwdV9BMCk7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fb3BfbW92X3JlZ192KGRfb3QsIHJlZywgY3B1X1RbMF0pOzwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB9PC9kaXY+PGRpdj5AQCAtNzUxNCw3ICs3Njc1LDcgQEAg c3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29u dGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgbW9kID0gKG1vZHJtICZndDsm Z3Q7IDYpICZhbXA7IDM7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBybSA9IG1v ZHJtICZhbXA7IDc7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykg ezwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2Ry bShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX29wX2xkX3Yocywgb3QsIHQwLCBjcHVfQTApOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgYTAgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTs8L2Rpdj48ZGl2PsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZfdGwoYTAsIGNwdV9BMCk7PC9kaXY+PGRp dj5AQCAtNzU1Niw3ICs3NzE3LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQ VVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgb3QgPSBkZmxhZyAhPSBNT18xNiA/IE1PXzMyIDogTU9fMTY7PC9kaXY+DQoNCjxkaXY+ wqAgwqAgwqAgwqAgwqAgwqAgwqBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLSZndDtwYysr KTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgcmVnID0gKChtb2RybSAmZ3Q7Jmd0OyAz KSAmYW1wOyA3KSB8IHJleF9yOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0 X21vZHJtKGVudiwgcywgbW9kcm0sIE1PXzE2LCBPUl9UTVAwLCAwKTs8L2Rpdj48ZGl2PisgwqAg wqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT18xNiwgT1JfVE1Q MCwgMCwgYik7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB0MCA9IHRjZ190ZW1w X2xvY2FsX25ldygpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2Nj X29wKHMpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoYiA9PSAweDEwMikgezwv ZGl2PjxkaXY+QEAgLTc1ODQsNyArNzc0NSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNf aW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+DQoNCjxkaXY+wqAg wqAgwqAgwqAgwqBjYXNlIDM6IC8qIHByZWZldGNobnQwICovPC9kaXY+PGRpdj7CoCDCoCDCoCDC oCDCoCDCoCDCoGlmIChtb2QgPT0gMyk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ290byBpbGxlZ2FsX29wOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFf bW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xl YV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoC8qIG5vdGhpbmcgbW9yZSB0byBkbyAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqBicmVhazs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgZGVmYXVsdDogLyogbm9wIChtdWx0aSBi eXRlKSAqLzwvZGl2PjxkaXY+QEAgLTc2MjQsNiArNzc4NSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxv bmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+DQoN CjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDQ6PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoGNhc2UgODo8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3Vw ZGF0ZV9jY19vcChzKTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBk YXRlX2VwKHMpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2lt KHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+DQo8ZGl2Pg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAoYiAmYW1wOyAyKSB7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl9vcF9tb3Zfdl9yZWcob3QsIGNwdV9UWzBdLCBybSk7PC9kaXY+PGRp dj5AQCAtNzY5Niw3ICs3ODU4LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQ VVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgZ290byBpbGxlZ2FsX29wOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgcmVnID0g KChtb2RybSAmZ3Q7Jmd0OyAzKSAmYW1wOyA3KSB8IHJleF9yOzwvZGl2PjxkaXY+wqAgwqAgwqAg wqAgwqAvKiBnZW5lcmF0ZSBhIGdlbmVyaWMgc3RvcmUgKi88L2Rpdj48ZGl2Pi0gwqAgwqAgwqAg wqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgcmVnLCAxKTs8L2Rpdj48ZGl2Pisg wqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgcmVnLCAxLCBiKTs8 L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2PjxkaXY+wqAgwqAgwqBjYXNl IDB4MWFlOjwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52 LCBzLSZndDtwYysrKTs8L2Rpdj48ZGl2PkBAIC03NzA0LDYgKzc4NjYsNyBAQCBzdGF0aWMgdGFy Z2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBvcCA9IChtb2RybSAmZ3Q7Jmd0OyAzKSAmYW1wOyA3Ozwv ZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgc3dpdGNoKG9wKSB7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoGNhc2UgMDogLyogZnhzYXZlICovPC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCA9 PSAzIHx8ICEocy0mZ3Q7Y3B1aWRfZmVhdHVyZXMgJmFtcDsgQ1BVSURfRlhTUikgfHw8L2Rpdj48 ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHMtJmd0O3ByZWZpeCAmYW1wOyBQUkVGSVhf TE9DSykpPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVn YWxfb3A7PC9kaXY+PGRpdj5AQCAtNzcxMSwxMCArNzg3NCwxMyBAQCBzdGF0aWMgdGFyZ2V0X3Vs b25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2Pjxk aXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwN19QUkVY LCBwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgYnJlYWs7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoH08L2Rpdj48 ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2 PjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PC9kaXY+ PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj4NCg0KPGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8 L2Rpdj48ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2Z4c2F2ZShjcHVfZW52LCBj cHVfQTAsIHRjZ19jb25zdF9pMzIoZGZsYWcgPT0gTU9fNjQpKTs8L2Rpdj48ZGl2PisgwqAgwqAg wqAgwqAgwqAgwqBnZW5faGVscGVyX2Z4c2F2ZShjcHVfZW52LCBjcHVfQTAsPC9kaXY+PGRpdj4r IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2NvbnN0X2kz MihkZmxhZyA9PSBNT18zMiksPC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19jb25zdF9pMzIoZGZsYWcgPT0gTU9fNjQpKTs8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oGNhc2UgMTogLyogZnhyc3RvciAqLzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAo bW9kID09IDMgfHwgIShzLSZndDtjcHVpZF9mZWF0dXJlcyAmYW1wOyBDUFVJRF9GWFNSKSB8fDwv ZGl2Pg0KDQo8ZGl2PkBAIC03NzI0LDEwICs3ODkwLDEyIEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcg ZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsPC9kaXY+PGRpdj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9leGNlcHRpb24ocywgRVhDUDA3X1BSRVgsIHBj X3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGJyZWFrOzwvZGl2PjxkaXY+DQoNCsKgIMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+ LSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRp dj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rp dj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8L2Rpdj48ZGl2 PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2Up OzwvZGl2Pg0KDQo8ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2Z4cnN0b3IoY3B1 X2VudiwgY3B1X0EwLCB0Y2dfY29uc3RfaTMyKGRmbGFnID09IE1PXzY0KSk7PC9kaXY+PGRpdj4r IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9meHJzdG9yKGNwdV9lbnYsIGNwdV9BMCw8L2Rp dj48ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGNn X2NvbnN0X2kzMihkZmxhZyA9PSBNT18zMiksPC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0Y2dfY29uc3RfaTMyKGRmbGFnID09IE1P XzY0KSk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqBjYXNlIDI6IC8qIGxkbXhjc3IgKi88L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg Y2FzZSAzOiAvKiBzdG14Y3NyICovPC9kaXY+PGRpdj5AQCAtNzczOCw3ICs3OTA2LDcgQEAgc3Rh dGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4 dCAqcyw8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGlmICgocy0mZ3Q7ZmxhZ3Mg JmFtcDsgSEZfRU1fTUFTSykgfHwgIShzLSZndDtmbGFncyAmYW1wOyBIRl9PU0ZYU1JfTUFTSykg fHw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW9kID09IDMpPC9kaXY+PGRp dj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8L2Rpdj48ZGl2Pi0g wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzwvZGl2Pg0KDQo8 ZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAob3AgPT0gMikgezwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3FlbXVfbGRfaTMyKGNwdV90bXAyX2kzMiwg Y3B1X0EwLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBzLSZndDttZW1faW5kZXgsIE1PX0xFVUwpOzwvZGl2Pg0KDQo8ZGl2 PkBAIC03NzYzLDcgKzc5MzEsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BV WDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAvKiBjbGZsdXNoICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmICghKHMtJmd0O2NwdWlkX2ZlYXR1cmVzICZhbXA7IENQVUlEX0NMRkxVU0gpKTwvZGl2 PjxkaXY+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8 L2Rpdj4NCjxkaXY+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2Ry bShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg ZGVmYXVsdDo8L2Rpdj48ZGl2PkBAIC03Nzc1LDcgKzc5NDMsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vs b25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLDwvZGl2Pg0K DQo8ZGl2PsKgIMKgIMKgIMKgIMKgbW9kID0gKG1vZHJtICZndDsmZ3Q7IDYpICZhbXA7IDM7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoGlmIChtb2QgPT0gMyk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKg IMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzwvZGl2PjxkaXY+LSDCoCDCoCDCoCDCoGdlbl9sZWFf bW9kcm0oZW52LCBzLCBtb2RybSk7PC9kaXY+PGRpdj4rIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2Ry bShlbnYsIHMsIG1vZHJtLCBiKTs8L2Rpdj4NCg0KPGRpdj7CoCDCoCDCoCDCoCDCoC8qIGlnbm9y ZSBmb3Igbm93ICovPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGJyZWFrOzwvZGl2PjxkaXY+wqAg wqAgwqBjYXNlIDB4MWFhOiAvKiByc20gKi88L2Rpdj48ZGl2PkBAIC03NzgzLDYgKzc5NTEsNyBA QCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXND b250ZXh0ICpzLDwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqBpZiAoIShzLSZndDtmbGFncyAmYW1w OyBIRl9TTU1fTUFTSykpPC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGls bGVnYWxfb3A7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PC9k aXY+PGRpdj4rIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8L2Rpdj48ZGl2PsKgIMKgIMKg IMKgIMKgZ2VuX2ptcF9pbShzLSZndDtwYyAtIHMtJmd0O2NzX2Jhc2UpOzwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqBnZW5faGVscGVyX3JzbShjcHVfZW52KTs8L2Rpdj48ZGl2Pg0KDQrCoCDCoCDC oCDCoCDCoGdlbl9lb2Iocyk7PC9kaXY+PGRpdj5AQCAtNzgwMyw3ICs3OTcyLDcgQEAgc3RhdGlj IHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAq cyw8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb182NF8zMihkZmxhZyk7PC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoH08L2Rpdj48ZGl2PsKgPC9kaXY+PGRpdj4tIMKgIMKgIMKg IMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzwvZGl2Pg0K DQo8ZGl2PisgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1Jf VE1QMCwgMCwgYik7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfcG9wY250KGNw dV9UWzBdLCBjcHVfZW52LCBjcHVfVFswXSwgdGNnX2NvbnN0X2kzMihvdCkpOzwvZGl2PjxkaXY+ wqAgwqAgwqAgwqAgwqBnZW5fb3BfbW92X3JlZ192KG90LCByZWcsIGNwdV9UWzBdKTs8L2Rpdj48 ZGl2PsKgPC9kaXY+DQoNCjxkaXY+QEAgLTc4ODAsNiArODA0OSwxNyBAQCB2b2lkIG9wdGltaXpl X2ZsYWdzX2luaXQodm9pZCk8L2Rpdj48ZGl2PsKgIMKgIMKgY3B1X2NjX3NyYzIgPSB0Y2dfZ2xv YmFsX21lbV9uZXcoVENHX0FSRUcwLCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgY2Nfc3JjMiksPC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAmcXVvdDtjY19zcmMyJnF1b3Q7KTs8L2Rpdj4NCg0KPGRpdj7CoDwvZGl2PjxkaXY+ KyDCoCDCoGNwdV9mcG9wID0gdGNnX2dsb2JhbF9tZW1fbmV3X2kzMihUQ0dfQVJFRzAsPC9kaXY+ PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGZwb3ApLCAmcXVvdDtmcG9wJnF1b3Q7KTs8L2Rp dj48ZGl2PisgwqAgwqBjcHVfZnBpcCA9IHRjZ19nbG9iYWxfbWVtX25ldyhUQ0dfQVJFRzAsIG9m ZnNldG9mKENQVVg4NlN0YXRlLCBmcGlwKSw8L2Rpdj4NCg0KPGRpdj4rIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O2ZwaXAmcXVvdDsp OzwvZGl2PjxkaXY+KyDCoCDCoGNwdV9mcGRwID0gdGNnX2dsb2JhbF9tZW1fbmV3KFRDR19BUkVH MCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGZwZHApLDwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmcXVvdDtmcGRwJnF1b3Q7 KTs8L2Rpdj48ZGl2Pg0KDQorIMKgIMKgY3B1X2ZwZHMgPSB0Y2dfZ2xvYmFsX21lbV9uZXdfaTMy KFRDR19BUkVHMCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGZwZHMpLDwvZGl2PjxkaXY+KyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmcXVvdDtm cGRzJnF1b3Q7KTs8L2Rpdj48ZGl2PisgwqAgwqBjcHVfZnBjcyA9IHRjZ19nbG9iYWxfbWVtX25l d19pMzIoVENHX0FSRUcwLCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgZnBjcyksPC9kaXY+DQoNCjxk aXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCAmcXVvdDtmcGNzJnF1b3Q7KTs8L2Rpdj48ZGl2Pis8L2Rpdj48ZGl2PsKgIMKgIMKgZm9yIChp ID0gMDsgaSAmbHQ7IENQVV9OQl9SRUdTOyArK2kpIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg Y3B1X3JlZ3NbaV0gPSB0Y2dfZ2xvYmFsX21lbV9uZXcoVENHX0FSRUcwLDwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbaV0pLDwvZGl2Pg0KDQo8ZGl2PkBAIC03OTI0 LDYgKzgxMDQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2ludGVybWVkaWF0ZV9jb2RlX2lu dGVybmFsKFg4NkNQVSAqY3B1LDwvZGl2PjxkaXY+wqAgwqAgwqBkYy0mZ3Q7c2luZ2xlc3RlcF9l bmFibGVkID0gY3MtJmd0O3NpbmdsZXN0ZXBfZW5hYmxlZDs8L2Rpdj48ZGl2PsKgIMKgIMKgZGMt Jmd0O2NjX29wID0gQ0NfT1BfRFlOQU1JQzs8L2Rpdj48ZGl2PsKgIMKgIMKgZGMtJmd0O2NjX29w X2RpcnR5ID0gZmFsc2U7PC9kaXY+DQoNCjxkaXY+KyDCoCDCoGRjLSZndDtmcF9vcCA9IEZQX0VQ X0lOVkFMSUQ7PC9kaXY+PGRpdj4rIMKgIMKgZGMtJmd0O2ZwX2VwX2RpcnR5ID0gZmFsc2U7PC9k aXY+PGRpdj7CoCDCoCDCoGRjLSZndDtjc19iYXNlID0gY3NfYmFzZTs8L2Rpdj48ZGl2PsKgIMKg IMKgZGMtJmd0O3RiID0gdGI7PC9kaXY+PGRpdj7CoCDCoCDCoGRjLSZndDtwb3BsX2VzcF9oYWNr ID0gMDs8L2Rpdj48ZGl2PkBAIC03OTk3LDYgKzgxNzksOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQg Z2VuX2ludGVybWVkaWF0ZV9jb2RlX2ludGVybmFsKFg4NkNQVSAqY3B1LDwvZGl2Pg0KDQo8ZGl2 PsKgIMKgIMKgIMKgIMKgIMKgIMKgfTwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2df Y3R4Lmdlbl9vcGNfcGNbbGpdID0gcGNfcHRyOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fb3BjX2NjX29wW2xqXSA9IGRjLSZndDtjY19vcDs8L2Rpdj48ZGl2PisgwqAgwqAgwqAg wqAgwqAgwqBnZW5fb3BjX2ZwX29wW2xqXSA9IGRjLSZndDtmcF9vcDs8L2Rpdj48ZGl2PisgwqAg wqAgwqAgwqAgwqAgwqBnZW5fb3BjX2ZwX2lwW2xqXSA9IGRjLSZndDtmcF9pcDs8L2Rpdj4NCg0K PGRpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wY19mcF9jc1tsal0gPSBkYy0mZ3Q7ZnBfY3M7 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19jdHguZ2VuX29wY19pbnN0cl9zdGFy dFtsal0gPSAxOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfY3R4Lmdlbl9vcGNf aWNvdW50W2xqXSA9IG51bV9pbnNuczs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgfTwvZGl2Pjxk aXY+QEAgLTgwODAsNiArODI2NSw3IEBAIHZvaWQgZ2VuX2ludGVybWVkaWF0ZV9jb2RlX3BjKENQ VVg4NlN0YXRlICplbnYsIFRyYW5zbGF0aW9uQmxvY2sgKnRiKTwvZGl2Pg0KDQo8ZGl2PsKgdm9p ZCByZXN0b3JlX3N0YXRlX3RvX29wYyhDUFVYODZTdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2Nr ICp0YiwgaW50IHBjX3Bvcyk8L2Rpdj48ZGl2PsKgezwvZGl2PjxkaXY+wqAgwqAgwqBpbnQgY2Nf b3A7PC9kaXY+PGRpdj4rIMKgIMKgdWludDE2X3QgZnBfb3A7PC9kaXY+PGRpdj7CoCNpZmRlZiBE RUJVR19ESVNBUzwvZGl2PjxkaXY+wqAgwqAgwqBpZiAocWVtdV9sb2dsZXZlbF9tYXNrKENQVV9M T0dfVEJfT1ApKSB7PC9kaXY+DQoNCjxkaXY+wqAgwqAgwqAgwqAgwqBpbnQgaTs8L2Rpdj48ZGl2 PkBAIC04MDk5LDQgKzgyODUsMTAgQEAgdm9pZCByZXN0b3JlX3N0YXRlX3RvX29wYyhDUFVYODZT dGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YiwgaW50IHBjX3Bvcyk8L2Rpdj48ZGl2PsKg IMKgIMKgY2Nfb3AgPSBnZW5fb3BjX2NjX29wW3BjX3Bvc107PC9kaXY+PGRpdj7CoCDCoCDCoGlm IChjY19vcCAhPSBDQ19PUF9EWU5BTUlDKTwvZGl2Pg0KDQo8ZGl2PsKgIMKgIMKgIMKgIMKgZW52 LSZndDtjY19vcCA9IGNjX29wOzwvZGl2PjxkaXY+KyDCoCDCoGZwX29wID0gZ2VuX29wY19mcF9v cFtwY19wb3NdOzwvZGl2PjxkaXY+KyDCoCDCoGlmIChmcF9vcCAmYW1wOyBGUF9FUF9WQUxJRCkg ezwvZGl2PjxkaXY+KyDCoCDCoCDCoCDCoHRjZ19nZW5fbW92aV9pMzIoY3B1X2Zwb3AsIGZwX29w KTs8L2Rpdj48ZGl2PisgwqAgwqAgwqAgwqB0Y2dfZ2VuX21vdmlfdGwoY3B1X2ZwaXAsIGdlbl9v cGNfZnBfaXBbcGNfcG9zXSk7PC9kaXY+DQoNCjxkaXY+KyDCoCDCoCDCoCDCoHRjZ19nZW5fbW92 aV9pMzIoY3B1X2ZwY3MsIGdlbl9vcGNfZnBfY3NbcGNfcG9zXSk7PC9kaXY+PGRpdj4rIMKgIMKg fTwvZGl2PjxkaXY+wqB9PC9kaXY+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21h aWxfZXh0cmEiPjxicj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPk9uIFNhdCwgSnVsIDE5 LCAyMDE0IGF0IDI6MzYgQU0sIEphdW1lIE1hcnTDrSA8c3BhbiBkaXI9Imx0ciI+Jmx0OzxhIGhy ZWY9Im1haWx0bzpqYXVtZS5tYXJ0aWZAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+amF1bWUu bWFydGlmQGdtYWlsLmNvbTwvYT4mZ3Q7PC9zcGFuPiB3cm90ZTo8YnI+DQoNCjxibG9ja3F1b3Rl IGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3Jk ZXItbGVmdC13aWR0aDoxcHg7Ym9yZGVyLWxlZnQtY29sb3I6cmdiKDIwNCwyMDQsMjA0KTtib3Jk ZXItbGVmdC1zdHlsZTpzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij5IZWxsbyw8YnI+DQo8YnI+DQpJ IGF0dGFjaCBhIHBhdGNoIHdpdGggdGhlIGZpeCBmb3IgdGhlIGlzc3VlcyBwb2ludGVkIG91dCBi eSBSaWNoYXJkLjxicj4NCk1heWJlIGl0IHdvdWxkIGJlIHVzZWZ1bCB0byBoYXZlIHRoZSBvcHRp b24gdG8gZGlzYWJsZWQgdGhpcyBmZWF0dXJlPGJyPg0KYXQgY29tcGlsZSB0aW1lLCBmb3IgcGVy Zm9ybWFuY2UgcmVhc29ucy48YnI+DQo8ZGl2IGNsYXNzPSIiPlBsZWFzZSByZXZpZXcgYW5kIGFw cGx5Ljxicj4NCjxicj4NCkJlc3QgcmVnYXJkcyw8YnI+DQpKYXVtZTxicj4NCjxicj4NClNpZ25l ZC1vZmYtYnk6IEphdW1lIE1hcnRpIEZhcnJpb2wgKDxhIGhyZWY9Im1haWx0bzpqYXVtZS5tYXJ0 aWZAZ21haWwuY29tIj5qYXVtZS5tYXJ0aWZAZ21haWwuY29tPC9hPik8YnI+DQpkaWZmIC0tZ2l0 IGEvbGludXgtdXNlci9zaWduYWwuYyBiL2xpbnV4LXVzZXIvc2lnbmFsLmM8YnI+DQo8L2Rpdj5p bmRleCAxMTQxMDU0Li43M2Y4ZjZiIDEwMDY0NDxicj4NCi0tLSBhL2xpbnV4LXVzZXIvc2lnbmFs LmM8YnI+DQorKysgYi9saW51eC11c2VyL3NpZ25hbC5jPGJyPg0KQEAgLTg2NSw3ICs4NjUsNyBA QCBzdGF0aWMgdm9pZCBzZXR1cF9zaWdjb250ZXh0KHN0cnVjdCB0YXJnZXRfc2lnY29udGV4dCAq c2MsPGJyPg0KPGRpdiBjbGFzcz0iIj7CoCDCoCDCoF9fcHV0X3VzZXIoZW52LSZndDtyZWdzW1Jf RVNQXSwgJmFtcDtzYy0mZ3Q7ZXNwX2F0X3NpZ25hbCk7PGJyPg0KwqAgwqAgwqBfX3B1dF91c2Vy KGVudi0mZ3Q7c2Vnc1tSX1NTXS5zZWxlY3RvciwgKHVuc2lnbmVkIGludCAqKSZhbXA7c2MtJmd0 O3NzKTs8YnI+DQo8YnI+DQotIMKgIMKgIMKgIMKgY3B1X3g4Nl9mc2F2ZShlbnYsIGZwc3RhdGVf YWRkciwgMSk7PGJyPg0KPC9kaXY+KyDCoCDCoCDCoCDCoGNwdV94ODZfZnNhdmUoZW52LCBmcHN0 YXRlX2FkZHIpOzxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqBmcHN0YXRlLSZndDtz dGF0dXMgPSBmcHN0YXRlLSZndDtzdzs8YnI+DQo8L2Rpdj48ZGl2IGNsYXNzPSIiPsKgIMKgIMKg IMKgIMKgbWFnaWMgPSAweGZmZmY7PGJyPg0KwqAgwqAgwqBfX3B1dF91c2VyKG1hZ2ljLCAmYW1w O2Zwc3RhdGUtJmd0O21hZ2ljKTs8YnI+DQo8L2Rpdj48ZGl2IGNsYXNzPSIiPkBAIC0xMDY4LDcg KzEwNjgsNyBAQCByZXN0b3JlX3NpZ2NvbnRleHQoQ1BVWDg2U3RhdGUgKmVudiwgc3RydWN0PGJy Pg0KdGFyZ2V0X3NpZ2NvbnRleHQgKnNjLCBpbnQgKnBlYXgpPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnBzdGF0ZV9hZGRyLDxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNpemVvZihz dHJ1Y3QgdGFyZ2V0X2Zwc3RhdGUpKSk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdvdG8gYmFkZnJhbWU7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNw dV94ODZfZnJzdG9yKGVudiwgZnBzdGF0ZV9hZGRyLCAxKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgY3B1X3g4Nl9mcnN0b3IoZW52LCBmcHN0YXRlX2FkZHIpOzxicj4NCsKgIH08YnI+ DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCpwZWF4ID0gdHN3YXBsKHNjLSZndDtlYXgpOzxicj4NCmRp ZmYgLS1naXQgYS90YXJnZXQtaTM4Ni9jcHUuaCBiL3RhcmdldC1pMzg2L2NwdS5oPGJyPg0KPC9k aXY+aW5kZXggZTYzNGQ4My4uNDI3NGNlMyAxMDA2NDQ8YnI+DQotLS0gYS90YXJnZXQtaTM4Ni9j cHUuaDxicj4NCisrKyBiL3RhcmdldC1pMzg2L2NwdS5oPGJyPg0KQEAgLTgxOSwxMCArODE5LDEx IEBAIHR5cGVkZWYgc3RydWN0IENQVVg4NlN0YXRlIHs8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKg IMKgdWludDE2X3QgZnB1Yzs8YnI+DQrCoCDCoCDCoHVpbnQ4X3QgZnB0YWdzWzhdOyDCoCAvKiAw ID0gdmFsaWQsIDEgPSBlbXB0eSAqLzxicj4NCsKgIMKgIMKgRlBSZWcgZnByZWdzWzhdOzxicj4N CjwvZGl2PjxkaXYgY2xhc3M9IiI+LSDCoCDCoC8qIEtWTS1vbmx5IHNvIGZhciAqLzxicj4NCi0g wqAgwqB1aW50MTZfdCBmcG9wOzxicj4NCjwvZGl2PisgwqAgwqB1aW50MzJfdCBmcG9wOzxicj4N CjxkaXYgY2xhc3M9IiI+wqAgwqAgwqB1aW50NjRfdCBmcGlwOzxicj4NCsKgIMKgIMKgdWludDY0 X3QgZnBkcDs8YnI+DQorIMKgIMKgdWludDMyX3QgZnBjczs8YnI+DQorIMKgIMKgdWludDMyX3Qg ZnBkczs8YnI+DQo8YnI+DQrCoCDCoCDCoC8qIGVtdWxhdG9yIGludGVybmFsIHZhcmlhYmxlcyAq Lzxicj4NCsKgIMKgIMKgZmxvYXRfc3RhdHVzIGZwX3N0YXR1czs8YnI+DQo8L2Rpdj5AQCAtMTA2 Nyw4ICsxMDY4LDggQEAgZmxvYXR4ODAgY3B1X3NldF9mcDgwKHVpbnQ2NF90IG1hbnQsIHVpbnQx Nl90IHVwcGVyKTs8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgLyogdGhlIGZvbGxvd2luZyBoZWxwZXJz IGFyZSBvbmx5IHVzYWJsZSBpbiB1c2VyIG1vZGUgc2ltdWxhdGlvbiBhczxicj4NCsKgIMKgIHRo ZXkgY2FuIHRyaWdnZXIgdW5leHBlY3RlZCBleGNlcHRpb25zICovPGJyPg0KwqB2b2lkIGNwdV94 ODZfbG9hZF9zZWcoQ1BVWDg2U3RhdGUgKnMsIGludCBzZWdfcmVnLCBpbnQgc2VsZWN0b3IpOzxi cj4NCi12b2lkIGNwdV94ODZfZnNhdmUoQ1BVWDg2U3RhdGUgKnMsIHRhcmdldF91bG9uZyBwdHIs IGludCBkYXRhMzIpOzxicj4NCi12b2lkIGNwdV94ODZfZnJzdG9yKENQVVg4NlN0YXRlICpzLCB0 YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTMyKTs8YnI+DQordm9pZCBjcHVfeDg2X2ZzYXZlKENQ VVg4NlN0YXRlICpzLCB0YXJnZXRfdWxvbmcgcHRyKTs8YnI+DQordm9pZCBjcHVfeDg2X2Zyc3Rv cihDUFVYODZTdGF0ZSAqcywgdGFyZ2V0X3Vsb25nIHB0cik7PGJyPg0KPGJyPg0KwqAvKiB5b3Ug Y2FuIGNhbGwgdGhpcyBzaWduYWwgaGFuZGxlciBmcm9tIHlvdXIgU0lHQlVTIGFuZCBTSUdTRUdW PGJyPg0KwqAgwqAgc2lnbmFsIGhhbmRsZXJzIHRvIGluZm9ybSB0aGUgdmlydHVhbCBDUFUgb2Yg ZXhjZXB0aW9ucy4gbm9uIHplcm88YnI+DQpkaWZmIC0tZ2l0IGEvdGFyZ2V0LWkzODYvZnB1X2hl bHBlci5jIGIvdGFyZ2V0LWkzODYvZnB1X2hlbHBlci5jPGJyPg0KPC9kaXY+aW5kZXggMWIyOTAw ZC4uNjg4NjAzMSAxMDA2NDQ8YnI+DQo8ZGl2PjxkaXYgY2xhc3M9Img1Ij4tLS0gYS90YXJnZXQt aTM4Ni9mcHVfaGVscGVyLmM8YnI+DQorKysgYi90YXJnZXQtaTM4Ni9mcHVfaGVscGVyLmM8YnI+ DQpAQCAtNTYsNiArNTYsOCBAQDxicj4NCsKgI2RlZmluZSBmbG9hdHg4MF9sMmUgbWFrZV9mbG9h dHg4MCgweDNmZmYsIDB4YjhhYTNiMjk1YzE3ZjBiY0xMKTxicj4NCsKgI2RlZmluZSBmbG9hdHg4 MF9sMnQgbWFrZV9mbG9hdHg4MCgweDQwMDAsIDB4ZDQ5YTc4NGJjZDFiOGFmZUxMKTxicj4NCjxi cj4NCisjZGVmaW5lIEZQVVMoZW52KSAoKGVudi0mZ3Q7ZnB1cyAmYW1wOyB+MHgzODAwKSB8ICgo ZW52LSZndDtmcHN0dCAmYW1wOyAweDcpICZsdDsmbHQ7IDExKSk8YnI+DQorPGJyPg0KwqBzdGF0 aWMgaW5saW5lIHZvaWQgZnB1c2goQ1BVWDg2U3RhdGUgKmVudik8YnI+DQrCoHs8YnI+DQrCoCDC oCDCoGVudi0mZ3Q7ZnBzdHQgPSAoZW52LSZndDtmcHN0dCAtIDEpICZhbXA7IDc7PGJyPg0KQEAg LTYwNCw2ICs2MDYsMTAgQEAgdm9pZCBoZWxwZXJfZm5pbml0KENQVVg4NlN0YXRlICplbnYpPGJy Pg0KwqAgwqAgwqBlbnYtJmd0O2ZwdGFnc1s1XSA9IDE7PGJyPg0KwqAgwqAgwqBlbnYtJmd0O2Zw dGFnc1s2XSA9IDE7PGJyPg0KwqAgwqAgwqBlbnYtJmd0O2ZwdGFnc1s3XSA9IDE7PGJyPg0KKyDC oCDCoGVudi0mZ3Q7ZnBpcCA9IDA7PGJyPg0KKyDCoCDCoGVudi0mZ3Q7ZnBjcyA9IDA7PGJyPg0K KyDCoCDCoGVudi0mZ3Q7ZnBkcCA9IDA7PGJyPg0KKyDCoCDCoGVudi0mZ3Q7ZnBkcyA9IDA7PGJy Pg0KwqB9PGJyPg0KPGJyPg0KwqAvKiBCQ0Qgb3BzICovPGJyPg0KQEAgLTk2MSwxMyArOTY3LDEz IEBAIHZvaWQgaGVscGVyX2Z4YW1fU1QwKENQVVg4NlN0YXRlICplbnYpPGJyPg0KwqAgwqAgwqB9 PGJyPg0KwqB9PGJyPg0KPGJyPg0KLXZvaWQgaGVscGVyX2ZzdGVudihDUFVYODZTdGF0ZSAqZW52 LCB0YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTMyKTxicj4NCit2b2lkIGhlbHBlcl9mc3RlbnYo Q1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMiw8YnI+DQorIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGludCBwcm90ZWN0ZWRfbW9kZSk8YnI+DQrCoHs8YnI+ DQotIMKgIMKgaW50IGZwdXMsIGZwdGFnLCBleHAsIGk7PGJyPg0KKyDCoCDCoGludCBmcHRhZywg ZXhwLCBpOzxicj4NCsKgIMKgIMKgdWludDY0X3QgbWFudDs8YnI+DQrCoCDCoCDCoENQVV9MRG91 YmxlVSB0bXA7PGJyPg0KPGJyPg0KLSDCoCDCoGZwdXMgPSAoZW52LSZndDtmcHVzICZhbXA7IH4w eDM4MDApIHwgKGVudi0mZ3Q7ZnBzdHQgJmFtcDsgMHg3KSAmbHQ7Jmx0OyAxMTs8YnI+DQrCoCDC oCDCoGZwdGFnID0gMDs8YnI+DQrCoCDCoCDCoGZvciAoaSA9IDc7IGkgJmd0Oz0gMDsgaS0tKSB7 PGJyPg0KwqAgwqAgwqAgwqAgwqBmcHRhZyAmbHQ7Jmx0Oz0gMjs8YnI+DQpAQCAtOTg3LDgzICs5 OTMsMTUwIEBAIHZvaWQgaGVscGVyX2ZzdGVudihDUFVYODZTdGF0ZSAqZW52LDxicj4NCnRhcmdl dF91bG9uZyBwdHIsIGludCBkYXRhMzIpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0K wqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqB9PGJyPg0KKzxicj4NCsKgIMKgIMKgaWYgKGRh dGEzMikgezxicj4NCsKgIMKgIMKgIMKgIMKgLyogMzIgYml0ICovPGJyPg0KLSDCoCDCoCDCoCDC oGNwdV9zdGxfZGF0YShlbnYsIHB0ciwgZW52LSZndDtmcHVjKTs8YnI+DQotIMKgIMKgIMKgIMKg Y3B1X3N0bF9kYXRhKGVudiwgcHRyICsgNCwgZnB1cyk7PGJyPg0KLSDCoCDCoCDCoCDCoGNwdV9z dGxfZGF0YShlbnYsIHB0ciArIDgsIGZwdGFnKTs8YnI+DQotIMKgIMKgIMKgIMKgY3B1X3N0bF9k YXRhKGVudiwgcHRyICsgMTIsIDApOyAvKiBmcGlwICovPGJyPg0KLSDCoCDCoCDCoCDCoGNwdV9z dGxfZGF0YShlbnYsIHB0ciArIDE2LCAwKTsgLyogZnBjcyAqLzxicj4NCi0gwqAgwqAgwqAgwqBj cHVfc3RsX2RhdGEoZW52LCBwdHIgKyAyMCwgMCk7IC8qIGZwb28gKi88YnI+DQotIMKgIMKgIMKg IMKgY3B1X3N0bF9kYXRhKGVudiwgcHRyICsgMjQsIDApOyAvKiBmcG9zICovPGJyPg0KKyDCoCDC oCDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciwgZW52LSZndDtmcHVjKTs8YnI+DQorIMKgIMKg IMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgNCwgRlBVUyhlbnYpKTs8YnI+DQorIMKgIMKg IMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgOCwgZnB0YWcpOzxicj4NCisgwqAgwqAgwqAg wqBpZiAocHJvdGVjdGVkX21vZGUpIHs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3N0bF9k YXRhKGVudiwgcHRyICsgMTIsIGVudi0mZ3Q7ZnBpcCk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDC oGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDE2LDxicj4NCjwvZGl2PjwvZGl2PisgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoKGVudi0mZ3Q7ZnBvcCAmYW1wOyAweDdmZikgJmx0 OyZsdDsgMTYpIHwgKGVudi0mZ3Q7ZnBjcyAmYW1wOyAweGZmZmYpKTs8YnI+DQo8ZGl2IGNsYXNz PSIiPisgwqAgwqAgwqAgwqAgwqAgwqBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAyMCwgZW52LSZn dDtmcGRwKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3N0bF9kYXRhKGVudiwgcHRyICsg MjQsIGVudi0mZ3Q7ZnBkcyk7PGJyPg0KKyDCoCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KKyDCoCDC oCDCoCDCoCDCoCDCoC8qIFJlYWwgbW9kZSDCoCovPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGNw dV9zdGxfZGF0YShlbnYsIHB0ciArIDEyLCBlbnYtJmd0O2ZwaXApOyAvKiBmcGlwWzE1Li4wMF0g Ki88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3N0bF9kYXRhKGVudiwgcHRyICsgMTYsICgo KChlbnYtJmd0O2ZwaXAgJmd0OyZndDsgMTYpICZhbXA7IDB4ZmZmZikgJmx0OyZsdDsgMTIpIHw8 YnI+DQo8L2Rpdj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGVudi0mZ3Q7 ZnBvcCAmYW1wOyAweDdmZikpKTsgLyogZnBpcFszMS4uMTZdLCBmcG9wICovPGJyPg0KPGRpdiBj bGFzcz0iIj4rIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3N0bF9kYXRhKGVudiwgcHRyICsgMjAsIGVu di0mZ3Q7ZnBkcCk7IC8qIGZwZHBbMTUuLjAwXSAqLzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBj cHVfc3RsX2RhdGEoZW52LCBwdHIgKyAyNCw8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgKGVudi0mZ3Q7ZnBkcCAmZ3Q7Jmd0OyA0KSAmYW1wOyAweGZmZmYwMDApOyAv KiBmcGRwWzMxLi4xNl0gKi88YnI+DQorIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgfSBlbHNl IHs8YnI+DQrCoCDCoCDCoCDCoCDCoC8qIDE2IGJpdCAqLzxicj4NCsKgIMKgIMKgIMKgIMKgY3B1 X3N0d19kYXRhKGVudiwgcHRyLCBlbnYtJmd0O2ZwdWMpOzxicj4NCi0gwqAgwqAgwqAgwqBjcHVf c3R3X2RhdGEoZW52LCBwdHIgKyAyLCBmcHVzKTs8YnI+DQorIMKgIMKgIMKgIMKgY3B1X3N0d19k YXRhKGVudiwgcHRyICsgMiwgRlBVUyhlbnYpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoGNwdV9zdHdf ZGF0YShlbnYsIHB0ciArIDQsIGZwdGFnKTs8YnI+DQotIMKgIMKgIMKgIMKgY3B1X3N0d19kYXRh KGVudiwgcHRyICsgNiwgMCk7PGJyPg0KLSDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0 ciArIDgsIDApOzxicj4NCi0gwqAgwqAgwqAgwqBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyAxMCwg MCk7PGJyPg0KLSDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDEyLCAwKTs8YnI+ DQorIMKgIMKgIMKgIMKgaWYgKHByb3RlY3RlZF9tb2RlKSB7PGJyPg0KKyDCoCDCoCDCoCDCoCDC oCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDYsIGVudi0mZ3Q7ZnBpcCk7PGJyPg0KKyDCoCDC oCDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDgsIGVudi0mZ3Q7ZnBjcyk7PGJy Pg0KKyDCoCDCoCDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDEwLCBlbnYtJmd0 O2ZwZHApOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyAx MiwgZW52LSZndDtmcGRzKTs8YnI+DQorIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQorIMKgIMKg IMKgIMKgIMKgIMKgLyogUmVhbCBtb2RlIMKgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY3B1 X3N0d19kYXRhKGVudiwgcHRyICsgNiwgZW52LSZndDtmcGlwKTsgLyogZnBpcFsxNS4uMF0gKi88 YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgOCwgKChlbnYt Jmd0O2ZwaXAgJmd0OyZndDsgNCkgJmFtcDsgMHhmMDAwKSB8PGJyPg0KPC9kaXY+KyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChlbnYtJmd0O2Zwb3AgJmFtcDsgMHg3ZmYpKTsg LyogZnBpcFsxOS4uMTZdLCBmcG9wICovPGJyPg0KPGRpdiBjbGFzcz0iIj4rIMKgIMKgIMKgIMKg IMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgMTAsIGVudi0mZ3Q7ZnBkcCk7IC8qIGZwZHBb MTUuLjBdICovPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGNwdV9zdHdfZGF0YShlbnYsIHB0ciAr IDEyLDxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoZW52LSZndDtm cGRwICZndDsmZ3Q7IDQpICZhbXA7IDB4ZjAwMCk7IC8qIGZwZHBbMTkuLjE2XSAqLzxicj4NCisg wqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqB9PGJyPg0KKzxicj4NCisgwqAgwqBlbnYtJmd0O2Zw aXAgPSAwOzxicj4NCisgwqAgwqBlbnYtJmd0O2ZwY3MgPSAwOzxicj4NCisgwqAgwqBlbnYtJmd0 O2ZwZHAgPSAwOzxicj4NCisgwqAgwqBlbnYtJmd0O2ZwZHMgPSAwOzxicj4NCsKgfTxicj4NCjxi cj4NCi12b2lkIGhlbHBlcl9mbGRlbnYoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0 ciwgaW50IGRhdGEzMik8YnI+DQordm9pZCBoZWxwZXJfZmxkZW52KENQVVg4NlN0YXRlICplbnYs IHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIsPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBpbnQgcHJvdGVjdGVkX21vZGUpPGJyPg0KwqB7PGJyPg0KLSDCoCDCoGludCBpLCBm cHVzLCBmcHRhZzs8YnI+DQorIMKgIMKgaW50IHRtcCwgaSwgZnB1cywgZnB0YWc7PGJyPg0KPGJy Pg0KwqAgwqAgwqBpZiAoZGF0YTMyKSB7PGJyPg0KKyDCoCDCoCDCoCDCoC8qIDMyIGJpdCAqLzxi cj4NCsKgIMKgIMKgIMKgIMKgZW52LSZndDtmcHVjID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0cik7 PGJyPg0KwqAgwqAgwqAgwqAgwqBmcHVzID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDQpOzxi cj4NCsKgIMKgIMKgIMKgIMKgZnB0YWcgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyICsgOCk7PGJy Pg0KKyDCoCDCoCDCoCDCoGlmIChwcm90ZWN0ZWRfbW9kZSkgezxicj4NCisgwqAgwqAgwqAgwqAg wqAgwqBlbnYtJmd0O2ZwaXAgPSBjcHVfbGRsX2RhdGEoZW52LCBwdHIgKyAxMik7PGJyPg0KKyDC oCDCoCDCoCDCoCDCoCDCoHRtcCA9IGNwdV9sZGxfZGF0YShlbnYsIHB0ciArIDE2KTs8YnI+DQor IMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGNzID0gdG1wICZhbXA7IDB4ZmZmZjs8YnI+DQo8 L2Rpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcG9wID0gdG1wICZndDsmZ3Q7IDE2Ozxi cj4NCjxkaXYgY2xhc3M9IiI+KyDCoCDCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBkcCA9IGNwdV9s ZGxfZGF0YShlbnYsIHB0ciArIDIwKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtm cGRzID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDI0KTs8YnI+DQorIMKgIMKgIMKgIMKgfSBl bHNlIHs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgLyogUmVhbCBtb2RlICovPGJyPg0KKyDCoCDC oCDCoCDCoCDCoCDCoHRtcCA9IGNwdV9sZGxfZGF0YShlbnYsIHB0ciArIDE2KTs8YnI+DQorIMKg IMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGlwID0gKCh0bXAgJmFtcDsgMHhmZmZmMDAwKSAmbHQ7 Jmx0OyA0KSB8PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNwdV9s ZHV3X2RhdGEoZW52LCBwdHIgKyAxMik7PGJyPg0KPC9kaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGVu di0mZ3Q7ZnBvcCA9IHRtcCAmYW1wOyAweDdmZjs8YnI+DQo8ZGl2IGNsYXNzPSIiPisgwqAgwqAg wqAgwqAgwqAgwqBlbnYtJmd0O2ZwZHAgPSAoY3B1X2xkbF9kYXRhKGVudiwgcHRyICsgMjQpICZs dDsmbHQ7IDQpIHw8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY3B1 X2xkdXdfZGF0YShlbnYsIHB0ciArIDIwKTs8YnI+DQorIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKg IMKgfSBlbHNlIHs8YnI+DQorIMKgIMKgIMKgIMKgLyogMTYgYml0ICovPGJyPg0KwqAgwqAgwqAg wqAgwqBlbnYtJmd0O2ZwdWMgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyKTs8YnI+DQrCoCDCoCDC oCDCoCDCoGZwdXMgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyICsgMik7PGJyPg0KwqAgwqAgwqAg wqAgwqBmcHRhZyA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyA0KTs8YnI+DQorIMKgIMKgIMKg IMKgaWYgKHByb3RlY3RlZF9tb2RlKSB7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoC8qIFByb3Rl Y3RlZCBtb2RlIMKgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGlwID0gY3B1 X2xkdXdfZGF0YShlbnYsIHB0ciArIDYpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBlbnYtJmd0 O2ZwY3MgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyICsgOCk7PGJyPg0KKyDCoCDCoCDCoCDCoCDC oCDCoGVudi0mZ3Q7ZnBkcCA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyAxMCk7PGJyPg0KKyDC oCDCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBkcyA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyAx Mik7PGJyPg0KKyDCoCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoC8q IFJlYWwgbW9kZSDCoCovPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoHRtcCA9IGNwdV9sZHV3X2Rh dGEoZW52LCBwdHIgKyA4KTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGlwID0g KCh0bXAgJmFtcDsgMHhmMDAwKSAmbHQ7Jmx0OyA0KSB8IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIg KyA2KTs8YnI+DQo8L2Rpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcG9wID0gdG1wICZh bXA7IDB4N2ZmOzxicj4NCjxkaXY+PGRpdiBjbGFzcz0iaDUiPisgwqAgwqAgwqAgwqAgwqAgwqBl bnYtJmd0O2ZwZHAgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyICsgMTIpICZsdDsmbHQ7IDQgfDxi cj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjcHVfbGR1d19kYXRhKGVu diwgcHRyICsgMTApOzxicj4NCisgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqB9PGJyPg0KKzxi cj4NCsKgIMKgIMKgZW52LSZndDtmcHN0dCA9IChmcHVzICZndDsmZ3Q7IDExKSAmYW1wOyA3Ozxi cj4NCsKgIMKgIMKgZW52LSZndDtmcHVzID0gZnB1cyAmYW1wOyB+MHgzODAwOzxicj4NCsKgIMKg IMKgZm9yIChpID0gMDsgaSAmbHQ7IDg7IGkrKykgezxicj4NCsKgIMKgIMKgIMKgIMKgZW52LSZn dDtmcHRhZ3NbaV0gPSAoKGZwdGFnICZhbXA7IDMpID09IDMpOzxicj4NCsKgIMKgIMKgIMKgIMKg ZnB0YWcgJmd0OyZndDs9IDI7PGJyPg0KwqAgwqAgwqB9PGJyPg0KKzxicj4NCisgwqAgwqBlbnYt Jmd0O2ZwaXAgJmFtcDs9IDB4ZmZmZmZmZmY7PGJyPg0KKyDCoCDCoGVudi0mZ3Q7ZnBkcCAmYW1w Oz0gMHhmZmZmZmZmZjs8YnI+DQorIMKgIMKgaWYgKCFwcm90ZWN0ZWRfbW9kZSkgezxicj4NCisg wqAgwqAgwqAgwqBlbnYtJmd0O2ZwY3MgPSAwOzxicj4NCisgwqAgwqAgwqAgwqBlbnYtJmd0O2Zw ZHMgPSAwOzxicj4NCisgwqAgwqB9PGJyPg0KwqB9PGJyPg0KPGJyPg0KLXZvaWQgaGVscGVyX2Zz YXZlKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIpPGJyPg0K K3ZvaWQgaGVscGVyX2ZzYXZlKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGlu dCBkYXRhMzIsPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGludCBwcm90ZWN0ZWRf bW9kZSk8YnI+DQrCoHs8YnI+DQrCoCDCoCDCoGZsb2F0eDgwIHRtcDs8YnI+DQrCoCDCoCDCoGlu dCBpOzxicj4NCjxicj4NCi0gwqAgwqBoZWxwZXJfZnN0ZW52KGVudiwgcHRyLCBkYXRhMzIpOzxi cj4NCisgwqAgwqBoZWxwZXJfZnN0ZW52KGVudiwgcHRyLCBkYXRhMzIsIHByb3RlY3RlZF9tb2Rl KTs8YnI+DQo8YnI+DQotIMKgIMKgcHRyICs9ICgxNCAmbHQ7Jmx0OyBkYXRhMzIpOzxicj4NCisg wqAgwqBpZiAoZGF0YTMyKSB7PGJyPg0KKyDCoCDCoCDCoCDCoHB0ciArPSAyODs8YnI+DQorIMKg IMKgfSBlbHNlIHs8YnI+DQorIMKgIMKgIMKgIMKgcHRyICs9IDE0Ozxicj4NCisgwqAgwqB9PGJy Pg0KwqAgwqAgwqBmb3IgKGkgPSAwOyBpICZsdDsgODsgaSsrKSB7PGJyPg0KwqAgwqAgwqAgwqAg wqB0bXAgPSBTVChpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoGhlbHBlcl9mc3R0KGVudiwgdG1wLCBw dHIpOzxicj4NCsKgIMKgIMKgIMKgIMKgcHRyICs9IDEwOzxicj4NCsKgIMKgIMKgfTxicj4NCjxi cj4NCi0gwqAgwqAvKiBmbmluaXQgKi88YnI+DQotIMKgIMKgZW52LSZndDtmcHVzID0gMDs8YnI+ DQotIMKgIMKgZW52LSZndDtmcHN0dCA9IDA7PGJyPg0KLSDCoCDCoGVudi0mZ3Q7ZnB1YyA9IDB4 MzdmOzxicj4NCi0gwqAgwqBlbnYtJmd0O2ZwdGFnc1swXSA9IDE7PGJyPg0KLSDCoCDCoGVudi0m Z3Q7ZnB0YWdzWzFdID0gMTs8YnI+DQotIMKgIMKgZW52LSZndDtmcHRhZ3NbMl0gPSAxOzxicj4N Ci0gwqAgwqBlbnYtJmd0O2ZwdGFnc1szXSA9IDE7PGJyPg0KLSDCoCDCoGVudi0mZ3Q7ZnB0YWdz WzRdID0gMTs8YnI+DQotIMKgIMKgZW52LSZndDtmcHRhZ3NbNV0gPSAxOzxicj4NCi0gwqAgwqBl bnYtJmd0O2ZwdGFnc1s2XSA9IDE7PGJyPg0KLSDCoCDCoGVudi0mZ3Q7ZnB0YWdzWzddID0gMTs8 YnI+DQorIMKgIMKgaGVscGVyX2ZuaW5pdChlbnYpOzxicj4NCsKgfTxicj4NCjxicj4NCi12b2lk IGhlbHBlcl9mcnN0b3IoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRh dGEzMik8YnI+DQordm9pZCBoZWxwZXJfZnJzdG9yKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91 bG9uZyBwdHIsIGludCBkYXRhMzIsPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBp bnQgcHJvdGVjdGVkX21vZGUpPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqBmbG9hdHg4MCB0bXA7PGJy Pg0KwqAgwqAgwqBpbnQgaTs8YnI+DQo8YnI+DQotIMKgIMKgaGVscGVyX2ZsZGVudihlbnYsIHB0 ciwgZGF0YTMyKTs8YnI+DQotIMKgIMKgcHRyICs9ICgxNCAmbHQ7Jmx0OyBkYXRhMzIpOzxicj4N CisgwqAgwqBoZWxwZXJfZmxkZW52KGVudiwgcHRyLCBkYXRhMzIsIHByb3RlY3RlZF9tb2RlKTs8 YnI+DQorIMKgIMKgaWYgKGRhdGEzMikgezxicj4NCisgwqAgwqAgwqAgwqBwdHIgKz0gMjg7PGJy Pg0KKyDCoCDCoH0gZWxzZSB7PGJyPg0KKyDCoCDCoCDCoCDCoHB0ciArPSAxNDs8YnI+DQorIMKg IMKgfTxicj4NCjxicj4NCsKgIMKgIMKgZm9yIChpID0gMDsgaSAmbHQ7IDg7IGkrKykgezxicj4N CsKgIMKgIMKgIMKgIMKgdG1wID0gaGVscGVyX2ZsZHQoZW52LCBwdHIpOzxicj4NCkBAIC0xMDcy LDIxICsxMTQ1LDIyIEBAIHZvaWQgaGVscGVyX2Zyc3RvcihDUFVYODZTdGF0ZSAqZW52LDxicj4N CnRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIpPGJyPg0KwqAgwqAgwqB9PGJyPg0KwqB9PGJy Pg0KPGJyPg0KLSNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpPGJyPg0KLXZvaWQgY3B1X3g4 Nl9mc2F2ZShDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTMyKTxi cj4NCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKSAmYW1wOyZhbXA7IGRlZmluZWQoVEFS R0VUX0kzODYpICZhbXA7JmFtcDsgVEFSR0VUX0FCSV9CSVRTID09IDMyPGJyPg0KKzxicj4NCit2 b2lkIGNwdV94ODZfZnNhdmUoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0cik8YnI+ DQrCoHs8YnI+DQotIMKgIMKgaGVscGVyX2ZzYXZlKGVudiwgcHRyLCBkYXRhMzIpOzxicj4NCisg wqAgwqBoZWxwZXJfZnNhdmUoZW52LCBwdHIsIDEsIDEpOzxicj4NCsKgfTxicj4NCjxicj4NCi12 b2lkIGNwdV94ODZfZnJzdG9yKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGlu dCBkYXRhMzIpPGJyPg0KK3ZvaWQgY3B1X3g4Nl9mcnN0b3IoQ1BVWDg2U3RhdGUgKmVudiwgdGFy Z2V0X3Vsb25nIHB0cik8YnI+DQrCoHs8YnI+DQotIMKgIMKgaGVscGVyX2Zyc3RvcihlbnYsIHB0 ciwgZGF0YTMyKTs8YnI+DQorIMKgIMKgaGVscGVyX2Zyc3RvcihlbnYsIHB0ciwgMSwgMSk7PGJy Pg0KwqB9PGJyPg0KwqAjZW5kaWY8YnI+DQo8YnI+DQotdm9pZCBoZWxwZXJfZnhzYXZlKENQVVg4 NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhNjQpPGJyPg0KK3ZvaWQgaGVs cGVyX2Z4c2F2ZShDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTMy LCBpbnQgZGF0YTY0KTxicj4NCsKgezxicj4NCi0gwqAgwqBpbnQgZnB1cywgZnB0YWcsIGksIG5i X3htbV9yZWdzOzxicj4NCisgwqAgwqBpbnQgaSwgbmJfeG1tX3JlZ3MsIGZwdGFnOzxicj4NCsKg IMKgIMKgZmxvYXR4ODAgdG1wOzxicj4NCsKgIMKgIMKgdGFyZ2V0X3Vsb25nIGFkZHI7PGJyPg0K PGJyPg0KQEAgLTEwOTUsMjUgKzExNjksMzYgQEAgdm9pZCBoZWxwZXJfZnhzYXZlKENQVVg4NlN0 YXRlICplbnYsPGJyPg0KdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGE2NCk8YnI+DQrCoCDCoCDC oCDCoCDCoHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwRF9HUEYpOzxicj4NCsKgIMKgIMKgfTxi cj4NCjxicj4NCi0gwqAgwqBmcHVzID0gKGVudi0mZ3Q7ZnB1cyAmYW1wOyB+MHgzODAwKSB8IChl bnYtJmd0O2Zwc3R0ICZhbXA7IDB4NykgJmx0OyZsdDsgMTE7PGJyPg0KwqAgwqAgwqBmcHRhZyA9 IDA7PGJyPg0KwqAgwqAgwqBmb3IgKGkgPSAwOyBpICZsdDsgODsgaSsrKSB7PGJyPg0KwqAgwqAg wqAgwqAgwqBmcHRhZyB8PSAoZW52LSZndDtmcHRhZ3NbaV0gJmx0OyZsdDsgaSk7PGJyPg0KwqAg wqAgwqB9PGJyPg0KKyDCoCDCoGZwdGFnIF49IDB4ZmY7PGJyPg0KKzxicj4NCsKgIMKgIMKgY3B1 X3N0d19kYXRhKGVudiwgcHRyLCBlbnYtJmd0O2ZwdWMpOzxicj4NCi0gwqAgwqBjcHVfc3R3X2Rh dGEoZW52LCBwdHIgKyAyLCBmcHVzKTs8YnI+DQotIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRy ICsgNCwgZnB0YWcgXiAweGZmKTs8YnI+DQorIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsg MiwgRlBVUyhlbnYpKTs8YnI+DQorIMKgIMKgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgNCwgZnB0 YWcgJmFtcDsgMHhmZik7PGJyPg0KPC9kaXY+PC9kaXY+KyDCoCDCoGNwdV9zdHdfZGF0YShlbnYs IHB0ciArIDYsIGVudi0mZ3Q7ZnBvcCk7PGJyPg0KPGRpdj48ZGl2IGNsYXNzPSJoNSI+Kzxicj4N CsKgI2lmZGVmIFRBUkdFVF9YODZfNjQ8YnI+DQrCoCDCoCDCoGlmIChkYXRhNjQpIHs8YnI+DQot IMKgIMKgIMKgIMKgY3B1X3N0cV9kYXRhKGVudiwgcHRyICsgMHgwOCwgMCk7IC8qIHJpcCAqLzxi cj4NCi0gwqAgwqAgwqAgwqBjcHVfc3RxX2RhdGEoZW52LCBwdHIgKyAweDEwLCAwKTsgLyogcmRw ICovPGJyPg0KKyDCoCDCoCDCoCDCoC8qIDY0IGJpdCAqLzxicj4NCisgwqAgwqAgwqAgwqBjcHVf c3RxX2RhdGEoZW52LCBwdHIgKyA4LCBlbnYtJmd0O2ZwaXApOzxicj4NCisgwqAgwqAgwqAgwqBj cHVfc3RxX2RhdGEoZW52LCBwdHIgKyAxNiwgZW52LSZndDtmcGRwKTs8YnI+DQrCoCDCoCDCoH0g ZWxzZTxicj4NCsKgI2VuZGlmPGJyPg0KwqAgwqAgwqB7PGJyPg0KLSDCoCDCoCDCoCDCoGNwdV9z dGxfZGF0YShlbnYsIHB0ciArIDB4MDgsIDApOyAvKiBlaXAgKi88YnI+DQotIMKgIMKgIMKgIMKg Y3B1X3N0bF9kYXRhKGVudiwgcHRyICsgMHgwYywgMCk7IC8qIHNlbCDCoCovPGJyPg0KLSDCoCDC oCDCoCDCoGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDB4MTAsIDApOyAvKiBkcCAqLzxicj4NCi0g wqAgwqAgwqAgwqBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAweDE0LCAwKTsgLyogc2VsIMKgKi88 YnI+DQorIMKgIMKgIMKgIMKgaWYgKGRhdGEzMikgezxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAv KiAzMiBiaXQgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3N0bF9kYXRhKGVudiwgcHRy ICsgOCwgZW52LSZndDtmcGlwKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY3B1X3N0bF9kYXRh KGVudiwgcHRyICsgMTYsIGVudi0mZ3Q7ZnBkcCk7PGJyPg0KKyDCoCDCoCDCoCDCoH0gZWxzZSB7 PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoC8qIDE2IGJpdCAqLzxicj4NCisgwqAgwqAgwqAgwqAg wqAgwqBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyA4LCBlbnYtJmd0O2ZwaXApOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyAxNiwgZW52LSZndDtmcGRwKTs8 YnI+DQorIMKgIMKgIMKgIMKgfTxicj4NCisgwqAgwqAgwqAgwqBjcHVfc3R3X2RhdGEoZW52LCBw dHIgKyAxMiwgZW52LSZndDtmcGNzICZhbXA7IDB4ZmZmZik7PGJyPg0KKyDCoCDCoCDCoCDCoGNw dV9zdHdfZGF0YShlbnYsIHB0ciArIDIwLCBlbnYtJmd0O2ZwZHMgJmFtcDsgMHhmZmZmKTs8YnI+ DQrCoCDCoCDCoH08YnI+DQo8YnI+DQrCoCDCoCDCoGFkZHIgPSBwdHIgKyAweDIwOzxicj4NCkBA IC0xMTQ2LDcgKzEyMzEsNyBAQCB2b2lkIGhlbHBlcl9meHNhdmUoQ1BVWDg2U3RhdGUgKmVudiw8 YnI+DQp0YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTY0KTxicj4NCsKgIMKgIMKgfTxicj4NCsKg fTxicj4NCjxicj4NCi12b2lkIGhlbHBlcl9meHJzdG9yKENQVVg4NlN0YXRlICplbnYsIHRhcmdl dF91bG9uZyBwdHIsIGludCBkYXRhNjQpPGJyPg0KK3ZvaWQgaGVscGVyX2Z4cnN0b3IoQ1BVWDg2 U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMiwgaW50IGRhdGE2NCk8YnI+ DQrCoHs8YnI+DQrCoCDCoCDCoGludCBpLCBmcHVzLCBmcHRhZywgbmJfeG1tX3JlZ3M7PGJyPg0K wqAgwqAgwqBmbG9hdHg4MCB0bXA7PGJyPg0KQEAgLTExNjcsNiArMTI1MiwzMCBAQCB2b2lkIGhl bHBlcl9meHJzdG9yKENQVVg4NlN0YXRlICplbnYsPGJyPg0KdGFyZ2V0X3Vsb25nIHB0ciwgaW50 IGRhdGE2NCk8YnI+DQrCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnB0YWdzW2ldID0gKChmcHRhZyAm Z3Q7Jmd0OyBpKSAmYW1wOyAxKTs8YnI+DQrCoCDCoCDCoH08YnI+DQo8YnI+DQo8L2Rpdj48L2Rp dj4rIMKgIMKgZW52LSZndDtmcG9wID0gKGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyA2KSAmZ3Q7 Jmd0OyA1KSAmYW1wOyAweDdmZjs8YnI+DQo8ZGl2PjxkaXYgY2xhc3M9Img1Ij4rPGJyPg0KKyNp ZmRlZiBUQVJHRVRfWDg2XzY0PGJyPg0KKyDCoCDCoGlmIChkYXRhNjQpIHs8YnI+DQorIMKgIMKg IMKgIMKgLyogNjQgYml0ICovPGJyPg0KKyDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBpcCA9IGNwdV9s ZHFfZGF0YShlbnYsIHB0ciArIDgpOzxicj4NCisgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwZHAgPSBj cHVfbGRxX2RhdGEoZW52LCBwdHIgKyAxNik7PGJyPg0KKyDCoCDCoH0gZWxzZTxicj4NCisjZW5k aWY8YnI+DQorIMKgIMKgezxicj4NCisgwqAgwqAgwqAgwqBpZiAoZGF0YTMyKSB7PGJyPg0KKyDC oCDCoCDCoCDCoCDCoCDCoC8qIDMyIGJpdCAqLzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBlbnYt Jmd0O2ZwaXAgPSBjcHVfbGRsX2RhdGEoZW52LCBwdHIgKyA4KTs8YnI+DQorIMKgIMKgIMKgIMKg IMKgIMKgZW52LSZndDtmcGRwID0gY3B1X2xkbF9kYXRhKGVudiwgcHRyICsgMTYpOzxicj4NCisg wqAgwqAgwqAgwqB9IGVsc2Ugezxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAvKiAxNiBiaXQgKi88 YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZW52LSZndDtmcGlwID0gY3B1X2xkdXdfZGF0YShlbnYs IHB0ciArIDgpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwZHAgPSBjcHVfbGR1 d19kYXRhKGVudiwgcHRyICsgMTYpOzxicj4NCisgwqAgwqAgwqAgwqB9PGJyPg0KKzxicj4NCisg wqAgwqAgwqAgwqBlbnYtJmd0O2ZwY3MgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyICsgMTIpOzxi cj4NCisgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwZHMgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyICsg MjApOzxicj4NCisgwqAgwqB9PGJyPg0KKzxicj4NCsKgIMKgIMKgYWRkciA9IHB0ciArIDB4MjA7 PGJyPg0KwqAgwqAgwqBmb3IgKGkgPSAwOyBpICZsdDsgODsgaSsrKSB7PGJyPg0KwqAgwqAgwqAg wqAgwqB0bXAgPSBoZWxwZXJfZmxkdChlbnYsIGFkZHIpOzxicj4NCkBAIC0xMTk1LDYgKzEzMDQs MTEgQEAgdm9pZCBoZWxwZXJfZnhyc3RvcihDUFVYODZTdGF0ZSAqZW52LDxicj4NCnRhcmdldF91 bG9uZyBwdHIsIGludCBkYXRhNjQpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAg wqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqB9PGJyPg0KKzxicj4NCisgwqAgwqBpZiAoIWRhdGE2 NCkgezxicj4NCisgwqAgwqAgwqAgwqBlbnYtJmd0O2ZwaXAgJmFtcDs9IDB4ZmZmZmZmZmY7PGJy Pg0KKyDCoCDCoCDCoCDCoGVudi0mZ3Q7ZnBkcCAmYW1wOz0gMHhmZmZmZmZmZjs8YnI+DQorIMKg IMKgfTxicj4NCsKgfTxicj4NCjxicj4NCsKgdm9pZCBjcHVfZ2V0X2ZwODAodWludDY0X3QgKnBt YW50LCB1aW50MTZfdCAqcGV4cCwgZmxvYXR4ODAgZik8YnI+DQpkaWZmIC0tZ2l0IGEvdGFyZ2V0 LWkzODYvaGVscGVyLmggYi90YXJnZXQtaTM4Ni9oZWxwZXIuaDxicj4NCmluZGV4IDhlYjAxNDUu LjljNGZkMjIgMTAwNjQ0PGJyPg0KLS0tIGEvdGFyZ2V0LWkzODYvaGVscGVyLmg8YnI+DQorKysg Yi90YXJnZXQtaTM4Ni9oZWxwZXIuaDxicj4NCkBAIC0xODMsMTIgKzE4MywxMiBAQCBERUZfSEVM UEVSXzEoZnJuZGludCwgdm9pZCwgZW52KTxicj4NCsKgREVGX0hFTFBFUl8xKGZzY2FsZSwgdm9p ZCwgZW52KTxicj4NCsKgREVGX0hFTFBFUl8xKGZzaW4sIHZvaWQsIGVudik8YnI+DQrCoERFRl9I RUxQRVJfMShmY29zLCB2b2lkLCBlbnYpPGJyPg0KLURFRl9IRUxQRVJfMyhmc3RlbnYsIHZvaWQs IGVudiwgdGwsIGludCk8YnI+DQotREVGX0hFTFBFUl8zKGZsZGVudiwgdm9pZCwgZW52LCB0bCwg aW50KTxicj4NCi1ERUZfSEVMUEVSXzMoZnNhdmUsIHZvaWQsIGVudiwgdGwsIGludCk8YnI+DQot REVGX0hFTFBFUl8zKGZyc3Rvciwgdm9pZCwgZW52LCB0bCwgaW50KTxicj4NCi1ERUZfSEVMUEVS XzMoZnhzYXZlLCB2b2lkLCBlbnYsIHRsLCBpbnQpPGJyPg0KLURFRl9IRUxQRVJfMyhmeHJzdG9y LCB2b2lkLCBlbnYsIHRsLCBpbnQpPGJyPg0KK0RFRl9IRUxQRVJfNChmc3RlbnYsIHZvaWQsIGVu diwgdGwsIGludCwgaW50KTxicj4NCitERUZfSEVMUEVSXzQoZmxkZW52LCB2b2lkLCBlbnYsIHRs LCBpbnQsIGludCk8YnI+DQorREVGX0hFTFBFUl80KGZzYXZlLCB2b2lkLCBlbnYsIHRsLCBpbnQs IGludCk8YnI+DQorREVGX0hFTFBFUl80KGZyc3Rvciwgdm9pZCwgZW52LCB0bCwgaW50LCBpbnQp PGJyPg0KK0RFRl9IRUxQRVJfNChmeHNhdmUsIHZvaWQsIGVudiwgdGwsIGludCwgaW50KTxicj4N CitERUZfSEVMUEVSXzQoZnhyc3Rvciwgdm9pZCwgZW52LCB0bCwgaW50LCBpbnQpPGJyPg0KPGJy Pg0KwqBERUZfSEVMUEVSX0ZMQUdTXzEoY2x6LCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCk8 YnI+DQrCoERFRl9IRUxQRVJfRkxBR1NfMShjdHosIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRs KTxicj4NCjwvZGl2PjwvZGl2PmRpZmYgLS1naXQgYS90YXJnZXQtaTM4Ni9tYWNoaW5lLmMgYi90 YXJnZXQtaTM4Ni9tYWNoaW5lLmM8YnI+DQppbmRleCAxNmQyZjZhLi41MDBmMDRmIDEwMDY0NDxi cj4NCi0tLSBhL3RhcmdldC1pMzg2L21hY2hpbmUuYzxicj4NCisrKyBiL3RhcmdldC1pMzg2L21h Y2hpbmUuYzxicj4NCjxkaXYgY2xhc3M9IiI+QEAgLTM5Nyw3ICszOTcsNyBAQCBzdGF0aWMgY29u c3QgVk1TdGF0ZURlc2NyaXB0aW9uIHZtc3RhdGVfZnBvcF9pcF9kcCA9IHs8YnI+DQrCoCDCoCDC oC52ZXJzaW9uX2lkID0gMSw8YnI+DQrCoCDCoCDCoC5taW5pbXVtX3ZlcnNpb25faWQgPSAxLDxi cj4NCjwvZGl2PjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAuZmllbGRzID0gKFZNU3RhdGVGaWVsZFtd KSB7PGJyPg0KLSDCoCDCoCDCoCDCoFZNU1RBVEVfVUlOVDE2KGVudi5mcG9wLCBYODZDUFUpLDxi cj4NCjwvZGl2PisgwqAgwqAgwqAgwqBWTVNUQVRFX1VJTlQzMihlbnYuZnBvcCwgWDg2Q1BVKSw8 YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgVk1TVEFURV9VSU5UNjQoZW52LmZwaXAs IFg4NkNQVSksPGJyPg0KwqAgwqAgwqAgwqAgwqBWTVNUQVRFX1VJTlQ2NChlbnYuZnBkcCwgWDg2 Q1BVKSw8YnI+DQrCoCDCoCDCoCDCoCDCoFZNU1RBVEVfRU5EX09GX0xJU1QoKTxicj4NCmRpZmYg LS1naXQgYS90YXJnZXQtaTM4Ni90cmFuc2xhdGUuYyBiL3RhcmdldC1pMzg2L3RyYW5zbGF0ZS5j PGJyPg0KPC9kaXY+aW5kZXggNmZjZDgyNC4uOGU0OTBkZSAxMDA2NDQ8YnI+DQotLS0gYS90YXJn ZXQtaTM4Ni90cmFuc2xhdGUuYzxicj4NCisrKyBiL3RhcmdldC1pMzg2L3RyYW5zbGF0ZS5jPGJy Pg0KQEAgLTU4LDYgKzU4LDkgQEA8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgI2VuZGlmPGJyPg0KPGJy Pg0KwqAvLyNkZWZpbmUgTUFDUk9fVEVTVCDCoCAxPGJyPg0KKyNkZWZpbmUgSVNfUFJPVEVDVEVE X01PREUocykgKHMtJmd0O3BlICZhbXA7JmFtcDsgIXMtJmd0O3ZtODYpPGJyPg0KPC9kaXY+KyNk ZWZpbmUgRlBfRVBfVkFMSUQgMHg4MDAwMDAwMDxicj4NCisjZGVmaW5lIEZQX0VQX0lOVkFMSUQg MDxicj4NCjxkaXYgY2xhc3M9IiI+PGJyPg0KwqAvKiBnbG9iYWwgcmVnaXN0ZXIgaW5kZXhlcyAq Lzxicj4NCsKgc3RhdGljIFRDR3ZfcHRyIGNwdV9lbnY7PGJyPg0KPC9kaXY+QEAgLTY1LDYgKzY4 LDExIEBAIHN0YXRpYyBUQ0d2IGNwdV9BMDs8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgc3RhdGljIFRD R3YgY3B1X2NjX2RzdCwgY3B1X2NjX3NyYywgY3B1X2NjX3NyYzIsIGNwdV9jY19zcmNUOzxicj4N CsKgc3RhdGljIFRDR3ZfaTMyIGNwdV9jY19vcDs8YnI+DQrCoHN0YXRpYyBUQ0d2IGNwdV9yZWdz W0NQVV9OQl9SRUdTXTs8YnI+DQorc3RhdGljIFRDR3ZfaTMyIGNwdV9mcG9wOzxicj4NCitzdGF0 aWMgVENHdiBjcHVfZnBpcDs8YnI+DQorc3RhdGljIFRDR3YgY3B1X2ZwZHA7PGJyPg0KK3N0YXRp YyBUQ0d2X2kzMiBjcHVfZnBkczs8YnI+DQorc3RhdGljIFRDR3ZfaTMyIGNwdV9mcGNzOzxicj4N CsKgLyogbG9jYWwgdGVtcHMgKi88YnI+DQrCoHN0YXRpYyBUQ0d2IGNwdV9UWzJdOzxicj4NCsKg LyogbG9jYWwgcmVnaXN0ZXIgaW5kZXhlcyAob25seSB1c2VkIGluc2lkZSBvbGQgbWljcm8gb3Bz KSAqLzxicj4NCjwvZGl2PkBAIC03NCw2ICs4Miw5IEBAIHN0YXRpYyBUQ0d2X2kzMiBjcHVfdG1w Ml9pMzIsIGNwdV90bXAzX2kzMjs8YnI+DQrCoHN0YXRpYyBUQ0d2X2k2NCBjcHVfdG1wMV9pNjQ7 PGJyPg0KPGJyPg0KwqBzdGF0aWMgdWludDhfdCBnZW5fb3BjX2NjX29wW09QQ19CVUZfU0laRV07 PGJyPg0KK3N0YXRpYyB1aW50MTZfdCBnZW5fb3BjX2ZwX29wW09QQ19CVUZfU0laRV07PGJyPg0K K3N0YXRpYyB1aW50MTZfdCBnZW5fb3BjX2ZwX2NzW09QQ19CVUZfU0laRV07PGJyPg0KK3N0YXRp YyB0YXJnZXRfdWxvbmcgZ2VuX29wY19mcF9pcFtPUENfQlVGX1NJWkVdOzxicj4NCjxicj4NCsKg I2luY2x1ZGUgJnF1b3Q7ZXhlYy9nZW4taWNvdW50LmgmcXVvdDs8YnI+DQo8YnI+DQpAQCAtMTA0 LDYgKzExNSwxMCBAQCB0eXBlZGVmIHN0cnVjdCBEaXNhc0NvbnRleHQgezxicj4NCsKgIMKgIMKg aW50IHNzMzI7IMKgIC8qIDMyIGJpdCBzdGFjayBzZWdtZW50ICovPGJyPg0KwqAgwqAgwqBDQ09w IGNjX29wOyDCoC8qIGN1cnJlbnQgQ0Mgb3BlcmF0aW9uICovPGJyPg0KwqAgwqAgwqBib29sIGNj X29wX2RpcnR5Ozxicj4NCisgwqAgwqB1aW50MTZfdCBmcF9vcDs8YnI+DQorIMKgIMKgYm9vbCBm cF9lcF9kaXJ0eTs8YnI+DQorIMKgIMKgdGFyZ2V0X3Vsb25nIGZwX2lwOzxicj4NCisgwqAgwqB1 aW50MTZfdCBmcF9jczs8YnI+DQrCoCDCoCDCoGludCBhZGRzZWc7IC8qIG5vbiB6ZXJvIGlmIGVp dGhlciBEUy9FUy9TUyBoYXZlIGEgbm9uIHplcm8gYmFzZSAqLzxicj4NCsKgIMKgIMKgaW50IGZf c3Q7IMKgIC8qIGN1cnJlbnRseSB1bnVzZWQgKi88YnI+DQrCoCDCoCDCoGludCB2bTg2OyDCoCAv KiB2bTg2IG1vZGUgKi88YnI+DQpAQCAtMjA4LDYgKzIyMyw2MiBAQCBzdGF0aWMgY29uc3QgdWlu dDhfdCBjY19vcF9saXZlW0NDX09QX05CXSA9IHs8YnI+DQrCoCDCoCDCoFtDQ19PUF9DTFJdID0g MCw8YnI+DQrCoH07PGJyPg0KPGJyPg0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnN0cl9pc194ODdf bmMoaW50IG1vZHJtLCBpbnQgYik8YnI+DQo8ZGl2PjxkaXYgY2xhc3M9Img1Ij4rezxicj4NCisg wqAgwqBpbnQgb3AsIG1vZCwgcm07PGJyPg0KKyDCoCDCoHN3aXRjaCAoYikgezxicj4NCisgwqAg wqBjYXNlIDB4ZDggLi4uIDB4ZGY6PGJyPg0KKyDCoCDCoCDCoCDCoC8qIGZsb2F0cyAqLzxicj4N CisgwqAgwqAgwqAgwqBvcCA9ICgoYiAmYW1wOyA3KSAmbHQ7Jmx0OyAzKSB8ICgobW9kcm0gJmd0 OyZndDsgMykgJmFtcDsgNyk7PGJyPg0KKyDCoCDCoCDCoCDCoG1vZCA9IChtb2RybSAmZ3Q7Jmd0 OyA2KSAmYW1wOyAzOzxicj4NCisgwqAgwqAgwqAgwqBybSA9IG1vZHJtICZhbXA7IDc7PGJyPg0K KyDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAvKiBt ZW1vcnkgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgc3dpdGNoIChvcCkgezxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqBjYXNlIDB4MGM6IC8qIGZsZGVudiAqLzxicj4NCisgwqAgwqAgwqAgwqAg wqAgwqBjYXNlIDB4MGQ6IC8qIGZsZGN3ICovPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGNhc2Ug MHgwZTogLyogZnN0ZW52LCBmbnN0ZW52ICovPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGNhc2Ug MHgwZjogLyogZnN0Y3csIGZuc3RjdyAqLzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDB4 MmM6IC8qIGZyc3RvciAqLzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDB4MmU6IC8qIGZz YXZlLCBmbnNhdmUgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAweDJmOiAvKiBmc3Rz dywgZm5zdHN3ICovPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiBmYWxzZTs8 YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZGVmYXVsdDo8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgcmV0dXJuIHRydWU7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQorIMKgIMKg IMKgIMKgfSBlbHNlIHs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgLyogcmVnaXN0ZXIgKi88YnI+ DQorIMKgIMKgIMKgIMKgIMKgIMKgc3dpdGNoIChvcCkgezxicj4NCisgwqAgwqAgwqAgwqAgwqAg wqBjYXNlIDB4MGE6PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiBmYWxzZTsg LyogZm5vcCwgSWxsZWdhbCBvcCAqLzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDB4MGU6 IC8qIGZkZWNzdHAsIGZpbmNzdHAgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAweDI4 OiAvKiBmZnJlZSAqLzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gZmFsc2U7 PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgxYzo8YnI+DQorIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgc3dpdGNoIChybSkgezxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNl IDE6IC8qIGZlbmkgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJu IHRydWU7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMjogLyogZmNsZXgsIGZu Y2xleCAqLzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDM6IC8qIGZpbml0LCBm bmluaXQgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIGZhbHNl Ozxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDQ6IC8qIGZzZXRwbSAqLzxicj4N CisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gdHJ1ZTs8YnI+DQorIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZGVmYXVsdDogLyogSWxsZWdhbCBvcCAqLzxicj4NCisgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gZmFsc2U7PGJyPg0KKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH08YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAweDNjOjxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gZmFsc2U7IC8qIGZzdHN3LCBmbnN0c3csIElsbGVn YWwgb3AgKi88YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZGVmYXVsdDo8YnI+DQorIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgcmV0dXJuIHRydWU7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoH08YnI+ DQorIMKgIMKgIMKgIMKgfTxicj4NCisgwqAgwqAvKmNhc2UgMHg5YjogLy8gZndhaXQsIHdhaXQ8 YnI+DQorIMKgIMKgIMKgIMKgcmV0dXJuIGZhbHNlOyovPGJyPg0KKyDCoCDCoGRlZmF1bHQ6PGJy Pg0KKyDCoCDCoCDCoCDCoHJldHVybiBmYWxzZTs8YnI+DQorIMKgIMKgfTxicj4NCit9PGJyPg0K Kzxicj4NCsKgc3RhdGljIHZvaWQgc2V0X2NjX29wKERpc2FzQ29udGV4dCAqcywgQ0NPcCBvcCk8 YnI+DQrCoHs8YnI+DQrCoCDCoCDCoGludCBkZWFkOzxicj4NCjwvZGl2PjwvZGl2PkBAIC0yNTMs NiArMzI0LDIzIEBAIHN0YXRpYyB2b2lkIGdlbl91cGRhdGVfY2Nfb3AoRGlzYXNDb250ZXh0ICpz KTxicj4NCsKgIMKgIMKgfTxicj4NCsKgfTxicj4NCjxicj4NCitzdGF0aWMgdm9pZCBzZXRfZXAo RGlzYXNDb250ZXh0ICpzLCBpbnQgZnBfb3AsIGludCBmcF9pcCwgaW50IGZwX2NzKSB7PGJyPg0K KyDCoCDCoHMtJmd0O2ZwX29wID0gRlBfRVBfVkFMSUQgfCBmcF9vcDs8YnI+DQorIMKgIMKgcy0m Z3Q7ZnBfaXAgPSBmcF9pcDs8YnI+DQorIMKgIMKgcy0mZ3Q7ZnBfY3MgPSBmcF9jczs8YnI+DQor IMKgIMKgcy0mZ3Q7ZnBfZXBfZGlydHkgPSB0cnVlOzxicj4NCit9PGJyPg0KKzxicj4NCitzdGF0 aWMgdm9pZCBnZW5fdXBkYXRlX2VwKERpc2FzQ29udGV4dCAqcyk8YnI+DQorezxicj4NCisgwqAg wqBpZiAocy0mZ3Q7ZnBfZXBfZGlydHkpIHs8YnI+DQorIMKgIMKgIMKgIMKgdGNnX2dlbl9tb3Zp X2kzMihjcHVfZnBvcCwgcy0mZ3Q7ZnBfb3ApOzxicj4NCisgwqAgwqAgwqAgwqB0Y2dfZ2VuX21v dmlfdGwoY3B1X2ZwaXAsIHMtJmd0O2ZwX2lwKTs8YnI+DQorIMKgIMKgIMKgIMKgdGNnX2dlbl9t b3ZpX2kzMihjcHVfZnBjcywgcy0mZ3Q7ZnBfY3MpOzxicj4NCisgwqAgwqAgwqAgwqBzLSZndDtm cF9lcF9kaXJ0eSA9IGZhbHNlOzxicj4NCisgwqAgwqB9PGJyPg0KK308YnI+DQorPGJyPg0KwqAj aWZkZWYgVEFSR0VUX1g4Nl82NDxicj4NCjxicj4NCsKgI2RlZmluZSBOQl9PUF9TSVpFUyA0PGJy Pg0KQEAgLTY2Niw2ICs3NTQsNyBAQCBzdGF0aWMgdm9pZCBnZW5fY2hlY2tfaW8oRGlzYXNDb250 ZXh0ICpzLCBUQ0dNZW1PcDxicj4NCm90LCB0YXJnZXRfdWxvbmcgY3VyX2VpcCw8YnI+DQrCoCDC oCDCoHN0YXRlX3NhdmVkID0gMDs8YnI+DQrCoCDCoCDCoGlmIChzLSZndDtwZSAmYW1wOyZhbXA7 IChzLSZndDtjcGwgJmd0OyBzLSZndDtpb3BsIHx8IHMtJmd0O3ZtODYpKSB7PGJyPg0KwqAgwqAg wqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzxicj4NCisgwqAgwqAgwqAgwqBnZW5fdXBkYXRl X2VwKHMpOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShjdXJfZWlwKTs8YnI+DQrCoCDC oCDCoCDCoCDCoHN0YXRlX3NhdmVkID0gMTs8YnI+DQrCoCDCoCDCoCDCoCDCoHRjZ19nZW5fdHJ1 bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOzxicj4NCkBAIC02ODYsNiArNzc1LDcg QEAgc3RhdGljIHZvaWQgZ2VuX2NoZWNrX2lvKERpc2FzQ29udGV4dCAqcywgVENHTWVtT3A8YnI+ DQpvdCwgdGFyZ2V0X3Vsb25nIGN1cl9laXAsPGJyPg0KwqAgwqAgwqBpZihzLSZndDtmbGFncyAm YW1wOyBIRl9TVk1JX01BU0spIHs8YnI+DQrCoCDCoCDCoCDCoCDCoGlmICghc3RhdGVfc2F2ZWQp IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PGJyPg0KKyDC oCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fam1wX2ltKGN1cl9laXApOzxicj4NCsKgIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKgIMKg IMKgIMKgc3ZtX2ZsYWdzIHw9ICgxICZsdDsmbHQ7ICg0ICsgb3QpKTs8YnI+DQpAQCAtMTA5Nyw2 ICsxMTg3LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGdlbl9qY2MxKERpc2FzQ29udGV4dCAqcywg aW50PGJyPg0KYiwgaW50IGwxKTxicj4NCsKgIMKgIMKgQ0NQcmVwYXJlIGNjID0gZ2VuX3ByZXBh cmVfY2MocywgYiwgY3B1X1RbMF0pOzxicj4NCjxicj4NCsKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19v cChzKTs8YnI+DQorIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8YnI+DQrCoCDCoCDCoGlmIChjYy5t YXNrICE9IC0xKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2FuZGlfdGwoY3B1X1RbMF0s IGNjLnJlZywgY2MubWFzayk7PGJyPg0KwqAgwqAgwqAgwqAgwqBjYy5yZWcgPSBjcHVfVFswXTs8 YnI+DQpAQCAtMTU4MCwxNCArMTY3MSwxNCBAQCBzdGF0aWMgdm9pZCBnZW5fcm90X3JtX1QxKERp c2FzQ29udGV4dCAqcyw8YnI+DQo8ZGl2IGNsYXNzPSIiPlRDR01lbU9wIG90LCBpbnQgb3AxLCBp bnQgaXNfcmlnaHQpPGJyPg0KwqAgwqAgwqB0MCA9IHRjZ19jb25zdF9pMzIoMCk7PGJyPg0KwqAg wqAgwqB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTs8YnI+DQrCoCDCoCDCoHRjZ19nZW5fdHJ1bmNf dGxfaTMyKHQxLCBjcHVfVFsxXSk7PGJyPg0KLSDCoCDCoHRjZ19nZW5fbW92aV9pMzIoY3B1X3Rt cDJfaTMyLCBDQ19PUF9BRENPWCk7PGJyPg0KKyDCoCDCoHRjZ19nZW5fbW92aV9pMzIoY3B1X3Rt cDJfaTMyLCBDQ19PUF9BRENPWCk7PGJyPg0KwqAgwqAgwqB0Y2dfZ2VuX21vdmlfaTMyKGNwdV90 bXAzX2kzMiwgQ0NfT1BfRUZMQUdTKTs8YnI+DQrCoCDCoCDCoHRjZ19nZW5fbW92Y29uZF9pMzIo VENHX0NPTkRfTkUsIGNwdV9jY19vcCwgdDEsIHQwLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgY3B1X3RtcDJfaTMyLCBjcHVfdG1wM19pMzIpOzxicj4NCsKgIMKg IMKgdGNnX3RlbXBfZnJlZV9pMzIodDApOzxicj4NCsKgIMKgIMKgdGNnX3RlbXBfZnJlZV9pMzIo dDEpOzxicj4NCjxicj4NCi0gwqAgwqAvKiBUaGUgQ0NfT1AgdmFsdWUgaXMgbm8gbG9uZ2VyIHBy ZWRpY3RhYmxlLiDCoCovPGJyPg0KKyDCoCDCoC8qIFRoZSBDQ19PUCB2YWx1ZSBpcyBubyBsb25n ZXIgcHJlZGljdGFibGUuIMKgKi88YnI+DQrCoCDCoCDCoHNldF9jY19vcChzLCBDQ19PUF9EWU5B TUlDKTs8YnI+DQrCoH08YnI+DQo8YnI+DQo8L2Rpdj5AQCAtMTg2Myw3ICsxOTU0LDcgQEAgc3Rh dGljIHZvaWQgZ2VuX3NoaWZ0aShEaXNhc0NvbnRleHQgKnMxLCBpbnQgb3AsPGJyPg0KPGRpdiBj bGFzcz0iIj5UQ0dNZW1PcCBvdCwgaW50IGQsIGludCBjKTxicj4NCsKgIMKgIMKgfTxicj4NCsKg fTxicj4NCjxicj4NCi1zdGF0aWMgdm9pZCBnZW5fbGVhX21vZHJtKENQVVg4NlN0YXRlICplbnYs IERpc2FzQ29udGV4dCAqcywgaW50IG1vZHJtKTxicj4NCitzdGF0aWMgdm9pZCBnZW5fbGVhX21v ZHJtKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgaW50IG1vZHJtLCBpbnQgYik8 YnI+DQrCoHs8YnI+DQrCoCDCoCDCoHRhcmdldF9sb25nIGRpc3A7PGJyPg0KwqAgwqAgwqBpbnQg aGF2ZXNpYjs8YnI+DQo8L2Rpdj5AQCAtMTg3MSw2ICsxOTYyLDcgQEAgc3RhdGljIHZvaWQgZ2Vu X2xlYV9tb2RybShDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250 ZXh0ICpzLCBpbnQgbW9kcm0pPGJyPg0KwqAgwqAgwqBpbnQgaW5kZXg7PGJyPg0KwqAgwqAgwqBp bnQgc2NhbGU7PGJyPg0KwqAgwqAgwqBpbnQgbW9kLCBybSwgY29kZSwgb3ZlcnJpZGUsIG11c3Rf YWRkX3NlZzs8YnI+DQo8L2Rpdj4rIMKgIMKgaW50IGN1cnJfaW5zdHJfaXNfeDg3X25jOzxicj4N CjxkaXYgY2xhc3M9IiI+wqAgwqAgwqBUQ0d2IHN1bTs8YnI+DQo8YnI+DQrCoCDCoCDCoG92ZXJy aWRlID0gcy0mZ3Q7b3ZlcnJpZGU7PGJyPg0KPC9kaXY+QEAgLTE5NTAsNiArMjA0MiwxMyBAQCBz dGF0aWMgdm9pZCBnZW5fbGVhX21vZHJtKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFz cz0iIj5EaXNhc0NvbnRleHQgKnMsIGludCBtb2RybSk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oHRjZ19nZW5fYWRkaV90bChjcHVfQTAsIHN1bSwgZGlzcCk7PGJyPg0KwqAgwqAgwqAgwqAgwqB9 PGJyPg0KPGJyPg0KPC9kaXY+KyDCoCDCoCDCoCDCoGN1cnJfaW5zdHJfaXNfeDg3X25jID0gaW5z dHJfaXNfeDg3X25jKG1vZHJtLCBiKTs8YnI+DQorIMKgIMKgIMKgIMKgaWYgKGN1cnJfaW5zdHJf aXNfeDg3X25jKSB7PGJyPg0KPGRpdiBjbGFzcz0iIj4rIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dl bl9tb3ZfdGwoY3B1X2ZwZHAsIGNwdV9BMCk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGlmIChz LSZndDthZmxhZyA9PSBNT18zMikgezxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2df Z2VuX2V4dDMydV90bChjcHVfZnBkcCwgY3B1X2ZwZHApOzxicj4NCisgwqAgwqAgwqAgwqAgwqAg wqB9PGJyPg0KKyDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDCoGlmIChtdXN0X2FkZF9z ZWcpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChvdmVycmlkZSAmbHQ7IDApIHs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChiYXNlID09IFJfRUJQIHx8IGJhc2UgPT0g Ul9FU1ApIHs8YnI+DQo8L2Rpdj5AQCAtMTk2MSw2ICsyMDYwLDEyIEBAIHN0YXRpYyB2b2lkIGdl bl9sZWFfbW9kcm0oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29u dGV4dCAqcywgaW50IG1vZHJtKTxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dl bl9sZF90bChjcHVfdG1wMCwgY3B1X2Vudiw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoG9mZnNldG9mKENQVVg4NlN0YXRlLCBzZWdzW292ZXJyaWRlXS5iYXNl KSk7PGJyPg0KKzxicj4NCjwvZGl2PisgwqAgwqAgwqAgwqAgwqAgwqBpZiAoY3Vycl9pbnN0cl9p c194ODdfbmMpIHs8YnI+DQo8ZGl2IGNsYXNzPSIiPisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0 Y2dfZ2VuX2xkX2kzMihjcHVfZnBkcywgY3B1X2Vudiw8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHNlZ3Nbb3Zl cnJpZGVdLnNlbGVjdG9yKSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQorPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoQ09ERTY0KHMpKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAocy0mZ3Q7YWZsYWcgPT0gTU9fMzIpIHs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fZXh0MzJ1X3RsKGNwdV9BMCwgY3B1X0EwKTs8YnI+ DQo8L2Rpdj5AQCAtMTk3MCw2ICsyMDc1LDExIEBAIHN0YXRpYyB2b2lkIGdlbl9sZWFfbW9kcm0o Q1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcywgaW50 IG1vZHJtKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCjxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgdGNnX2dlbl9hZGRfdGwoY3B1X0EwLCBjcHVfQTAsIGNwdV90bXAwKTs8YnI+DQor IMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQo8L2Rpdj4rIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGN1 cnJfaW5zdHJfaXNfeDg3X25jKSB7PGJyPg0KPGRpdiBjbGFzcz0iIj4rIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgdGNnX2dlbl9sZF9pMzIoY3B1X2ZwZHMsIGNwdV9lbnYsPGJyPg0KKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9mZnNldG9mKENQVVg4NlN0YXRl LCBzZWdzW1JfRFNdLnNlbGVjdG9yKSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQrC oCDCoCDCoCDCoCDCoH08YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoGlmIChzLSZndDthZmxhZyA9 PSBNT18zMikgezxicj4NCjwvZGl2PkBAIC0yMDM5LDggKzIxNDksMjIgQEAgc3RhdGljIHZvaWQg Z2VuX2xlYV9tb2RybShDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXND b250ZXh0ICpzLCBpbnQgbW9kcm0pPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBvdmVycmlkZSA9IFJfRFM7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KPC9kaXY+KyDCoCDCoCDCoCDCoCDCoCDCoGlmIChp bnN0cl9pc194ODdfbmMobW9kcm0sIGIpKSB7PGJyPg0KPGRpdiBjbGFzcz0iIj4rIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZfdGwoY3B1X2ZwZHAsIGNwdV9BMCk7PGJyPg0KKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbGRfaTMyKGNwdV9mcGRzLCBjcHVfZW52LDxi cj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvZmZzZXRv ZihDUFVYODZTdGF0ZSwgc2Vnc1tvdmVycmlkZV0uc2VsZWN0b3IpKTs8YnI+DQorIMKgIMKgIMKg IMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX2FkZGxfQTBfc2VnKHMs IG92ZXJyaWRlKTs8YnI+DQorIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQo8L2Rpdj4rIMKgIMKg IMKgIMKgIMKgIMKgaWYgKGluc3RyX2lzX3g4N19uYyhtb2RybSwgYikpIHs8YnI+DQo8ZGl2IGNs YXNzPSIiPisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX21vdl90bChjcHVfZnBkcCwg Y3B1X0EwKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZF9pMzIoY3B1 X2ZwZHMsIGNwdV9lbnYsPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoG9mZnNldG9mKENQVVg4NlN0YXRlLCBzZWdzW1JfRFNdLnNlbGVjdG9yKSk7PGJy Pg0KKyDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDCoH08YnI+DQorI2lmZGVm IFRBUkdFVF9YODZfNjQ8YnI+DQorIMKgIMKgIMKgIMKgdGNnX2dlbl9hbmRpX3RsKGNwdV9mcGRw LCBjcHVfZnBkcCwgMHhmZmZmZmZmZik7PGJyPg0KKyNlbmRpZjxicj4NCsKgIMKgIMKgIMKgIMKg YnJlYWs7PGJyPg0KPGJyPg0KwqAgwqAgwqBkZWZhdWx0Ojxicj4NCjwvZGl2PkBAIC0yMTMwLDcg KzIyNTQsNyBAQCBzdGF0aWMgdm9pZCBnZW5fYWRkX0EwX2RzX3NlZyhEaXNhc0NvbnRleHQgKnMp PGJyPg0KPGRpdiBjbGFzcz0iIj7CoC8qIGdlbmVyYXRlIG1vZHJtIG1lbW9yeSBsb2FkIG9yIHN0 b3JlIG9mICYjMzk7cmVnJiMzOTsuIFRNUDAgaXMgdXNlZCBpZiByZWcgPT08YnI+DQrCoCDCoCBP Ul9UTVAwICovPGJyPg0KwqBzdGF0aWMgdm9pZCBnZW5fbGRzdF9tb2RybShDUFVYODZTdGF0ZSAq ZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBtb2RybSw8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIFRDR01lbU9wIG90LCBpbnQgcmVnLCBpbnQgaXNfc3RvcmUp PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBUQ0dNZW1PcCBv dCwgaW50IHJlZywgaW50IGlzX3N0b3JlLCBpbnQgYik8YnI+DQrCoHs8YnI+DQrCoCDCoCDCoGlu dCBtb2QsIHJtOzxicj4NCjxicj4NCjwvZGl2PkBAIC0yMTQ3LDcgKzIyNzEsNyBAQCBzdGF0aWMg dm9pZCBnZW5fbGRzdF9tb2RybShDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+ RGlzYXNDb250ZXh0ICpzLCBpbnQgbW9kcm0sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fb3BfbW92X3JlZ192KG90LCByZWcsIGNwdV9UWzBdKTs8YnI+DQrCoCDCoCDCoCDCoCDC oH08YnI+DQrCoCDCoCDCoH0gZWxzZSB7PGJyPg0KLSDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0o ZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBt b2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqBpZiAoaXNfc3RvcmUpIHs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoGlmIChyZWcgIT0gT1JfVE1QMCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9vcF9tb3Zfdl9yZWcob3QsIGNwdV9UWzBdLCByZWcpOzxicj4NCjwvZGl2PkBA IC0yMjUwLDcgKzIzNzQsNyBAQCBzdGF0aWMgdm9pZCBnZW5fY21vdmNjMShDUFVYODZTdGF0ZSAq ZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBUQ0dNZW1PcCBvdCwgaW50 IGIsPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqBDQ1ByZXBhcmUgY2M7PGJyPg0KPGJyPg0KLSDCoCDC oGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTs8YnI+DQorIMKg IMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAsIGIpOzxicj4N Cjxicj4NCsKgIMKgIMKgY2MgPSBnZW5fcHJlcGFyZV9jYyhzLCBiLCBjcHVfVFsxXSk7PGJyPg0K wqAgwqAgwqBpZiAoY2MubWFzayAhPSAtMSkgezxicj4NCjwvZGl2PkBAIC0yMjk3LDYgKzI0MjEs NyBAQCBzdGF0aWMgdm9pZCBnZW5fbW92bF9zZWdfVDAoRGlzYXNDb250ZXh0ICpzLCBpbnQ8YnI+ DQpzZWdfcmVnLCB0YXJnZXRfdWxvbmcgY3VyX2VpcCk8YnI+DQrCoCDCoCDCoGlmIChzLSZndDtw ZSAmYW1wOyZhbXA7ICFzLSZndDt2bTg2KSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAvKiBYWFg6IG9w dGltaXplIGJ5IGZpbmRpbmcgcHJvY2Vzc29yIHN0YXRlIGR5bmFtaWNhbGx5ICovPGJyPg0KwqAg wqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzxicj4NCisgwqAgwqAgwqAgwqBnZW5fdXBk YXRlX2VwKHMpOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShjdXJfZWlwKTs8YnI+DQrC oCDCoCDCoCDCoCDCoHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0p Ozxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9sb2FkX3NlZyhjcHVfZW52LCB0Y2dfY29u c3RfaTMyKHNlZ19yZWcpLCBjcHVfdG1wMl9pMzIpOzxicj4NCkBAIC0yMzI2LDYgKzI0NTEsNyBA QCBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShEaXNhc0NvbnRleHQgKnMsPGJyPg0KdGFy Z2V0X3Vsb25nIHBjX3N0YXJ0LDxicj4NCsKgIMKgIMKgaWYgKGxpa2VseSghKHMtJmd0O2ZsYWdz ICZhbXA7IEhGX1NWTUlfTUFTSykpKTxicj4NCsKgIMKgIMKgIMKgIMKgcmV0dXJuOzxicj4NCsKg IMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+DQorIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8 YnI+DQrCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8YnI+DQrC oCDCoCDCoGdlbl9oZWxwZXJfc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShjcHVfZW52LCB0Y2df Y29uc3RfaTMyKHR5cGUpLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRjZ19jb25zdF9pNjQocGFyYW0pKTs8YnI+DQpA QCAtMjUxMyw2ICsyNjM5LDcgQEAgc3RhdGljIHZvaWQgZ2VuX2VudGVyKERpc2FzQ29udGV4dCAq cywgaW50PGJyPg0KZXNwX2FkZGVuZCwgaW50IGxldmVsKTxicj4NCsKgc3RhdGljIHZvaWQgZ2Vu X2V4Y2VwdGlvbihEaXNhc0NvbnRleHQgKnMsIGludCB0cmFwbm8sIHRhcmdldF91bG9uZyBjdXJf ZWlwKTxicj4NCsKgezxicj4NCsKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+DQorIMKg IMKgZ2VuX3VwZGF0ZV9lcChzKTs8YnI+DQrCoCDCoCDCoGdlbl9qbXBfaW0oY3VyX2VpcCk7PGJy Pg0KwqAgwqAgwqBnZW5faGVscGVyX3JhaXNlX2V4Y2VwdGlvbihjcHVfZW52LCB0Y2dfY29uc3Rf aTMyKHRyYXBubykpOzxicj4NCsKgIMKgIMKgcy0mZ3Q7aXNfam1wID0gRElTQVNfVEJfSlVNUDs8 YnI+DQpAQCAtMjUyNCw2ICsyNjUxLDcgQEAgc3RhdGljIHZvaWQgZ2VuX2ludGVycnVwdChEaXNh c0NvbnRleHQgKnMsIGludCBpbnRubyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHRhcmdldF91bG9uZyBjdXJfZWlwLCB0YXJnZXRfdWxvbmcgbmV4dF9laXAp PGJyPg0KwqB7PGJyPg0KwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzxicj4NCisgwqAgwqBn ZW5fdXBkYXRlX2VwKHMpOzxicj4NCsKgIMKgIMKgZ2VuX2ptcF9pbShjdXJfZWlwKTs8YnI+DQrC oCDCoCDCoGdlbl9oZWxwZXJfcmFpc2VfaW50ZXJydXB0KGNwdV9lbnYsIHRjZ19jb25zdF9pMzIo aW50bm8pLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHRjZ19jb25zdF9pMzIobmV4dF9laXAgLSBjdXJfZWlwKSk7PGJyPg0KQEAgLTI1MzMsNiAr MjY2MSw3IEBAIHN0YXRpYyB2b2lkIGdlbl9pbnRlcnJ1cHQoRGlzYXNDb250ZXh0ICpzLCBpbnQg aW50bm8sPGJyPg0KwqBzdGF0aWMgdm9pZCBnZW5fZGVidWcoRGlzYXNDb250ZXh0ICpzLCB0YXJn ZXRfdWxvbmcgY3VyX2VpcCk8YnI+DQrCoHs8YnI+DQrCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Ao cyk7PGJyPg0KKyDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJyPg0KwqAgwqAgwqBnZW5fam1wX2lt KGN1cl9laXApOzxicj4NCsKgIMKgIMKgZ2VuX2hlbHBlcl9kZWJ1ZyhjcHVfZW52KTs8YnI+DQrC oCDCoCDCoHMtJmd0O2lzX2ptcCA9IERJU0FTX1RCX0pVTVA7PGJyPg0KQEAgLTI1NDMsNiArMjY3 Miw3IEBAIHN0YXRpYyB2b2lkIGdlbl9kZWJ1ZyhEaXNhc0NvbnRleHQgKnMsPGJyPg0KdGFyZ2V0 X3Vsb25nIGN1cl9laXApPGJyPg0KwqBzdGF0aWMgdm9pZCBnZW5fZW9iKERpc2FzQ29udGV4dCAq cyk8YnI+DQrCoHs8YnI+DQrCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PGJyPg0KKyDCoCDC oGdlbl91cGRhdGVfZXAocyk7PGJyPg0KwqAgwqAgwqBpZiAocy0mZ3Q7dGItJmd0O2ZsYWdzICZh bXA7IEhGX0lOSElCSVRfSVJRX01BU0spIHs8YnI+DQrCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJf cmVzZXRfaW5oaWJpdF9pcnEoY3B1X2Vudik7PGJyPg0KwqAgwqAgwqB9PGJyPg0KQEAgLTI1NjQs NiArMjY5NCw3IEBAIHN0YXRpYyB2b2lkIGdlbl9lb2IoRGlzYXNDb250ZXh0ICpzKTxicj4NCsKg c3RhdGljIHZvaWQgZ2VuX2ptcF90YihEaXNhc0NvbnRleHQgKnMsIHRhcmdldF91bG9uZyBlaXAs IGludCB0Yl9udW0pPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzxi cj4NCisgwqAgwqBnZW5fdXBkYXRlX2VwKHMpOzxicj4NCsKgIMKgIMKgc2V0X2NjX29wKHMsIEND X09QX0RZTkFNSUMpOzxicj4NCsKgIMKgIMKgaWYgKHMtJmd0O2ptcF9vcHQpIHs8YnI+DQrCoCDC oCDCoCDCoCDCoGdlbl9nb3RvX3RiKHMsIHRiX251bSwgZWlwKTs8YnI+DQpAQCAtMzA0Myw3ICsz MTc0LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYg Y2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8YnI+DQrCoCDCoCDCoCDCoCDCoGNhc2Ug MHgwZTc6IC8qIG1vdm50cSAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCA9PSAz KTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzxicj4NCi0g wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX3N0cV9lbnZfQTAocywgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGZw cmVnc1tyZWddLm1teCkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KwqAg wqAgwqAgwqAgwqBjYXNlIDB4MWU3OiAvKiBtb3ZudGRxICovPGJyPg0KPC9kaXY+QEAgLTMwNTEs MjAgKzMxODIsMjAgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LDxicj4N CjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8YnI+DQrCoCDCoCDCoCDCoCDC oGNhc2UgMHgxMmI6IC8qIG1vdm50cHMgKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICht b2QgPT0gMyk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8 YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+ DQorIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9zdG9fZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0 YXRlLCB4bW1fcmVnc1tyZWddKSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+ DQrCoCDCoCDCoCDCoCDCoGNhc2UgMHgzZjA6IC8qIGxkZHF1ICovPGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqBpZiAobW9kID09IDMpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3Rv IGlsbGVnYWxfb3A7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBt b2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRvX2Vudl9BMChzLCBvZmZz ZXRvZihDUFVYODZTdGF0ZSwgeG1tX3JlZ3NbcmVnXSkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgYnJlYWs7PGJyPg0KwqAgwqAgwqAgwqAgwqBjYXNlIDB4MjJiOiAvKiBtb3ZudHNzICovPGJy Pg0KwqAgwqAgwqAgwqAgwqBjYXNlIDB4MzJiOiAvKiBtb3ZudHNkICovPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAobW9kID09IDMpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn b3RvIGlsbGVnYWxfb3A7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52 LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoYjEgJmFtcDsgMSkgezxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3N0cV9lbnZfQTAocywgb2Zmc2V0b2Yo Q1BVWDg2U3RhdGUsIHhtbV9yZWdzW3JlZ10pKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0g ZWxzZSB7PGJyPg0KPC9kaXY+QEAgLTMwNzYsMTMgKzMyMDcsMTMgQEAgc3RhdGljIHZvaWQgZ2Vu X3NzZShDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpz LCBpbnQgYiw8YnI+DQrCoCDCoCDCoCDCoCDCoGNhc2UgMHg2ZTogLyogbW92ZCBtbSwgZWEgKi88 YnI+DQrCoCNpZmRlZiBUQVJHRVRfWDg2XzY0PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAo cy0mZ3Q7ZGZsYWcgPT0gTU9fNjQpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fNjQsIE9SX1RNUDAsIDApOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT182NCwg T1JfVE1QMCwgMCwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3N0 X3RsKGNwdV9UWzBdLCBjcHVfZW52LDxicj4NCm9mZnNldG9mKENQVVg4NlN0YXRlLGZwcmVnc1ty ZWddLm1teCkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlPGJyPg0KwqAjZW5kaWY8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMzIsIE9SX1RNUDAsIDApOzxicj4NCjwv ZGl2Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBj cHVfZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9s ZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE1PXzMyLCBPUl9UTVAwLCAwLCBiKTs8YnI+DQo8L2Rp dj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1 X2Vudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIG9mZnNldG9mKENQVVg4NlN0YXRlLGZwcmVnc1tyZWddLm1teCkp Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1 X3RtcDJfaTMyLCBjcHVfVFswXSk7PGJyPg0KPC9kaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5faGVscGVyX21vdmxfbW1fVDBfbW14KGNwdV9wdHIwLCBjcHVfdG1wMl9pMzIpOzxicj4N CkBAIC0zMDkxLDE1ICszMjIyLDE1IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUg KmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJyPg0KwqAg wqAgwqAgwqAgwqBjYXNlIDB4MTZlOiAvKiBtb3ZkIHhtbSwgZWEgKi88YnI+DQrCoCNpZmRlZiBU QVJHRVRfWDg2XzY0PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocy0mZ3Q7ZGZsYWcgPT0g TU9fNjQpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52 LCBzLCBtb2RybSwgTU9fNjQsIE9SX1RNUDAsIDApOzxicj4NCjwvZGl2Pi0gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVfZW52LDxicj4NCjxkaXYg Y2xhc3M9IiI+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywg bW9kcm0sIE1PXzY0LCBPUl9UTVAwLCAwLCBiKTs8YnI+DQo8L2Rpdj4rIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2Vudiw8YnI+DQo8ZGl2IGNs YXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10pKTs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfbW92cV9tbV9UMF94bW0oY3B1X3B0cjAsIGNwdV9UWzBd KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZTxicj4NCsKgI2VuZGlmPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0 X21vZHJtKGVudiwgcywgbW9kcm0sIE1PXzMyLCBPUl9UTVAwLCAwKTs8YnI+DQo8L2Rpdj4tIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2Vudiw8 YnI+DQo8ZGl2IGNsYXNzPSIiPisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2Ry bShlbnYsIHMsIG1vZHJtLCBNT18zMiwgT1JfVE1QMCwgMCwgYik7PGJyPg0KPC9kaXY+KyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsPGJy Pg0KPGRpdiBjbGFzcz0iIj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddKSk7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIs IGNwdV9UWzBdKTs8YnI+DQo8L2Rpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxw ZXJfbW92bF9tbV9UMF94bW0oY3B1X3B0cjAsIGNwdV90bXAyX2kzMik7PGJyPg0KQEAgLTMxMDcs NyArMzIzOCw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8 ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqBicmVhazs8YnI+DQrCoCDCoCDCoCDCoCDCoGNhc2UgMHg2ZjogLyogbW92cSBtbSwgZWEg Ki88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezxicj4NCi0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkcV9lbnZfQTAocywgb2Zmc2V0b2YoQ1BV WDg2U3RhdGUsIGZwcmVnc1tyZWddLm1teCkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBl bHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJtID0gKG1vZHJtICZhbXA7IDcp Ozxicj4NCjwvZGl2PkBAIC0zMTI0LDcgKzMyNTUsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQ VVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsIGludCBi LDxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAweDE2ZjogLyogbW92ZHFhIHhtbSwgZWEgKi88YnI+ DQrCoCDCoCDCoCDCoCDCoGNhc2UgMHgyNmY6IC8qIG1vdmRxdSB4bW0sIGVhICovPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9sZG9fZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLCB4 bW1fcmVnc1tyZWddKSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcm0gPSAobW9kcm0gJmFtcDsgNykgfCBSRVhfQihzKTs8 YnI+DQo8L2Rpdj5AQCAtMzEzNCw3ICszMjY1LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVY ODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAw eDIxMDogLyogbW92c3MgeG1tLCBlYSAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1v ZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52 LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0o ZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3Bf bGRfdihzLCBNT18zMiwgY3B1X1RbMF0sIGNwdV9BMCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqB0Y2dfZ2VuX3N0MzJfdGwoY3B1X1RbMF0sIGNwdV9lbnYsPGJyPg0Kb2Zmc2V0b2Yo Q1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fTCgwKSkpOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZpX3RsKGNwdV9UWzBdLCAwKTs8YnI+DQo8L2Rpdj5AQCAt MzE0OSw3ICszMjgwLDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LDxi cj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoGJyZWFrOzxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAweDMxMDogLyogbW92c2Qg eG1tLCBlYSAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0K LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJy Pg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwg Yik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRxX2Vudl9BMChzLCBvZmZz ZXRvZihDUFVYODZTdGF0ZSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB4bW1fcmVnc1tyZWddLlhNTV9RKDApKSk7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX21vdmlfdGwoY3B1X1RbMF0s IDApOzxicj4NCjwvZGl2PkBAIC0zMTY0LDcgKzMyOTUsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3Nl KENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsIGlu dCBiLDxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAweDAxMjogLyogbW92bHBzICovPGJyPg0KwqAg wqAgwqAgwqAgwqBjYXNlIDB4MTEyOiAvKiBtb3ZscGQgKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoGlmIChtb2QgIT0gMykgezxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVh X21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX2xkcV9lbnZfQTAocywgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg eG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNl IHs8YnI+DQo8L2Rpdj5AQCAtMzE3Niw3ICszMzA3LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShD UFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQg Yiw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCsKgIMKgIMKgIMKgIMKgY2Fz ZSAweDIxMjogLyogbW92c2xkdXAgKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2Qg IT0gMykgezxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwg cywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVu diwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkb19l bnZfQTAocywgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHhtbV9yZWdzW3JlZ10pKTs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBy bSA9IChtb2RybSAmYW1wOyA3KSB8IFJFWF9CKHMpOzxicj4NCjwvZGl2PkBAIC0zMTkyLDcgKzMz MjMsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBj bGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsIGludCBiLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg YnJlYWs7PGJyPg0KwqAgwqAgwqAgwqAgwqBjYXNlIDB4MzEyOiAvKiBtb3ZkZHVwICovPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHFfZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRl LDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KPC9kaXY+QEAgLTMyMDYsNyArMzMzNyw3IEBAIHN0YXRp YyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQpEaXNhc0NvbnRleHQgKnMsIGlu dCBiLDxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqBjYXNlIDB4MDE2OiAvKiBtb3Zo cHMgKi88YnI+DQrCoCDCoCDCoCDCoCDCoGNhc2UgMHgxMTY6IC8qIG1vdmhwZCAqLzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRxX2Vudl9BMChzLCBvZmZzZXRvZihDUFVYODZTdGF0ZSw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB4bW1fcmVnc1tyZWddLlhNTV9RKDEpKSk7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqB9IGVsc2Ugezxicj4NCjwvZGl2PkBAIC0zMjE4LDcgKzMzNDksNyBAQCBzdGF0aWMg dm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0Nv bnRleHQgKnMsIGludCBiLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KwqAg wqAgwqAgwqAgwqBjYXNlIDB4MjE2OiAvKiBtb3ZzaGR1cCAqLzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9s ZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdl bl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fbGRvX2Vudl9BMChzLCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgeG1tX3JlZ3NbcmVn XSkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHJtID0gKG1vZHJtICZhbXA7IDcpIHwgUkVYX0Iocyk7PGJyPg0KPC9kaXY+ QEAgLTMyNTYsMzQgKzMzODcsMzQgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAq ZW52LDxicj4NCkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqBjYXNl IDB4N2U6IC8qIG1vdmQgZWEsIG1tICovPGJyPg0KPGRpdiBjbGFzcz0iIj7CoCNpZmRlZiBUQVJH RVRfWDg2XzY0PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocy0mZ3Q7ZGZsYWcgPT0gTU9f NjQpIHs8YnI+DQo8L2Rpdj48ZGl2IGNsYXNzPSIiPi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0 Y2dfZ2VuX2xkX2k2NChjcHVfVFswXSwgY3B1X2Vudiw8YnI+DQo8L2Rpdj4rIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgdGNnX2dlbl9sZF9pNjQoY3B1X1RbMF0sIGNwdV9lbnYsPGJyPg0KPGRpdiBj bGFzcz0iIj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBv ZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3NbcmVnXS5tbXgpKTs8YnI+DQotIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fNjQsIE9SX1RNUDAs IDEpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMs IG1vZHJtLCBNT182NCwgT1JfVE1QMCwgMSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9 IGVsc2U8YnI+DQrCoCNlbmRpZjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgezxicj4NCjwvZGl2 PjxkaXYgY2xhc3M9IiI+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbGQzMnVfdGwo Y3B1X1RbMF0sIGNwdV9lbnYsPGJyPg0KPC9kaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRj Z19nZW5fbGQzMnVfdGwoY3B1X1RbMF0sIGNwdV9lbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj48YnI+ DQpvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3NbcmVnXS5tbXguTU1YX0woMCkpKTs8YnI+DQot IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9f MzIsIE9SX1RNUDAsIDEpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9t b2RybShlbnYsIHMsIG1vZHJtLCBNT18zMiwgT1JfVE1QMCwgMSwgYik7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQrCoCDCoCDC oCDCoCDCoGNhc2UgMHgxN2U6IC8qIG1vdmQgZWEsIHhtbSAqLzxicj4NCjwvZGl2PjxkaXYgY2xh c3M9IiI+wqAjaWZkZWYgVEFSR0VUX1g4Nl82NDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYg KHMtJmd0O2RmbGFnID09IE1PXzY0KSB7PGJyPg0KPC9kaXY+PGRpdiBjbGFzcz0iIj4tIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZF9pNjQoY3B1X1RbMF0sIGNwdV9lbnYsPGJyPg0K PC9kaXY+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbGRfaTY0KGNwdV9UWzBdLCBj cHVfZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1f USgwKSkpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYs IHMsIG1vZHJtLCBNT182NCwgT1JfVE1QMCwgMSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE1PXzY0LCBPUl9UTVAwLCAxLCBiKTs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZTxicj4NCsKgI2VuZGlmPGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqB7PGJyPg0KPC9kaXY+PGRpdiBjbGFzcz0iIj4tIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgdGNnX2dlbl9sZDMydV90bChjcHVfVFswXSwgY3B1X2Vudiw8YnI+DQo8L2Rpdj4r IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZDMydV90bChjcHVfVFswXSwgY3B1X2Vu diw8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0wo MCkpKTs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBz LCBtb2RybSwgTU9fMzIsIE9SX1RNUDAsIDEpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT18zMiwgT1JfVE1QMCwgMSwgYik7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8 YnI+DQrCoCDCoCDCoCDCoCDCoGNhc2UgMHgyN2U6IC8qIG1vdnEgeG1tLCBlYSAqLzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRxX2Vudl9BMChzLCBvZmZzZXRvZihDUFVYODZTdGF0ZSw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB4bW1fcmVnc1tyZWddLlhNTV9RKDApKSk7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqB9IGVsc2Ugezxicj4NCjwvZGl2PkBAIC0zMjk1LDcgKzM0MjYsNyBAQCBzdGF0aWMg dm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0Nv bnRleHQgKnMsIGludCBiLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KPC9k aXY+PGRpdiBjbGFzcz0iIj7CoCDCoCDCoCDCoCDCoGNhc2UgMHg3ZjogLyogbW92cSBlYSwgbW0g Ki88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezxicj4NCi0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3N0cV9lbnZfQTAocywgb2Zmc2V0b2YoQ1BV WDg2U3RhdGUsIGZwcmVnc1tyZWddLm1teCkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBl bHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJtID0gKG1vZHJtICZhbXA7IDcp Ozxicj4NCjwvZGl2PkBAIC0zMzEwLDcgKzM0NDEsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQ VVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsIGludCBi LDxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAweDE3ZjogLyogbW92ZHFhIGVhLCB4bW0gKi88YnI+ DQrCoCDCoCDCoCDCoCDCoGNhc2UgMHgyN2Y6IC8qIG1vdmRxdSBlYSwgeG1tICovPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9zdG9fZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLCB4 bW1fcmVnc1tyZWddKSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcm0gPSAobW9kcm0gJmFtcDsgNykgfCBSRVhfQihzKTs8 YnI+DQo8L2Rpdj5AQCAtMzMyMCw3ICszNDUxLDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVY ODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAw eDIxMTogLyogbW92c3MgZWEsIHhtbSAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1v ZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52 LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0o ZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2Vu X2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LDxicj4NCm9mZnNldG9mKENQVVg4NlN0YXRlLHht bV9yZWdzW3JlZ10uWE1NX0woMCkpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdl bl9vcF9zdF92KHMsIE1PXzMyLCBjcHVfVFswXSwgY3B1X0EwKTs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoH0gZWxzZSB7PGJyPg0KPC9kaXY+QEAgLTMzMzEsNyArMzQ2Miw3IEBAIHN0YXRpYyB2 b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29u dGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQrCoCDC oCDCoCDCoCDCoGNhc2UgMHgzMTE6IC8qIG1vdnNkIGVhLCB4bW0gKi88YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX3N0cV9lbnZfQTAocywgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgeG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg fSBlbHNlIHs8YnI+DQo8L2Rpdj5AQCAtMzM0Myw3ICszNDc0LDcgQEAgc3RhdGljIHZvaWQgZ2Vu X3NzZShDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpz LCBpbnQgYiw8YnI+DQrCoCDCoCDCoCDCoCDCoGNhc2UgMHgwMTM6IC8qIG1vdmxwcyAqLzxicj4N CsKgIMKgIMKgIMKgIMKgY2FzZSAweDExMzogLyogbW92bHBkICovPGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9zdHFfZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLDxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0g ZWxzZSB7PGJyPg0KPC9kaXY+QEAgLTMzNTMsNyArMzQ4NCw3IEBAIHN0YXRpYyB2b2lkIGdlbl9z c2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQpEaXNhc0NvbnRleHQgKnMsIGludCBiLDxicj4NCjxk aXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqBjYXNlIDB4MDE3OiAvKiBtb3ZocHMgKi88YnI+DQrC oCDCoCDCoCDCoCDCoGNhc2UgMHgxMTc6IC8qIG1vdmhwZCAqLzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9s ZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdl bl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fc3RxX2Vudl9BMChzLCBvZmZzZXRvZihDUFVYODZTdGF0ZSw8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCB4bW1fcmVnc1tyZWddLlhNTV9RKDEpKSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVs c2Ugezxicj4NCjwvZGl2PkBAIC0zNDE3LDcgKzM1NDgsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3Nl KENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsIGlu dCBiLDxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAweDEyYTogLyogY3Z0cGkycGQgKi88YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfZW50ZXJfbW14KGNwdV9lbnYpOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsbW14X3Qw KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHFfZW52X0EwKHMsIG9wMl9v ZmZzZXQpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQo8L2Rpdj5AQCAt MzQ0MCw3ICszNTcxLDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LDxi cj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8YnI+DQrCoCDCoCDCoCDC oCDCoGNhc2UgMHgyMmE6IC8qIGN2dHNpMnNzICovPGJyPg0KwqAgwqAgwqAgwqAgwqBjYXNlIDB4 MzJhOiAvKiBjdnRzaTJzZCAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb182NF8z MihzLSZndDtkZmxhZyk7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVu diwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAsIGIpOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgb3AxX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdz W3JlZ10pOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRy MCwgY3B1X2Vudiwgb3AxX29mZnNldCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAob3Qg PT0gTU9fMzIpIHs8YnI+DQo8L2Rpdj5AQCAtMzQ2Miw3ICszNTkzLDcgQEAgc3RhdGljIHZvaWQg Z2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LDxicj4NCkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJy Pg0KPGRpdiBjbGFzcz0iIj7CoCDCoCDCoCDCoCDCoGNhc2UgMHgxMmQ6IC8qIGN2dHBkMnBpICov PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2VudGVyX21teChjcHVfZW52KTs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezxicj4NCi0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3AyX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRl LHhtbV90MCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRvX2Vudl9BMChz LCBvcDJfb2Zmc2V0KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KPC9k aXY+QEAgLTM0OTMsNyArMzYyNCw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUg KmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJyPg0KwqAg wqAgwqAgwqAgwqBjYXNlIDB4MzJkOiAvKiBjdnRzZDJzaSAqLzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgb3QgPSBtb182NF8zMihzLSZndDtkZmxhZyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqBpZiAobW9kICE9IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9t b2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xl YV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlmICgoYiAmZ3Q7Jmd0OyA4KSAmYW1wOyAxKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fbGRxX2Vudl9BMChzLCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgeG1tX3Qw LlhNTV9RKDApKSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4N CjwvZGl2PkBAIC0zNTI1LDcgKzM2NTYsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0 YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsIGludCBiLDxicj4N CsKgIMKgIMKgIMKgIMKgY2FzZSAweGM0OiAvKiBwaW5zcncgKi88YnI+DQrCoCDCoCDCoCDCoCDC oGNhc2UgMHgxYzQ6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBzLSZndDtyaXBfb2Zmc2V0ID0g MTs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwg TU9fMTYsIE9SX1RNUDAsIDApOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2Ry bShlbnYsIHMsIG1vZHJtLCBNT18xNiwgT1JfVE1QMCwgMCwgYik7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqB2YWwgPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0mZ3Q7cGMrKyk7PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqBpZiAoYjEpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHZh bCAmYW1wOz0gNzs8YnI+DQo8L2Rpdj5AQCAtMzU1OSw3ICszNjkwLDcgQEAgc3RhdGljIHZvaWQg Z2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0 ICpzLCBpbnQgYiw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCsKgIMKgIMKg IMKgIMKgY2FzZSAweDFkNjogLyogbW92cSBlYSwgeG1tICovPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xl YV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9zdHFfZW52X0EwKHMsIG9mZnNldG9mKENQVVg4NlN0YXRlLDxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxz ZSB7PGJyPg0KPC9kaXY+QEAgLTM2MjYsNyArMzc1Nyw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2Uo Q1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcywgaW50 IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcDJfb2Zmc2V0ID0gb2Zm c2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm0gfCBSRVhfQihzKV0pOzxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fdDApOzxicj4NCi0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0p Ozxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwg cywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3dpdGNo IChiKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDB4MjA6IGNh c2UgMHgzMDogLyogcG1vdnN4YncsIHBtb3Z6eGJ3ICovPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBjYXNlIDB4MjM6IGNhc2UgMHgzMzogLyogcG1vdnN4d2QsIHBtb3Z6eHdk ICovPGJyPg0KPC9kaXY+QEAgLTM2NjAsNyArMzc5MSw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2Uo Q1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcywgaW50 IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcDJfb2Zmc2V0ID0gb2Zm c2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JtXS5tbXgpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgfSBlbHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9w Ml9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxtbXhfdDApOzxicj4NCi0gwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0s IGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkcV9lbnZfQTAo cywgb3AyX29mZnNldCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KPC9kaXY+QEAgLTM3MDEsNyArMzgzMiw3IEBAIHN0YXRp YyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2Fz Q29udGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0K PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVf dG1wMl9pMzIsIGNwdV9yZWdzW3JlZ10pOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCk7PGJyPg0KKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9U TVAwLCAwLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfY3Jj MzIoY3B1X1RbMF0sIGNwdV90bXAyX2kzMiw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjcHVfVFswXSwgdGNnX2NvbnN0X2kzMig4ICZsdDsm bHQ7IG90KSk7PGJyPg0KPGJyPg0KPC9kaXY+QEAgLTM3MjksNyArMzg2MCw3IEBAIHN0YXRpYyB2 b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29u dGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvdCA9 IE1PXzY0Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCjxicj4NCi0gwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKChiICZhbXA7IDEpID09IDApIHs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fcWVtdV9sZF90bChjcHVf VFswXSwgY3B1X0EwLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHMtJmd0O21lbV9pbmRleCwgb3QgfCBNT19CRSk7PGJyPg0K PC9kaXY+QEAgLTM3NDcsNyArMzg3OCw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3Rh dGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBv dCA9IG1vXzY0XzMyKHMtJmd0O2RmbGFnKTs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1Jf VE1QMCwgMCwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2FuZGNf dGwoY3B1X1RbMF0sIGNwdV9yZWdzW3MtJmd0O3ZleF92XSwgY3B1X1RbMF0pOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl9yZWdfdihvdCwgcmVnLCBjcHVfVFswXSk7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3BfdXBkYXRlMV9jYygpOzxicj4N CjwvZGl2PkBAIC0zNzY0LDcgKzM4OTUsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0 YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsIGludCBiLDxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgVENHdiBib3VuZCwgemVybzs8YnI+DQo8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAp Ozxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYs IHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAvKiBFeHRyYWN0IFNUQVJULCBhbmQgc2hpZnQgdGhlIG9wZXJhbmQuPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgU2hpZnRzIGxhcmdlciB0aGFuIG9w ZXJhbmQgc2l6ZSBnZXQgemVyb3MuIMKgKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHRjZ19nZW5fZXh0OHVfdGwoY3B1X0EwLCBjcHVfcmVnc1tzLSZndDt2ZXhfdl0pOzxi cj4NCjwvZGl2PkBAIC0zODAxLDcgKzM5MzIsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4 NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsIGludCBiLDxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgb3QgPSBtb182NF8zMihzLSZndDtkZmxhZyk7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTs8YnI+DQor IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3Qs IE9SX1RNUDAsIDAsIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9l eHQ4dV90bChjcHVfVFsxXSwgY3B1X3JlZ3Nbcy0mZ3Q7dmV4X3ZdKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRD R3YgYm91bmQgPSB0Y2dfY29uc3RfdGwob3QgPT0gTU9fNjQgPyA2MyA6IDMxKTs8YnI+DQo8L2Rp dj5AQCAtMzgyOCw3ICszOTU5LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAq ZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG90ID0g bW9fNjRfMzIocy0mZ3Q7ZGZsYWcpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCk7PGJyPg0KKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAw LCAwLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHN3aXRjaCAob3QpIHs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRlZmF1bHQ6PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9U WzBdKTs8YnI+DQo8L2Rpdj5AQCAtMzg1NCw3ICszOTg1LDcgQEAgc3RhdGljIHZvaWQgZ2VuX3Nz ZShDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBp bnQgYiw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9v cDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoG90ID0gbW9fNjRfMzIocy0mZ3Q7ZGZsYWcpOzxicj4NCi0gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCk7 PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9k cm0sIG90LCBPUl9UTVAwLCAwLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8q IE5vdGUgdGhhdCBieSB6ZXJvLWV4dGVuZGluZyB0aGUgbWFzayBvcGVyYW5kLCB3ZTxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHplcm8tZXh0 ZW5kaW5nIHRoZSByZXN1bHQuIMKgKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlm IChvdCA9PSBNT182NCkgezxicj4NCjwvZGl2PkBAIC0zODcyLDcgKzQwMDMsNyBAQCBzdGF0aWMg dm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0Nv bnRleHQgKnMsIGludCBiLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290 byBpbGxlZ2FsX29wOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb182NF8zMihzLSZndDtkZmxhZyk7PGJyPg0KLSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBP Ul9UTVAwLCAwKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0o ZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAsIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgLyogTm90ZSB0aGF0IGJ5IHplcm8tZXh0ZW5kaW5nIHRoZSBtYXNrIG9wZXJhbmQs IHdlPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYXV0b21hdGljYWxseSBoYW5k bGUgemVyby1leHRlbmRpbmcgdGhlIHJlc3VsdC4gwqAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgaWYgKG90ID09IE1PXzY0KSB7PGJyPg0KPC9kaXY+QEAgLTM4OTIsNyArNDAyMyw3 IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNz PSIiPkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBpbnQgZW5kX29wOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgb3QgPSBtb182NF8zMihzLSZndDtkZmxhZyk7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAw KTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52 LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAsIGIpOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgLyogUmUtdXNlIHRoZSBjYXJyeS1vdXQgZnJvbSBhIHByZXZpb3Vz IHJvdW5kLiDCoCovPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBUQ0dWX1VO VVNFRChjYXJyeV9pbik7PGJyPg0KPC9kaXY+QEAgLTM5NzEsNyArNDEwMiw3IEBAIHN0YXRpYyB2 b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29u dGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3Rv IGlsbGVnYWxfb3A7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBvdCA9IG1vXzY0XzMyKHMtJmd0O2RmbGFnKTs8YnI+DQotIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9S X1RNUDAsIDApOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShl bnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBpZiAob3QgPT0gTU9fNjQpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHRjZ19nZW5fYW5kaV90bChjcHVfVFsxXSwgY3B1X3JlZ3Nbcy0mZ3Q7dmV4X3ZdLCA2 Myk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4NCjwvZGl2PkBA IC00MDAzLDcgKzQxMzQsNyBAQCBzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYs PGJyPg0KRGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb182 NF8zMihzLSZndDtkZmxhZyk7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0 X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTs8YnI+DQorIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAs IGIpOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3dpdGNoIChyZWcgJmFt cDsgNykgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAxOiAvKiBibHNyIEJ5 LEV5ICovPGJyPg0KPC9kaXY+QEAgLTQwNjIsNyArNDE5Myw3IEBAIHN0YXRpYyB2b2lkIGdlbl9z c2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcywg aW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvdCA9IG1vXzY0XzMyKHMtJmd0 O2RmbGFnKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJtID0gKG1vZHJtICZhbXA7 IDcpIHwgUkVYX0Iocyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9 IDMpPGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52 LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFf bW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBy ZWcgPSAoKG1vZHJtICZndDsmZ3Q7IDMpICZhbXA7IDcpIHwgcmV4X3I7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB2YWwgPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0mZ3Q7cGMrKyk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzd2l0Y2ggKGIpIHs8YnI+DQo8L2Rpdj5AQCAt NDE5OSw3ICs0MzMwLDcgQEAgc3RhdGljIHZvaWQgZ2VuX3NzZShDUFVYODZTdGF0ZSAqZW52LDxi cj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLCBpbnQgYiw8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4 bW1fcmVnc1tybSB8IFJFWF9CKHMpXSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9 IGVsc2Ugezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3AyX29mZnNldCA9 IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV90MCk7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRvX2Vudl9BMChzLCBvcDJfb2Zm c2V0KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoH0gZWxzZSB7PGJyPg0KPC9kaXY+QEAgLTQyMDgsNyArNDMzOSw3IEBAIHN0YXRpYyB2 b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQpEaXNhc0NvbnRleHQgKnMsIGludCBi LDxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcDJf b2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JtXS5tbXgpOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxtbXhfdDApOzxicj4N Ci0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9k cm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVu diwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xkcV9lbnZfQTAocywgb3AyX29mZnNldCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KPC9kaXY+QEAgLTQyNDIsNyArNDM3 Myw3IEBAIHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNs YXNzPSIiPkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvdCA9IG1vXzY0XzMyKHMtJmd0O2Rm bGFnKTs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBz LCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCwgYik7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBiID0gY3B1X2xkdWJfY29kZShlbnYsIHMtJmd0O3BjKysp Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG90ID09IE1PXzY0KSB7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3JvdHJpX3RsKGNwdV9UWzBd LCBjcHVfVFswXSwgYiAmYW1wOyA2Myk7PGJyPg0KPC9kaXY+QEAgLTQyNzgsNyArNDQwOSw3IEBA IHN0YXRpYyB2b2lkIGdlbl9zc2UoQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIi PkRpc2FzQ29udGV4dCAqcywgaW50IGIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9k ICE9IDMpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGludCBzeiA9IDQ7PGJyPg0K PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2Ry bSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBt b2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcDJfb2Zmc2V0ID0gb2Zm c2V0b2YoQ1BVWDg2U3RhdGUseG1tX3QwKTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHN3aXRjaCAoYikgezxicj4NCjwvZGl2PkBAIC00MzI2LDcgKzQ0NTcsNyBAQCBzdGF0 aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNh c0NvbnRleHQgKnMsIGludCBiLDxicj4NCsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoG9wMV9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3Nb cmVnXS5tbXgpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0K LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJy Pg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwg Yik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2Yo Q1BVWDg2U3RhdGUsbW14X3QwKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9s ZHFfZW52X0EwKHMsIG9wMl9vZmZzZXQpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNl IHs8YnI+DQo8L2Rpdj5AQCAtNDQwNCw2ICs0NTM1LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBk aXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KRGlzYXNDb250ZXh0ICpzLDxicj4NCsKg IMKgIMKgaW50IG1vZHJtLCByZWcsIHJtLCBtb2QsIG9wLCBvcHJlZywgdmFsOzxicj4NCsKgIMKg IMKgdGFyZ2V0X3Vsb25nIG5leHRfZWlwLCB0dmFsOzxicj4NCsKgIMKgIMKgaW50IHJleF93LCBy ZXhfcjs8YnI+DQorIMKgIMKgaW50IGZwX29wLCBmcF9pcCwgZnBfY3M7PGJyPg0KPGJyPg0KwqAg wqAgwqBpZiAodW5saWtlbHkocWVtdV9sb2dsZXZlbF9tYXNrKENQVV9MT0dfVEJfT1AgfCBDUFVf TE9HX1RCX09QX09QVCkpKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2RlYnVnX2luc25f c3RhcnQocGNfc3RhcnQpOzxicj4NCkBAIC00NTk1LDcgKzQ3MjcsNyBAQCBzdGF0aWMgdGFyZ2V0 X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRp c2FzQ29udGV4dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1vZCA9IChtb2Ry bSAmZ3Q7Jmd0OyA2KSAmYW1wOyAzOzxicj4NCjwvZGl2PjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBybSA9IChtb2RybSAmYW1wOyA3KSB8IFJFWF9CKHMpOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwg Yik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBvcHJlZyA9IE9SX1RNUDA7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2UgaWYgKG9wID09IE9QX1hPUkwg JmFtcDsmYW1wOyBybSA9PSByZWcpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHhv cl96ZXJvOjxicj4NCjwvZGl2PkBAIC00NjE2LDcgKzQ3NDgsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vs b25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2Fz Q29udGV4dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJlZyA9ICgobW9kcm0g Jmd0OyZndDsgMykgJmFtcDsgNykgfCByZXhfcjs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHJtID0gKG1vZHJtICZhbXA7IDcpIHwgUkVYX0Iocyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9sZF92KHMsIG90LCBjcHVfVFsxXSwg Y3B1X0EwKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSBpZiAob3AgPT0g T1BfWE9STCAmYW1wOyZhbXA7IHJtID09IHJlZykgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ290byB4b3JfemVybzs8YnI+DQo8L2Rpdj5AQCAtNDY1NSw3ICs0Nzg3LDcg QEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0K PGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBzLSZndDtyaXBfb2Zmc2V0ID0gMTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGVsc2U8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHMtJmd0O3Jp cF9vZmZzZXQgPSBpbnNuX2NvbnN0X3NpemUob3QpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgb3ByZWcgPSBPUl9UTVAwOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg fSBlbHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wcmVnID0gcm07PGJyPg0K PC9kaXY+QEAgLTQ2OTgsNyArNDgzMCw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5z bihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLDxi cj4NCsKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqBpZiAob3AgPT0gMCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHMtJmd0O3JpcF9v ZmZzZXQgPSBpbnNuX2NvbnN0X3NpemUob3QpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5f bGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVh X21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29w X2xkX3Yocywgb3QsIGNwdV9UWzBdLCBjcHVfQTApOzxicj4NCsKgIMKgIMKgIMKgIMKgfSBlbHNl IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3Zfdl9yZWcob3QsIGNwdV9UWzBd LCBybSk7PGJyPg0KPC9kaXY+QEAgLTQ5MDYsNyArNTAzOCw3IEBAIHN0YXRpYyB0YXJnZXRfdWxv bmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXND b250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgIMKgIMKg fTxicj4NCsKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDC oCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDC oGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqBpZiAob3AgJmd0Oz0gMiAmYW1wOyZhbXA7IG9wICE9IDMgJmFtcDsmYW1wOyBvcCAhPSA1KTxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX2xkX3Yocywgb3QsIGNwdV9UWzBd LCBjcHVfQTApOzxicj4NCsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQo8L2Rpdj5AQCAtNDk0 Niw2ICs1MDc4LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRl ICplbnYsPGJyPg0KRGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgZG9fbGNhbGw6 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocy0mZ3Q7cGUgJmFtcDsmYW1wOyAhcy0mZ3Q7 dm04Nikgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChz KTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8YnI+DQo8 ZGl2IGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFy dCAtIHMtJmd0O2NzX2Jhc2UpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dl bl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7PGJyPg0KPC9kaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2xjYWxsX3Byb3RlY3RlZChjcHVfZW52LCBj cHVfdG1wMl9pMzIsIGNwdV9UWzFdLDxicj4NCkBAIC00OTczLDYgKzUxMDYsNyBAQCBzdGF0aWMg dGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQpEaXNhc0NvbnRl eHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqBkb19sam1wOjxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgaWYgKHMtJmd0O3BlICZhbXA7JmFtcDsgIXMtJmd0O3ZtODYpIHs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PGJyPg0KKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJyPg0KPGRpdiBjbGFzcz0iIj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAy X2kzMiwgY3B1X1RbMF0pOzxicj4NCjwvZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2hlbHBlcl9sam1wX3Byb3RlY3RlZChjcHVfZW52LCBjcHVfdG1wMl9pMzIsIGNwdV9UWzFdLDxi cj4NCkBAIC00OTk4LDcgKzUxMzIsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24o Q1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcyw8YnI+ DQrCoCDCoCDCoCDCoCDCoG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtJmd0O3BjKyspOzxi cj4NCsKgIMKgIMKgIMKgIMKgcmVnID0gKChtb2RybSAmZ3Q7Jmd0OyAzKSAmYW1wOyA3KSB8IHJl eF9yOzxicj4NCjxicj4NCi0gwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJt LCBvdCwgT1JfVE1QMCwgMCk7PGJyPg0KKyDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwg cywgbW9kcm0sIG90LCBPUl9UTVAwLCAwLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoGdlbl9vcF9t b3Zfdl9yZWcob3QsIGNwdV9UWzFdLCByZWcpOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX29wX3Rl c3RsX1QwX1QxX2NjKCk7PGJyPg0KwqAgwqAgwqAgwqAgwqBzZXRfY2Nfb3AocywgQ0NfT1BfTE9H SUNCICsgb3QpOzxicj4NCjwvZGl2PkBAIC01MDczLDcgKzUyMDcsNyBAQCBzdGF0aWMgdGFyZ2V0 X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRp c2FzQ29udGV4dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoHMtJmd0O3JpcF9vZmZzZXQg PSBpbnNuX2NvbnN0X3NpemUob3QpOzxicj4NCsKgIMKgIMKgIMKgIMKgZWxzZSBpZiAoYiA9PSAw eDZiKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7cmlwX29mZnNldCA9IDE7PGJyPg0K LSDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAw KTs8YnI+DQorIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9S X1RNUDAsIDAsIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgaWYgKGIgPT0gMHg2OSkgezxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgdmFsID0gaW5zbl9nZXQoZW52LCBzLCBvdCk7PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX21vdmlfdGwoY3B1X1RbMV0sIHZhbCk7PGJyPg0KPC9kaXY+ QEAgLTUxMzAsNyArNTI2NCw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVY ODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLDxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl9yZWdfdihvdCwgcmVnLCBjcHVfVFsxXSk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3BfbW92X3JlZ192KG90LCBybSwgY3B1X1RbMF0p Ozxicj4NCsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xl YV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9v cF9tb3Zfdl9yZWcob3QsIGNwdV9UWzBdLCByZWcpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX29wX2xkX3Yocywgb3QsIGNwdV9UWzFdLCBjcHVfQTApOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgdGNnX2dlbl9hZGRfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7PGJyPg0K PC9kaXY+QEAgLTUxNTksNyArNTI5Myw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5z bihDUFVYODZTdGF0ZSAqZW52LDxicj4NCkRpc2FzQ29udGV4dCAqcyw8YnI+DQo8ZGl2IGNsYXNz PSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcm0gPSAobW9kcm0gJmFtcDsgNykgfCBSRVhf QihzKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3Zfdl9yZWcob3Qs IHQwLCBybSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4NCi0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZfdGwoYTAsIGNwdV9BMCk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3BfbGRfdihzLCBvdCwgdDAsIGEwKTs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJtID0gMDsgLyogYXZvaWQgd2FybmluZyAq Lzxicj4NCjwvZGl2PkBAIC01MjA3LDE2ICs1MzQxLDE2IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcg ZGlzYXNfaW5zbihDUFVYODZTdGF0ZTxicj4NCjxkaXYgY2xhc3M9IiI+KmVudiwgRGlzYXNDb250 ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jh c2UpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+DQot IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfY21weGNoZzE2YihjcHVfZW52LCBjcHVfQTApOzxi cj4NCsKgIMKgIMKgIMKgIMKgfSBlbHNlPGJyPg0KLSNlbmRpZjxicj4NCisjZW5kaWY8YnI+DQrC oCDCoCDCoCDCoCDCoHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghKHMtJmd0O2NwdWlk X2ZlYXR1cmVzICZhbXA7IENQVUlEX0NYOCkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnb3RvIGlsbGVnYWxfb3A7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2ltKHBj X3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBk YXRlX2NjX29wKHMpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwg cywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywg bW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9jbXB4Y2hnOGIo Y3B1X2VudiwgY3B1X0EwKTs8YnI+DQrCoCDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDC oHNldF9jY19vcChzLCBDQ19PUF9FRkxBR1MpOzxicj4NCjwvZGl2PkBAIC01MjY2LDcgKzU0MDAs NyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+ DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDCoH0gZWxz ZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBOT1RFOiBvcmRlciBpcyBpbXBvcnRhbnQg dG9vIGZvciBNTVUgZXhjZXB0aW9ucyAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7 cG9wbF9lc3BfaGFjayA9IDEgJmx0OyZsdDsgb3Q7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdl bl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAxKTs8YnI+DQorIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDEs IGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7cG9wbF9lc3BfaGFjayA9IDA7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fcG9wX3VwZGF0ZShzLCBvdCk7PGJyPg0KwqAgwqAg wqAgwqAgwqB9PGJyPg0KPC9kaXY+QEAgLTUzNTIsNyArNTQ4Niw3IEBAIHN0YXRpYyB0YXJnZXRf dWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlz YXNDb250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgcmVnID0gKChtb2RybSAmZ3Q7Jmd0OyAz KSAmYW1wOyA3KSB8IHJleF9yOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgLyogZ2VuZXJhdGUg YSBnZW5lcmljIHN0b3JlICovPGJyPg0KLSDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwg cywgbW9kcm0sIG90LCByZWcsIDEpOzxicj4NCisgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShl bnYsIHMsIG1vZHJtLCBvdCwgcmVnLCAxLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoGJyZWFrOzxi cj4NCsKgIMKgIMKgY2FzZSAweGM2Ojxicj4NCsKgIMKgIMKgY2FzZSAweGM3OiAvKiBtb3YgRXYs IEl2ICovPGJyPg0KPC9kaXY+QEAgLTUzNjEsNyArNTQ5NSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxv bmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXND b250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgbW9kID0gKG1vZHJtICZndDsmZ3Q7IDYpICZh bXA7IDM7PGJyPg0KwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoHMtJmd0O3JpcF9vZmZzZXQgPSBpbnNuX2NvbnN0X3NpemUob3QpOzxicj4NCi0g wqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKg IMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgIMKgIMKgdmFsID0gaW5zbl9nZXQoZW52LCBzLCBvdCk7 PGJyPg0KwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX21vdmlfdGwoY3B1X1RbMF0sIHZhbCk7PGJyPg0K PC9kaXY+QEAgLTUzNzcsNyArNTUxMSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5z bihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLDxi cj4NCsKgIMKgIMKgIMKgIMKgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0mZ3Q7cGMrKyk7 PGJyPg0KwqAgwqAgwqAgwqAgwqByZWcgPSAoKG1vZHJtICZndDsmZ3Q7IDMpICZhbXA7IDcpIHwg cmV4X3I7PGJyPg0KPGJyPg0KLSDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9k cm0sIG90LCBPUl9UTVAwLCAwKTs8YnI+DQorIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52 LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAsIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX29w X21vdl9yZWdfdihvdCwgcmVnLCBjcHVfVFswXSk7PGJyPg0KwqAgwqAgwqAgwqAgwqBicmVhazs8 YnI+DQrCoCDCoCDCoGNhc2UgMHg4ZTogLyogbW92IHNlZywgR3YgKi88YnI+DQo8L2Rpdj5AQCAt NTM4NSw3ICs1NTE5LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0 YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAg wqAgwqAgwqByZWcgPSAobW9kcm0gJmd0OyZndDsgMykgJmFtcDsgNzs8YnI+DQrCoCDCoCDCoCDC oCDCoGlmIChyZWcgJmd0Oz0gNiB8fCByZWcgPT0gUl9DUyk8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQotIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52 LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RNUDAsIDApOzxicj4NCisgwqAgwqAgwqAgwqBnZW5fbGRz dF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT18xNiwgT1JfVE1QMCwgMCwgYik7PGJyPg0KwqAgwqAg wqAgwqAgwqBnZW5fbW92bF9zZWdfVDAocywgcmVnLCBwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2Up Ozxicj4NCsKgIMKgIMKgIMKgIMKgaWYgKHJlZyA9PSBSX1NTKSB7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAvKiBpZiByZWcgPT0gU1MsIGluaGliaXQgaW50ZXJydXB0cy90cmFjZSAqLzxicj4N CjwvZGl2PkBAIC01NDA4LDcgKzU1NDIsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2lu c24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcyw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQrCoCDCoCDCoCDC oCDCoGdlbl9vcF9tb3ZsX1QwX3NlZyhyZWcpOzxicj4NCsKgIMKgIMKgIMKgIMKgb3QgPSBtb2Qg PT0gMyA/IGRmbGFnIDogTU9fMTY7PGJyPg0KLSDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVu diwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAxKTs8YnI+DQorIMKgIMKgIMKgIMKgZ2VuX2xkc3Rf bW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDEsIGIpOzxicj4NCsKgIMKgIMKgIMKg IMKgYnJlYWs7PGJyPg0KPGJyPg0KwqAgwqAgwqBjYXNlIDB4MWI2OiAvKiBtb3Z6YlMgR3YsIEVi ICovPGJyPg0KPC9kaXY+QEAgLTU0NTAsNyArNTU4NCw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcg ZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250 ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl9yZWdfdihkX290LCByZWcsIGNwdV9UWzBdKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5fb3BfbGRfdihzLCBzX290LCBjcHVfVFswXSwgY3B1X0EwKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3ZfcmVnX3YoZF9vdCwgcmVnLCBj cHVfVFswXSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KPC9kaXY+QEAgLTU0Njgs NyArNTYwMiw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAq ZW52LDxicj4NCkRpc2FzQ29udGV4dCAqcyw8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKgIMKgIMKg IMKgcy0mZ3Q7b3ZlcnJpZGUgPSAtMTs8YnI+DQrCoCDCoCDCoCDCoCDCoHZhbCA9IHMtJmd0O2Fk ZHNlZzs8YnI+DQrCoCDCoCDCoCDCoCDCoHMtJmd0O2FkZHNlZyA9IDA7PGJyPg0KLSDCoCDCoCDC oCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoGdlbl9s ZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqBzLSZndDthZGRz ZWcgPSB2YWw7PGJyPg0KwqAgwqAgwqAgwqAgwqBnZW5fb3BfbW92X3JlZ192KG90LCByZWcsIGNw dV9BMCk7PGJyPg0KwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQo8L2Rpdj5AQCAtNTU1OCw3ICs1 NjkyLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYs PGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fb3BfbW92X3JlZ192KG90LCBybSwgY3B1X1RbMF0pOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX29wX21vdl9yZWdfdihvdCwgcmVnLCBjcHVfVFsxXSk7PGJyPg0KwqAgwqAg wqAgwqAgwqB9IGVsc2Ugezxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVu diwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwg cywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl92X3JlZyhv dCwgY3B1X1RbMF0sIHJlZyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBmb3IgeGNoZywg bG9jayBpcyBpbXBsaWNpdCAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKCEocHJlZml4 ZXMgJmFtcDsgUFJFRklYX0xPQ0spKTxicj4NCjwvZGl2PkBAIC01NTkzLDcgKzU3MjcsNyBAQCBz dGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQpEaXNh c0NvbnRleHQgKnMsPGJyPg0KPGRpdiBjbGFzcz0iIj7CoCDCoCDCoCDCoCDCoG1vZCA9IChtb2Ry bSAmZ3Q7Jmd0OyA2KSAmYW1wOyAzOzxicj4NCsKgIMKgIMKgIMKgIMKgaWYgKG1vZCA9PSAzKTxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzxicj4NCi0gwqAgwqAgwqAg wqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqBnZW5fbGVh X21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX29wX2xkX3Yo cywgb3QsIGNwdV9UWzFdLCBjcHVfQTApOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2FkZF9BMF9p bShzLCAxICZsdDsmbHQ7IG90KTs8YnI+DQrCoCDCoCDCoCDCoCDCoC8qIGxvYWQgdGhlIHNlZ21l bnQgZmlyc3QgdG8gaGFuZGxlIGV4Y2VwdGlvbnMgcHJvcGVybHkgKi88YnI+DQo8L2Rpdj5AQCAt NTYyNCw3ICs1NzU4LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0 YXRlICplbnYsPGJyPg0KRGlzYXNDb250ZXh0ICpzLDxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoc2hpZnQgPT0gMikgezxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7cmlwX29mZnNldCA9IDE7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqB9PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9k cm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFf bW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBv cHJlZyA9IE9SX1RNUDA7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3ByZWcgPSAobW9kcm0gJmFtcDsgNykgfCBSRVhfQihz KTs8YnI+DQo8L2Rpdj5AQCAtNTY3NCw3ICs1ODA4LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBk aXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KRGlzYXNDb250ZXh0ICpzLDxicj4NCjxk aXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqBybSA9IChtb2RybSAmYW1wOyA3KSB8IFJFWF9CKHMp Ozxicj4NCsKgIMKgIMKgIMKgIMKgcmVnID0gKChtb2RybSAmZ3Q7Jmd0OyAzKSAmYW1wOyA3KSB8 IHJleF9yOzxicj4NCsKgIMKgIMKgIMKgIMKgaWYgKG1vZCAhPSAzKSB7PGJyPg0KLSDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDC oCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqBvcHJlZyA9IE9SX1RNUDA7PGJyPg0KwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgb3ByZWcgPSBybTs8YnI+DQo8L2Rpdj5AQCAtNTcwNSw3ICs1 ODM5LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYs PGJyPg0KRGlzYXNDb250ZXh0ICpzLDxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqBv cCA9ICgoYiAmYW1wOyA3KSAmbHQ7Jmx0OyAzKSB8ICgobW9kcm0gJmd0OyZndDsgMykgJmFtcDsg Nyk7PGJyPg0KwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoC8qIG1lbW9yeSBvcCAqLzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21v ZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJt KGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgc3dpdGNoKG9wKSB7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDB4MDAgLi4uIDB4MDc6IC8qIGZ4eHhzICov PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDB4MTAgLi4uIDB4MTc6IC8qIGZpeHh4bCAq Lzxicj4NCjwvZGl2PkBAIC01ODMyLDcgKzU5NjYsOSBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRp c2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4 dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgwYzogLyogZmxkZW52IG1lbSAq Lzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtj c19iYXNlKTs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9mbGRlbnYo Y3B1X2VudiwgY3B1X0EwLCB0Y2dfY29uc3RfaTMyKGRmbGFnIC0gMSkpOzxicj4NCisgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2ZsZGVudihjcHVfZW52LCBjcHVfQTAsPGJyPg0K KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19j b25zdF9pMzIoZGZsYWcgPT0gTU9fMzIpLDxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfY29uc3RfaTMyKElTX1BST1RFQ1RFRF9NT0RF KHMpKSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoGNhc2UgMHgwZDogLyogZmxkY3cgbWVtICovPGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3FlbXVfbGRfaTMyKGNwdV90bXAyX2kzMiwgY3B1X0EwLDxi cj4NCjwvZGl2PkBAIC01ODQxLDggKzU5NzcsMTEgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNh c19pbnNuKENQVVg4NlN0YXRlPGJyPg0KKmVudiwgRGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KPGRpdiBjbGFzcz0iIj7CoCDCoCDCoCDC oCDCoCDCoCDCoGNhc2UgMHgwZTogLyogZm5zdGVudiBtZW0gKi88YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PGJyPg0KPC9kaXY+KyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJyPg0KPGRpdiBjbGFzcz0iIj7CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8 YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9mc3RlbnYoY3B1X2Vudiwg Y3B1X0EwLCB0Y2dfY29uc3RfaTMyKGRmbGFnIC0gMSkpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5faGVscGVyX2ZzdGVudihjcHVfZW52LCBjcHVfQTAsPGJyPg0KKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19jb25zdF9pMzIo ZGZsYWcgPT0gTU9fMzIpLDxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB0Y2dfY29uc3RfaTMyKElTX1BST1RFQ1RFRF9NT0RFKHMpKSk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoGNhc2UgMHgwZjogLyogZm5zdGN3IG1lbSAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX2hlbHBlcl9mbnN0Y3coY3B1X3RtcDJfaTMyLCBjcHVfZW52KTs8YnI+DQo8L2Rp dj5AQCAtNTg2MywxMiArNjAwMiwxNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24o Q1BVWDg2U3RhdGU8YnI+DQo8ZGl2IGNsYXNzPSIiPiplbnYsIERpc2FzQ29udGV4dCAqcyw8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGNhc2UgMHgyYzogLyogZnJzdG9yIG1lbSAqLzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8 YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9mcnN0b3IoY3B1X2Vudiwg Y3B1X0EwLCB0Y2dfY29uc3RfaTMyKGRmbGFnIC0gMSkpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5faGVscGVyX2Zyc3RvcihjcHVfZW52LCBjcHVfQTAsPGJyPg0KKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19jb25zdF9pMzIo ZGZsYWcgPT0gTU9fMzIpLDxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB0Y2dfY29uc3RfaTMyKElTX1BST1RFQ1RFRF9NT0RFKHMpKSk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoGNhc2UgMHgyZTogLyogZm5zYXZlIG1lbSAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+DQo8L2Rpdj4rIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzxicj4NCi0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2ZzYXZlKGNwdV9lbnYsIGNwdV9BMCwg dGNnX2NvbnN0X2kzMihkZmxhZyAtIDEpKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2hlbHBlcl9mc2F2ZShjcHVfZW52LCBjcHVfQTAsPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0Y2dfY29uc3RfaTMyKGRmbGFnID09IE1P XzMyKSw8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHRjZ19jb25zdF9pMzIoSVNfUFJPVEVDVEVEX01PREUocykpKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSAweDJm OiAvKiBmbnN0c3cgbWVtICovPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVs cGVyX2Zuc3RzdyhjcHVfdG1wMl9pMzIsIGNwdV9lbnYpOzxicj4NCjwvZGl2PkBAIC02MjA5LDYg KzYzNTMsMTIgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlPGJy Pg0KPGRpdiBjbGFzcz0iIj4qZW52LCBEaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9 PGJyPg0KwqAgwqAgwqAgwqAgwqB9PGJyPg0KPC9kaXY+KyDCoCDCoCDCoCDCoGlmIChpbnN0cl9p c194ODdfbmMobW9kcm0sIGIpKSB7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGZwX29wID0gKChi ICZhbXA7IDB4NykgJmx0OyZsdDsgOCkgfCAobW9kcm0gJmFtcDsgMHhmZik7PGJyPg0KKyDCoCDC oCDCoCDCoCDCoCDCoGZwX2lwID0gcGNfc3RhcnQgLSBzLSZndDtjc19iYXNlOzxicj4NCisgwqAg wqAgwqAgwqAgwqAgwqBmcF9jcyA9IGVudi0mZ3Q7c2Vnc1tSX0NTXS5zZWxlY3Rvcjs8YnI+DQor IMKgIMKgIMKgIMKgIMKgIMKgc2V0X2VwKHMsIGZwX29wLCBmcF9pcCwgZnBfY3MpOzxicj4NCjxk aXYgY2xhc3M9IiI+KyDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4N CsKgIMKgIMKgIMKgIMKgLyoqKioqKioqKioqKioqKioqKioqKioqKi88YnI+DQrCoCDCoCDCoCDC oCDCoC8qIHN0cmluZyBvcHMgKi88YnI+DQo8L2Rpdj48ZGl2IGNsYXNzPSIiPkBAIC02MzkzLDYg KzY1NDMsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVu diw8YnI+DQpEaXNhc0NvbnRleHQgKnMsPGJyPg0KPC9kaXY+wqAgwqAgwqBkb19scmV0Ojxicj4N CsKgIMKgIMKgIMKgIMKgaWYgKHMtJmd0O3BlICZhbXA7JmFtcDsgIXMtJmd0O3ZtODYpIHs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PGJyPg0KKyDCoCDCoCDC oCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f am1wX2ltKHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5faGVscGVyX2xyZXRfcHJvdGVjdGVkKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIoZGZsYWcg LSAxKSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHRjZ19jb25zdF9pMzIodmFsKSk7PGJyPg0KQEAgLTY0MzAsNiArNjU4MSw3 IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4N CkRpc2FzQ29udGV4dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDC oCDCoCDCoH0gZWxzZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29w KHMpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2VwKHMpOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9pcmV0X3Byb3RlY3RlZChjcHVfZW52LCB0 Y2dfY29uc3RfaTMyKGRmbGFnIC0gMSksPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfY29uc3RfaTMyKHMtJmd0O3BjIC0g cy0mZ3Q7Y3NfYmFzZSkpOzxicj4NCkBAIC02NTI3LDcgKzY2NzksNyBAQCBzdGF0aWMgdGFyZ2V0 X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRp c2FzQ29udGV4dCAqcyw8YnI+DQrCoCDCoCDCoGNhc2UgMHgxOTAgLi4uIDB4MTlmOiAvKiBzZXRj YyBHdiAqLzxicj4NCsKgIMKgIMKgIMKgIMKgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0m Z3Q7cGMrKyk7PGJyPg0KwqAgwqAgwqAgwqAgwqBnZW5fc2V0Y2MxKHMsIGIsIGNwdV9UWzBdKTs8 YnI+DQotIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fOCwgT1Jf VE1QMCwgMSk7PGJyPg0KKyDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0s IE1PXzgsIE9SX1RNUDAsIDEsIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KwqAg wqAgwqBjYXNlIDB4MTQwIC4uLiAweDE0ZjogLyogY21vdiBHdiwgRXYgKi88YnI+DQrCoCDCoCDC oCDCoCDCoGlmICghKHMtJmd0O2NwdWlkX2ZlYXR1cmVzICZhbXA7IENQVUlEX0NNT1YpKSB7PGJy Pg0KPC9kaXY+QEAgLTY2NTcsNyArNjgwOSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNf aW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCkRpc2FzQ29udGV4dCAqcyw8YnI+DQo8ZGl2IGNs YXNzPSIiPsKgIMKgIMKgIMKgIMKgcm0gPSAobW9kcm0gJmFtcDsgNykgfCBSRVhfQihzKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoGlmIChtb2QgIT0gMykgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg cy0mZ3Q7cmlwX29mZnNldCA9IDE7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9k cm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0o ZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3BfbGRfdihz LCBvdCwgY3B1X1RbMF0sIGNwdV9BMCk7PGJyPg0KwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl92X3JlZyhvdCwgY3B1X1RbMF0sIHJtKTs8 YnI+DQo8L2Rpdj5AQCAtNjY4OCw3ICs2ODQwLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNh c19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQg KnMsPGJyPg0KwqAgwqAgwqAgwqAgwqBybSA9IChtb2RybSAmYW1wOyA3KSB8IFJFWF9CKHMpOzxi cj4NCsKgIMKgIMKgIMKgIMKgZ2VuX29wX21vdl92X3JlZyhNT18zMiwgY3B1X1RbMV0sIHJlZyk7 PGJyPg0KwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oC8qIHNwZWNpZmljIGNhc2U6IHdlIG5lZWQgdG8gYWRkIGEgZGlzcGxhY2VtZW50ICovPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZXh0cyhvdCwgY3B1X1RbMV0pOzxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgdGNnX2dlbl9zYXJpX3RsKGNwdV90bXAwLCBjcHVfVFsxXSwgMyArIG90KTs8 YnI+DQo8L2Rpdj5AQCAtNjc2NCw3ICs2OTE2LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNh c19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQg KnMsPGJyPg0KwqAgwqAgwqAgwqAgwqBvdCA9IGRmbGFnOzxicj4NCsKgIMKgIMKgIMKgIMKgbW9k cm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0mZ3Q7cGMrKyk7PGJyPg0KwqAgwqAgwqAgwqAgwqBy ZWcgPSAoKG1vZHJtICZndDsmZ3Q7IDMpICZhbXA7IDcpIHwgcmV4X3I7PGJyPg0KLSDCoCDCoCDC oCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTs8YnI+DQor IMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDAs IGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2V4dHUob3QsIGNwdV9UWzBdKTs8YnI+DQo8YnI+ DQrCoCDCoCDCoCDCoCDCoC8qIE5vdGUgdGhhdCBsemNudCBhbmQgdHpjbnQgYXJlIGluIGRpZmZl cmVudCBleHRlbnNpb25zLiDCoCovPGJyPg0KPC9kaXY+QEAgLTY4ODQsNiArNzAzNiw3IEBAIHN0 YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCkRpc2Fz Q29udGV4dCAqcyw8YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2V4 Y2VwdGlvbihzLCBFWENQMDdfUFJFWCwgcGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8YnI+DQo8 L2Rpdj7CoCDCoCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f dXBkYXRlX2NjX29wKHMpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2VwKHMp Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2Nz X2Jhc2UpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9md2FpdChjcHVfZW52 KTs8YnI+DQrCoCDCoCDCoCDCoCDCoH08YnI+DQpAQCAtNjkwMyw2ICs3MDU2LDcgQEAgc3RhdGlj IHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KRGlzYXNDb250 ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgaWYgKENPREU2NChzKSk8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQrCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVf Y2Nfb3Aocyk7PGJyPg0KKyDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJyPg0KwqAgwqAg wqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PGJyPg0KwqAgwqAg wqAgwqAgwqBnZW5faGVscGVyX2ludG8oY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLSZndDtwYyAt IHBjX3N0YXJ0KSk7PGJyPg0KwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQpAQCAtNjk2Nyw3ICs3 MTIxLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYs PGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqBp ZiAobW9kID09IDMpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PGJy Pg0KwqAgwqAgwqAgwqAgwqBnZW5fb3BfbW92X3ZfcmVnKG90LCBjcHVfVFswXSwgcmVnKTs8YnI+ DQotIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKg IMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDC oGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8YnI+DQrCoCDCoCDCoCDCoCDC oHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOzxicj4NCsKgIMKg IMKgIMKgIMKgaWYgKG90ID09IE1PXzE2KSB7PGJyPg0KPC9kaXY+QEAgLTcwOTUsNiArNzI0OSw3 IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4N CjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzxi cj4NCsKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQo8L2Rpdj7CoCDCoCDCoCDCoCDCoCDCoCDC oGdlbl91cGRhdGVfY2Nfb3Aocyk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVf ZXAocyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0m Z3Q7Y3NfYmFzZSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX3N5c2V4aXQo Y3B1X2VudiwgdGNnX2NvbnN0X2kzMihkZmxhZyAtIDEpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoGdlbl9lb2Iocyk7PGJyPg0KQEAgLTcxMDQsNiArNzI1OSw3IEBAIHN0YXRpYyB0YXJnZXRf dWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCkRpc2FzQ29udGV4dCAqcyw8 YnI+DQrCoCDCoCDCoGNhc2UgMHgxMDU6IC8qIHN5c2NhbGwgKi88YnI+DQrCoCDCoCDCoCDCoCDC oC8qIFhYWDogaXMgaXQgdXNhYmxlIGluIHJlYWwgbW9kZSA/ICovPGJyPg0KwqAgwqAgwqAgwqAg wqBnZW5fdXBkYXRlX2NjX29wKHMpOzxicj4NCisgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2VwKHMp Ozxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2Up Ozxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9zeXNjYWxsKGNwdV9lbnYsIHRjZ19jb25z dF9pMzIocy0mZ3Q7cGMgLSBwY19zdGFydCkpOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2VvYihz KTs8YnI+DQpAQCAtNzExMyw2ICs3MjY5LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19p bnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMs PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBj X3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PGJyPg0KwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4N CjwvZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+DQorIMKg IMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoGdlbl9oZWxwZXJfc3lzcmV0KGNwdV9lbnYsIHRjZ19jb25zdF9pMzIoZGZsYWcgLSAx KSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBjb25kaXRpb24gY29kZXMgYXJlIG1vZGlm aWVkIG9ubHkgaW4gbG9uZyBtb2RlICovPGJyPg0KQEAgLTcxMzMsNiArNzI5MCw3IEBAIHN0YXRp YyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xh c3M9IiI+RGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2V4Y2Vw dGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzxicj4NCsKgIMKg IMKgIMKgIMKgfSBlbHNlIHs8YnI+DQo8L2Rpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRh dGVfY2Nfb3Aocyk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFz ZSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2hsdChjcHVfZW52LCB0Y2df Y29uc3RfaTMyKHMtJmd0O3BjIC0gcGNfc3RhcnQpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oHMtJmd0O2lzX2ptcCA9IERJU0FTX1RCX0pVTVA7PGJyPg0KQEAgLTcxNDksNyArNzMwNyw3IEBA IHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxk aXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2Vu X3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX0xEVFJfUkVBRCk7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52 LDxicj4NCm9mZnNldG9mKENQVVg4NlN0YXRlLGxkdC5zZWxlY3RvcikpOzxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgb3QgPSBtb2QgPT0gMyA/IGRmbGFnIDogTU9fMTY7PGJyPg0KLSDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAxKTs8 YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3Qs IE9SX1RNUDAsIDEsIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KwqAg wqAgwqAgwqAgwqBjYXNlIDI6IC8qIGxsZHQgKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlm ICghcy0mZ3Q7cGUgfHwgcy0mZ3Q7dm04Nik8YnI+DQo8L2Rpdj5AQCAtNzE1OCw3ICs3MzE2LDcg QEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0K PGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFz ZSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElU X0xEVFJfV1JJVEUpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2Ry bShlbnYsIHMsIG1vZHJtLCBNT18xNiwgT1JfVE1QMCwgMCk7PGJyPg0KKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE1PXzE2LCBPUl9UTVAwLCAw LCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQg LSBzLSZndDtjc19iYXNlKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5f dHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9sbGR0KGNwdV9lbnYsIGNwdV90bXAyX2kzMik7PGJyPg0K PC9kaXY+QEAgLTcxNzAsNyArNzMyOCw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5z bihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLDxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3Rh cnQsIFNWTV9FWElUX1RSX1JFQUQpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9s ZDMydV90bChjcHVfVFswXSwgY3B1X2Vudiw8YnI+DQpvZmZzZXRvZihDUFVYODZTdGF0ZSx0ci5z ZWxlY3RvcikpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgb3QgPSBtb2QgPT0gMyA/IGRmbGFn IDogTU9fMTY7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywg bW9kcm0sIG90LCBPUl9UTVAwLCAxKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xkc3Rf bW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDEsIGIpOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgYnJlYWs7PGJyPg0KwqAgwqAgwqAgwqAgwqBjYXNlIDM6IC8qIGx0ciAqLzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKCFzLSZndDtwZSB8fCBzLSZndDt2bTg2KTxicj4NCjwv ZGl2PkBAIC03MTc5LDcgKzczMzcsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24o Q1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcyw8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9leGNlcHRpb24ocywgRVhDUDBEX0dQRiwg cGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxz ZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fc3ZtX2NoZWNrX2ludGVyY2Vw dChzLCBwY19zdGFydCwgU1ZNX0VYSVRfVFJfV1JJVEUpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT18xNiwgT1JfVE1QMCwgMCk7 PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9k cm0sIE1PXzE2LCBPUl9UTVAwLCAwLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNlKTs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0p Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9sdHIoY3B1X2Vudiwg Y3B1X3RtcDJfaTMyKTs8YnI+DQo8L2Rpdj5AQCAtNzE4OSw3ICs3MzQ3LDcgQEAgc3RhdGljIHRh cmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KRGlzYXNDb250ZXh0 ICpzLDxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqBjYXNlIDU6IC8qIHZlcncgKi88 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghcy0mZ3Q7cGUgfHwgcy0mZ3Q7dm04Nik8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQotIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RNUDAs IDApOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJt LCBNT18xNiwgT1JfVE1QMCwgMCwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBk YXRlX2NjX29wKHMpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG9wID09IDQpIHs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfdmVycihjcHVfZW52LCBjcHVf VFswXSk7PGJyPg0KPC9kaXY+QEAgLTcyMTIsNyArNzM3MCw3IEBAIHN0YXRpYyB0YXJnZXRfdWxv bmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXND b250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCA9PSAzKTxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX0dE VFJfUkVBRCk7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBt b2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2Ry bSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBd LCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSw8YnI+DQpnZHQubGltaXQpKTs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9zdF92KHMsIE1PXzE2LCBjcHVfVFswXSwgY3B1X0Ew KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9hZGRfQTBfaW0ocywgMik7PGJyPg0KPC9k aXY+QEAgLTcyNDEsNiArNzM5OSw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihD UFVYODZTdGF0ZSAqZW52LDxicj4NCkRpc2FzQ29udGV4dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHMtJmd0O2NwbCAhPSAwKTxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+DQorIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZndDtjc19iYXNl KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfbXdhaXQo Y3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLSZndDtwYyAtIHBjX3N0YXJ0KSk7PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZW9iKHMpOzxicj4NCkBAIC03MjY4LDcgKzc0 MjcsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8 YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7IC8qIHNpZHQgKi88 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9zdm1fY2hlY2tfaW50ZXJjZXB0KHMs IHBjX3N0YXJ0LCBTVk1fRVhJVF9JRFRSX1JFQUQpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9sZDMydV90bChjcHVfVFswXSwgY3B1X2Vudiw8YnI+DQpv ZmZzZXRvZihDUFVYODZTdGF0ZSwgaWR0LmxpbWl0KSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fb3Bfc3RfdihzLCBNT18xNiwgY3B1X1RbMF0sIGNwdV9BMCk7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fYWRkX0EwX2ltKHMsIDIpOzxicj4NCjwvZGl2PkBA IC03MzcxLDcgKzc1MzAsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2 U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcyw8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn ZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCw8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wPT0yID8gU1ZN X0VYSVRfR0RUUl9XUklURSA6PGJyPg0KU1ZNX0VYSVRfSURUUl9XUklURSk7PGJyPg0KLSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgYik7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3BfbGRfdihzLCBNT18xNiwgY3B1X1Rb MV0sIGNwdV9BMCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fYWRkX0EwX2lt KHMsIDIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wX2xkX3YocywgQ09E RTY0KHMpICsgTU9fMzIsIGNwdV9UWzBdLCBjcHVfQTApOzxicj4NCjwvZGl2PkBAIC03Mzk0LDE0 ICs3NTUzLDE0IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZTxi cj4NCjxkaXYgY2xhc3M9IiI+KmVudiwgRGlzYXNDb250ZXh0ICpzLDxicj4NCsKgI2Vsc2U8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19nZW5fbGQzMnVfdGwoY3B1X1RbMF0sIGNwdV9lbnYs IG9mZnNldG9mKENQVVg4NlN0YXRlLGNyWzBdKSk7PGJyPg0KwqAjZW5kaWY8YnI+DQotIMKgIMKg IMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RNUDAs IDEpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJt LCBNT18xNiwgT1JfVE1QMCwgMSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8 YnI+DQrCoCDCoCDCoCDCoCDCoGNhc2UgNjogLyogbG1zdyAqLzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgaWYgKHMtJmd0O2NwbCAhPSAwKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9IGVsc2Ugezxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX1dS SVRFX0NSMCk7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVu diwgcywgbW9kcm0sIE1PXzE2LCBPUl9UTVAwLCAwKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgTU9fMTYsIE9SX1RNUDAsIDAsIGIp Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9sbXN3KGNwdV9lbnYs IGNwdV9UWzBdKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocy0m Z3Q7cGMgLSBzLSZndDtjc19iYXNlKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdl bl9lb2Iocyk7PGJyPg0KPC9kaXY+QEAgLTc0MTMsOCArNzU3Miw5IEBAIHN0YXRpYyB0YXJnZXRf dWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4NCkRpc2FzQ29udGV4dCAqcyw8 YnI+DQo8ZGl2IGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2V4 Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIHs8YnI+DQo8L2Rpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PGJyPg0KKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJyPg0KPGRpdiBjbGFzcz0iIj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLSZn dDtjc19iYXNlKTs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9t b2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl9oZWxwZXJfaW52bHBnKGNwdV9lbnYsIGNwdV9BMCk7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fam1wX2ltKHMtJmd0O3BjIC0gcy0mZ3Q7 Y3NfYmFzZSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fZW9iKHMp Ozxicj4NCjwvZGl2PkBAIC03NDQ2LDYgKzc2MDYsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRp c2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQpEaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoIShzLSZndDtjcHVpZF9leHQyX2ZlYXR1 cmVzICZhbXA7IENQVUlEX0VYVDJfUkRUU0NQKSk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfY2Nfb3Aocyk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGdlbl91cGRhdGVfZXAocyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0mZ3Q7Y3NfYmFzZSk7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAodXNlX2ljb3VudCk8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9pb19zdGFydCgpOzxicj4NCkBAIC03 NDkzLDcgKzc2NTQsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3Rh dGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4dCAqcyw8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9v cF9tb3ZfcmVnX3YoZF9vdCwgcmVnLCBjcHVfVFswXSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqB9IGVsc2Ugezxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVu diwgcywgbW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJt KGVudiwgcywgbW9kcm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29w X2xkX3YocywgTU9fMzIgfCBNT19TSUdOLCBjcHVfVFswXSwgY3B1X0EwKTs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9tb3ZfcmVnX3YoZF9vdCwgcmVnLCBjcHVfVFswXSk7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KPC9kaXY+QEAgLTc1MTQsNyArNzY3NSw3 IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZSAqZW52LDxicj4N CjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg bW9kID0gKG1vZHJtICZndDsmZ3Q7IDYpICZhbXA7IDM7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqBybSA9IG1vZHJtICZhbXA7IDc7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kICE9 IDMpIHs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMs IG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYs IHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcF9sZF92 KHMsIG90LCB0MCwgY3B1X0EwKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGEwID0g dGNnX3RlbXBfbG9jYWxfbmV3KCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2df Z2VuX21vdl90bChhMCwgY3B1X0EwKTs8YnI+DQo8L2Rpdj5AQCAtNzU1Niw3ICs3NzE3LDcgQEAg c3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KPGRp diBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBvdCA9 IGRmbGFnICE9IE1PXzE2ID8gTU9fMzIgOiBNT18xNjs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtJmd0O3BjKyspOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgcmVnID0gKChtb2RybSAmZ3Q7Jmd0OyAzKSAmYW1wOyA3KSB8IHJleF9yOzxicj4N Ci0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBNT18xNiwg T1JfVE1QMCwgMCk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwg cywgbW9kcm0sIE1PXzE2LCBPUl9UTVAwLCAwLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oHQwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5f dXBkYXRlX2NjX29wKHMpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGIgPT0gMHgxMDIp IHs8YnI+DQo8L2Rpdj5AQCAtNzU4NCw3ICs3NzQ1LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBk aXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KRGlzYXNDb250ZXh0ICpzLDxicj4NCjxk aXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqBjYXNlIDM6IC8qIHByZWZldGNobnQwICovPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAobW9kID09IDMpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFf bW9kcm0oZW52LCBzLCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9k cm0oZW52LCBzLCBtb2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBub3RoaW5n IG1vcmUgdG8gZG8gKi88YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCsKgIMKg IMKgIMKgIMKgZGVmYXVsdDogLyogbm9wIChtdWx0aSBieXRlKSAqLzxicj4NCjwvZGl2PkBAIC03 NjI0LDYgKzc3ODUsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3Rh dGUgKmVudiw8YnI+DQpEaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBj YXNlIDQ6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBjYXNlIDg6PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzxicj4NCisgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBnZW5fdXBkYXRlX2VwKHMpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Z2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgaWYgKGIgJmFtcDsgMikgezxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3BfbW92X3ZfcmVnKG90LCBjcHVfVFswXSwgcm0p Ozxicj4NCjwvZGl2PkBAIC03Njk2LDcgKzc4NTgsNyBAQCBzdGF0aWMgdGFyZ2V0X3Vsb25nIGRp c2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQo8ZGl2IGNsYXNzPSIiPkRpc2FzQ29udGV4 dCAqcyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQrCoCDC oCDCoCDCoCDCoHJlZyA9ICgobW9kcm0gJmd0OyZndDsgMykgJmFtcDsgNykgfCByZXhfcjs8YnI+ DQrCoCDCoCDCoCDCoCDCoC8qIGdlbmVyYXRlIGEgZ2VuZXJpYyBzdG9yZSAqLzxicj4NCi0gwqAg wqAgwqAgwqBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgcmVnLCAxKTs8YnI+DQor IMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIHJlZywgMSwgYik7 PGJyPg0KwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQrCoCDCoCDCoGNhc2UgMHgxYWU6PGJyPg0K wqAgwqAgwqAgwqAgwqBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLSZndDtwYysrKTs8YnI+ DQo8L2Rpdj5AQCAtNzcwNCw2ICs3ODY2LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19p bnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0KRGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKgIMKg IMKgIMKgb3AgPSAobW9kcm0gJmd0OyZndDsgMykgJmFtcDsgNzs8YnI+DQrCoCDCoCDCoCDCoCDC oHN3aXRjaChvcCkgezxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAwOiAvKiBmeHNhdmUgKi88YnI+ DQorIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8YnI+DQo8ZGl2IGNsYXNzPSIi PsKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG1vZCA9PSAzIHx8ICEocy0mZ3Q7Y3B1aWRfZmVhdHVy ZXMgJmFtcDsgQ1BVSURfRlhTUikgfHw8YnI+DQo8L2Rpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoChzLSZndDtwcmVmaXggJmFtcDsgUFJFRklYX0xPQ0spKTxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZ290byBpbGxlZ2FsX29wOzxicj4NCkBAIC03NzExLDEwICs3ODc0LDEzIEBA IHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZTdGF0ZTxicj4NCjxkaXYgY2xh c3M9IiI+KmVudiwgRGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMDdfUFJFWCwgcGNfc3RhcnQgLSBzLSZndDtjc19iYXNl KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgfTxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywg bW9kcm0pOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9k cm0sIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9jY19vcChzKTs8YnI+ DQo8L2Rpdj4rIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX3VwZGF0ZV9lcChzKTs8YnI+DQo8ZGl2IGNs YXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2Nz X2Jhc2UpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2Z4c2F2ZShjcHVfZW52 LCBjcHVfQTAsIHRjZ19jb25zdF9pMzIoZGZsYWcgPT0gTU9fNjQpKTs8YnI+DQorIMKgIMKgIMKg IMKgIMKgIMKgZ2VuX2hlbHBlcl9meHNhdmUoY3B1X2VudiwgY3B1X0EwLDxicj4NCisgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfY29uc3RfaTMyKGRmbGFn ID09IE1PXzMyKSw8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgdGNnX2NvbnN0X2kzMihkZmxhZyA9PSBNT182NCkpOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgYnJlYWs7PGJyPg0KwqAgwqAgwqAgwqAgwqBjYXNlIDE6IC8qIGZ4cnN0b3IgKi88YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChtb2QgPT0gMyB8fCAhKHMtJmd0O2NwdWlkX2ZlYXR1 cmVzICZhbXA7IENQVUlEX0ZYU1IpIHx8PGJyPg0KPC9kaXY+QEAgLTc3MjQsMTAgKzc4OTAsMTIg QEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlPGJyPg0KPGRpdiBj bGFzcz0iIj4qZW52LCBEaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwN19QUkVYLCBwY19zdGFydCAtIHMtJmd0O2NzX2Jh c2UpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqB9PGJyPg0KLSDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBz LCBtb2RybSk7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9sZWFfbW9kcm0oZW52LCBzLCBt b2RybSwgYik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtJmd0O2NzX2Jh c2UpOzxicj4NCi0gwqAgwqAgwqAgwqAgwqAgwqBnZW5faGVscGVyX2Z4cnN0b3IoY3B1X2Vudiwg Y3B1X0EwLCB0Y2dfY29uc3RfaTMyKGRmbGFnID09IE1PXzY0KSk7PGJyPg0KKyDCoCDCoCDCoCDC oCDCoCDCoGdlbl9oZWxwZXJfZnhyc3RvcihjcHVfZW52LCBjcHVfQTAsPGJyPg0KKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0Y2dfY29uc3RfaTMyKGRmbGFn ID09IE1PXzMyKSw8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHRjZ19jb25zdF9pMzIoZGZsYWcgPT0gTU9fNjQpKTs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoGJyZWFrOzxicj4NCsKgIMKgIMKgIMKgIMKgY2FzZSAyOiAvKiBsZG14Y3NyICovPGJy Pg0KwqAgwqAgwqAgwqAgwqBjYXNlIDM6IC8qIHN0bXhjc3IgKi88YnI+DQo8L2Rpdj5AQCAtNzcz OCw3ICs3OTA2LDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRl ICplbnYsPGJyPg0KPGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqBpZiAoKHMtJmd0O2ZsYWdzICZhbXA7IEhGX0VNX01BU0spIHx8ICEocy0mZ3Q7 ZmxhZ3MgJmFtcDsgSEZfT1NGWFNSX01BU0spIHx8PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBtb2QgPT0gMyk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdh bF9vcDs8YnI+DQotIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJt KTs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBi KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChvcCA9PSAyKSB7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB0Y2dfZ2VuX3FlbXVfbGRfaTMyKGNwdV90bXAyX2kzMiwgY3B1X0Ew LDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgcy0mZ3Q7bWVtX2luZGV4LCBNT19MRVVMKTs8YnI+DQo8L2Rpdj5AQCAtNzc2Myw3ICs3 OTMxLDcgQEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYs PGJyPg0KRGlzYXNDb250ZXh0ICpzLDxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAvKiBjbGZsdXNoICovPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp ZiAoIShzLSZndDtjcHVpZF9mZWF0dXJlcyAmYW1wOyBDUFVJRF9DTEZMVVNIKSk8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQotIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxi cj4NCsKgIMKgIMKgIMKgIMKgZGVmYXVsdDo8YnI+DQo8L2Rpdj5AQCAtNzc3NSw3ICs3OTQzLDcg QEAgc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsPGJyPg0K PGRpdiBjbGFzcz0iIj5EaXNhc0NvbnRleHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqBtb2QgPSAo bW9kcm0gJmd0OyZndDsgNikgJmFtcDsgMzs8YnI+DQrCoCDCoCDCoCDCoCDCoGlmIChtb2QgPT0g Myk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gaWxsZWdhbF9vcDs8YnI+DQotIMKgIMKg IMKgIMKgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtKTs8YnI+DQorIMKgIMKgIMKgIMKgZ2Vu X2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCBiKTs8YnI+DQrCoCDCoCDCoCDCoCDCoC8qIGlnbm9y ZSBmb3Igbm93ICovPGJyPg0KwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQrCoCDCoCDCoGNhc2Ug MHgxYWE6IC8qIHJzbSAqLzxicj4NCjwvZGl2PkBAIC03NzgzLDYgKzc5NTEsNyBAQCBzdGF0aWMg dGFyZ2V0X3Vsb25nIGRpc2FzX2luc24oQ1BVWDg2U3RhdGUgKmVudiw8YnI+DQpEaXNhc0NvbnRl eHQgKnMsPGJyPg0KwqAgwqAgwqAgwqAgwqBpZiAoIShzLSZndDtmbGFncyAmYW1wOyBIRl9TTU1f TUFTSykpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqBnb3RvIGlsbGVnYWxfb3A7PGJyPg0KwqAg wqAgwqAgwqAgwqBnZW5fdXBkYXRlX2NjX29wKHMpOzxicj4NCisgwqAgwqAgwqAgwqBnZW5fdXBk YXRlX2VwKHMpOzxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqBnZW5fam1wX2ltKHMt Jmd0O3BjIC0gcy0mZ3Q7Y3NfYmFzZSk7PGJyPg0KPC9kaXY+wqAgwqAgwqAgwqAgwqBnZW5faGVs cGVyX3JzbShjcHVfZW52KTs8YnI+DQrCoCDCoCDCoCDCoCDCoGdlbl9lb2Iocyk7PGJyPg0KQEAg LTc4MDMsNyArNzk3Miw3IEBAIHN0YXRpYyB0YXJnZXRfdWxvbmcgZGlzYXNfaW5zbihDUFVYODZT dGF0ZSAqZW52LDxicj4NCjxkaXYgY2xhc3M9IiI+RGlzYXNDb250ZXh0ICpzLDxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgb3QgPSBtb182NF8zMihkZmxhZyk7PGJyPg0KwqAgwqAgwqAgwqAgwqB9 PGJyPg0KPGJyPg0KLSDCoCDCoCDCoCDCoGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90 LCBPUl9UTVAwLCAwKTs8YnI+DQorIMKgIMKgIMKgIMKgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBt b2RybSwgb3QsIE9SX1RNUDAsIDAsIGIpOzxicj4NCsKgIMKgIMKgIMKgIMKgZ2VuX2hlbHBlcl9w b3BjbnQoY3B1X1RbMF0sIGNwdV9lbnYsIGNwdV9UWzBdLCB0Y2dfY29uc3RfaTMyKG90KSk7PGJy Pg0KwqAgwqAgwqAgwqAgwqBnZW5fb3BfbW92X3JlZ192KG90LCByZWcsIGNwdV9UWzBdKTs8YnI+ DQo8YnI+DQo8L2Rpdj5AQCAtNzg4MCw2ICs4MDQ5LDE3IEBAIHZvaWQgb3B0aW1pemVfZmxhZ3Nf aW5pdCh2b2lkKTxicj4NCjxkaXYgY2xhc3M9IiI+wqAgwqAgwqBjcHVfY2Nfc3JjMiA9IHRjZ19n bG9iYWxfbWVtX25ldyhUQ0dfQVJFRzAsIG9mZnNldG9mKENQVVg4NlN0YXRlLCBjY19zcmMyKSw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCAmcXVvdDtjY19zcmMyJnF1b3Q7KTs8YnI+DQo8YnI+DQorIMKgIMKgY3B1X2Zwb3AgPSB0 Y2dfZ2xvYmFsX21lbV9uZXdfaTMyKFRDR19BUkVHMCw8YnI+DQo8L2Rpdj4rIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb2Zmc2V0b2YoQ1BV WDg2U3RhdGUsIGZwb3ApLCAmcXVvdDtmcG9wJnF1b3Q7KTs8YnI+DQo8ZGl2IGNsYXNzPSIiPisg wqAgwqBjcHVfZnBpcCA9IHRjZ19nbG9iYWxfbWVtX25ldyhUQ0dfQVJFRzAsIG9mZnNldG9mKENQ VVg4NlN0YXRlLCBmcGlwKSw8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O2ZwaXAmcXVvdDspOzxicj4NCisgwqAgwqBjcHVf ZnBkcCA9IHRjZ19nbG9iYWxfbWVtX25ldyhUQ0dfQVJFRzAsIG9mZnNldG9mKENQVVg4NlN0YXRl LCBmcGRwKSw8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgICZxdW90O2ZwZHAmcXVvdDspOzxicj4NCisgwqAgwqBjcHVfZnBkcyA9IHRj Z19nbG9iYWxfbWVtX25ld19pMzIoVENHX0FSRUcwLCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgZnBk cyksPGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAmcXVvdDtmcGRzJnF1b3Q7KTs8YnI+DQorIMKgIMKgY3B1X2ZwY3MgPSB0Y2dfZ2xv YmFsX21lbV9uZXdfaTMyKFRDR19BUkVHMCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGZwY3MpLDxi cj4NCisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgJnF1b3Q7ZnBjcyZxdW90Oyk7PGJyPg0KKzxicj4NCsKgIMKgIMKgZm9yIChpID0gMDsgaSAm bHQ7IENQVV9OQl9SRUdTOyArK2kpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoGNwdV9yZWdzW2ldID0g dGNnX2dsb2JhbF9tZW1fbmV3KFRDR19BUkVHMCw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBvZmZzZXRvZihDUFVYODZT dGF0ZSwgcmVnc1tpXSksPGJyPg0KPC9kaXY+QEAgLTc5MjQsNiArODEwNCw4IEBAIHN0YXRpYyBp bmxpbmUgdm9pZDxicj4NCmdlbl9pbnRlcm1lZGlhdGVfY29kZV9pbnRlcm5hbChYODZDUFUgKmNw dSw8YnI+DQrCoCDCoCDCoGRjLSZndDtzaW5nbGVzdGVwX2VuYWJsZWQgPSBjcy0mZ3Q7c2luZ2xl c3RlcF9lbmFibGVkOzxicj4NCsKgIMKgIMKgZGMtJmd0O2NjX29wID0gQ0NfT1BfRFlOQU1JQzs8 YnI+DQrCoCDCoCDCoGRjLSZndDtjY19vcF9kaXJ0eSA9IGZhbHNlOzxicj4NCisgwqAgwqBkYy0m Z3Q7ZnBfb3AgPSBGUF9FUF9JTlZBTElEOzxicj4NCisgwqAgwqBkYy0mZ3Q7ZnBfZXBfZGlydHkg PSBmYWxzZTs8YnI+DQrCoCDCoCDCoGRjLSZndDtjc19iYXNlID0gY3NfYmFzZTs8YnI+DQrCoCDC oCDCoGRjLSZndDt0YiA9IHRiOzxicj4NCsKgIMKgIMKgZGMtJmd0O3BvcGxfZXNwX2hhY2sgPSAw Ozxicj4NCkBAIC03OTk3LDYgKzgxNzksOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQ8YnI+DQpnZW5f aW50ZXJtZWRpYXRlX2NvZGVfaW50ZXJuYWwoWDg2Q1BVICpjcHUsPGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfY3R4Lmdlbl9vcGNfcGNbbGpd ID0gcGNfcHRyOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wY19jY19vcFtsal0gPSBk Yy0mZ3Q7Y2Nfb3A7PGJyPg0KKyDCoCDCoCDCoCDCoCDCoCDCoGdlbl9vcGNfZnBfb3BbbGpdID0g ZGMtJmd0O2ZwX29wOzxicj4NCisgwqAgwqAgwqAgwqAgwqAgwqBnZW5fb3BjX2ZwX2lwW2xqXSA9 IGRjLSZndDtmcF9pcDs8YnI+DQorIMKgIMKgIMKgIMKgIMKgIMKgZ2VuX29wY19mcF9jc1tsal0g PSBkYy0mZ3Q7ZnBfY3M7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqB0Y2dfY3R4Lmdlbl9vcGNf aW5zdHJfc3RhcnRbbGpdID0gMTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoHRjZ19jdHguZ2Vu X29wY19pY291bnRbbGpdID0gbnVtX2luc25zOzxicj4NCsKgIMKgIMKgIMKgIMKgfTxicj4NCkBA IC04MDgwLDYgKzgyNjUsNyBAQCB2b2lkIGdlbl9pbnRlcm1lZGlhdGVfY29kZV9wYyhDUFVYODZT dGF0ZSAqZW52LDxicj4NClRyYW5zbGF0aW9uQmxvY2sgKnRiKTxicj4NCsKgdm9pZCByZXN0b3Jl X3N0YXRlX3RvX29wYyhDUFVYODZTdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YiwgaW50 IHBjX3Bvcyk8YnI+DQrCoHs8YnI+DQrCoCDCoCDCoGludCBjY19vcDs8YnI+DQorIMKgIMKgdWlu dDE2X3QgZnBfb3A7PGJyPg0KwqAjaWZkZWYgREVCVUdfRElTQVM8YnI+DQrCoCDCoCDCoGlmIChx ZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19UQl9PUCkpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoGlu dCBpOzxicj4NCkBAIC04MDk5LDQgKzgyODUsMTAgQEAgdm9pZCByZXN0b3JlX3N0YXRlX3RvX29w YyhDUFVYODZTdGF0ZSAqZW52LDxicj4NClRyYW5zbGF0aW9uQmxvY2sgKnRiLCBpbnQgcGNfcG9z KTxicj4NCsKgIMKgIMKgY2Nfb3AgPSBnZW5fb3BjX2NjX29wW3BjX3Bvc107PGJyPg0KwqAgwqAg wqBpZiAoY2Nfb3AgIT0gQ0NfT1BfRFlOQU1JQyk8YnI+DQrCoCDCoCDCoCDCoCDCoGVudi0mZ3Q7 Y2Nfb3AgPSBjY19vcDs8YnI+DQorIMKgIMKgZnBfb3AgPSBnZW5fb3BjX2ZwX29wW3BjX3Bvc107 PGJyPg0KKyDCoCDCoGlmIChmcF9vcCAmYW1wOyBGUF9FUF9WQUxJRCkgezxicj4NCisgwqAgwqAg wqAgwqB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9mcG9wLCBmcF9vcCk7PGJyPg0KKyDCoCDCoCDCoCDC oHRjZ19nZW5fbW92aV90bChjcHVfZnBpcCwgZ2VuX29wY19mcF9pcFtwY19wb3NdKTs8YnI+DQor IMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZpX2kzMihjcHVfZnBjcywgZ2VuX29wY19mcF9jc1twY19w b3NdKTs8YnI+DQorIMKgIMKgfTxicj4NCjxkaXYgY2xhc3M9IiI+PGRpdiBjbGFzcz0iaDUiPsKg fTxicj4NCjxicj4NCk9uIFN1biwgSnVuIDIyLCAyMDE0IGF0IDk6MTcgUE0sIEphdW1lIE1hcnTD rSAmbHQ7PGEgaHJlZj0ibWFpbHRvOmphdW1lLm1hcnRpZkBnbWFpbC5jb20iPmphdW1lLm1hcnRp ZkBnbWFpbC5jb208L2E+Jmd0OyB3cm90ZTo8YnI+DQomZ3Q7IFRoYW5rcyBSaWNoYXJkIGZvciB5 b3VyIGZlZWRiYWNrLiBJIGFtIGdvaW5nIHRvIGNvcnJlY3QgdGhlIHBhdGNoIGFuZDxicj4NCiZn dDsgcmVzdWJtaXQgaXQuPGJyPg0KJmd0Ozxicj4NCiZndDsgQmVzdCByZWdhcmRzLDxicj4NCiZn dDsgSmF1bWU8YnI+DQomZ3Q7PGJyPg0KJmd0OyBPbiBTdW4sIEp1biAyMiwgMjAxNCBhdCA4OjU1 IFBNLCBSaWNoYXJkIEhlbmRlcnNvbiAmbHQ7PGEgaHJlZj0ibWFpbHRvOnJ0aEB0d2lkZGxlLm5l dCI+cnRoQHR3aWRkbGUubmV0PC9hPiZndDsgd3JvdGU6PGJyPg0KJmd0OyZndDsgT24gMDYvMjIv MjAxNCAwNzo1NSBBTSwgSmF1bWUgTWFydMOtIHdyb3RlOjxicj4NCiZndDsmZ3Q7Jmd0OyAtIMKg IMKgIMKgIMKgY3B1X3g4Nl9mc2F2ZShlbnYsIGZwc3RhdGVfYWRkciwgMSk7PGJyPg0KJmd0OyZn dDsmZ3Q7IC0gwqAgwqAgwqAgwqBmcHN0YXRlLSZndDtzdGF0dXMgPSBmcHN0YXRlLSZndDtzdzs8 YnI+DQomZ3Q7Jmd0OyZndDsgLSDCoCDCoCDCoCDCoG1hZ2ljID0gMHhmZmZmOzxicj4NCiZndDsm Z3Q7Jmd0OyArIMKgIMKgY3B1X3g4Nl9mc2F2ZShlbnYsIGZwc3RhdGVfYWRkcik7PGJyPg0KJmd0 OyZndDsmZ3Q7ICsgwqAgwqBmcHN0YXRlLSZndDtzdGF0dXMgPSBmcHN0YXRlLSZndDtzdzs8YnI+ DQomZ3Q7Jmd0OyZndDsgKyDCoCDCoG1hZ2ljID0gMHhmZmZmOzxicj4NCiZndDsmZ3Q7PGJyPg0K Jmd0OyZndDsgVGhpcyBwYXRjaCBuZWVkcyB0byBiZSBzcGxpdCBpbnRvIGZvcm1hdCBmaXhlcyBh bmQgdGhlIGFjdHVhbCBjaGFuZ2UgdG8gYmU8YnI+DQomZ3Q7Jmd0OyByZXZpZXdlZC48YnI+DQom Z3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7Jmd0OyAtIMKgIMKgLyogS1ZNLW9ubHkgc28gZmFyICovPGJy Pg0KJmd0OyZndDsmZ3Q7IC0gwqAgwqB1aW50MTZfdCBmcG9wOzxicj4NCiZndDsmZ3Q7Jmd0OyAr IMKgIMKgdW5pb24gezxicj4NCiZndDsmZ3Q7Jmd0OyArIMKgIMKgIMKgIMKgdWludDMyX3QgdGNn Ozxicj4NCiZndDsmZ3Q7Jmd0OyArIMKgIMKgIMKgIMKgdWludDE2X3Qga3ZtOzxicj4NCiZndDsm Z3Q7Jmd0OyArIMKgIMKgfSBmcG9wOzxicj4NCiZndDsmZ3Q7PGJyPg0KJmd0OyZndDsgVGhpcyBp cyBoaWdobHkgcXVlc3Rpb25hYmxlLjxicj4NCiZndDsmZ3Q7PGJyPg0KJmd0OyZndDsmZ3Q7IMKg IMKgIMKgLmZpZWxkcyA9IChWTVN0YXRlRmllbGRbXSkgezxicj4NCiZndDsmZ3Q7Jmd0OyAtIMKg IMKgIMKgIMKgVk1TVEFURV9VSU5UMTYoZW52LmZwb3AsIFg4NkNQVSksPGJyPg0KJmd0OyZndDsm Z3Q7ICsgwqAgwqAgwqAgwqBWTVNUQVRFX1VJTlQxNihlbnYuZnBvcC5rdm0sIFg4NkNQVSksPGJy Pg0KJmd0OyZndDs8YnI+DQomZ3Q7Jmd0OyBZb3UmIzM5O3JlIGJyZWFraW5nIHNhdmUvcmVzdG9y ZSBpbiB0Y2cuIMKgS1ZNIGlzIG5vdCByZXF1aXJlZCBmb3IgbWlncmF0aW9uLjxicj4NCiZndDsm Z3Q7PGJyPg0KJmd0OyZndDsmZ3Q7ICsgwqAgwqAgwqAgwqBpZiAobm9uX2NvbnRyb2xfeDg3X2lu c3RyKG1vZHJtLCBiKSkgezxicj4NCiZndDsmZ3Q7Jmd0OyArIMKgIMKgIMKgIMKgIMKgIMKgdGNn X2dlbl9tb3ZpX2kzMihjcHVfZnBvcCwgKChiICZhbXA7IDB4NykgJmx0OyZsdDsgOCkgfCAobW9k cm0gJmFtcDsgMHhmZikpOzxicj4NCiZndDsmZ3Q7Jmd0OyArIMKgIMKgIMKgIMKgIMKgIMKgdGNn X2dlbl9tb3ZpX3RsKGNwdV9mcGlwLCBwY19zdGFydCAtIHMtJmd0O2NzX2Jhc2UpOzxicj4NCiZn dDsmZ3Q7Jmd0OyArIMKgIMKgIMKgIMKgIMKgIMKgdGNnX2dlbl9tb3ZpX2kzMihjcHVfZnBjcywg ZW52LSZndDtzZWdzW1JfQ1NdLnNlbGVjdG9yKTs8YnI+DQomZ3Q7Jmd0OyZndDsgKyDCoCDCoCDC oCDCoH08YnI+DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IEkgc3Ryb25nbHkgc3VzcGVjdCB5b3Ug Y2FuIGltcGxlbWVudCB0aGlzIGZlYXR1cmUgd2l0aG91dCBoYXZpbmcgdG8gYWRkIDM8YnI+DQom Z3Q7Jmd0OyAobGFyZ2VseSByZWR1bmRhbnQpIHJlZ2lzdGVyIHdyaXRlcyB0byBldmVyeSB4ODcg aW5zdHJ1Y3Rpb24gZXhlY3V0ZWQuPGJyPg0KJmd0OyZndDs8YnI+DQomZ3Q7Jmd0OyBTZWUgaG93 IHJlc3RvcmVfc3RhdGVfdG9fb3BjIHdvcmtzIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIENDX09Q IGR1cmluZzxicj4NCiZndDsmZ3Q7IHRyYW5zbGF0aW9uLiDCoFlvdSBjYW4gZG8gdGhlIHNhbWUg dGhpbmcgdG8gcmVjb3ZlciB0aGVzZSB0aHJlZSB2YWx1ZXMuPGJyPg0KJmd0OyZndDs8YnI+DQom Z3Q7Jmd0OyBZb3UgZG8gaGF2ZSB0byBzeW5jIHRoZXNlIHZhbHVlcyBiZWZvcmUgbm9ybWFsIGV4 aXRzIGZyb20gdGhlIFRCLCBidXQgeW91IG9ubHk8YnI+DQomZ3Q7Jmd0OyBoYXZlIHRvIGRvIHRo YXQgb25jZSwgbm90IG9uY2UgZm9yIGV2ZXJ5IGluc24gZXhlY3V0ZWQuIMKgU2VlIGdlbl91cGRh dGVfY2Nfb3AuPGJyPg0KJmd0OyZndDs8YnI+DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IHJ+PGJy Pg0KPC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjwvZGl2Pjxicj48YnIgY2xlYXI9ImFsbCI+PGRp dj48YnI+PC9kaXY+LS0gPGJyPjxkaXY+SmF1bWU8L2Rpdj4NCjwvZGl2PjwvZGl2Pg0K --089e013d161ef69dc704feb8a8ff--