From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14901 invoked by alias); 12 Apr 2011 14:27:19 -0000 Received: (qmail 14888 invoked by uid 22791); 12 Apr 2011 14:27:17 -0000 X-SWARE-Spam-Status: No, hits=-0.5 required=5.0 tests=AWL,BAYES_60,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_CF,TW_TM X-Spam-Check-By: sourceware.org Received: from mail-wy0-f175.google.com (HELO mail-wy0-f175.google.com) (74.125.82.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 12 Apr 2011 14:27:04 +0000 Received: by wye20 with SMTP id 20so6783244wye.20 for ; Tue, 12 Apr 2011 07:27:02 -0700 (PDT) MIME-Version: 1.0 Received: by 10.227.195.75 with SMTP id eb11mr6857575wbb.120.1302618422004; Tue, 12 Apr 2011 07:27:02 -0700 (PDT) Received: by 10.227.0.140 with HTTP; Tue, 12 Apr 2011 07:27:01 -0700 (PDT) In-Reply-To: <20110412141626.GF23480@codesourcery.com> References: <20110412141626.GF23480@codesourcery.com> Date: Tue, 12 Apr 2011 14:27:00 -0000 Message-ID: Subject: Re: [PATCH] add statistics counting to postreload, copy-rename, and math-opts From: Richard Guenther To: Nathan Froyd Cc: gcc-patches@gcc.gnu.org Content-Type: multipart/mixed; boundary=485b3973ea9552508904a0b97c97 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-04/txt/msg00888.txt.bz2 --485b3973ea9552508904a0b97c97 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 11065 On Tue, Apr 12, 2011 at 4:16 PM, Nathan Froyd wr= ote: > It's a shame more passes don't make use of the statistics_* > infrastructure. =A0This patch is a step towards rectifying that and adds > statistics_counter_event calls to passes mentioned in $SUBJECT. > postreload-gcse already tracked the stats for the dump file and so only > needs the statistics_counter_event calls; the other passes needed to be > taught about the statistics also. > > Tested on x86_64-unknown-linux-gnu. =A0OK to commit? Ok if there are no complaints within 24h. I actually have a local patch adding many of these which I use whenever fiddling with the pass pipeline .= .. (attached). Richard. > -Nathan > > =A0 =A0 =A0 =A0* postreload-gcse.c (gcse_after_reload_main): Add calls to > =A0 =A0 =A0 =A0statistics_counter_event. > =A0 =A0 =A0 =A0* tree-ssa-copyrename.c (stats): Define. > =A0 =A0 =A0 =A0(rename_ssa_copies): Count coalesced SSA_NAMEs. =A0Add cal= l to > =A0 =A0 =A0 =A0statistics_counter_event. > =A0 =A0 =A0 =A0* tree-ssa-math-opts.c (reciprocal_stats, sincos_stats): D= efine. > =A0 =A0 =A0 =A0(bswap_stats, widen_mul_stats): Define. > =A0 =A0 =A0 =A0(insert_reciprocals): Increment rdivs_inserted. > =A0 =A0 =A0 =A0(execute_cse_reciprocals): Zeroize reciprocal_stats. =A0In= crement > =A0 =A0 =A0 =A0rfuncs_inserted. =A0Add calls to statistics_counter_event. > =A0 =A0 =A0 =A0(execute_cse_sincos_1): Increment inserted. > =A0 =A0 =A0 =A0(execute_cse_sincos): Zeroize sincos_stats. =A0Add call to > =A0 =A0 =A0 =A0statistics_counter_event. > =A0 =A0 =A0 =A0(execute_optimize_bswap): Zeroize bswap_stats. =A0Incremen= t fields > =A0 =A0 =A0 =A0of bswap_stats. =A0Add calls to statistics_counter_event. > =A0 =A0 =A0 =A0(convert_mult_to_widen): Increment widen_mults_inserted. > =A0 =A0 =A0 =A0(convert_plusminus_to_widen): Increment maccs_inserted. > =A0 =A0 =A0 =A0(convert_mult_to_fma): Increment fmas_inserted. > =A0 =A0 =A0 =A0(execute_optimize_widening_mul): Zeroize widen_mul_stats. = =A0Add > =A0 =A0 =A0 =A0calls to statistics_counter_event. > > diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c > index 7eeecf4..8e26419 100644 > --- a/gcc/postreload-gcse.c > +++ b/gcc/postreload-gcse.c > @@ -1294,6 +1294,13 @@ gcse_after_reload_main (rtx f ATTRIBUTE_UNUSED) > =A0 =A0 =A0 =A0 =A0fprintf (dump_file, "insns deleted: =A0 %d\n", stats.i= nsns_deleted); > =A0 =A0 =A0 =A0 =A0fprintf (dump_file, "\n\n"); > =A0 =A0 =A0 =A0} > + > + =A0 =A0 =A0statistics_counter_event (cfun, "copies inserted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 stats.copie= s_inserted); > + =A0 =A0 =A0statistics_counter_event (cfun, "moves inserted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 stats.moves= _inserted); > + =A0 =A0 =A0statistics_counter_event (cfun, "insns deleted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 stats.insns= _deleted); > =A0 =A0 } > > =A0 /* We are finished with alias. =A0*/ > diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c > index dfc0b4e..ae4fb5f 100644 > --- a/gcc/tree-ssa-copyrename.c > +++ b/gcc/tree-ssa-copyrename.c > @@ -40,6 +40,12 @@ along with GCC; see the file COPYING3. =A0If not see > =A0#include "tree-pass.h" > =A0#include "langhooks.h" > > +static struct > +{ > + =A0/* Number of copies coalesced. =A0*/ > + =A0int coalesced; > +} stats; > + > =A0/* The following routines implement the SSA copy renaming phase. > > =A0 =A0This optimization looks for copies between 2 SSA_NAMES, either thr= ough a > @@ -360,9 +366,12 @@ rename_ssa_copies (void) > =A0 =A0 =A0 =A0 =A0 =A0 =A0fprintf (debug, "\n"); > =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0} > + =A0 =A0 =A0stats.coalesced++; > =A0 =A0 =A0 replace_ssa_name_symbol (var, SSA_NAME_VAR (part_var)); > =A0 =A0 } > > + =A0statistics_counter_event (cfun, "copies coalesced", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 stats.coalesced); > =A0 delete_var_map (map); > =A0 return updated ? TODO_remove_unused_locals : 0; > =A0} > diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c > index 6e2213c..b9f631e 100644 > --- a/gcc/tree-ssa-math-opts.c > +++ b/gcc/tree-ssa-math-opts.c > @@ -138,6 +138,41 @@ struct occurrence { > =A0 bool bb_has_division; > =A0}; > > +static struct > +{ > + =A0/* Number of 1.0/X ops inserted. =A0*/ > + =A0int rdivs_inserted; > + > + =A0/* Number of 1.0/FUNC ops inserted. =A0*/ > + =A0int rfuncs_inserted; > +} reciprocal_stats; > + > +static struct > +{ > + =A0/* Number of cexpi calls inserted. =A0*/ > + =A0int inserted; > +} sincos_stats; > + > +static struct > +{ > + =A0/* Number of hand-written 32-bit bswaps found. =A0*/ > + =A0int found_32bit; > + > + =A0/* Number of hand-written 64-bit bswaps found. =A0*/ > + =A0int found_64bit; > +} bswap_stats; > + > +static struct > +{ > + =A0/* Number of widening multiplication ops inserted. =A0*/ > + =A0int widen_mults_inserted; > + > + =A0/* Number of integer multiply-and-accumulate ops inserted. =A0*/ > + =A0int maccs_inserted; > + > + =A0/* Number of fp fused multiply-add ops inserted. =A0*/ > + =A0int fmas_inserted; > +} widen_mul_stats; > > =A0/* The instance of "struct occurrence" representing the highest > =A0 =A0interesting block in the dominator tree. =A0*/ > @@ -339,6 +374,8 @@ insert_reciprocals (gimple_stmt_iterator *def_gsi, st= ruct occurrence *occ, > =A0 =A0 =A0 =A0 =A0 gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT); > =A0 =A0 =A0 =A0 } > > + =A0 =A0 =A0reciprocal_stats.rdivs_inserted++; > + > =A0 =A0 =A0 occ->recip_def_stmt =3D new_stmt; > =A0 =A0 } > > @@ -466,6 +503,7 @@ execute_cse_reciprocals (void) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sizeof (st= ruct occurrence), > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0n_basic_bl= ocks / 3 + 1); > > + =A0memset (&reciprocal_stats, 0, sizeof (reciprocal_stats)); > =A0 calculate_dominance_info (CDI_DOMINATORS); > =A0 calculate_dominance_info (CDI_POST_DOMINATORS); > > @@ -568,6 +606,7 @@ execute_cse_reciprocals (void) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gimple_replace_lhs (stmt1, arg1); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gimple_call_set_fndecl (stmt1, fndecl); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0update_stmt (stmt1); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 reciprocal_stats.rfuncs_inserted++; > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0FOR_EACH_IMM_USE_STMT (stmt, ui, arg1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0{ > @@ -580,6 +619,11 @@ execute_cse_reciprocals (void) > =A0 =A0 =A0 =A0} > =A0 =A0 } > > + =A0statistics_counter_event (cfun, "reciprocal divs inserted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 reciprocal_stats.rd= ivs_inserted); > + =A0statistics_counter_event (cfun, "reciprocal functions inserted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 reciprocal_stats.rf= uncs_inserted); > + > =A0 free_dominance_info (CDI_DOMINATORS); > =A0 free_dominance_info (CDI_POST_DOMINATORS); > =A0 free_alloc_pool (occ_pool); > @@ -711,6 +755,7 @@ execute_cse_sincos_1 (tree name) > =A0 =A0 =A0 gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); > =A0 =A0 } > =A0 update_stmt (stmt); > + =A0sincos_stats.inserted++; > > =A0 /* And adjust the recorded old call sites. =A0*/ > =A0 for (i =3D 0; VEC_iterate(gimple, stmts, i, use_stmt); ++i) > @@ -760,6 +805,7 @@ execute_cse_sincos (void) > =A0 bool cfg_changed =3D false; > > =A0 calculate_dominance_info (CDI_DOMINATORS); > + =A0memset (&sincos_stats, 0, sizeof (sincos_stats)); > > =A0 FOR_EACH_BB (bb) > =A0 =A0 { > @@ -793,6 +839,9 @@ execute_cse_sincos (void) > =A0 =A0 =A0 =A0} > =A0 =A0 } > > + =A0statistics_counter_event (cfun, "sincos statements inserted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sincos_stats.insert= ed); > + > =A0 free_dominance_info (CDI_DOMINATORS); > =A0 return cfg_changed ? TODO_cleanup_cfg : 0; > =A0} > @@ -1141,6 +1190,8 @@ execute_optimize_bswap (void) > =A0 =A0 =A0 bswap64_type =3D TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fndec= l))); > =A0 =A0 } > > + =A0memset (&bswap_stats, 0, sizeof (bswap_stats)); > + > =A0 FOR_EACH_BB (bb) > =A0 =A0 { > =A0 =A0 =A0 gimple_stmt_iterator gsi; > @@ -1189,6 +1240,10 @@ execute_optimize_bswap (void) > =A0 =A0 =A0 =A0 =A0 =A0continue; > > =A0 =A0 =A0 =A0 =A0changed =3D true; > + =A0 =A0 =A0 =A0 if (type_size =3D=3D 32) > + =A0 =A0 =A0 =A0 =A0 bswap_stats.found_32bit++; > + =A0 =A0 =A0 =A0 else > + =A0 =A0 =A0 =A0 =A0 bswap_stats.found_64bit++; > > =A0 =A0 =A0 =A0 =A0bswap_tmp =3D bswap_src; > > @@ -1237,6 +1292,11 @@ execute_optimize_bswap (void) > =A0 =A0 =A0 =A0} > =A0 =A0 } > > + =A0statistics_counter_event (cfun, "32-bit bswap implementations found", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bswap_stats.found_3= 2bit); > + =A0statistics_counter_event (cfun, "64-bit bswap implementations found", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bswap_stats.found_6= 4bit); > + > =A0 return (changed ? TODO_dump_func | TODO_update_ssa | TODO_verify_ssa > =A0 =A0 =A0 =A0 =A0| TODO_verify_stmts : 0); > =A0} > @@ -1389,6 +1449,7 @@ convert_mult_to_widen (gimple stmt) > =A0 gimple_assign_set_rhs2 (stmt, fold_convert (type2, rhs2)); > =A0 gimple_assign_set_rhs_code (stmt, WIDEN_MULT_EXPR); > =A0 update_stmt (stmt); > + =A0widen_mul_stats.widen_mults_inserted++; > =A0 return true; > =A0} > > @@ -1491,6 +1552,7 @@ convert_plusminus_to_widen (gimple_stmt_iterator *g= si, gimple stmt, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0fo= ld_convert (type2, mult_rhs2), > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ad= d_rhs); > =A0 update_stmt (gsi_stmt (*gsi)); > + =A0widen_mul_stats.maccs_inserted++; > =A0 return true; > =A0} > > @@ -1666,6 +1728,7 @@ convert_mult_to_fma (gimple mul_stmt, tree op1, tre= e op2) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0mulop1, op2, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0addop); > =A0 =A0 =A0 gsi_replace (&gsi, fma_stmt, true); > + =A0 =A0 =A0widen_mul_stats.fmas_inserted++; > =A0 =A0 } > > =A0 return true; > @@ -1681,6 +1744,8 @@ execute_optimize_widening_mul (void) > =A0 basic_block bb; > =A0 bool cfg_changed =3D false; > > + =A0memset (&widen_mul_stats, 0, sizeof (widen_mul_stats)); > + > =A0 FOR_EACH_BB (bb) > =A0 =A0 { > =A0 =A0 =A0 gimple_stmt_iterator gsi; > @@ -1752,6 +1817,13 @@ execute_optimize_widening_mul (void) > =A0 =A0 =A0 =A0} > =A0 =A0 } > > + =A0statistics_counter_event (cfun, "widening multiplications inserted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 widen_mul_stats.wid= en_mults_inserted); > + =A0statistics_counter_event (cfun, "widening maccs inserted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 widen_mul_stats.mac= cs_inserted); > + =A0statistics_counter_event (cfun, "fused multiply-adds inserted", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 widen_mul_stats.fma= s_inserted); > + > =A0 return cfg_changed ? TODO_cleanup_cfg : 0; > =A0} > > --485b3973ea9552508904a0b97c97 Content-Type: application/octet-stream; name=passes-reorder Content-Disposition: attachment; filename=passes-reorder Content-Transfer-Encoding: base64 X-Attachment-Id: f_gmexcyn40 Content-length: 26523 MjAwOC0wOC0xNCAgUmljaGFyZCBHdWVudGhlciAgPHJndWVudGhlckBzdXNl LmRlPgoKCSogdHJlZS1jZmdjbGVhbnVwLmMgKHJlbW92ZV9mb3J3YXJkZXJf YmxvY2spOiBDb3VudCB0aGUgZXZlbnQuCgkocmVtb3ZlX2ZvcndhcmRlcl9i bG9ja193aXRoX3BoaSk6IExpa2V3aXNlLgoJKiB0cmVlLXNzYS1kc2UuYyAo ZHNlX29wdGltaXplX3N0bXQpOiBDb3VudCB0aGUgbnVtYmVyIG9mCglkZWxl dGVkIHN0b3Jlcy4KCSogdHJlZS1zc2EtZm9yd3Byb3AuYyAocmVtb3ZlX3By b3Bfc291cmNlX2Zyb21fdXNlKTogQ291bnQgdGhlCgludW1iZXIgb2YgZGVs ZXRlZCBzdGF0ZW1lbnRzLgoJKGZvcndhcmRfcHJvcGFnYXRlX2ludG9fZ2lt cGxlX2NvbmQpOiBDb3VudCB0aGUgbnVtYmVyIG9mCglzaW1wbGlmaWVkIGNv bmRpdGlvbnMuCgkoZm9yd2FyZF9wcm9wYWdhdGVfaW50b19jb25kKTogTGlr ZXdpc2UuCgkoZm9yd2FyZF9wcm9wYWdhdGVfYWRkcl9leHByKTogQ291bnQg dGhlIG51bWJlciBvZiBwcm9wYWdhdGVkCglhZGRyZXNzZXMuICBDb3VudCB0 aGUgbnVtYmVyIG9mIGRlbGV0ZWQgc3RhdGVtZW50cy4KCShmb3J3YXJkX3By b3BhZ2F0ZV9jb21wYXJpc29uKTogQ291bnQgdGhlIG51bWJlciBvZiBwcm9w YWdhdGVkCgljb252ZXJzaW9ucy4KCShzaW1wbGlmeV9ub3RfbmVnX2V4cHIp OiBDb3VudCB0aGUgbnVtYmVyIG9mIHByb3BhZ2F0ZWQgbmVnYXRpb25zLgoJ KHNpbXBsaWZ5X2dpbXBsZV9zd2l0Y2gpOiBDb3VudCB0aGUgbnVtYmVyIG9m IHByb3BhZ2F0ZWQgY29udmVyc2lvbnMuCgkodHJlZV9zc2FfZm9yd2FyZF9w cm9wYWdhdGVfc2luZ2xlX3VzZV92YXJzKTogQ291bnQgdGhlIG51bWJlciBv ZgoJZGVsZXRlZCBzdGF0ZW1lbnRzLgoJKiB0cmVlLXNzYS5jIChleGVjdXRl X3VwZGF0ZV9hZGRyZXNzZXNfdGFrZW4pOiBDb3VudCB0aGUgbnVtYmVyCglv ZiB2YXJpYWJsZXMgcHJvbW90ZWQgdG8gcmVnaXN0ZXJzLgoJKiB0cmVlLXRh aWxjYWxsLmMgKG9wdGltaXplX3RhaWxfY2FsbCk6IENvdW50IHRoZSBudW1i ZXIgb2YKCWNvbnZlcnRlZCB0YWlsIHJlY3Vyc2lvbnMuCgkqIGNmZ2hvb2tz LmMgKGRlbGV0ZV9iYXNpY19ibG9jayk6IENvdW50IHRoZSBudW1iZXIgb2Yg ZGVsZXRlZAoJYmFzaWMgYmxvY2tzLgoJKG1lcmdlX2Jsb2Nrcyk6IENvdW50 IHRoZSBudW1iZXIgb2YgbWVyZ2VkIGJsb2Nrcy4KCSogdHJlZS1pbmxpbmUu YyAoZXhwYW5kX2NhbGxfaW5saW5lKTogQ291bnQgdGhlIG51bWJlciBvZiBj YWxscwoJaW5saW5lZC4KCSogdHJlZS1zc2EtcGhpcHJvcC5jIChwcm9wYWdh dGVfd2l0aF9waGkpOiBDb3VudCB0aGUgbnVtYmVyIG9mCgljb252ZXJ0ZWQg bG9hZHMuCgkocGFzc19waGlwcm9wKTogUmVxdWlyZSBQUk9QX2FsaWFzLgoJ KiB0cmVlLXNzYS1pZmNvbWJpbmUuYyAoaWZjb21iaW5lX2lmYW5kaWYpOiBD b3VudCB0aGUgbnVtYmVyIG9mCgljb21iaW5lZCBiaXQgdGVzdHMuCgkoaWZj b21iaW5lX2lmb3JpZik6IExpa2V3aXNlLiAgQ291bnQgdGhlIG51bWJlciBv ZiBjb21iaW5lZAoJY29tcGFyaXNvbnMuCgkqIHRyZWUtc3NhLWxvb3AtaXZj YW5vbi5jICh0cmVlX3Vucm9sbF9sb29wc19jb21wbGV0ZWx5KTogQ291bnQK CXRoZSBudW1iZXIgb2YgdW5yb2xsZWQgbG9vcHMuCgkqIHRyZWUtc3NhLXBo aW9wdC5jIChjb25kaXRpb25hbF9yZXBsYWNlbWVudCk6IENvdW50IHRoZQoJ bnVtYmVyIG9mIHNpbXBsaWZpY2F0aW9ucy4KCSh2YWx1ZV9yZXBsYWNlbWVu dCk6IExpa2V3aXNlLgoJKG1pbm1heF9yZXBsYWNlbWVudCk6IExpa2V3aXNl LgoJKGFic19yZXBsYWNlbWVudCk6IExpa2V3aXNlLgoJKGNvbmRfc3RvcmVf cmVwbGFjZW1lbnQpOiBMaWtld2lzZS4KCgoKSW5kZXg6IHRydW5rL2djYy90 cmVlLWNmZ2NsZWFudXAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiB0 cnVuay5vcmlnL2djYy90cmVlLWNmZ2NsZWFudXAuYwkyMDEwLTA4LTMwIDE1 OjQ1OjA3LjAwMDAwMDAwMCArMDIwMAotLS0gdHJ1bmsvZ2NjL3RyZWUtY2Zn Y2xlYW51cC5jCTIwMTAtMDktMjEgMTM6NDM6MDIuMDAwMDAwMDAwICswMjAw CioqKioqKioqKioqKioqKiByZW1vdmVfZm9yd2FyZGVyX2Jsb2NrIChiYXNp Y19ibG9jayBiYikKKioqIDUzNCw1MzkgKioqKgotLS0gNTM0LDU0MSAtLS0t CiAgICAvKiBBbmQga2lsbCB0aGUgZm9yd2FyZGVyIGJsb2NrLiAgKi8KICAg IGRlbGV0ZV9iYXNpY19ibG9jayAoYmIpOwogIAorICAgc3RhdGlzdGljc19j b3VudGVyX2V2ZW50IChjZnVuLCAiRm9yd2FyZGVyIGJsb2NrcyByZW1vdmVk IiwgMSk7CisgCiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgCioqKioqKioqKioq KioqKiByZW1vdmVfZm9yd2FyZGVyX2Jsb2NrX3dpdGhfcGhpIChiYXNpY19i CioqKiA5MzgsOTQzICoqKioKLS0tIDk0MCw5NDcgLS0tLQogICAgLyogUmVt b3ZlIEJCIHNpbmNlIGFsbCBvZiBCQidzIGluY29taW5nIGVkZ2VzIGhhdmUg YmVlbiByZWRpcmVjdGVkCiAgICAgICB0byBERVNULiAgKi8KICAgIGRlbGV0 ZV9iYXNpY19ibG9jayAoYmIpOworIAorICAgc3RhdGlzdGljc19jb3VudGVy X2V2ZW50IChjZnVuLCAiRm9yd2FyZGVyIGJsb2NrcyByZW1vdmVkIiwgMSk7 CiAgfQogIAogIC8qIFRoaXMgcGFzcyBtZXJnZXMgUEhJIG5vZGVzIGlmIG9u ZSBmZWVkcyBpbnRvIGFub3RoZXIuICBGb3IgZXhhbXBsZSwKSW5kZXg6IHRy dW5rL2djYy90cmVlLXNzYS1kc2UuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CioqKiB0cnVuay5vcmlnL2djYy90cmVlLXNzYS1kc2UuYwkyMDEwLTA3LTA5 IDEwOjQyOjAyLjAwMDAwMDAwMCArMDIwMAotLS0gdHJ1bmsvZ2NjL3RyZWUt c3NhLWRzZS5jCTIwMTAtMDktMjEgMTM6NDM6MDIuMDAwMDAwMDAwICswMjAw CioqKioqKioqKioqKioqKiBkc2Vfb3B0aW1pemVfc3RtdCAoc3RydWN0IGRz ZV9nbG9iYWxfZGF0CioqKiAzMzAsMzM1ICoqKioKLS0tIDMzMCwzMzYgLS0t LQogICAgICAgICAgICAgICAgcHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBfZmls ZSwgZ3NpX3N0bXQgKGdzaSksIGR1bXBfZmxhZ3MsIDApOwogICAgICAgICAg ICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiJ1xuIik7CiAgICAgICAgICAg ICAgfQorIAkgIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1biwgIlN0 b3JlcyBkZWxldGVkIiwgMSk7CiAgCiAgCSAgLyogVGhlbiB3ZSBuZWVkIHRv IGZpeCB0aGUgb3BlcmFuZCBvZiB0aGUgY29uc3VtaW5nIHN0bXQuICAqLwog IAkgIHVubGlua19zdG10X3ZkZWYgKHN0bXQpOwpJbmRleDogdHJ1bmsvZ2Nj L3RyZWUtc3NhLWZvcndwcm9wLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoq KiogdHJ1bmsub3JpZy9nY2MvdHJlZS1zc2EtZm9yd3Byb3AuYwkyMDEwLTA4 LTMwIDE1OjQ1OjA3LjAwMDAwMDAwMCArMDIwMAotLS0gdHJ1bmsvZ2NjL3Ry ZWUtc3NhLWZvcndwcm9wLmMJMjAxMC0wOS0yMSAxMzo0MzowMi4wMDAwMDAw MDAgKzAyMDAKKioqKioqKioqKioqKioqIHJlbW92ZV9wcm9wX3NvdXJjZV9m cm9tX3VzZSAodHJlZSBuYW1lLAoqKiogMzIxLDMyNiAqKioqCi0tLSAzMjEs MzI3IC0tLS0KICAgICAgZ3NpID0gZ3NpX2Zvcl9zdG10IChzdG10KTsKICAg ICAgcmVsZWFzZV9kZWZzIChzdG10KTsKICAgICAgZ3NpX3JlbW92ZSAoJmdz aSwgdHJ1ZSk7CisgICAgIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1 biwgIlN0YXRlbWVudHMgZGVsZXRlZCIsIDEpOwogIAogICAgICBuYW1lID0g KGdpbXBsZV9hc3NpZ25fY29weV9wIChzdG10KSkgPyBnaW1wbGVfYXNzaWdu X3JoczEgKHN0bXQpIDogTlVMTDsKICAgIH0gd2hpbGUgKG5hbWUgJiYgVFJF RV9DT0RFIChuYW1lKSA9PSBTU0FfTkFNRSk7CioqKioqKioqKioqKioqKiBm b3J3YXJkX3Byb3BhZ2F0ZV9pbnRvX2dpbXBsZV9jb25kIChnaW1wCioqKiA0 NjEsNDY2ICoqKioKLS0tIDQ2Miw0NjggLS0tLQogIAogICAgICAgICAgZ2lt cGxlX2NvbmRfc2V0X2NvbmRpdGlvbl9mcm9tX3RyZWUgKHN0bXQsIHVuc2hh cmVfZXhwciAodG1wKSk7CiAgCXVwZGF0ZV9zdG10IChzdG10KTsKKyAJc3Rh dGlzdGljc19jb3VudGVyX2V2ZW50IChjZnVuLCAiQ29uZGl0aW9ucyBzaW1w bGlmaWVkIiwgMSk7CiAgCiAgCS8qIFJlbW92ZSBkZWZpbmluZyBzdGF0ZW1l bnRzLiAgKi8KICAJcmVtb3ZlX3Byb3Bfc291cmNlX2Zyb21fdXNlIChuYW1l LCBOVUxMKTsKKioqKioqKioqKioqKioqIGZvcndhcmRfcHJvcGFnYXRlX2lu dG9fY29uZCAoZ2ltcGxlX3N0bXQKKioqIDU3Miw1NzcgKioqKgotLS0gNTc0 LDU4MCAtLS0tCiAgCWdpbXBsZV9hc3NpZ25fc2V0X3Joc19mcm9tX3RyZWUg KGdzaV9wLCB1bnNoYXJlX2V4cHIgKHRtcCkpOwogIAlzdG10ID0gZ3NpX3N0 bXQgKCpnc2lfcCk7CiAgCXVwZGF0ZV9zdG10IChzdG10KTsKKyAJc3RhdGlz dGljc19jb3VudGVyX2V2ZW50IChjZnVuLCAiQ29uZGl0aW9ucyBzaW1wbGlm aWVkIiwgMSk7CiAgCiAgCS8qIFJlbW92ZSBkZWZpbmluZyBzdGF0ZW1lbnRz LiAgKi8KICAJcmVtb3ZlX3Byb3Bfc291cmNlX2Zyb21fdXNlIChuYW1lLCBO VUxMKTsKKioqKioqKioqKioqKioqIHRpZHlfYWZ0ZXJfZm9yd2FyZF9wcm9w YWdhdGVfYWRkciAoZ2ltcGwKKioqIDYwNCw2MDkgKioqKgotLS0gNjA3LDYx NCAtLS0tCiAgCiAgICBpZiAoVFJFRV9DT0RFIChnaW1wbGVfYXNzaWduX3Jo czEgKHN0bXQpKSA9PSBBRERSX0VYUFIpCiAgICAgICByZWNvbXB1dGVfdHJl ZV9pbnZhcmlhbnRfZm9yX2FkZHJfZXhwciAoZ2ltcGxlX2Fzc2lnbl9yaHMx IChzdG10KSk7CisgCisgICBzdGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQgKGNm dW4sICJBZGRyZXNzZXMgcHJvcGFnYXRlZCIsIDEpOwogIH0KICAKICAvKiBE RUZfUkhTIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSAwdGggZWxlbWVu dCBpbiBhbiBhcnJheS4KKioqKioqKioqKioqKioqIGZvcndhcmRfcHJvcGFn YXRlX2FkZHJfZXhwciAodHJlZSBuYW1lLAoqKiogMTEwNiwxMTExICoqKioK LS0tIDExMTEsMTExNyAtLS0tCiAgCSAgZ2ltcGxlX3N0bXRfaXRlcmF0b3Ig Z3NpID0gZ3NpX2Zvcl9zdG10ICh1c2Vfc3RtdCk7CiAgCSAgcmVsZWFzZV9k ZWZzICh1c2Vfc3RtdCk7CiAgCSAgZ3NpX3JlbW92ZSAoJmdzaSwgdHJ1ZSk7 CisgCSAgc3RhdGlzdGljc19jb3VudGVyX2V2ZW50IChjZnVuLCAiU3RhdGVt ZW50cyBkZWxldGVkIiwgMSk7CiAgCX0KICAgICAgfQogIAoqKioqKioqKioq KioqKiogZm9yd2FyZF9wcm9wYWdhdGVfY29tcGFyaXNvbiAoZ2ltcGxlIHN0 bQoqKiogMTIwMCwxMjA1ICoqKioKLS0tIDEyMDYsMTIxMiAtLS0tCiAgCWdp bXBsZV9hc3NpZ25fc2V0X3Joc19mcm9tX3RyZWUgKCZnc2ksIHVuc2hhcmVf ZXhwciAodG1wKSk7CiAgCXVzZV9zdG10ID0gZ3NpX3N0bXQgKGdzaSk7CiAg CXVwZGF0ZV9zdG10ICh1c2Vfc3RtdCk7CisgCXN0YXRpc3RpY3NfY291bnRl cl9ldmVudCAoY2Z1biwgIkNvbnZlcnNpb25zIHByb3BhZ2F0ZWQiLCAxKTsK ICAgICAgICB9CiAgCiAgICAgICAgLyogUmVtb3ZlIGRlZmluaW5nIHN0YXRl bWVudHMuICAqLwoqKioqKioqKioqKioqKiogc2ltcGxpZnlfbm90X25lZ19l eHByIChnaW1wbGVfc3RtdF9pdGVyYQoqKiogMTI1NiwxMjYxICoqKioKLS0t IDEyNjMsMTI2OSAtLS0tCiAgCSAgZ2ltcGxlX2Fzc2lnbl9zZXRfcmhzX2Zy b21fdHJlZSAoZ3NpX3AsIHJoc19kZWZfb3BlcmFuZCk7CiAgCSAgc3RtdCA9 IGdzaV9zdG10ICgqZ3NpX3ApOwogIAkgIHVwZGF0ZV9zdG10IChzdG10KTsK KyAJICBzdGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQgKGNmdW4sICJOZWdhdGlv bnMgcHJvcGFnYXRlZCIsIDEpOwogIAl9CiAgICAgIH0KICB9CioqKioqKioq KioqKioqKiBzaW1wbGlmeV9naW1wbGVfc3dpdGNoIChnaW1wbGUgc3RtdCkK KioqIDEzMTEsMTMxNiAqKioqCi0tLSAxMzE5LDEzMjUgLS0tLQogIAkJewog IAkJICBnaW1wbGVfc3dpdGNoX3NldF9pbmRleCAoc3RtdCwgZGVmKTsKICAJ CSAgdXBkYXRlX3N0bXQgKHN0bXQpOworIAkJICBzdGF0aXN0aWNzX2NvdW50 ZXJfZXZlbnQgKGNmdW4sICJDb252ZXJzaW9ucyBwcm9wYWdhdGVkIiwgMSk7 CiAgCQl9CiAgCSAgICB9CiAgCX0KKioqKioqKioqKioqKioqIHRyZWVfc3Nh X2ZvcndhcmRfcHJvcGFnYXRlX3NpbmdsZV91c2VfdmEKKioqIDE2ODcsMTY5 MiAqKioqCi0tLSAxNjk2LDE3MDIgLS0tLQogIAkJICAgICAgcmVsZWFzZV9k ZWZzIChzdG10KTsKICAJCSAgICAgIHRvZG9mbGFncyB8PSBUT0RPX3JlbW92 ZV91bnVzZWRfbG9jYWxzOwogIAkJICAgICAgZ3NpX3JlbW92ZSAoJmdzaSwg dHJ1ZSk7CisgCQkgICAgICBzdGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQgKGNm dW4sICJTdGF0ZW1lbnRzIGRlbGV0ZWQiLCAxKTsKICAJCSAgICB9CiAgCQkg IGVsc2UKICAJCSAgICBnc2lfbmV4dCAoJmdzaSk7CioqKioqKioqKioqKioq KiB0cmVlX3NzYV9mb3J3YXJkX3Byb3BhZ2F0ZV9zaW5nbGVfdXNlX3ZhCioq KiAxNzUwLDE3NTUgKioqKgotLS0gMTc2MCwxNzY2IC0tLS0KICAJCSAgICAg IHJlbGVhc2VfZGVmcyAoc3RtdCk7CiAgCQkgICAgICB0b2RvZmxhZ3MgfD0g VE9ET19yZW1vdmVfdW51c2VkX2xvY2FsczsKICAJCSAgICAgIGdzaV9yZW1v dmUgKCZnc2ksIHRydWUpOworIAkJICAgICAgc3RhdGlzdGljc19jb3VudGVy X2V2ZW50IChjZnVuLCAiU3RhdGVtZW50cyBkZWxldGVkIiwgMSk7CiAgCQkg ICAgfQogIAkJICBlbHNlCiAgCQkgICAgZ3NpX25leHQgKCZnc2kpOwpJbmRl eDogdHJ1bmsvZ2NjL3RyZWUtdGFpbGNhbGwuYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CioqKiB0cnVuay5vcmlnL2djYy90cmVlLXRhaWxjYWxsLmMJMjAx MC0wOS0wNiAxMDo1Njo0OC4wMDAwMDAwMDAgKzAyMDAKLS0tIHRydW5rL2dj Yy90cmVlLXRhaWxjYWxsLmMJMjAxMC0wOS0yMSAxMzo0MzowMi4wMDAwMDAw MDAgKzAyMDAKKioqKioqKioqKioqKioqIG9wdGltaXplX3RhaWxfY2FsbCAo c3RydWN0IHRhaWxjYWxsICp0LAoqKiogOTAxLDkwNiAqKioqCi0tLSA5MDEs OTA3IC0tLS0KICAgIGlmICh0LT50YWlsX3JlY3Vyc2lvbikKICAgICAgewog ICAgICAgIGVsaW1pbmF0ZV90YWlsX2NhbGwgKHQpOworICAgICAgIHN0YXRp c3RpY3NfY291bnRlcl9ldmVudCAoY2Z1biwgIlRhaWwgcmVjdXJzaW9ucyIs IDEpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgCkluZGV4OiB0 cnVuay9nY2MvY2ZnaG9va3MuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cioq KiB0cnVuay5vcmlnL2djYy9jZmdob29rcy5jCTIwMTAtMDctMDkgMTA6NDI6 MDIuMDAwMDAwMDAwICswMjAwCi0tLSB0cnVuay9nY2MvY2ZnaG9va3MuYwky MDEwLTA5LTIxIDEzOjQzOjAyLjAwMDAwMDAwMCArMDIwMAoqKioqKioqKioq KioqKiogZGVsZXRlX2Jhc2ljX2Jsb2NrIChiYXNpY19ibG9jayBiYikKKioq IDQ5Niw1MDEgKioqKgotLS0gNDk2LDUwMiAtLS0tCiAgICAgIGludGVybmFs X2Vycm9yICgiJXMgZG9lcyBub3Qgc3VwcG9ydCBkZWxldGVfYmFzaWNfYmxv Y2siLCBjZmdfaG9va3MtPm5hbWUpOwogIAogICAgY2ZnX2hvb2tzLT5kZWxl dGVfYmFzaWNfYmxvY2sgKGJiKTsKKyAgIHN0YXRpc3RpY3NfY291bnRlcl9l dmVudCAoY2Z1biwgIkJsb2NrcyBkZWxldGVkIiwgMSk7CiAgCiAgICBpZiAo Y3VycmVudF9sb29wcyAhPSBOVUxMKQogICAgICB7CioqKioqKioqKioqKioq KiBtZXJnZV9ibG9ja3MgKGJhc2ljX2Jsb2NrIGEsIGJhc2ljX2Jsb2NrCioq KiA2ODEsNjg2ICoqKioKLS0tIDY4Miw2ODggLS0tLQogICAgICBpbnRlcm5h bF9lcnJvciAoIiVzIGRvZXMgbm90IHN1cHBvcnQgbWVyZ2VfYmxvY2tzIiwg Y2ZnX2hvb2tzLT5uYW1lKTsKICAKICAgIGNmZ19ob29rcy0+bWVyZ2VfYmxv Y2tzIChhLCBiKTsKKyAgIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1 biwgIkJsb2NrcyBtZXJnZWQiLCAxKTsKICAKICAgIGlmIChjdXJyZW50X2xv b3BzICE9IE5VTEwpCiAgICAgIHJlbW92ZV9iYl9mcm9tX2xvb3BzIChiKTsK SW5kZXg6IHRydW5rL2djYy90cmVlLWlubGluZS5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKioqIHRydW5rLm9yaWcvZ2NjL3RyZWUtaW5saW5lLmMJMjAx MC0wOS0yMCAxMTowOToxOC4wMDAwMDAwMDAgKzAyMDAKLS0tIHRydW5rL2dj Yy90cmVlLWlubGluZS5jCTIwMTAtMDktMjEgMTM6NDM6MDIuMDAwMDAwMDAw ICswMjAwCioqKioqKioqKioqKioqKiBleHBhbmRfY2FsbF9pbmxpbmUgKGJh c2ljX2Jsb2NrIGJiLCBnaW1wCioqKiAzODAwLDM4MDUgKioqKgotLS0gMzgw MCwzODA2IC0tLS0KICAJfQogICAgICAgIGdvdG8gZWdyZXNzOwogICAgICB9 CisgICBzdGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQgKGNmdW4sICJGdW5jdGlv bnMgaW5saW5lZCIsIDEpOwogICAgZm4gPSBjZ19lZGdlLT5jYWxsZWUtPmRl Y2w7CiAgCiAgI2lmZGVmIEVOQUJMRV9DSEVDS0lORwpJbmRleDogdHJ1bmsv Z2NjL3RyZWUtc3NhLXBoaXByb3AuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CioqKiB0cnVuay5vcmlnL2djYy90cmVlLXNzYS1waGlwcm9wLmMJMjAxMC0w OC0yNCAxMDozMjozOC4wMDAwMDAwMDAgKzAyMDAKLS0tIHRydW5rL2djYy90 cmVlLXNzYS1waGlwcm9wLmMJMjAxMC0wOS0yMSAxMzo0MzowMi4wMDAwMDAw MDAgKzAyMDAKKioqKioqKioqKioqKioqIHByb3BhZ2F0ZV93aXRoX3BoaSAo YmFzaWNfYmxvY2sgYmIsIGdpbXAKKioqIDM1NSwzNjAgKioqKgotLS0gMzU1 LDM2MSAtLS0tCiAgCSAgZ3NpX3JlbW92ZSAoJmdzaSwgZmFsc2UpOwogIAog IAkgIHBoaV9pbnNlcnRlZCA9IHRydWU7CisgCSAgc3RhdGlzdGljc19jb3Vu dGVyX2V2ZW50IChjZnVuLCAiTG9hZHMgZnJvbSBQSElzIHByb21vdGVkIiwg MSk7CiAgCX0KICAgICAgICBlbHNlCiAgCXsKSW5kZXg6IHRydW5rL2djYy90 cmVlLXNzYS1pZmNvbWJpbmUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cioq KiB0cnVuay5vcmlnL2djYy90cmVlLXNzYS1pZmNvbWJpbmUuYwkyMDEwLTA4 LTMwIDE1OjQ1OjA3LjAwMDAwMDAwMCArMDIwMAotLS0gdHJ1bmsvZ2NjL3Ry ZWUtc3NhLWlmY29tYmluZS5jCTIwMTAtMDktMjEgMTM6NDM6MDIuMDAwMDAw MDAwICswMjAwCioqKioqKioqKioqKioqKiBpZmNvbWJpbmVfaWZhbmRpZiAo YmFzaWNfYmxvY2sgaW5uZXJfY29uCioqKiAzNjAsMzY1ICoqKioKLS0tIDM2 MCwzNjYgLS0tLQogIAkgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxl LCBiaXQyLCAwKTsKICAJICBmcHJpbnRmIChkdW1wX2ZpbGUsICIpXG4iKTsK ICAJfQorICAgICAgIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1biwg IkJpdCB0ZXN0cyBjb21iaW5lZCIsIDEpOwogIAogICAgICAgIHJldHVybiB0 cnVlOwogICAgICB9CioqKioqKioqKioqKioqKiBpZmNvbWJpbmVfaWZvcmlm IChiYXNpY19ibG9jayBpbm5lcl9jb25kCioqKiA1MDYsNTExICoqKioKLS0t IDUwNyw1MTMgLS0tLQogIAkgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9m aWxlLCBiaXRzMiwgMCk7CiAgCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4i KTsKICAJfQorICAgICAgIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1 biwgIkJpdCB0ZXN0cyBjb21iaW5lZCIsIDEpOwogIAogICAgICAgIHJldHVy biB0cnVlOwogICAgICB9CioqKioqKioqKioqKioqKiBpZmNvbWJpbmVfaWZv cmlmIChiYXNpY19ibG9jayBpbm5lcl9jb25kCioqKiA1NDEsNTQ2ICoqKioK LS0tIDU0Myw1NDkgLS0tLQogIAkgIHByaW50X2dlbmVyaWNfZXhwciAoZHVt cF9maWxlLCB0LCAwKTsKICAJICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIp OwogIAl9CisgICAgICAgc3RhdGlzdGljc19jb3VudGVyX2V2ZW50IChjZnVu LCAiQ29tcGFyaXNvbnMgY29tYmluZWQiLCAxKTsKICAKICAgICAgICByZXR1 cm4gdHJ1ZTsKICAgICAgfQpJbmRleDogdHJ1bmsvZ2NjL3RyZWUtc3NhLWxv b3AtaXZjYW5vbi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRydW5r Lm9yaWcvZ2NjL3RyZWUtc3NhLWxvb3AtaXZjYW5vbi5jCTIwMTAtMDktMjAg MTc6NTI6NDkuMDAwMDAwMDAwICswMjAwCi0tLSB0cnVuay9nY2MvdHJlZS1z c2EtbG9vcC1pdmNhbm9uLmMJMjAxMC0wOS0yMSAxMzo0MzowMi4wMDAwMDAw MDAgKzAyMDAKKioqKioqKioqKioqKioqIHRyZWVfdW5yb2xsX2xvb3BzX2Nv bXBsZXRlbHkgKGJvb2wgbWF5X2kKKioqIDUzMiw1MzkgKioqKgogIAkgICAg dWwgPSBVTF9BTEw7CiAgCSAgZWxzZQogIAkgICAgdWwgPSBVTF9OT19HUk9X VEg7CiEgCSAgY2hhbmdlZCB8PSBjYW5vbmljYWxpemVfbG9vcF9pbmR1Y3Rp b25fdmFyaWFibGVzCiEgCQkgICAgICAgKGxvb3AsIGZhbHNlLCB1bCwgIWZs YWdfdHJlZV9sb29wX2l2Y2Fub24pOwogIAl9CiAgCiAgICAgICAgaWYgKGNo YW5nZWQpCi0tLSA1MzIsNTQzIC0tLS0KICAJICAgIHVsID0gVUxfQUxMOwog IAkgIGVsc2UKICAJICAgIHVsID0gVUxfTk9fR1JPV1RIOwohIAkgIGlmIChj YW5vbmljYWxpemVfbG9vcF9pbmR1Y3Rpb25fdmFyaWFibGVzCiEgCSAgICAg ICAgKGxvb3AsIGZhbHNlLCB1bCwgIWZsYWdfdHJlZV9sb29wX2l2Y2Fub24p KQohIAkgICAgewohIAkgICAgICBzdGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQg KGNmdW4sICJMb29wcyBjb21wbGV0ZWx5IHVucm9sbGVkIiwgMSk7CiEgCSAg ICAgIGNoYW5nZWQgPSB0cnVlOwohIAkgICAgfQogIAl9CiAgCiAgICAgICAg aWYgKGNoYW5nZWQpCkluZGV4OiB0cnVuay9nY2MvdHJlZS1zc2EtcGhpb3B0 LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogdHJ1bmsub3JpZy9nY2Mv dHJlZS1zc2EtcGhpb3B0LmMJMjAxMC0wOC0zMCAxNTo0NTowNy4wMDAwMDAw MDAgKzAyMDAKLS0tIHRydW5rL2djYy90cmVlLXNzYS1waGlvcHQuYwkyMDEw LTA5LTIxIDEzOjQzOjAyLjAwMDAwMDAwMCArMDIwMAoqKioqKioqKioqKioq KiogY29uZGl0aW9uYWxfcmVwbGFjZW1lbnQgKGJhc2ljX2Jsb2NrIGNvbgoq KiogNTM4LDU0MyAqKioqCi0tLSA1MzgsNTQ0IC0tLS0KICAgIHJlcGxhY2Vf cGhpX2VkZ2Vfd2l0aF92YXJpYWJsZSAoY29uZF9iYiwgZTEsIHBoaSwgbmV3 X3Zhcik7CiAgCiAgICAvKiBOb3RlIHRoYXQgd2Ugb3B0aW1pemVkIHRoaXMg UEhJLiAgKi8KKyAgIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1biwg IkNGRyByZXBsYWNlZCB3aXRoIGNvbmRpdGlvbiB2YWx1ZSIsIDEpOwogICAg cmV0dXJuIHRydWU7CiAgfQogIAoqKioqKioqKioqKioqKiogdmFsdWVfcmVw bGFjZW1lbnQgKGJhc2ljX2Jsb2NrIGNvbmRfYmIsCioqKiA2MTYsNjIxICoq KioKLS0tIDYxNyw2MjMgLS0tLQogICAgICAgIHJlcGxhY2VfcGhpX2VkZ2Vf d2l0aF92YXJpYWJsZSAoY29uZF9iYiwgZTEsIHBoaSwgYXJnKTsKICAKICAg ICAgICAvKiBOb3RlIHRoYXQgd2Ugb3B0aW1pemVkIHRoaXMgUEhJLiAgKi8K KyAgICAgICBzdGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQgKGNmdW4sICJDRkcg cmVwbGFjZWQgd2l0aCBQSEkiLCAxKTsKICAgICAgICByZXR1cm4gdHJ1ZTsK ICAgICAgfQogICAgcmV0dXJuIGZhbHNlOwoqKioqKioqKioqKioqKiogbWlu bWF4X3JlcGxhY2VtZW50IChiYXNpY19ibG9jayBjb25kX2JiLAoqKiogODY2 LDg3MSAqKioqCi0tLSA4NjgsODc1IC0tLS0KICAgIGdzaV9pbnNlcnRfYmVm b3JlICgmZ3NpLCBuZXdfc3RtdCwgR1NJX05FV19TVE1UKTsKICAKICAgIHJl cGxhY2VfcGhpX2VkZ2Vfd2l0aF92YXJpYWJsZSAoY29uZF9iYiwgZTEsIHBo aSwgcmVzdWx0KTsKKyAgIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1 biwgIkNGRyByZXBsYWNlZCB3aXRoIG1pbi9tYXgiLCAxKTsKKyAKICAgIHJl dHVybiB0cnVlOwogIH0KICAKKioqKioqKioqKioqKioqIGFic19yZXBsYWNl bWVudCAoYmFzaWNfYmxvY2sgY29uZF9iYiwgYmEKKioqIDk4Nyw5OTIgKioq KgotLS0gOTkxLDk5NyAtLS0tCiAgICAgIH0KICAKICAgIHJlcGxhY2VfcGhp X2VkZ2Vfd2l0aF92YXJpYWJsZSAoY29uZF9iYiwgZTEsIHBoaSwgcmVzdWx0 KTsKKyAgIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1biwgIkNGRyB0 cmFuc2Zvcm1lZCB0byBBQlMiLCAxKTsKICAKICAgIC8qIE5vdGUgdGhhdCB3 ZSBvcHRpbWl6ZWQgdGhpcyBQSEkuICAqLwogICAgcmV0dXJuIHRydWU7Cioq KioqKioqKioqKioqKiBjb25kX3N0b3JlX3JlcGxhY2VtZW50IChiYXNpY19i bG9jayBtaWRkCioqKiAxMjYxLDEyNjYgKioqKgotLS0gMTI2NiwxMjcyIC0t LS0KICAgIGVsc2UKICAgICAgZ3NpX2luc2VydF9iZWZvcmUgKCZnc2ksIG5l d19zdG10LCBHU0lfTkVXX1NUTVQpOwogIAorICAgc3RhdGlzdGljc19jb3Vu dGVyX2V2ZW50IChjZnVuLCAiQ29uZGl0aW9uYWwgc3RvcmVzIGVsaW1pbmF0 ZWQiLCAxKTsKICAgIHJldHVybiB0cnVlOwogIH0KICAKSW5kZXg6IHRydW5r L2djYy90cmVlLXByZWRjb20uYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cioq KiB0cnVuay5vcmlnL2djYy90cmVlLXByZWRjb20uYwkyMDEwLTA5LTA2IDE1 OjU1OjI1LjAwMDAwMDAwMCArMDIwMAotLS0gdHJ1bmsvZ2NjL3RyZWUtcHJl ZGNvbS5jCTIwMTAtMDktMjEgMTM6NDM6MDIuMDAwMDAwMDAwICswMjAwCioq KioqKioqKioqKioqKiB0cmVlX3ByZWRpY3RpdmVfY29tbW9uaW5nX2xvb3Ag KHN0cnVjdCBsCioqKiAyNTQ0LDI1NDkgKioqKgotLS0gMjU0NCwyNTUwIC0t LS0KICAJCSAiRXhlY3V0aW5nIHByZWRpY3RpdmUgY29tbW9uaW5nIHdpdGhv dXQgdW5yb2xsaW5nLlxuIik7CiAgICAgICAgZXhlY3V0ZV9wcmVkX2NvbW1v bmluZyAobG9vcCwgY2hhaW5zLCB0bXBfdmFycyk7CiAgICAgIH0KKyAgIHN0 YXRpc3RpY3NfY291bnRlcl9ldmVudCAoY2Z1biwgIkxvb3BzIHByZWRpY3Rp dmUgY29tbW9uZWQiLCAxKTsKICAKICBlbmQ6IDsKICAgIHJlbGVhc2VfY2hh aW5zIChjaGFpbnMpOwpJbmRleDogdHJ1bmsvZ2NjL3RyZWUtc2NhbGFyLWV2 b2x1dGlvbi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRydW5rLm9y aWcvZ2NjL3RyZWUtc2NhbGFyLWV2b2x1dGlvbi5jCTIwMTAtMDgtMjQgMTA6 MzI6MzguMDAwMDAwMDAwICswMjAwCi0tLSB0cnVuay9nY2MvdHJlZS1zY2Fs YXItZXZvbHV0aW9uLmMJMjAxMC0wOS0yMSAxMzo0MzowMi4wMDAwMDAwMDAg KzAyMDAKKioqKioqKioqKioqKioqIHNjZXZfY29uc3RfcHJvcCAodm9pZCkK KioqIDMzMTYsMzMyMSAqKioqCi0tLSAzMzE2LDMzMjIgLS0tLQogICAgICAg IGVkZ2UgZXhpdDsKICAgICAgICB0cmVlIGRlZiwgcnNsdCwgbml0ZXI7CiAg ICAgICAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgYnNpOworICAgICAgIHVuc2ln bmVkIG5yOwogIAogICAgICAgIC8qIElmIHdlIGRvIG5vdCBrbm93IGV4YWN0 IG51bWJlciBvZiBpdGVyYXRpb25zIG9mIHRoZSBsb29wLCB3ZSBjYW5ub3QK ICAJIHJlcGxhY2UgdGhlIGZpbmFsIHZhbHVlLiAgKi8KKioqKioqKioqKioq KioqIHNjZXZfY29uc3RfcHJvcCAodm9pZCkKKioqIDMzMzUsMzM0MCAqKioq Ci0tLSAzMzM2LDMzNDIgLS0tLQogICAgICAgIGV4X2xvb3AgPSBzdXBlcmxv b3BfYXRfZGVwdGggKGxvb3AsCiAgCQkJCSAgICBsb29wX2RlcHRoIChleGl0 LT5kZXN0LT5sb29wX2ZhdGhlcikgKyAxKTsKICAKKyAgICAgICBuciA9IDA7 CiAgICAgICAgZm9yIChwc2kgPSBnc2lfc3RhcnRfcGhpcyAoZXhpdC0+ZGVz dCk7ICFnc2lfZW5kX3AgKHBzaSk7ICkKICAJewogIAkgIHBoaSA9IGdzaV9z dG10IChwc2kpOwoqKioqKioqKioqKioqKiogc2Nldl9jb25zdF9wcm9wICh2 b2lkKQoqKiogMzM4MywzMzg5ICoqKioKLS0tIDMzODUsMzM5NCAtLS0tCiAg ICAgICAgCQkJCQkgIHRydWUsIEdTSV9TQU1FX1NUTVQpOwogIAkgIGFzcyA9 IGdpbXBsZV9idWlsZF9hc3NpZ24gKHJzbHQsIGRlZik7CiAgCSAgZ3NpX2lu c2VydF9iZWZvcmUgKCZic2ksIGFzcywgR1NJX1NBTUVfU1RNVCk7CisgCSAg KytucjsKICAJfQorICAgICAgIGlmIChuciA+IDApCisgCXN0YXRpc3RpY3Nf Y291bnRlcl9ldmVudCAoY2Z1biwgIkZpbmFsIGxvb3AgSVYgdmFsdWVzIHJl cGxhY2VkIiwgbnIpOwogICAgICB9CiAgICByZXR1cm4gMDsKICB9CkluZGV4 OiB0cnVuay9nY2MvdHJlZS1zc2EtbG9vcC1jaC5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKioqIHRydW5rLm9yaWcvZ2NjL3RyZWUtc3NhLWxvb3AtY2gu YwkyMDEwLTA3LTA5IDEwOjQyOjAyLjAwMDAwMDAwMCArMDIwMAotLS0gdHJ1 bmsvZ2NjL3RyZWUtc3NhLWxvb3AtY2guYwkyMDEwLTA5LTIxIDEzOjQzOjAy LjAwMDAwMDAwMCArMDIwMAoqKioqKioqKioqKioqKiogY29weV9sb29wX2hl YWRlcnMgKHZvaWQpCioqKiAyMDgsMjEzICoqKioKLS0tIDIwOCwyMTQgLS0t LQogIAkgIGZwcmludGYgKGR1bXBfZmlsZSwgIkR1cGxpY2F0aW9uIGZhaWxl ZC5cbiIpOwogIAkgIGNvbnRpbnVlOwogIAl9CisgICAgICAgc3RhdGlzdGlj c19jb3VudGVyX2V2ZW50IChjZnVuLCAiTG9vcCBoZWFkZXJzIGNvcGllZCIs IDEpOwogIAogICAgICAgIC8qIElmIHRoZSBsb29wIGhhcyB0aGUgZm9ybSAi Zm9yIChpID0gajsgaSA8IGogKyAxMDsgaSsrKSIgdGhlbgogIAkgdGhpcyBj b3B5aW5nIGNhbiBpbnRyb2R1Y2UgYSBjYXNlIHdoZXJlIHdlIHJlbHkgb24g dW5kZWZpbmVkCkluZGV4OiB0cnVuay9nY2MvdHJlZS1zc2EtbG9vcC11bnN3 aXRjaC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRydW5rLm9yaWcv Z2NjL3RyZWUtc3NhLWxvb3AtdW5zd2l0Y2guYwkyMDEwLTA4LTMwIDE1OjQ1 OjA3LjAwMDAwMDAwMCArMDIwMAotLS0gdHJ1bmsvZ2NjL3RyZWUtc3NhLWxv b3AtdW5zd2l0Y2guYwkyMDEwLTA5LTIxIDEzOjQzOjAyLjAwMDAwMDAwMCAr MDIwMAoqKioqKioqKioqKioqKiogdHJlZV91bnN3aXRjaF9zaW5nbGVfbG9v cCAoc3RydWN0IGxvb3AgKgoqKiogMzQ1LDM1MCAqKioqCi0tLSAzNDUsMzUx IC0tLS0KICAgICAgICBmcmVlIChiYnMpOwogICAgICAgIHJldHVybiBjaGFu Z2VkOwogICAgICB9CisgICBzdGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQgKGNm dW4sICJMb29wcyB1bnN3aXRjaGVkIiwgMSk7CiAgCiAgICAvKiBVcGRhdGUg dGhlIFNTQSBmb3JtIGFmdGVyIHVuc3dpdGNoaW5nLiAgKi8KICAgIHVwZGF0 ZV9zc2EgKFRPRE9fdXBkYXRlX3NzYSk7CkluZGV4OiB0cnVuay9nY2MvdHJl ZS1zc2EtY29weXJlbmFtZS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioq IHRydW5rLm9yaWcvZ2NjL3RyZWUtc3NhLWNvcHlyZW5hbWUuYwkyMDEwLTA4 LTI1IDE3OjUzOjA1LjAwMDAwMDAwMCArMDIwMAotLS0gdHJ1bmsvZ2NjL3Ry ZWUtc3NhLWNvcHlyZW5hbWUuYwkyMDEwLTA5LTIxIDEzOjQzOjAyLjAwMDAw MDAwMCArMDIwMAoqKioqKioqKioqKioqKiogY29weV9yZW5hbWVfcGFydGl0 aW9uX2NvYWxlc2NlICh2YXJfbWFwCioqKiAyNTIsMjU3ICoqKioKLS0tIDI1 MiwyNTggLS0tLQogIAkJCSAgVERGX1NMSU0pOwogICAgICAgIGZwcmludGYg KGRlYnVnLCAiXG4iKTsKICAgICAgfQorICAgc3RhdGlzdGljc19jb3VudGVy X2V2ZW50IChjZnVuLCAiVmFyaWFibGVzIGNvYWxlc2NlZCIsIDEpOwogICAg cmV0dXJuIHRydWU7CiAgfQogIApJbmRleDogdHJ1bmsvZ2NjL3RyZWUtc3Nh LWxvb3AtaW0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiB0cnVuay5v cmlnL2djYy90cmVlLXNzYS1sb29wLWltLmMJMjAxMC0wOS0wNiAxNTo1NToy NS4wMDAwMDAwMDAgKzAyMDAKLS0tIHRydW5rL2djYy90cmVlLXNzYS1sb29w LWltLmMJMjAxMC0wOS0yMSAxMzo0MzowMi4wMDAwMDAwMDAgKzAyMDAKKioq KioqKioqKioqKioqIG1vdmVfY29tcHV0YXRpb25zX3N0bXQgKHN0cnVjdCBk b21fd2Fsa18KKioqIDEyMDAsMTIwNiAqKioqCiAgICBzdHJ1Y3QgbG9vcCAq bGV2ZWw7CiAgICBnaW1wbGVfc3RtdF9pdGVyYXRvciBic2k7CiAgICBnaW1w bGUgc3RtdDsKISAgIHVuc2lnbmVkIGNvc3QgPSAwOwogICAgc3RydWN0IGxp bV9hdXhfZGF0YSAqbGltX2RhdGE7CiAgCiAgICBpZiAoIWxvb3Bfb3V0ZXIg KGJiLT5sb29wX2ZhdGhlcikpCi0tLSAxMjAwLDEyMDYgLS0tLQogICAgc3Ry dWN0IGxvb3AgKmxldmVsOwogICAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgYnNp OwogICAgZ2ltcGxlIHN0bXQ7CiEgICB1bnNpZ25lZCBjb3N0ID0gMCwgY250 ID0gMDsKICAgIHN0cnVjdCBsaW1fYXV4X2RhdGEgKmxpbV9kYXRhOwogIAog ICAgaWYgKCFsb29wX291dGVyIChiYi0+bG9vcF9mYXRoZXIpKQoqKioqKioq KioqKioqKiogbW92ZV9jb21wdXRhdGlvbnNfc3RtdCAoc3RydWN0IGRvbV93 YWxrXwoqKiogMTMwMCwxMzEwICoqKioKLS0tIDEzMDAsMTMxMyAtLS0tCiAg CSAgZnByaW50ZiAoZHVtcF9maWxlLCAiKGNvc3QgJXUpIG91dCBvZiBsb29w ICVkLlxuXG4iLAogIAkJICAgY29zdCwgbGV2ZWwtPm51bSk7CiAgCX0KKyAg ICAgICBjbnQrKzsKICAKICAgICAgICBtYXJrX3ZpcnR1YWxfb3BzX2Zvcl9y ZW5hbWluZyAoc3RtdCk7CiAgICAgICAgZ3NpX2luc2VydF9vbl9lZGdlIChs b29wX3ByZWhlYWRlcl9lZGdlIChsZXZlbCksIHN0bXQpOwogICAgICAgIGdz aV9yZW1vdmUgKCZic2ksIGZhbHNlKTsKICAgICAgfQorIAorICAgc3RhdGlz dGljc19jb3VudGVyX2V2ZW50IChjZnVuLCAiTG9vcCBpbnZhcmlhbnQgbW90 aW9ucyIsIGNudCk7CiAgfQogIAogIC8qIEhvaXN0IHRoZSBzdGF0ZW1lbnRz IG91dCBvZiB0aGUgbG9vcHMgcHJlc2NyaWJlZCBieSBkYXRhIHN0b3JlZCBp bgoqKioqKioqKioqKioqKiogaG9pc3RfbWVtb3J5X3JlZmVyZW5jZXMgKHN0 cnVjdCBsb29wICpsbwoqKiogMjEzMCwyMTQzICoqKioKICAJCQkgVkVDIChl ZGdlLCBoZWFwKSAqZXhpdHMpCiAgewogICAgbWVtX3JlZl9wIHJlZjsKISAg IHVuc2lnbmVkICBpOwogICAgYml0bWFwX2l0ZXJhdG9yIGJpOwogIAogICAg RVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQIChtZW1fcmVmcywgMCwgaSwgYmkp CiAgICAgIHsKICAgICAgICByZWYgPSBWRUNfaW5kZXggKG1lbV9yZWZfcCwg bWVtb3J5X2FjY2Vzc2VzLnJlZnNfbGlzdCwgaSk7CiAgICAgICAgZXhlY3V0 ZV9zbSAobG9vcCwgZXhpdHMsIHJlZik7CiAgICAgIH0KICB9CiAgCiAgLyog UmV0dXJucyB0cnVlIGlmIFJFRiBpcyBhbHdheXMgYWNjZXNzZWQgaW4gTE9P UC4gIElmIFNUT1JFRF9QIGlzIHRydWUKLS0tIDIxMzMsMjE0OCAtLS0tCiAg CQkJIFZFQyAoZWRnZSwgaGVhcCkgKmV4aXRzKQogIHsKICAgIG1lbV9yZWZf cCByZWY7CiEgICB1bnNpZ25lZCBpLCBjbnQgPSAwOwogICAgYml0bWFwX2l0 ZXJhdG9yIGJpOwogIAogICAgRVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQICht ZW1fcmVmcywgMCwgaSwgYmkpCiAgICAgIHsKICAgICAgICByZWYgPSBWRUNf aW5kZXggKG1lbV9yZWZfcCwgbWVtb3J5X2FjY2Vzc2VzLnJlZnNfbGlzdCwg aSk7CiAgICAgICAgZXhlY3V0ZV9zbSAobG9vcCwgZXhpdHMsIHJlZik7Cisg ICAgICAgY250Kys7CiAgICAgIH0KKyAgIHN0YXRpc3RpY3NfY291bnRlcl9l dmVudCAoY2Z1biwgIkxvb3Agc3RvcmUgbW90aW9ucyIsIGNudCk7CiAgfQog IAogIC8qIFJldHVybnMgdHJ1ZSBpZiBSRUYgaXMgYWx3YXlzIGFjY2Vzc2Vk IGluIExPT1AuICBJZiBTVE9SRURfUCBpcyB0cnVlCkluZGV4OiB0cnVuay9n Y2MvdHJlZS1zc2EtbWF0aC1vcHRzLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQoqKiogdHJ1bmsub3JpZy9nY2MvdHJlZS1zc2EtbWF0aC1vcHRzLmMJMjAx MC0wOC0yNSAxMTowNjoyNy4wMDAwMDAwMDAgKzAyMDAKLS0tIHRydW5rL2dj Yy90cmVlLXNzYS1tYXRoLW9wdHMuYwkyMDEwLTA5LTIxIDEzOjQzOjAyLjAw MDAwMDAwMCArMDIwMAoqKioqKioqKioqKioqKiogZXhlY3V0ZV9jc2Vfc2lu Y29zXzEgKHRyZWUgbmFtZSkKKioqIDY4Niw2OTEgKioqKgotLS0gNjg2LDY5 MyAtLS0tCiAgICAgICAgVkVDX2ZyZWUoZ2ltcGxlLCBoZWFwLCBzdG10cyk7 CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CisgICBzdGF0aXN0aWNz X2hpc3RvZ3JhbV9ldmVudCAoY2Z1biwgIm51bWJlciBvZiBzaW4vY29zIGNh bGxzIGNzZWQgdG8gb25lIHNpbmNvcyIsCisgCQkJICAgICAgVkVDX2xlbmd0 aCAoZ2ltcGxlLCBzdG10cykpOwogIAogICAgLyogU2ltcGx5IGluc2VydCBj ZXhwaSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRvcF9iYiBidXQgbm90IGVhcmxp ZXIgdGhhbgogICAgICAgdGhlIG5hbWUgZGVmIHN0YXRlbWVudC4gICovCklu ZGV4OiB0cnVuay9nY2MvdHJlZS1zc2EtdW5jcHJvcC5jCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKioqIHRydW5rLm9yaWcvZ2NjL3RyZWUtc3NhLXVuY3By b3AuYwkyMDEwLTA4LTMwIDE1OjQ1OjA3LjAwMDAwMDAwMCArMDIwMAotLS0g dHJ1bmsvZ2NjL3RyZWUtc3NhLXVuY3Byb3AuYwkyMDEwLTA5LTIxIDEzOjQz OjAyLjAwMDAwMDAwMCArMDIwMAoqKioqKioqKioqKioqKiogdW5jcHJvcF9p bnRvX3N1Y2Nlc3Nvcl9waGlzIChiYXNpY19ibG9jawoqKiogNDk5LDUwNCAq KioqCi0tLSA0OTksNTA1IC0tLS0KICAJCSAgaWYgKFNTQV9OQU1FX1ZBUiAo ZXF1aXYpID09IFNTQV9OQU1FX1ZBUiAoUEhJX1JFU1VMVCAocGhpKSkpCiAg CQkgICAgewogIAkJICAgICAgU0VUX1BISV9BUkdfREVGIChwaGksIGUtPmRl c3RfaWR4LCBlcXVpdik7CisgCQkgICAgICBzdGF0aXN0aWNzX2NvdW50ZXJf ZXZlbnQgKGNmdW4sICJQSEkgYXJndW1lbnRzIHVuLXByb3BhZ2F0ZWQiLCAx KTsKICAJCSAgICAgIGJyZWFrOwogIAkJICAgIH0KICAJCX0K --485b3973ea9552508904a0b97c97--