From: authorNari Date: 2008-07-17T22:38:53+09:00 Subject: [ruby-dev:35568] Re: make profiler for gc ------=_Part_31433_32237404.1216302227809 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline こんにちわ、nariです。 GCのプロファイラを少し改良してみました。 == 使用方法 == GC.profile = true # 計測対象の処理 GC.display ---- 以下のプロファイル情報が出力される ----- GC 10 invokes. Index Use Size(byte) Total Size(byte) Total Object GC time(ms) 0 338620 360448 18018 0.00000000000000014129 1 605620 622592 31122 0.40010000000000001119 2 1080300 1097728 54873 0.00000000000000007657 3 1931420 1949696 97461 0.40000000000000018874 4 3470040 3489792 174447 0.40010000000000034426 5 6236220 6258688 312858 1.19999999999999906741 6 11212100 11239424 561834 2.00009999999999976694 7 20181760 20217856 1010646 3.60029999999999850147 8 36320600 36372480 1818180 6.80040000000000244285 2008275 used objects 80 free objects and 2008355 total objects in Heap. Index Count % Kind (class) 1 1500000 74.68799092 Child 2 500000 24.89599697 Parent 3 5974 0.29745737 Object 4 1644 0.08185804 String 5 416 0.02071347 Class 6 81 0.00403315 Encoding 8 47 0.00234022 RubyVM::InstructionSequence 9 19 0.00094605 Module 10 17 0.00084646 Array 11 16 0.00079667 Hash 12 14 0.00069709 Float 13 10 0.00049792 Regexp 14 9 0.00044813 Enumerable 15 5 0.00024896 Comparable 16 3 0.00014938 IO 17 3 0.00014938 Precision 18 2 0.00009958 Bignum 19 1 0.00004979 Complex 20 1 0.00004979 Thread 21 1 0.00004979 RubyVM 22 1 0.00004979 ThreadGroup 23 1 0.00004979 NoMemoryError 24 1 0.00004979 Binding 25 1 0.00004979 SystemStackError 26 1 0.00004979 RubyVM::Env 27 1 0.00004979 Mutex 28 1 0.00004979 File::Constants 29 1 0.00004979 ARGF.class 30 1 0.00004979 Gem::QuickLoader 31 1 0.00004979 Data 32 1 0.00004979 fatal 33 1 0.00004979 Kernel ------ ここまで ------ == パッチを適用した際のメリット == 1. メモリリークの調査が簡単になる   どのクラスが多く生成されているかよく分かり、調査しやすい。   現在RubyレベルからHeap内部のクラス名による統計情報を   取得する方法は無く、これを提供する事によって、メモリリーク   の調査がしやすくなる。 2. パフォーマンスチューニングしやすい   GCの実行時間を手軽に測れる、また、GCによるHeapサイズの   変動を見ることができ、パフォーマンスチューニングがしやすく   なる。 以上の2点が上げられるのではないかと思います。 # もちろん、私がGCいじりやすくなってハッピーというのもありますが。。。 == 追加されるメソッド == * GC.profile * GC.profile= プロファイルを行う場合はtrue, 行わない場合false * GC.display プロファイル情報、Heapの詳細情報を出力 * GC.count_classes => {:TOTAL => 3000000, :FREE => 30000, :String => 20000 .... }   クラス名での統計情報をHashにて取得可能 == パッチ == 今回は少し大きめになったので、添付しておきます。 == ご意見など == 名前はこうした方がよいとか、出力する情報はもっとこういうものがいい、 そもそもいらないのでは?などありましたら、ご意見いただけると嬉しい限りです。 それでは、よろしくお願いいたします。 2008/07/13 23:25 authorNari : > nariです。 > > 動的に変更できるパッチも併せて作成しました。 > > 「GC.profile=true」でプロファイルし始めて、 > 「GC.profile_report」で結果を返してくれます。 > > また、通常はGC全体の時間のみ返しますが、コンパイル時に > #define GC_PROFILE_MORE_DETAIL 1 > にする事でmark/sweepにかかった時間等の詳細なデータ > を返すようにしました。 > > 速度的にもそれ程重くないようですし、私としてはこちらの方が > 良いように思うのですがいかがでしょうか? > > ベンチマーク > normal profile > vm3_gc 2.359   2.375 > > > ============= > nari@nari-laptop ~/s/r/ruby-trunk> make benchmark OPTS="-r 10" > ruby ./benchmark/driver.rb -v \ > --executables="ruby; ./miniruby -I./lib -I.ext/common > -I./- -r./ext/purelib.rb ./runruby.rb --extout=.ext --" \ > --pattern='bm_' --directory=./benchmark -r 10 > "1.9.0" > 2008-07-13 22:42:41 +0900 > target 0: ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] > target 1: ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] > > ----------------------------------------------------------- > vm3_gc > > #! /usr/bin/ruby > 5000.times do > 100.times do > {"xxxx"=>"yyyy"} > end > GC.start > end > > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.35910558700562 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.51446843147278 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.90153551101685 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.67432570457458 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.74260926246643 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 3.18074822425842 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.78490710258484 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.73308610916138 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.76204562187195 > ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] 2.78759121894836 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.6268355846405 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.49695825576782 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.47115182876587 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.37481427192688 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.85433769226074 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.76230645179749 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.74803757667542 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.48261618614197 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.42063546180725 > ruby 1.9.0 (2008-07-13 revision 17780) [i686-linux] 2.67150807380676 > > ----------------------------------------------------------- > raw data: > > [["vm3_gc", > [[2.35910558700562, > 2.51446843147278, > 2.90153551101685, > 2.67432570457458, > 2.74260926246643, > 3.18074822425842, > 2.78490710258484, > 2.73308610916138, > 2.76204562187195, > 2.78759121894836], > [2.6268355846405, > 2.49695825576782, > 2.47115182876587, > 2.37481427192688, > 2.85433769226074, > 2.76230645179749, > 2.74803757667542, > 2.48261618614197, > 2.42063546180725, > 2.67150807380676]]]] > > Elapesed time: 53.357572675 (sec) > ----------------------------------------------------------- > benchmark results: > minimum results in each 10 measurements. > name ruby 1.9.0 (2008-07-11 revision 17780) [i686-linux] ruby 1.9.0 > (2008-07-13 revision 17780) [i686-linux] > vm3_gc 2.359 2.375 > > > Index: gc.c > =================================================================== > --- gc.c (リビジョン 18054) > +++ gc.c (作業コピー) > @@ -92,6 +92,117 @@ > > #undef GC_DEBUG > > +/* for GC profile */ > +#define GC_PROFILE_MORE_DETAIL 0 > +typedef struct gc_profile_data { > + double gc_time; > + double gc_mark_time; > + double gc_sweep_time; > + size_t heaps_use_count; > + size_t heaps_live; > + size_t heaps_free; > + size_t heaps_all_objects; > + int is_exist_finalize; > + size_t allocate_increase; > + size_t allocate_limit; > +} gc_profile_data; > + > +/* referenced document http://kzk9.net/column/time.html */ > +static double > +getrusage_time(void) > +{ > + struct rusage usage; > + struct timeval time; > + getrusage(RUSAGE_SELF, &usage); > + time = usage.ru_utime; > + return time.tv_sec + (double)time.tv_usec*1e-6; > +} > + > +#define GC_PROF_TIMER_START do { \ > + if (ruby_gc_profile) { \ > + if (!objspace->profile.data) { \ > + objspace->profile.size = 1000; \ > + objspace->profile.data = malloc(sizeof(gc_profile_data) * > objspace->profile.size); \ > + } \ > + if (count >= objspace->profile.size) { \ > + objspace->profile.size += 1000; \ > + objspace->profile.data = realloc(objspace->profile.data, > sizeof(gc_profile_data) * objspace->profile.size); \ > + } \ > + if (!objspace->profile.data) { \ > + rb_bug("gc_profile malloc or realloc miss"); \ > + } \ > + MEMZERO(&objspace->profile.data[count], gc_profile_data, 1); \ > + gc_time = getrusage_time(); \ > + } \ > + } while(0) > + > +#define GC_PROF_TIMER_STOP do { \ > + if (ruby_gc_profile) { \ > + gc_time = getrusage_time() - gc_time; \ > + objspace->profile.data[count].gc_time = gc_time; \ > + objspace->profile.count++; \ > + } \ > + } while(0) > + > +#if GC_PROFILE_MORE_DETAIL > +#define INIT_GC_PROF_PARAMS double gc_time = 0, mark_time = 0, > sweep_time = 0; \ > + size_t count = objspace->profile.count > + > +#define GC_PROF_MARK_TIMER_START do { \ > + if (ruby_gc_profile) { \ > + mark_time = getrusage_time(); \ > + } \ > + } while(0) > + > +#define GC_PROF_MARK_TIMER_STOP do { \ > + if (ruby_gc_profile) { \ > + mark_time = getrusage_time() - mark_time; \ > + objspace->profile.data[count].gc_mark_time = mark_time; \ > + } \ > + } while(0) > + > +#define GC_PROF_SWEEP_TIMER_START do { \ > + if (ruby_gc_profile) { \ > + sweep_time = getrusage_time(); \ > + } \ > + } while(0) > + > +#define GC_PROF_SWEEP_TIMER_STOP do { \ > + if (ruby_gc_profile) { \ > + sweep_time = getrusage_time() - sweep_time; \ > + objspace->profile.data[count].gc_sweep_time = sweep_time; \ > + } \ > + } while(0) > +#define GC_PROF_SET_MALLOC_INFO do { \ > + if (ruby_gc_profile) { \ > + size_t count = objspace->profile.count; \ > + objspace->profile.data[count].allocate_increase = malloc_increase; \ > + objspace->profile.data[count].allocate_limit = malloc_limit; \ > + } \ > + } while(0) > +#define GC_PROF_SET_HEAP_INFO do { \ > + if (ruby_gc_profile) { \ > + size_t count = objspace->profile.count; \ > + objspace->profile.data[count].heaps_use_count = heaps_used; \ > + objspace->profile.data[count].heaps_live = live; \ > + objspace->profile.data[count].heaps_free = freed; \ > + objspace->profile.data[count].heaps_all_objects = heaps_used * > HEAP_OBJ_LIMIT; \ > + objspace->profile.data[count].is_exist_finalize = final_list ? > Qtrue : Qfalse; \ > + } \ > + } while(0) > + > +#else > +#define INIT_GC_PROF_PARAMS double gc_time = 0;\ > + size_t count = objspace->profile.count > +#define GC_PROF_MARK_TIMER_START > +#define GC_PROF_MARK_TIMER_STOP > +#define GC_PROF_SWEEP_TIMER_START > +#define GC_PROF_SWEEP_TIMER_STOP > +#define GC_PROF_SET_MALLOC_INFO > +#define GC_PROF_SET_HEAP_INFO > +#endif > + > + > #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CYGWIN__) > #pragma pack(push, 1) /* magic for reducing sizeof(RVALUE): 24 -> 20 */ > #endif > @@ -176,6 +287,12 @@ > VALUE *ptr; > int overflow; > } markstack; > + struct { > + int run; > + gc_profile_data *data; > + size_t count; > + size_t size; > + } profile; > struct gc_list *global_list; > unsigned int count; > int gc_stress; > @@ -209,6 +326,7 @@ > #define mark_stack_overflow objspace->markstack.overflow > #define global_List objspace->global_list > #define ruby_gc_stress objspace->gc_stress > +#define ruby_gc_profile objspace->profile.run > > #define need_call_final (finalizer_table && finalizer_table->num_entries) > > @@ -309,6 +427,46 @@ > return bool; > } > > +/* > + * call-seq: > + * GC.profile => true or false > + * > + * returns current status of GC profile mode. > + */ > + > +static VALUE > +gc_profile_get(VALUE self) > +{ > + rb_objspace_t *objspace = &rb_objspace; > + return ruby_gc_profile ? Qtrue : Qfalse; > +} > + > +/* > + * call-seq: > + * GC.profile = bool => bool > + * > + * updates GC profile mode. > + * > + * When GC.profile = true, run profiler for GC. > + * > + * When GC.profile = false, delete before profiler data. > + * > + * if want more detail info. please use GC_PROFILE_MORE_DETAIL. > + */ > + > +static VALUE > +gc_profile_set(VALUE self, VALUE bool) > +{ > + rb_objspace_t *objspace = &rb_objspace; > + rb_secure(2); > + ruby_gc_profile = RTEST(bool); > + if (!ruby_gc_profile) { > + MEMZERO(objspace->profile.data, gc_profile_data, objspace->profile.size); > + objspace->profile.count = 0; > + } > + return bool; > +} > + > static void * > vm_xmalloc(rb_objspace_t *objspace, size_t size) > { > @@ -1440,6 +1598,7 @@ > freed += n; > } > } > + GC_PROF_SET_MALLOC_INFO; > if (malloc_increase > malloc_limit) { > malloc_limit += (malloc_increase - malloc_limit) * (double)live / > (live + freed); > if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT; > @@ -1453,10 +1612,12 @@ > > /* clear finalization list */ > if (final_list) { > + GC_PROF_SET_HEAP_INFO; > deferred_final_list = final_list; > return; > } > free_unused_heaps(objspace); > + GC_PROF_SET_HEAP_INFO; > } > > void > @@ -1672,6 +1833,7 @@ > { > struct gc_list *list; > rb_thread_t *th = GET_THREAD(); > + INIT_GC_PROF_PARAMS; > > if (GC_NOTIFY) printf("start garbage_collect()\n"); > > @@ -1691,6 +1853,8 @@ > during_gc++; > objspace->count++; > > + GC_PROF_TIMER_START; > + GC_PROF_MARK_TIMER_START; > SET_STACK_END; > > init_mark_stack(objspace); > @@ -1731,9 +1895,13 @@ > gc_mark_rest(objspace); > } > } > + GC_PROF_MARK_TIMER_STOP; > > + GC_PROF_SWEEP_TIMER_START; > gc_sweep(objspace); > + GC_PROF_SWEEP_TIMER_STOP; > > + GC_PROF_TIMER_STOP; > if (GC_NOTIFY) printf("end garbage_collect()\n"); > return Qtrue; > } > @@ -2387,6 +2555,53 @@ > #endif > > /* > + * call-seq: > + * GC.profile_report -> hash > + * > + * Report profile data to wrap hash. > + * > + * It returns a hash as: > + * {:gc_count => 20 :report => [{:gc_time => 0.001}, {:gc_time => 0.002}]} > + * > + * if GC_PROFILE_MORE_DETAIL is 1: > + * {:gc_count => 20 :report => [{:gc_time => 0.001, :gc_mark_time => > 0.00004, :gc_sweep_time => 0.00006 }, ... }]} > + */ > + > +VALUE > +gc_profile_report(void) > +{ > + VALUE prof = 0; > + VALUE res = rb_hash_new(); > + VALUE datas = rb_ary_new(); > + size_t i; > + rb_objspace_t *objspace = (&rb_objspace); > + > + if (!ruby_gc_profile) { > + return Qnil; > + } > + > + for (i =0; i < objspace->profile.count; i++) { > + prof = rb_hash_new(); > + rb_hash_aset(prof, ID2SYM(rb_intern("gc_time")), > DOUBLE2NUM(objspace->profile.data[i].gc_time)); > +#if GC_PROFILE_MORE_DETAIL > + rb_hash_aset(prof, ID2SYM(rb_intern("gc_mark_time")), > DOUBLE2NUM(objspace->profile.data[i].gc_mark_time)); > + rb_hash_aset(prof, ID2SYM(rb_intern("gc_sweep_time")), > DOUBLE2NUM(objspace->profile.data[i].gc_sweep_time)); > + rb_hash_aset(prof, ID2SYM(rb_intern("allocate_increase")), > rb_uint2inum(objspace->profile.data[i].allocate_increase)); > + rb_hash_aset(prof, ID2SYM(rb_intern("allocate_limit")), > rb_uint2inum(objspace->profile.data[i].allocate_limit)); > + rb_hash_aset(prof, ID2SYM(rb_intern("heaps_use_count")), > rb_uint2inum(objspace->profile.data[i].heaps_use_count)); > + rb_hash_aset(prof, ID2SYM(rb_intern("heaps_live")), > rb_uint2inum(objspace->profile.data[i].heaps_live)); > + rb_hash_aset(prof, ID2SYM(rb_intern("heaps_free")), > rb_uint2inum(objspace->profile.data[i].heaps_free)); > + rb_hash_aset(prof, ID2SYM(rb_intern("heaps_all_objects")), > rb_uint2inum(objspace->profile.data[i].heaps_all_objects)); > + rb_hash_aset(prof, ID2SYM(rb_intern("is_exist_finalize")), > objspace->profile.data[i].is_exist_finalize); > +#endif > + rb_ary_push(datas, prof); > + } > + rb_hash_aset(res, ID2SYM(rb_intern("gc_count")), > rb_uint2inum(objspace->count)); > + rb_hash_aset(res, ID2SYM(rb_intern("report")), datas); > + return res; > +} > + > +/* > * The GC module provides an interface to Ruby's mark and > * sweep garbage collection mechanism. Some of the underlying methods > * are also available via the ObjectSpace module. > @@ -2404,6 +2619,9 @@ > rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0); > rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1); > rb_define_singleton_method(rb_mGC, "count", gc_count, 0); > + rb_define_singleton_method(rb_mGC, "profile", gc_profile_get, 0); > + rb_define_singleton_method(rb_mGC, "profile=", gc_profile_set, 1); > + rb_define_singleton_method(rb_mGC, "profile_report", gc_profile_report, 0); > rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0); > > rb_mObSpace = rb_define_module("ObjectSpace"); > > ------=_Part_31433_32237404.1216302227809 Content-Type: text/x-diff; name=gc_profile_by_dynamic.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fireuhv01 Content-Disposition: attachment; filename=gc_profile_by_dynamic.patch SW5kZXg6IHByZWx1ZGUucmIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcHJlbHVkZS5yYgko44Oq44OT44K444On 44OzIDE4MDgxKQorKysgcHJlbHVkZS5yYgko5L2c5qWt44Kz44OU44O8KQpAQCAtMzMsMyArMzMs MjggQEAKICAgYWJzb2x1dGVfZmVhdHVyZSA9IEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZp bGUuZGlybmFtZShmaWxlKSwgcmVsYXRpdmVfZmVhdHVyZSkpCiAgIHJlcXVpcmUgYWJzb2x1dGVf ZmVhdHVyZQogZW5kCisKK21vZHVsZSBHQworICBkZWYgc2VsZi5kaXNwbGF5KG91dD0kc3Rkb3V0 KQorICAgIHJlcCA9IEdDLnJlcG9ydAorICAgIGhfaW5mID0gT2JqZWN0U3BhY2UuY291bnRfY2xh c3NlcworICAgIHByb2YgPSBzcHJpbnRmKCJHQyAlMSRkIGludm9rZXMuXG4iLCBHQy5jb3VudCkK KworICAgIGlmIEdDLnByb2ZpbGUgYW5kICFyZXAuZW1wdHk/CisgICAgICBwcm9mICs9ICJJbmRl eCAgICAgICBVc2UgU2l6ZShieXRlKSAgICAgVG90YWwgU2l6ZShieXRlKSAgICAgICAgIFRvdGFs IE9iamVjdCAgICAgICAgICAgICAgICAgICAgR0MgdGltZShtcylcbiIKKyAgICAgIHJlcC5lYWNo X3dpdGhfaW5kZXggZG8gfGUsIGl8CisgICAgICAgIHByb2YgKz0gc3ByaW50ZigiJTEkNWQgJTIk MjBkICUzJDIwZCAlNCQyMGQgJTUkMzAuMjBmXG4iLCBpLCBlWzpIRUFQX1VTRV9TSVpFXSwgZVs6 SEVBUF9UT1RBTF9TSVpFXSwgZVs6SEVBUF9UT1RBTF9PQkpFQ1RTXSwgZVs6R0NfVElNRV0qMTAw KQorICAgICAgZW5kCisgICAgICBwcm9mICs9ICJcblxuIgorICAgIGVuZAorCisgICAgcHJvZiAr PSBzcHJpbnRmKCIlMSRkIHVzZWQgb2JqZWN0cyAlMiRkIGZyZWUgb2JqZWN0cyBhbmQgJTMkZCB0 b3RhbCBvYmplY3RzIGluIEhlYXAuXG4iLCBoX2luZls6VE9UQUxdIC0gaF9pbmZbOkZSRUVdLCBo X2luZls6RlJFRV0sIGhfaW5mWzpUT1RBTF0pCisgICAgcHJvZiArPSAiSW5kZXggICAgICAgICAg ICAgICAgQ291bnQgICAgICAgICAgICAgICAgICAgICUgICAgICAgICAgS2luZCAoY2xhc3MpXG4i CisgICAgaF9pbmYudG9fYS5zb3J0e3xiLCBhfCBhWzFdIDw9PiBiWzFdIH0uZWFjaF93aXRoX2lu ZGV4IGRvIHxlLCBpfAorICAgICAgIHVubGVzcyAldyJGUkVFIFRPVEFMIi5pbmNsdWRlPyBlWzBd LnRvX3MKKyAgICAgICAgIHByb2YgKz0gc3ByaW50ZigiJTEkNWQgJTIkMjBkICUzJDIwLjhmICU0 JDIwc1xuIiwgaSwgZVsxXSwgZVsxXS50b19mL2hfaW5mWzpUT1RBTF0udG9fZioxMDAsIGVbMF0p CisgICAgICAgZW5kCisgICAgZW5kCisgICAgb3V0LnB1dHMgcHJvZgorICBlbmQKK2VuZApJbmRl eDogZ2MuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSBnYy5jCSjjg6rjg5Pjgrjjg6fjg7MgMTgwODEpCisrKyBn Yy5jCSjkvZzmpa3jgrPjg5Tjg7wpCkBAIC05Miw2ICs5MiwxMjggQEAKIAogI3VuZGVmIEdDX0RF QlVHCiAKKy8qIGZvciBHQyBwcm9maWxlICovCisjZGVmaW5lIEdDX1BST0ZJTEVfTU9SRV9ERVRB SUwgMAordHlwZWRlZiBzdHJ1Y3QgZ2NfcHJvZmlsZV9kYXRhIHsKKyAgICBkb3VibGUgZ2NfdGlt ZTsKKyAgICBkb3VibGUgZ2NfbWFya190aW1lOworICAgIGRvdWJsZSBnY19zd2VlcF90aW1lOwor ICAgIHNpemVfdCBoZWFwX3VzZV9zbG90czsKKyAgICBzaXplX3QgaGVhcF9saXZlX29iamVjdHM7 CisgICAgc2l6ZV90IGhlYXBfZnJlZV9vYmplY3RzOworICAgIHNpemVfdCBoZWFwX3RvdGFsX29i amVjdHM7CisgICAgc2l6ZV90IGhlYXBfdXNlX3NpemU7CisgICAgc2l6ZV90IGhlYXBfdG90YWxf c2l6ZTsKKyAgICBpbnQgaGF2ZV9maW5hbGl6ZTsKKyAgICBzaXplX3QgYWxsb2NhdGVfaW5jcmVh c2U7CisgICAgc2l6ZV90IGFsbG9jYXRlX2xpbWl0OworfSBnY19wcm9maWxlX2RhdGE7CisKKy8q IHJlZmVyZW5jZWQgZG9jdW1lbnQgaHR0cDovL2t6azkubmV0L2NvbHVtbi90aW1lLmh0bWwgKi8K K3N0YXRpYyBkb3VibGUKK2dldHJ1c2FnZV90aW1lKHZvaWQpCit7CisgICAgc3RydWN0IHJ1c2Fn ZSB1c2FnZTsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lOworICAgIGdldHJ1c2FnZShSVVNBR0Vf U0VMRiwgJnVzYWdlKTsKKyAgICB0aW1lID0gdXNhZ2UucnVfdXRpbWU7CisgICAgcmV0dXJuIHRp bWUudHZfc2VjICsgKGRvdWJsZSl0aW1lLnR2X3VzZWMqMWUtNjsKK30KKworI2RlZmluZSBHQ19Q Uk9GX1RJTUVSX1NUQVJUIGRvIHtcCisJaWYgKHJ1YnlfZ2NfcHJvZmlsZSkge1wKKwkgICAgaWYg KCFvYmpzcGFjZS0+cHJvZmlsZS5kYXRhKSB7XAorCQlvYmpzcGFjZS0+cHJvZmlsZS5zaXplID0g MTAwMDtcCisJCW9ianNwYWNlLT5wcm9maWxlLmRhdGEgPSBtYWxsb2Moc2l6ZW9mKGdjX3Byb2Zp bGVfZGF0YSkgKiBvYmpzcGFjZS0+cHJvZmlsZS5zaXplKTtcCisJICAgIH1cCisJICAgIGlmIChj b3VudCA+PSBvYmpzcGFjZS0+cHJvZmlsZS5zaXplKSB7XAorCQlvYmpzcGFjZS0+cHJvZmlsZS5z aXplICs9IDEwMDA7XAorCQlvYmpzcGFjZS0+cHJvZmlsZS5kYXRhID0gcmVhbGxvYyhvYmpzcGFj ZS0+cHJvZmlsZS5kYXRhLCBzaXplb2YoZ2NfcHJvZmlsZV9kYXRhKSAqIG9ianNwYWNlLT5wcm9m aWxlLnNpemUpO1wKKwkgICAgfVwKKwkgICAgaWYgKCFvYmpzcGFjZS0+cHJvZmlsZS5kYXRhKSB7 XAorCQlyYl9idWcoImdjX3Byb2ZpbGUgbWFsbG9jIG9yIHJlYWxsb2MgbWlzcyIpO1wKKwkgICAg fVwKKwkgICAgTUVNWkVSTygmb2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtjb3VudF0sIGdjX3Byb2Zp bGVfZGF0YSwgMSk7XAorCSAgICBnY190aW1lID0gZ2V0cnVzYWdlX3RpbWUoKTtcCisJfVwKKyAg ICB9IHdoaWxlKDApCisKKyNkZWZpbmUgR0NfUFJPRl9USU1FUl9TVE9QIGRvIHtcCisJaWYgKHJ1 YnlfZ2NfcHJvZmlsZSkge1wKKwkgICAgZ2NfdGltZSA9IGdldHJ1c2FnZV90aW1lKCkgLSBnY190 aW1lO1wKKwkgICAgb2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtjb3VudF0uZ2NfdGltZSA9IGdjX3Rp bWU7XAorCSAgICBvYmpzcGFjZS0+cHJvZmlsZS5jb3VudCsrO1wKKwl9XAorICAgIH0gd2hpbGUo MCkKKworI2lmIEdDX1BST0ZJTEVfTU9SRV9ERVRBSUwKKyNkZWZpbmUgSU5JVF9HQ19QUk9GX1BB UkFNUyBkb3VibGUgZ2NfdGltZSA9IDAsIG1hcmtfdGltZSA9IDAsIHN3ZWVwX3RpbWUgPSAwOwlc CisgICAgc2l6ZV90IGNvdW50ID0gb2Jqc3BhY2UtPnByb2ZpbGUuY291bnQKKworI2RlZmluZSBH Q19QUk9GX01BUktfVElNRVJfU1RBUlQgZG8ge1wKKwlpZiAocnVieV9nY19wcm9maWxlKSB7XAor CSAgICBtYXJrX3RpbWUgPSBnZXRydXNhZ2VfdGltZSgpO1wKKwl9XAorICAgIH0gd2hpbGUoMCkK KworI2RlZmluZSBHQ19QUk9GX01BUktfVElNRVJfU1RPUCBkbyB7XAorCWlmIChydWJ5X2djX3By b2ZpbGUpIHtcCisJICAgIG1hcmtfdGltZSA9IGdldHJ1c2FnZV90aW1lKCkgLSBtYXJrX3RpbWU7 XAorCSAgICBvYmpzcGFjZS0+cHJvZmlsZS5kYXRhW2NvdW50XS5nY19tYXJrX3RpbWUgPSBtYXJr X3RpbWU7XAorCX1cCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIEdDX1BST0ZfU1dFRVBfVElN RVJfU1RBUlQgZG8gewkJXAorCWlmIChydWJ5X2djX3Byb2ZpbGUpIHsJCQlcCisJICAgIHN3ZWVw X3RpbWUgPSBnZXRydXNhZ2VfdGltZSgpOwlcCisJfQkJCQkJXAorICAgIH0gd2hpbGUoMCkKKwor I2RlZmluZSBHQ19QUk9GX1NXRUVQX1RJTUVSX1NUT1AgZG8ge1wKKwlpZiAocnVieV9nY19wcm9m aWxlKSB7XAorCSAgICBzd2VlcF90aW1lID0gZ2V0cnVzYWdlX3RpbWUoKSAtIHN3ZWVwX3RpbWU7 XAorCSAgICBvYmpzcGFjZS0+cHJvZmlsZS5kYXRhW2NvdW50XS5nY19zd2VlcF90aW1lID0gc3dl ZXBfdGltZTtcCisJfVwKKyAgICB9IHdoaWxlKDApCisjZGVmaW5lIEdDX1BST0ZfU0VUX01BTExP Q19JTkZPIGRvIHtcCisJaWYgKHJ1YnlfZ2NfcHJvZmlsZSkge1wKKwkgICAgc2l6ZV90IGNvdW50 ID0gb2Jqc3BhY2UtPnByb2ZpbGUuY291bnQ7XAorCSAgICBvYmpzcGFjZS0+cHJvZmlsZS5kYXRh W2NvdW50XS5hbGxvY2F0ZV9pbmNyZWFzZSA9IG1hbGxvY19pbmNyZWFzZTtcCisJICAgIG9ianNw YWNlLT5wcm9maWxlLmRhdGFbY291bnRdLmFsbG9jYXRlX2xpbWl0ID0gbWFsbG9jX2xpbWl0OyBc CisJfVwKKyAgICB9IHdoaWxlKDApCisjZGVmaW5lIEdDX1BST0ZfU0VUX0hFQVBfSU5GTyBkbyB7 XAorCWlmIChydWJ5X2djX3Byb2ZpbGUpIHtcCisJICAgIHNpemVfdCBjb3VudCA9IG9ianNwYWNl LT5wcm9maWxlLmNvdW50O1wKKwkgICAgb2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtjb3VudF0uaGVh cF91c2Vfc2xvdHMgPSBoZWFwc191c2VkO1wKKwkgICAgb2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtj b3VudF0uaGVhcF9saXZlX29iamVjdHMgPSBsaXZlO1wKKwkgICAgb2Jqc3BhY2UtPnByb2ZpbGUu ZGF0YVtjb3VudF0uaGVhcF9mcmVlX29iamVjdHMgPSBmcmVlZDtcCisJICAgIG9ianNwYWNlLT5w cm9maWxlLmRhdGFbY291bnRdLmhlYXBfdG90YWxfb2JqZWN0cyA9IGhlYXBzX3VzZWQgKiBIRUFQ X09CSl9MSU1JVDtcCisJICAgIG9ianNwYWNlLT5wcm9maWxlLmRhdGFbY291bnRdLmhhdmVfZmlu YWxpemUgPSBmaW5hbF9saXN0ID8gUXRydWUgOiBRZmFsc2U7XAorCSAgICBvYmpzcGFjZS0+cHJv ZmlsZS5kYXRhW2NvdW50XS5oZWFwX3VzZV9zaXplID0gbGl2ZSAqIHNpemVvZihSVkFMVUUpO1wK KwkgICAgb2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtjb3VudF0uaGVhcF90b3RhbF9zaXplID0gaGVh cHNfdXNlZCAqIChIRUFQX09CSl9MSU1JVCAqIHNpemVvZihSVkFMVUUpKTtcCisJfVwKKyAgICB9 IHdoaWxlKDApCisKKyNlbHNlCisjZGVmaW5lIElOSVRfR0NfUFJPRl9QQVJBTVMgZG91YmxlIGdj X3RpbWUgPSAwO1wKKyAgICBzaXplX3QgY291bnQgPSBvYmpzcGFjZS0+cHJvZmlsZS5jb3VudAor I2RlZmluZSBHQ19QUk9GX01BUktfVElNRVJfU1RBUlQKKyNkZWZpbmUgR0NfUFJPRl9NQVJLX1RJ TUVSX1NUT1AKKyNkZWZpbmUgR0NfUFJPRl9TV0VFUF9USU1FUl9TVEFSVAorI2RlZmluZSBHQ19Q Uk9GX1NXRUVQX1RJTUVSX1NUT1AKKyNkZWZpbmUgR0NfUFJPRl9TRVRfTUFMTE9DX0lORk8KKyNk ZWZpbmUgR0NfUFJPRl9TRVRfSEVBUF9JTkZPIGRvIHtcCisJaWYgKHJ1YnlfZ2NfcHJvZmlsZSkg e1wKKwkgICAgc2l6ZV90IGNvdW50ID0gb2Jqc3BhY2UtPnByb2ZpbGUuY291bnQ7XAorCSAgICBv YmpzcGFjZS0+cHJvZmlsZS5kYXRhW2NvdW50XS5oZWFwX3RvdGFsX29iamVjdHMgPSBoZWFwc191 c2VkICogSEVBUF9PQkpfTElNSVQ7XAorCSAgICBvYmpzcGFjZS0+cHJvZmlsZS5kYXRhW2NvdW50 XS5oZWFwX3VzZV9zaXplID0gbGl2ZSAqIHNpemVvZihSVkFMVUUpO1wKKwkgICAgb2Jqc3BhY2Ut PnByb2ZpbGUuZGF0YVtjb3VudF0uaGVhcF90b3RhbF9zaXplID0gaGVhcHNfdXNlZCAqIEhFQVBf U0laRTtcCisJfVwKKyAgICB9IHdoaWxlKDApCisjZW5kaWYKKworCiAjaWYgZGVmaW5lZChfTVND X1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKICNw cmFnbWEgcGFjayhwdXNoLCAxKSAvKiBtYWdpYyBmb3IgcmVkdWNpbmcgc2l6ZW9mKFJWQUxVRSk6 IDI0IC0+IDIwICovCiAjZW5kaWYKQEAgLTE3Niw2ICsyOTgsMTIgQEAKIAlWQUxVRSAqcHRyOwog CWludCBvdmVyZmxvdzsKICAgICB9IG1hcmtzdGFjazsKKyAgICBzdHJ1Y3QgeworCWludCBydW47 CisJZ2NfcHJvZmlsZV9kYXRhICpkYXRhOworCXNpemVfdCBjb3VudDsKKwlzaXplX3Qgc2l6ZTsK KyAgICB9IHByb2ZpbGU7CiAgICAgc3RydWN0IGdjX2xpc3QgKmdsb2JhbF9saXN0OwogICAgIHVu c2lnbmVkIGludCBjb3VudDsKICAgICBpbnQgZ2Nfc3RyZXNzOwpAQCAtMjA5LDYgKzMzNyw3IEBA CiAjZGVmaW5lIG1hcmtfc3RhY2tfb3ZlcmZsb3cJb2Jqc3BhY2UtPm1hcmtzdGFjay5vdmVyZmxv dwogI2RlZmluZSBnbG9iYWxfTGlzdAkJb2Jqc3BhY2UtPmdsb2JhbF9saXN0CiAjZGVmaW5lIHJ1 YnlfZ2Nfc3RyZXNzCQlvYmpzcGFjZS0+Z2Nfc3RyZXNzCisjZGVmaW5lIHJ1YnlfZ2NfcHJvZmls ZQkJb2Jqc3BhY2UtPnByb2ZpbGUucnVuCiAKICNkZWZpbmUgbmVlZF9jYWxsX2ZpbmFsIAkoZmlu YWxpemVyX3RhYmxlICYmIGZpbmFsaXplcl90YWJsZS0+bnVtX2VudHJpZXMpCiAKQEAgLTMwOSw2 ICs0MzgsNDYgQEAKICAgICByZXR1cm4gYm9vbDsKIH0KIAorLyoKKyAqICBjYWxsLXNlcToKKyAq ICAgIEdDLnByb2ZpbGUgICAgICAgICAgICAgICAgID0+IHRydWUgb3IgZmFsc2UKKyAqCisgKiAg cmV0dXJucyBjdXJyZW50IHN0YXR1cyBvZiBHQyBwcm9maWxlIG1vZGUuCisgKi8KKworc3RhdGlj IFZBTFVFCitnY19wcm9maWxlX2dldChWQUxVRSBzZWxmKQoreworICAgIHJiX29ianNwYWNlX3Qg Km9ianNwYWNlID0gJnJiX29ianNwYWNlOworICAgIHJldHVybiBydWJ5X2djX3Byb2ZpbGUgPyBR dHJ1ZSA6IFFmYWxzZTsKK30KKworLyoKKyAqICBjYWxsLXNlcToKKyAqICAgIEdDLnByb2ZpbGUg PSBib29sICAgICAgICAgID0+IGJvb2wKKyAqCisgKiAgdXBkYXRlcyBHQyBwcm9maWxlIG1vZGUu CisgKgorICogIFdoZW4gR0MucHJvZmlsZSA9IHRydWUsIHJ1biBwcm9maWxlciBmb3IgR0MuCisg KgorICogIFdoZW4gR0MucHJvZmlsZSA9IGZhbHNlLCBkZWxldGUgYmVmb3JlIHByb2ZpbGVyIGRh dGEuCisgKgorICogIGlmIHdhbnQgbW9yZSBkZXRhaWwgaW5mby4gcGxlYXNlIHVzZSBHQ19QUk9G SUxFX01PUkVfREVUQUlMLgorICovCisKK3N0YXRpYyBWQUxVRQorZ2NfcHJvZmlsZV9zZXQoVkFM VUUgc2VsZiwgVkFMVUUgYm9vbCkKK3sKKyAgICByYl9vYmpzcGFjZV90ICpvYmpzcGFjZSA9ICZy Yl9vYmpzcGFjZTsKKyAgICByYl9zZWN1cmUoMik7CisgICAgcnVieV9nY19wcm9maWxlID0gUlRF U1QoYm9vbCk7CisgICAgaWYgKCFydWJ5X2djX3Byb2ZpbGUpIHsKKwlNRU1aRVJPKG9ianNwYWNl LT5wcm9maWxlLmRhdGEsIGdjX3Byb2ZpbGVfZGF0YSwgb2Jqc3BhY2UtPnByb2ZpbGUuc2l6ZSk7 CisJb2Jqc3BhY2UtPnByb2ZpbGUuY291bnQgPSAwOworICAgIH0KKyAgICByZXR1cm4gYm9vbDsK K30KKwogc3RhdGljIHZvaWQgKgogdm1feG1hbGxvYyhyYl9vYmpzcGFjZV90ICpvYmpzcGFjZSwg c2l6ZV90IHNpemUpCiB7CkBAIC0xNDQwLDYgKzE2MDksNyBAQAogCSAgICBmcmVlZCArPSBuOwog CX0KICAgICB9CisgICAgR0NfUFJPRl9TRVRfTUFMTE9DX0lORk87CiAgICAgaWYgKG1hbGxvY19p bmNyZWFzZSA+IG1hbGxvY19saW1pdCkgewogCW1hbGxvY19saW1pdCArPSAobWFsbG9jX2luY3Jl YXNlIC0gbWFsbG9jX2xpbWl0KSAqIChkb3VibGUpbGl2ZSAvIChsaXZlICsgZnJlZWQpOwogCWlm IChtYWxsb2NfbGltaXQgPCBHQ19NQUxMT0NfTElNSVQpIG1hbGxvY19saW1pdCA9IEdDX01BTExP Q19MSU1JVDsKQEAgLTE0NTMsMTAgKzE2MjMsMTIgQEAKIAogICAgIC8qIGNsZWFyIGZpbmFsaXph dGlvbiBsaXN0ICovCiAgICAgaWYgKGZpbmFsX2xpc3QpIHsKKwlHQ19QUk9GX1NFVF9IRUFQX0lO Rk87CiAJZGVmZXJyZWRfZmluYWxfbGlzdCA9IGZpbmFsX2xpc3Q7CiAJcmV0dXJuOwogICAgIH0K ICAgICBmcmVlX3VudXNlZF9oZWFwcyhvYmpzcGFjZSk7CisgICAgR0NfUFJPRl9TRVRfSEVBUF9J TkZPOwogfQogCiB2b2lkCkBAIC0xNjcyLDYgKzE4NDQsNyBAQAogewogICAgIHN0cnVjdCBnY19s aXN0ICpsaXN0OwogICAgIHJiX3RocmVhZF90ICp0aCA9IEdFVF9USFJFQUQoKTsKKyAgICBJTklU X0dDX1BST0ZfUEFSQU1TOwogCiAgICAgaWYgKEdDX05PVElGWSkgcHJpbnRmKCJzdGFydCBnYXJi YWdlX2NvbGxlY3QoKVxuIik7CiAKQEAgLTE2OTEsNiArMTg2NCw4IEBACiAgICAgZHVyaW5nX2dj Kys7CiAgICAgb2Jqc3BhY2UtPmNvdW50Kys7CiAKKyAgICBHQ19QUk9GX1RJTUVSX1NUQVJUOwor ICAgIEdDX1BST0ZfTUFSS19USU1FUl9TVEFSVDsKICAgICBTRVRfU1RBQ0tfRU5EOwogCiAgICAg aW5pdF9tYXJrX3N0YWNrKG9ianNwYWNlKTsKQEAgLTE3MzEsOSArMTkwNiwxMyBAQAogCSAgICBn Y19tYXJrX3Jlc3Qob2Jqc3BhY2UpOwogCX0KICAgICB9CisgICAgR0NfUFJPRl9NQVJLX1RJTUVS X1NUT1A7CiAKKyAgICBHQ19QUk9GX1NXRUVQX1RJTUVSX1NUQVJUOwogICAgIGdjX3N3ZWVwKG9i anNwYWNlKTsKKyAgICBHQ19QUk9GX1NXRUVQX1RJTUVSX1NUT1A7CiAKKyAgICBHQ19QUk9GX1RJ TUVSX1NUT1A7CiAgICAgaWYgKEdDX05PVElGWSkgcHJpbnRmKCJlbmQgZ2FyYmFnZV9jb2xsZWN0 KClcbiIpOwogICAgIHJldHVybiBRdHJ1ZTsKIH0KQEAgLTIzMDAsNiArMjQ3OSw3IEBACiAgICAg fQogICAgIHJiX2hhc2hfYXNldChoYXNoLCBJRDJTWU0ocmJfaW50ZXJuKCJUT1RBTCIpKSwgU0la RVQyTlVNKHRvdGFsKSk7CiAgICAgcmJfaGFzaF9hc2V0KGhhc2gsIElEMlNZTShyYl9pbnRlcm4o IkZSRUUiKSksIFNJWkVUMk5VTShmcmVlZCkpOworCiAgICAgZm9yIChpID0gMDsgaSA8PSBUX01B U0s7IGkrKykgewogICAgICAgICBWQUxVRSB0eXBlOwogICAgICAgICBzd2l0Y2ggKGkpIHsKQEAg LTIzNDAsNiArMjUyMCw4NyBAQAogCiAvKgogICogIGNhbGwtc2VxOgorICogICAgIE9iamVjdFNw YWNlLmNvdW50X2NsYXNzZXMoW3Jlc3VsdF9oYXNoXSkgLT4gaGFzaAorICoKKyAqICBDb3VudHMg Y2xhc3NlcyBmb3IgZWFjaCB0eXBlLgorICoKKyAqICBJdCByZXR1cm5zIGEgaGFzaCBhczoKKyAq ICB7OlRPVEFMPT4xMDAwMCwgOkZSRUU9PjMwMTEsIDpTdHJpbmc9PjYsIDpBcnJheT0+NDA0LCAu Li59CisgKgorICogIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCwgcmVzdWx0X2hhc2gsIGlzIGdp dmVuLAorICogIGl0IGlzIG92ZXJ3cml0dGVuIGFuZCByZXR1cm5lZC4KKyAqICBUaGlzIGlzIGlu dGVuZGVkIHRvIGF2b2lkIHByb2JlIGVmZmVjdC4KKyAqCisgKiAgVGhlIGNvbnRlbnRzIG9mIHRo ZSByZXR1cm5lZCBoYXNoIGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQuCisgKi8KKworVkFMVUUK K2NvdW50X2NsYXNzZXMoaW50IGFyZ2MsIFZBTFVFICphcmd2LCBWQUxVRSBvcykKK3sKKyAgICBW QUxVRSBoYXNoOworICAgIHJiX29ianNwYWNlX3QgKm9ianNwYWNlID0gKCZyYl9vYmpzcGFjZSk7 CisgICAgVkFMVUUgc3ltcyA9IHJiX2FyeV9uZXcoKTsKKyAgICBzdF90YWJsZSAqdGFibGU7Cisg ICAgc3RfZGF0YV90ICpjbnQ7CisgICAgc2l6ZV90IGZyZWVfb2Jqcz0gMCwgdG90YWxfb2JqcyA9 IDAsIGkgPSAwOworCisgICAgaWYgKHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiMDEiLCAmaGFz aCkgPT0gMSkgeworICAgICAgICBpZiAoVFlQRShoYXNoKSAhPSBUX0hBU0gpCisgICAgICAgICAg ICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAibm9uLWhhc2ggZ2l2ZW4iKTsKKyAgICB9CisKKyAg ICB0YWJsZSA9IHN0X2luaXRfbnVtdGFibGUoKTsKKyAgICBjbnQgPSB2bV94bWFsbG9jKG9ianNw YWNlLCBzaXplb2Yoc3RfZGF0YV90KSk7CisgICAgZm9yIChpID0gMDsgaSA8IGhlYXBzX3VzZWQ7 IGkrKykgeworICAgICAgICBSVkFMVUUgKnAsICpwZW5kOworICAgICAgICBJRCBzeW07CisKKyAg ICAgICAgcCA9IGhlYXBzW2ldLnNsb3Q7IHBlbmQgPSBwICsgaGVhcHNbaV0ubGltaXQ7CisgICAg ICAgIGZvciAoO3AgPCBwZW5kOyBwKyspIHsKKwkgICAgKmNudCA9IDE7CisJICAgIGlmIChCVUlM VElOX1RZUEUocCkgIT0gMCAmJiBSQU5ZKHApLT5hcy5iYXNpYy5mbGFncykgeyAKKwkJc3ltID0g cmJfaW50ZXJuKHJiX29ial9jbGFzc25hbWUoKFZBTFVFKXApKTsKKwkJaWYgKHN0X2xvb2t1cCh0 YWJsZSwgKHN0X2RhdGFfdClzeW0sIGNudCkpIHsKKwkJICAgICpjbnQgPSAqY250ICsgMTsKKwkJ ICAgIHN0X2luc2VydCh0YWJsZSwgKHN0X2RhdGFfdClzeW0sICpjbnQpOworCQl9IGVsc2Ugewor CQkgICAgcmJfYXJ5X3B1c2goc3ltcywgSUQyU1lNKHN5bSkpOworCQkgICAgc3RfYWRkX2RpcmVj dCh0YWJsZSwgKHN0X2RhdGFfdClzeW0sICpjbnQpOworCQl9CisJICAgIH0KKwkgICAgZWxzZSB7 CisJCWZyZWVfb2JqcysrOworCSAgICB9CisJfQorCXRvdGFsX29ianMgKz0gaGVhcHNbaV0ubGlt aXQ7CisgICAgfQorCisgICAgaWYgKGhhc2ggPT0gUW5pbCkgeworICAgICAgICBoYXNoID0gcmJf aGFzaF9uZXcoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIVJIQVNIX0VNUFRZX1AoaGFzaCkpIHsK KyAgICAgICAgc3RfZm9yZWFjaChSSEFTSF9UQkwoaGFzaCksIHNldF96ZXJvLCBoYXNoKTsKKyAg ICB9CisKKyAgICByYl9oYXNoX2FzZXQoaGFzaCwgSUQyU1lNKHJiX2ludGVybigiVE9UQUwiKSks IHJiX3VpbnQyaW51bSh0b3RhbF9vYmpzKSk7CisgICAgcmJfaGFzaF9hc2V0KGhhc2gsIElEMlNZ TShyYl9pbnRlcm4oIkZSRUUiKSksIHJiX3VpbnQyaW51bShmcmVlX29ianMpKTsKKworICAgIGZv ciAoaSA9IDA7IGkgPCBSQVJSQVlfTEVOKHN5bXMpOyBpKyspIHsKKwlWQUxVRSBzeW07CisJc3lt ID0gcmJfYXJ5X2VudHJ5KHN5bXMsIGkpOworCWlmIChzdF9sb29rdXAodGFibGUsIChWQUxVRSlT WU0ySUQoc3ltKSwgY250KSkgeworCSAgICByYl9oYXNoX2FzZXQoaGFzaCwgc3ltLCByYl91aW50 MmludW0oKmNudCkpOworCX0KKyAgICB9CisKKyAgICB2bV94ZnJlZShvYmpzcGFjZSwgY250KTsK KyAgICBzdF9mcmVlX3RhYmxlKHRhYmxlKTsKKworICAgIHJldHVybiBoYXNoOworfQorCisvKgor ICogIGNhbGwtc2VxOgogICogICAgIEdDLmNvdW50IC0+IEludGVnZXIKICAqCiAgKiAgVGhlIG51 bWJlciBvZiB0aW1lcyBHQyBvY2N1cmVkLgpAQCAtMjM4Nyw2ICsyNjQ4LDU1IEBACiAjZW5kaWYK IAogLyoKKyAqICBjYWxsLXNlcToKKyAqICAgICBHQy5yZXBvcnQgLT4gaGFzaAorICoKKyAqICBS ZXBvcnQgcHJvZmlsZSBkYXRhIHRvIHdyYXAgaGFzaC4KKyAqCisgKiAgSXQgcmV0dXJucyBhIGhh c2ggYXM6CisgKiAgW3s6R0NfVElNRSA9PiAwLjAwMSwgOkhFQVBfVVNFX1NJWkUgPT4gMzQyODQw LCA6SEVBUF9UT1RBTF9TSVpFPT4zNjAzNjB9LCAuLi4gXQorICoKKyAqICBpZiBHQ19QUk9GSUxF X01PUkVfREVUQUlMIGlzIDE6CisgKiAgW3s6R0NfVElNRT0+MC4wMDQsIDpIRUFQX1VTRV9TSVpF PT4zNDI4NDAsIDpIRUFQX1RPVEFMX1NJWkU9PjM2MDM2MCwgOkdDX01BUktfVElNRT0+LTUuMjg1 NDg1NTkwODY2ODNlLTE5LAorICogICAgICA6R0NfU1dFRVBfVElNRT0+MC4wMDQsIDpBTExPQ0FU RV9JTkNSRUFTRT0+NDA0NzAsIDpBTExPQ0FURV9MSU1JVD0+ODAwMDAwMCwgOkhFQVBfVVNFX1NM T1RTPT4yMiwKKyAqICAgICAgOkhFQVBfTElWRV9PQkpFQ1RTPT4xNzE0MiwgOkhFQVBfRlJFRV9P QkpFQ1RTPT40NCwgOkhFQVBfVE9UQUxfT0JKRUNUUz0+MTgwMTgsIDpIQVZFX0ZJTkFMSVpFPT5m YWxzZX0sIC4uIF0KKyAqLworCitWQUxVRQorZ2NfcmVwb3J0KHZvaWQpCit7CisgICAgVkFMVUUg cHJvZjsKKyAgICBWQUxVRSBnY19wcm9maWxlID0gcmJfYXJ5X25ldygpOworICAgIHNpemVfdCBp OworICAgIHJiX29ianNwYWNlX3QgKm9ianNwYWNlID0gKCZyYl9vYmpzcGFjZSk7CisgICAgCisg ICAgaWYgKCFydWJ5X2djX3Byb2ZpbGUpIHsKKwlyZXR1cm4gUW5pbDsKKyAgICB9CisKKyAgICBm b3IgKGkgPTA7IGkgPCBvYmpzcGFjZS0+cHJvZmlsZS5jb3VudDsgaSsrKSB7CisJcHJvZiA9IHJi X2hhc2hfbmV3KCk7CisgICAgICAgIHJiX2hhc2hfYXNldChwcm9mLCBJRDJTWU0ocmJfaW50ZXJu KCJHQ19USU1FIikpLCBET1VCTEUyTlVNKG9ianNwYWNlLT5wcm9maWxlLmRhdGFbaV0uZ2NfdGlt ZSkpOworICAgICAgICByYl9oYXNoX2FzZXQocHJvZiwgSUQyU1lNKHJiX2ludGVybigiSEVBUF9V U0VfU0laRSIpKSwgcmJfdWludDJpbnVtKG9ianNwYWNlLT5wcm9maWxlLmRhdGFbaV0uaGVhcF91 c2Vfc2l6ZSkpOworICAgICAgICByYl9oYXNoX2FzZXQocHJvZiwgSUQyU1lNKHJiX2ludGVybigi SEVBUF9UT1RBTF9TSVpFIikpLCByYl91aW50MmludW0ob2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtp XS5oZWFwX3RvdGFsX3NpemUpKTsKKyAgICAgICAgcmJfaGFzaF9hc2V0KHByb2YsIElEMlNZTShy Yl9pbnRlcm4oIkhFQVBfVE9UQUxfT0JKRUNUUyIpKSwgcmJfdWludDJpbnVtKG9ianNwYWNlLT5w cm9maWxlLmRhdGFbaV0uaGVhcF90b3RhbF9vYmplY3RzKSk7CisjaWYgR0NfUFJPRklMRV9NT1JF X0RFVEFJTAorICAgICAgICByYl9oYXNoX2FzZXQocHJvZiwgSUQyU1lNKHJiX2ludGVybigiR0Nf TUFSS19USU1FIikpLCBET1VCTEUyTlVNKG9ianNwYWNlLT5wcm9maWxlLmRhdGFbaV0uZ2NfbWFy a190aW1lKSk7CisJcmJfaGFzaF9hc2V0KHByb2YsIElEMlNZTShyYl9pbnRlcm4oIkdDX1NXRUVQ X1RJTUUiKSksIERPVUJMRTJOVU0ob2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtpXS5nY19zd2VlcF90 aW1lKSk7CisgICAgICAgIHJiX2hhc2hfYXNldChwcm9mLCBJRDJTWU0ocmJfaW50ZXJuKCJBTExP Q0FURV9JTkNSRUFTRSIpKSwgcmJfdWludDJpbnVtKG9ianNwYWNlLT5wcm9maWxlLmRhdGFbaV0u YWxsb2NhdGVfaW5jcmVhc2UpKTsKKyAgICAgICAgcmJfaGFzaF9hc2V0KHByb2YsIElEMlNZTShy Yl9pbnRlcm4oIkFMTE9DQVRFX0xJTUlUIikpLCByYl91aW50MmludW0ob2Jqc3BhY2UtPnByb2Zp bGUuZGF0YVtpXS5hbGxvY2F0ZV9saW1pdCkpOworICAgICAgICByYl9oYXNoX2FzZXQocHJvZiwg SUQyU1lNKHJiX2ludGVybigiSEVBUF9VU0VfU0xPVFMiKSksIHJiX3VpbnQyaW51bShvYmpzcGFj ZS0+cHJvZmlsZS5kYXRhW2ldLmhlYXBfdXNlX3Nsb3RzKSk7CisgICAgICAgIHJiX2hhc2hfYXNl dChwcm9mLCBJRDJTWU0ocmJfaW50ZXJuKCJIRUFQX0xJVkVfT0JKRUNUUyIpKSwgcmJfdWludDJp bnVtKG9ianNwYWNlLT5wcm9maWxlLmRhdGFbaV0uaGVhcF9saXZlX29iamVjdHMpKTsKKyAgICAg ICAgcmJfaGFzaF9hc2V0KHByb2YsIElEMlNZTShyYl9pbnRlcm4oIkhFQVBfRlJFRV9PQkpFQ1RT IikpLCByYl91aW50MmludW0ob2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtpXS5oZWFwX2ZyZWVfb2Jq ZWN0cykpOworICAgICAgICByYl9oYXNoX2FzZXQocHJvZiwgSUQyU1lNKHJiX2ludGVybigiSEFW RV9GSU5BTElaRSIpKSwgb2Jqc3BhY2UtPnByb2ZpbGUuZGF0YVtpXS5oYXZlX2ZpbmFsaXplKTsK KyNlbmRpZgorCXJiX2FyeV9wdXNoKGdjX3Byb2ZpbGUsIHByb2YpOworICAgIH0KKworICAgIHJl dHVybiBnY19wcm9maWxlOworfQorCisvKgogICogIFRoZSA8Y29kZT5HQzwvY29kZT4gbW9kdWxl IHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBSdWJ5J3MgbWFyayBhbmQKICAqICBzd2VlcCBnYXJi YWdlIGNvbGxlY3Rpb24gbWVjaGFuaXNtLiBTb21lIG9mIHRoZSB1bmRlcmx5aW5nIG1ldGhvZHMK ICAqICBhcmUgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSA8Y29kZT5PYmplY3RTcGFjZTwvY29kZT4g bW9kdWxlLgpAQCAtMjQwNCw2ICsyNzE0LDkgQEAKICAgICByYl9kZWZpbmVfc2luZ2xldG9uX21l dGhvZChyYl9tR0MsICJzdHJlc3MiLCBnY19zdHJlc3NfZ2V0LCAwKTsKICAgICByYl9kZWZpbmVf c2luZ2xldG9uX21ldGhvZChyYl9tR0MsICJzdHJlc3M9IiwgZ2Nfc3RyZXNzX3NldCwgMSk7CiAg ICAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QocmJfbUdDLCAiY291bnQiLCBnY19jb3VudCwg MCk7CisgICAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QocmJfbUdDLCAicHJvZmlsZSIsIGdj X3Byb2ZpbGVfZ2V0LCAwKTsKKyAgICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChyYl9tR0Ms ICJwcm9maWxlPSIsIGdjX3Byb2ZpbGVfc2V0LCAxKTsKKyAgICByYl9kZWZpbmVfc2luZ2xldG9u X21ldGhvZChyYl9tR0MsICJyZXBvcnQiLCBnY19yZXBvcnQsIDApOwogICAgIHJiX2RlZmluZV9t ZXRob2QocmJfbUdDLCAiZ2FyYmFnZV9jb2xsZWN0IiwgcmJfZ2Nfc3RhcnQsIDApOwogCiAgICAg cmJfbU9iU3BhY2UgPSByYl9kZWZpbmVfbW9kdWxlKCJPYmplY3RTcGFjZSIpOwpAQCAtMjQyNSw2 ICsyNzM4LDcgQEAKICAgICByYl9kZWZpbmVfbWV0aG9kKHJiX21LZXJuZWwsICJvYmplY3RfaWQi LCByYl9vYmpfaWQsIDApOwogCiAgICAgcmJfZGVmaW5lX21vZHVsZV9mdW5jdGlvbihyYl9tT2JT cGFjZSwgImNvdW50X29iamVjdHMiLCBjb3VudF9vYmplY3RzLCAtMSk7CisgICAgcmJfZGVmaW5l X21vZHVsZV9mdW5jdGlvbihyYl9tT2JTcGFjZSwgImNvdW50X2NsYXNzZXMiLCBjb3VudF9jbGFz c2VzLCAtMSk7CiAKICNpZiBDQUxDX0VYQUNUX01BTExPQ19TSVpFCiAgICAgcmJfZGVmaW5lX3Np bmdsZXRvbl9tZXRob2QocmJfbUdDLCAibWFsbG9jX2FsbG9jYXRlZF9zaXplIiwgZ2NfbWFsbG9j X2FsbG9jYXRlZF9zaXplLCAwKTsK ------=_Part_31433_32237404.1216302227809--