--0__=85256AD4006805E18f9e8a93df938690918c85256AD4006805E1 Content-type: text/plain; charset=us-ascii Hi, I would like comments on a stand alone Perl program for administering accessibility settings. It invokes two programs from the Blinux site and one from metalab.unc.edu. They are volume, SVGATextMode, and locktones - which you will need to download. Here is the code; I'll send both clear text and an attachment just in case the clear text has a white space reformat problem. (See attached file: console.510) #!/usr/bin/perl # Author Michael R Cross September 26, 1001 11:35 AM # -e favorite.vol && die( ... ); # This program presents a menu of console mode access # options. These options are as follows: # 1. set Defaults # 2. volume control # 3. SVGATextMode large fonts # 4. Locked Tones # 5. foreground Background color changes # NOTES: # 1. Unpack volume-2.1.tar.gz in /usr/bin # rpm install locktones # rpm install SVGATextMode ############################################### # main Accessibility For The Linux Console ############################################### { # array colors @colors = ( black, red, green, brown, blue, magenta, cyan, gray, dark_gray, light_red, light_green, yellow, light_blue, light_magenta, light_cyan, white, not_set); # end array definition system("clear"); print "September 26, 2001 11:35 AM \n"; print "Welcome To the Console Accessibility Tool\n"; print "You should be logged in as root to run this program!\n"; print "if you are not, quit this program and login again.\n"; # print "again.\n\n"; $ret1 = &catch_your_breath(); do # while { print "Main Menu: Select an item & press enter.\n"; print "Your options are\n"; print " 1 for restore all Defaults.\n"; print " 2 for Volume controls. \n"; $volume_path ="/bin/volume_2.1"; print " 3 for font menu. \n"; print " 4 for lock Tones. \n"; $tone_path ="/usr/bin"; print " 5 for Foreground Background Changes.\n"; print " 6 for readme text. \n"; $font_path ="/usr/sbin"; print " q to quit this program.\n"; print " r to repeat this menu.\n"; print "Type your choice & press Enter now!\n"; $in_key = <STDIN>; chop( $in_key ); $ret = &strip_white_space(); # print "in_key is \<$in_key\>\n"; system( "clear" ); if( $in_key == 1 ) { system("locktones" ); $ret = &small_font(); $ret = &init_vol(); print "\033[33;1m\n"; # yellow foreground print "\033[40m\n"; # black background } elsif( $in_key == 2 ) { $ret1 = &change_volume(); } elsif( $in_key == 3 ) # fonts { # Select from a menu of fonts of different sizes. $ret1 = &font_menu(); } elsif( $in_key == 4 ) { # Set tones to sound when you touch caps lock, num lock, & scroll lock. system( "clear" ); print " Note about locktone:\n"; print "locktones will play a tone if you \n"; print "touch Caps Lock, Num Lock, or Scroll \n"; print "Lock.\n"; print " End Of Note:\n"; print " Do you want to set up these tones? y/n\n"; $in_key = <STDIN>; $ret = &strip_white_space(); if(($in_key eq "y") || ($in_key eq "Y")) { system( "locktones" ); print "locktones have now been set up."; } else { print "locktones were not set up."; } } elsif( $in_key == 5 ) # background foreground changess { # foreground Background color change tool. $ret1 = &change_color_scheme(); } elsif ($in_key == 6 ) # read me text { # Info about URLs, directories, and installing. $ret = &readme(); } # end if select a function # elsif( $in_key =~ /\e/ ) } while( $in_key ne "q" ); print "\n\n Ssend Comments to mrcross\@us.ibm.com \n\n"; $ret = &exit_program(); } # end main program ############################################### # change_volume ################################################# sub change_volume { $delta_v = 20; # change per keystroke $top_v = 240; # max volume system( "clear" ); $old_v = 50; $cannot_open = 0; # false unless( open( FAVORITEVOL, "/bin/favorite.vol") ) { # die("Cannot open file: /bin/favorite.vol.\n\n"); $cannot_open = 1; # true $ret = &init_vol(); } if( $cannot_open == 0 ) { $old_v = <FAVORITEVOL>; chop( $old_v ); close( FAVORITEVOL ); } # end if cannot_open == 0 print "Your current volume setting is $old_v.\n"; $new_v = $old_v; # starting volume $cmd = "volume_path/volume -l ".$new_v." -r ".$new_v; # print "cmd is \<$cmd\>.\n"; system( $cmd ); # execute the command $final_change = 0; # false print "Volume Control Menu:\n"; print "To return to the Main Menu press m and\n"; print "enter. The old volume will be restored.\n"; print "To exit the program press q and\n"; print "enter. The old volume will be restored.\n"; print " Each time you press d and enter\n"; print "the volume will be decreased.\n"; print " Each time you press i and enter\n"; print "the volume will be increased.\n"; print "When finished changing volume press \n"; print "enter by itself.\n"; while( $final_change == 0 ) { $in_key = <STDIN>; chop( $in_key ); $ret = &strip_white_space(); # print "in_key \<$in_key\>\n"; system( "clear" ); # clear screen if( $in_key eq "i") { $new_v += $delta_v; if( $new_v > $top_v ) { $new_v = $top_v; } print "volume is $new_v.\n"; $cmd = "/bin/volume-2.1/volume -l ".$new_v." -r ".$new_v; # print "cmd is \<$cmd\>\n"; system( $cmd ); # execute the command } elsif( $in_key eq "d" ) { $new_v -= $delta_v; if( $new_v < $delta_v ) { $new_v = $delta_v; } print "volume is $new_v.\n"; $cmd = "/bin/volume-2.1/volume -l ".$new_v." -r ".$new_v; # print "cmd is \<$cmd\>\n"; system( $cmd ); # execute the command } elsif( $in_key eq "" ) # enter by itself { $final_change = 1; print "Your Final Volume is $new_v.\n"; $final_change = 1; print "Do you want $new_v to be your volume setting? y/n "; $in_key = <STDIN>; chop( $in_key ); $ret = &strip_white_space(); if(($in_key eq "y") || ($in_key eq "Y")) { system( "rm /bin/favorite.vol" ); unless( open( FAVORITEVOL, ">/bin/favorite.vol") ) { die("Cannot open file: /bin/favorite.vol!\n\n"); } print FAVORITEVOL "$new_v\n"; print "Save new volume setting $new_v in /bin/favorite.vol.\n\n"; } # end if saving new volume setting } elsif( $in_key eq "m" ) # return to main menu { $final_change = 1; $cmd = "/bin/volume-2.1/volume -l ".$old_v." -r ".$old_v; system( $cmd ); # execute the command } elsif( $in_key eq "q" ) # exit program { $final_change = 1; $cmd = "/bin/volume-2.1/volume -l ".$old_v." -r ".$old_v; system( $cmd ); # execute the command $ret = &exit_program(); } # end volume execute branch } # end while not final_change } # end subroutine change_volume ############################################## # init_vol initialize volume to 50 and save it ################################################ sub init_vol { system("volume -l 40 -r 40" ); system("rm /bin/favorite.vol" ); unless( open( FAVORITEVOL, ">/bin/favorite.vol") ) { die("Cannot open file: /bin/favorite.vol!\n\n"); } $new_v = 40; print FAVORITEVOL "$delta_v\n"; print "SavING volume 40 in /bin/favorite.vol.\n\n"; } # end sub routine set_vol ############################################## # font_menu choice of 5 fonts of dirrerence sizes ############################################### sub font_menu { $old_f = "80x25"; $cannot_open == 0; # false unless( open( FAVORITEFON, "/usr/sbin/favorite.fon") ) { $ret = &small_font(); $cannot_open == 1; # true } if( $cannot_open == 0 ) { $old_f = <FAVORITEFON>; chop( $old_f ); close( FAVORITEFON ); } # end if cannot_open == 0 system( "SVGATextMode $old_f" ); do # while { system( "clear" ); print "Current font is $old_f.\n"; print "Select a font then press enter.\n"; print "Your options are\n"; print "1 for the 80x25 font. \n"; print "2 for the 40x12x8 font. \n"; print "3 for the 40x12x9 font. \n"; print "4 for the 40x15x8 font. \n"; print "5 for the 40x15x9 font. \n"; print "m to return to Main Menu.\n"; print "q to exit the program.\n"; print "r to repeat this menu.\n"; print "Select an item and press Enter now!\n"; $in_key = <STDIN>; chop( $in_key ); $ret = &strip_white_space(); $valid_font = 1; # yes if( $in_key == 1 ) { system( "SVGATextMode 80x25" ); $new_f = "80x25"; } elsif( $in_key == 2 ) { system( "SVGATextMode 40x12x8" ); $new_f = "40x12x8"; } elsif( $in_key == 3 ) { system( "SVGATextMode 40x12x9" ); $new_f = "40x12x9"; } elsif( $in_key == 4 ) { system( "SVGATextMode 40x15x8" ); $new_f = "40x15x8"; } elsif( $in_key == 5 ) { system( "SVGATextMode 40x15x9" ); $new_f = "40x15x9"; } elsif( $in_key eq "m" ) # return to main menu { $valid_font = 0; # no # system( "SVGATextMode $old_f" ); } elsif( $in_key eq "q" ) # exit program { $valid_font = 0; # no # system( "SVGATextMode $old_f" ); } # end if pick a new font system( "clear" ); if( $valid_font == 1 ) { print "Do you want $new_f to be your font setting? y/n "; $in_key = <STDIN>; chop( $in_key ); $ret = &strip_white_space(); # print "in_key is \<$in_key\>.n"; if(($in_key eq "y") || ($in_key eq "Y")) { system( "rm /usr/sbin/favorite.fon" ); unless( open( FAVORITEFON, ">/usr/sbin/favorite.fon") ) { die("Cannot open file: /usr/sbin/favorite.fon! \n\n"); } print FAVORITEFON "$new_f\n"; print "Saving new font setting $new_f in /usr/sbin/favorite.fon.\n\n"; $old_f = $new_f; } else # do not save new font { system( "SVGATextMode $old_f" ); } # end if saving new font setting } # end if $valid_font == 1 yes system( "clear" ); } while(($in_key ne "m") && ($in_key ne "q") ); if( $in_key eq "q" ) # exit program { # system( "SVGATextMode $old_f" ); $ret = &exit_program(); } # end if quit this menu } # end subroutine font_menu ############################################## # small_font to 80x25 and save it ################################################ sub small_font { system("SVGATextMode 80x25" ); # system("rm /usr/sbin/favorite.fon" ); unless( open( FAVORITEFON, ">/usr/sbin/favorite.fon") ) { die("Cannot open file: /usr/sbin/favorite.fon!\n\n"); } print FAVORITEFON "80x25\n"; print "Save Font 80x25 in /usr/sbin/favorit4.fon.\n\n"; } # end subroutine small_font ############################################## # readme show urls and install paths ################################################ sub readme { system("clear" ); print "Download volume from \n"; print " ftp://metalab.unc.edu/pub/Linux/apps/sound/soundcard/.\n"; print "When untarred it creates directory \n"; print "volume-2.1. \n"; print " The URL for locktones & SVGATextmode is:\n"; print " http://leb.net/pub/blinux/.\n"; print "To install type the following:\n"; print " rpm -i SVGATextMode*.rpm and press enter.\n"; print " rpm -i locktones*.rpm and press enter.\n"; print "The SVGATextMode binary will be put at /usr/sbin.\n\n"; print "The locktones binary will be put in two places:\n"; print " /usr/bin and /bin\n\n"; print " SVGA Text Mode is very talkative.\n"; print "In /etc/Textconfig, delete all lines\n"; print "starting with the word echo. \n"; print " If you start Emacspeak and pick the\n"; print "option to change colors, the color \n"; print "choices are saved in the favorites \n"; print "files but Emacspeak does not allow \n"; print "the colors to actually change. Run \n"; print "this outside Emacspeak to see colors \n"; print "change. \n"; print " If volume is increased beyond 240,\n"; print "the sound level suddenly drops to 0.\n"; print " If you create favorite.vol etc. \n"; print "with an editor, make sure each line \n"; print "ends with a new line character. \n"; print "\n Press any key when finished reading.\n"; $in_key = <STDIN>; } # end subroutine readme # ---- foreground background subroutines ---- ################################################# # change_color_scheme ######################################################## sub change_color_scheme { do # while { # system( "clear" ); print "Main Color Change Menu.\n\n"; print "Your options are\n"; print "1 to change Foreground color.\n"; print "2 to change Background color.\n"; print "3 to restore the default colors.\n"; print "m to return to Main Menu.\n"; print "q to quit this program.\n"; print "r to repeat this menu.\n"; print "Type 1 2 3 m r or q and press ENTER now!\n"; $in_key = <STDIN>; chop( $in_key ); $ret = &strip_white_space(); if( $in_key == 1 ) { $focus_num = "3"; # foreground 3 is hardcoded $focus_word = "foreground"; $ret1 = &change_foreground(); system( "clear" ); } elsif( $in_key == 2 ) { $focus_word = "background"; $focus_num = "4"; # focus is background $ret1 = &change_background(); system( "clear" ); } elsif( $in_key == 3 ) { print "Setting foreground and background\n"; print "to original colors. \n"; system("echo -e \"\033[35;1m Bac to original colors \033[0m\"" ); } # end if statement } while(($in_key ne "m") && ($in_key ne "q")); system( "clear" ); if( $in_key eq "q" ) { $ret = &exit_program(); } } # end subroutine change_color_scheme ######################################## # change_foreground ######################################## sub change_foreground { $old_c = "17"; # unknown $cannot_open = 0; # false unless( open( FAVORITEFG, "/usr/sbin/favorite.fg") ) { print "File /usr/sbin/favorite.fg can't be opened!\n"; $cannot_open = 1; # true } # end unless if( $cannot_open == 0 ) { $old_c = <FAVORITEFG>; chop( $old_c ); $color = $old_c; $ret1 = &set_color(); # print "old_c \<$old_fg\>.\n"; close( FAVORITEFG ); } # end if cannot_open == 0 system( "clear" ); print "Current $focus_word is $old_c $colors[$old_c -1].\n"; # print "Press a key to continue."; # $in_key = <STDIN>; $ret1 = &show_color_menu(); $ret1 = &set_color(); if( $valid_choice == 1 ) { print "Do you want your $focus_word $colors[$color -1]? y/n "; $in_key = <STDIN>; chop( $in_key ); $ret = &strip_white_space(); # print "in_key is \<$in_key>.\n"; if(($in_key eq "y") || ($in_key eq "Y")) { system( "rm /usr/sbin/favorite.fG" ); unless( open( FAVORITEFG, ">/usr/sbin/favorite.fg") ) { die("Cannot open file: /usr/sbin/favorite.fg!\n\n"); } # end unless print FAVORITEFG "$color\n"; print "Saving $color $colors[$color -1] $focus_word.\n\n"; } else # no { $color = $old_c; print "Restoring old $focus_word $old_c $colors[$old_fg -1].\n"; $ret1 = &set_color(); # $old_fg ); } # end if saving new color setting } # end if $valid_choice == 1 yes } # end subroutine change_foreground ################################################ # set_color of either foreground or background ################################################ sub set_color { # print "\n*** sub change_background ***\n"; # If $focus_num eq "3", foreground gets set. # If $focus_num eq "4", background gets set. if((0 < $color) && ($color < 9)) { $n = $color - 1; print "\033["."$focus_num"."$n"."m\n"; $valid_bg = 1; # true } elsif((8 < $color) && ($color < 17)) { $n = $color - 9; print "\033["."$focus_num"."$n".";1m\n"; $valid_bg = 1; # true } else { $valid_bg = 0; # false } # end if } # end subroutine set_color ############################################### # show_color_menu ############################################### sub show_color_menu { do { system( "clear" ); # Display color menu on screen. for( $j=1 ; $j < 17 ; $j++ ) { print " $j for $colors[$j - 1].\n"; } # end for loop that prints body of menu print "Type an integer from 1 to 16 and press ENTER now!\n"; print "or type m & press Enter to go to the Main Color Menu.\n"; print "or type r & press enter to repeat menu.\n"; $color = <STDIN>; chop( $color ); $color =~ s/^\s+//; # strip lead & trail white space $color =~ s/\s+$//; # $color = substr( $color, 0, 1 ); } while( $color eq "r" ); if((0 < $color) && ($color < 17) ) { $valid_choice = 1; } else { $valid_choice = 0; # false } } # end subroutine show_color_menu ######################################## # change_background ######################################## sub change_background { $old_c = "17"; # unknown $cannot_open = 0; # false unless( open( FAVORITEBG, "/usr/sbin/favorite.bg") ) { print "File /usr/sbin/favorite.bg can't be opened!\n"; $cannot_open = 1; # true } # end unless if( $cannot_open == 0 ) { $old_c = <FAVORITEBG>; chop( $old_c ); $color = $old_c; $ret1 = &set_color(); print "old_c \<$old_c\>.\n"; close( FAVORITEBG ); } # end if cannot_open == 0 system( "clear" ); print "Current $focus_word is $old_c $colors[$old_c -1].\n"; $ret1 = &show_color_menu(); $ret1 = &set_color(); if( $valid_choice == 1 ) { print "Do you want your $focus_word $colors[$color -1]? y/n "; $in_key = <STDIN>; chop( $in_key ); $ret = &strip_white_space(); # print "in_key is \<$in_key>.\n"; if(($in_key eq "y") || ($in_key eq "Y")) { system( "rm /usr/sbin/favorite.fG" ); unless( open( FAVORITEFG, ">/usr/sbin/favorite.bg") ) { die("Cannot open file: /usr/sbin/favorite.bg!\n\n"); } # end unless print FAVORITEBG "$color\n"; print "Saving $color $colors[$color -1] $focus_word.\n\n"; } else # no { $color = $old_c; print "Restoring old $focus_word $old_c $colors[$old_fg -1].\n"; $ret1 = &set_color(); # $old_fg ); } # end if saving new color setting } # end if $valid_choice == 1 yes } # end subroutine change_background ######################################## # catch_your_breath ######################################## sub catch_your_breath { local( $i); for( $i = 0 ; $i < 10000 ; $i++ ) { $keep_quiet = 1; } # end for loop } # end subroutine catch_your_breath ########################################################## # strip_white_space ########################################################## sub strip_white_space { $in_key =~ s/^\s+//; # chop leading white space $in_key =~ s/\s+$//; # chop trailing white space $in_key = substr( $in_key, 0, 1 ); # reduce to first char only } # end subroutine strip_white_space ########################################################## # exit_program prints a message and exits ########################################################## sub exit_program { print "\n\n\n\nExiting Accessibility Settings For The Linux Console \n"; } # end subroutine exit_program Michael R. Cross LTS - Linux Information Development Mike Cross/Austin/IBM (mrcross@us.ibm.com) 512-838-0087 / tl 678-0087 --0__=85256AD4006805E18f9e8a93df938690918c85256AD4006805E1 Content-type: application/octet-stream; name="console.510" Content-Disposition: attachment; filename="console.510" Content-transfer-encoding: base64 IyEvdXNyL2Jpbi9wZXJsDQoNCiMgQXV0aG9yIE1pY2hhZWwgUiAgQ3Jvc3MgU2VwdGVtYmVyIDI2 LCAxMDAxIDExOjM1IEFNDQojIC1lIGZhdm9yaXRlLnZvbCAmJiBkaWUoIC4uLiApOw0KIyBUaGlz IHByb2dyYW0gcHJlc2VudHMgYSBtZW51IG9mIGNvbnNvbGUgbW9kZSBhY2Nlc3MNCiMgb3B0aW9u cy4gVGhlc2Ugb3B0aW9ucyBhcmUgYXMgZm9sbG93czoNCiMgICAxLiBzZXQgRGVmYXVsdHMNCiMg ICAyLiB2b2x1bWUgY29udHJvbA0KIyAgIDMuIFNWR0FUZXh0TW9kZSBsYXJnZSBmb250cw0KIyAg IDQuIExvY2tlZCBUb25lcw0KIyAgIDUuIGZvcmVncm91bmQgQmFja2dyb3VuZCBjb2xvciBjaGFu Z2VzDQojICBOT1RFUzoNCiMgMS4gVW5wYWNrIHZvbHVtZS0yLjEudGFyLmd6IGluIC91c3IvYmlu DQojIHJwbSBpbnN0YWxsIGxvY2t0b25lcw0KIyBycG0gaW5zdGFsbCBTVkdBVGV4dE1vZGUNCg0K IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgbWFpbiAg QWNjZXNzaWJpbGl0eSBGb3IgVGhlIExpbnV4IENvbnNvbGUNCiMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQp7DQojIGFycmF5IGNvbG9ycw0KQGNvbG9ycyA9 DQooIGJsYWNrLCByZWQsIGdyZWVuLCBicm93biwgYmx1ZSwgbWFnZW50YSwgIGN5YW4sDQogIGdy YXksIGRhcmtfZ3JheSwgbGlnaHRfcmVkLCBsaWdodF9ncmVlbiwgeWVsbG93LA0KICBsaWdodF9i bHVlLCBsaWdodF9tYWdlbnRhLCAgICBsaWdodF9jeWFuLCB3aGl0ZSwgbm90X3NldCk7DQogIyBl bmQgYXJyYXkgZGVmaW5pdGlvbg0KDQoNCnN5c3RlbSgiY2xlYXIiKTsNCiAgcHJpbnQgIlNlcHRl bWJlciAyNiwgMjAwMSAxMTozNSBBTSBcbiI7DQpwcmludCAiV2VsY29tZSBUbyB0aGUgQ29uc29s ZSBBY2Nlc3NpYmlsaXR5IFRvb2xcbiI7DQpwcmludCAiWW91IHNob3VsZCBiZSBsb2dnZWQgaW4g YXMgcm9vdCB0byBydW4gdGhpcyBwcm9ncmFtIVxuIjsNCnByaW50ICJpZiB5b3UgYXJlIG5vdCwg cXVpdCB0aGlzIHByb2dyYW0gYW5kIGxvZ2luIGFnYWluLlxuIjsNCiMgcHJpbnQgImFnYWluLlxu XG4iOw0KDQogJHJldDEgPSAmY2F0Y2hfeW91cl9icmVhdGgoKTsNCg0KZG8gIyB3aGlsZQ0Kew0K cHJpbnQgIk1haW4gTWVudTogU2VsZWN0IGFuIGl0ZW0gJiBwcmVzcyBlbnRlci5cbiI7DQpwcmlu dCAiWW91ciBvcHRpb25zIGFyZVxuIjsNCnByaW50ICIgMSBmb3IgcmVzdG9yZSBhbGwgRGVmYXVs dHMuXG4iOw0KcHJpbnQgIiAyIGZvciBWb2x1bWUgY29udHJvbHMuICAgIFxuIjsNCiAgJHZvbHVt ZV9wYXRoID0iL2Jpbi92b2x1bWVfMi4xIjsNCnByaW50ICIgMyBmb3IgZm9udCBtZW51LiAgICAg ICAgIFxuIjsNCnByaW50ICIgNCBmb3IgbG9jayBUb25lcy4gICAgICAgICBcbiI7DQogICR0b25l X3BhdGggPSIvdXNyL2JpbiI7DQpwcmludCAiIDUgZm9yIEZvcmVncm91bmQgQmFja2dyb3VuZCBD aGFuZ2VzLlxuIjsNCnByaW50ICIgNiBmb3IgcmVhZG1lIHRleHQuICAgICAgICAgICAgICAgICAg IFxuIjsNCiAgJGZvbnRfcGF0aCA9Ii91c3Ivc2JpbiI7DQpwcmludCAiIHEgdG8gcXVpdCB0aGlz IHByb2dyYW0uXG4iOw0KcHJpbnQgIiByIHRvIHJlcGVhdCB0aGlzIG1lbnUuXG4iOw0KcHJpbnQg IlR5cGUgeW91ciBjaG9pY2UgJiBwcmVzcyBFbnRlciBub3chXG4iOw0KDQogJGluX2tleSA9IDxT VERJTj47DQogY2hvcCggJGluX2tleSApOw0KICAgJHJldCA9ICZzdHJpcF93aGl0ZV9zcGFjZSgp Ow0KIyAgcHJpbnQgImluX2tleSBpcyBcPCRpbl9rZXlcPlxuIjsNCiAgc3lzdGVtKCAiY2xlYXIi ICk7DQoNCmlmKCAkaW5fa2V5ID09IDEgKQ0Kew0KICBzeXN0ZW0oImxvY2t0b25lcyIgKTsNCiAg JHJldCA9ICZzbWFsbF9mb250KCk7DQogICRyZXQgPSAmaW5pdF92b2woKTsNCiAgcHJpbnQgIlww MzNbMzM7MW1cbiI7ICMgeWVsbG93IGZvcmVncm91bmQNCiAgcHJpbnQgIlwwMzNbNDBtXG4iOyAj IGJsYWNrIGJhY2tncm91bmQNCn0NCmVsc2lmKCAkaW5fa2V5ID09IDIgKQ0Kew0KICAkcmV0MSA9 ICZjaGFuZ2Vfdm9sdW1lKCk7DQp9DQplbHNpZiggJGluX2tleSA9PSAzICkgIyBmb250cw0Kew0K ICAjIFNlbGVjdCBmcm9tIGEgbWVudSBvZiBmb250cyBvZiBkaWZmZXJlbnQgc2l6ZXMuDQogICRy ZXQxID0gJmZvbnRfbWVudSgpOw0KfQ0KZWxzaWYoICRpbl9rZXkgPT0gNCApDQp7DQogICMgU2V0 IHRvbmVzIHRvIHNvdW5kIHdoZW4geW91IHRvdWNoIGNhcHMgbG9jaywgbnVtIGxvY2ssICYgc2Ny b2xsIGxvY2suDQogIHN5c3RlbSggImNsZWFyIiApOw0KICBwcmludCAiICAgTm90ZSBhYm91dCBs b2NrdG9uZTpcbiI7DQogIHByaW50ICJsb2NrdG9uZXMgd2lsbCBwbGF5ICBhIHRvbmUgaWYgeW91 IFxuIjsNCiAgcHJpbnQgInRvdWNoIENhcHMgTG9jaywgTnVtIExvY2ssIG9yIFNjcm9sbCBcbiI7 DQogIHByaW50ICJMb2NrLlxuIjsNCiAgcHJpbnQgIiAgIEVuZCBPZiBOb3RlOlxuIjsNCiAgcHJp bnQgIiBEbyB5b3Ugd2FudCB0byBzZXQgdXAgdGhlc2UgdG9uZXM/IHkvblxuIjsNCiAgJGluX2tl eSA9IDxTVERJTj47DQogICAkcmV0ID0gJnN0cmlwX3doaXRlX3NwYWNlKCk7DQogIGlmKCgkaW5f a2V5IGVxICJ5IikgfHwgKCRpbl9rZXkgZXEgIlkiKSkNCiAgew0KICAgIHN5c3RlbSggImxvY2t0 b25lcyIgKTsNCiAgICBwcmludCAibG9ja3RvbmVzIGhhdmUgbm93IGJlZW4gc2V0IHVwLiI7DQog IH0NCiAgZWxzZQ0KICB7DQogICAgcHJpbnQgImxvY2t0b25lcyB3ZXJlIG5vdCBzZXQgdXAuIjsN CiAgfQ0KfQ0KZWxzaWYoICRpbl9rZXkgPT0gNSApICMgYmFja2dyb3VuZCBmb3JlZ3JvdW5kIGNo YW5nZXNzDQp7DQogICMgZm9yZWdyb3VuZCBCYWNrZ3JvdW5kIGNvbG9yIGNoYW5nZSB0b29sLg0K ICAkcmV0MSA9ICZjaGFuZ2VfY29sb3Jfc2NoZW1lKCk7DQp9DQplbHNpZiAoJGluX2tleSA9PSA2 ICkgIyByZWFkIG1lIHRleHQNCnsNCiAgIyBJbmZvIGFib3V0IFVSTHMsIGRpcmVjdG9yaWVzLCBh bmQgaW5zdGFsbGluZy4NCiAgJHJldCA9ICZyZWFkbWUoKTsNCn0gIyBlbmQgaWYgc2VsZWN0IGEg ZnVuY3Rpb24NCg0KICAjIGVsc2lmKCAkaW5fa2V5ID1+IC9cZS8gKQ0KfSB3aGlsZSggJGluX2tl eSBuZSAicSIgKTsNCg0KICBwcmludCAiXG5cbiBTc2VuZCBDb21tZW50cyB0byBtcmNyb3NzXEB1 cy5pYm0uY29tIFxuXG4iOw0KICAkcmV0ID0gJmV4aXRfcHJvZ3JhbSgpOw0KfSAjIGVuZCBtYWlu IHByb2dyYW0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMNCiMgY2hhbmdlX3ZvbHVtZQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIw0Kc3ViIGNoYW5nZV92b2x1bWUNCnsNCiAgJGRlbHRhX3YgPSAyMDsgIyBj aGFuZ2UgcGVyIGtleXN0cm9rZQ0KICAkdG9wX3YgPSAyNDA7ICMgbWF4IHZvbHVtZQ0KICBzeXN0 ZW0oICJjbGVhciIgKTsNCg0KICAkb2xkX3YgPSA1MDsNCiAgICRjYW5ub3Rfb3BlbiA9IDA7ICMg ZmFsc2UNCiAgdW5sZXNzKCBvcGVuKCBGQVZPUklURVZPTCwgIi9iaW4vZmF2b3JpdGUudm9sIikg KSB7DQogICAjIGRpZSgiQ2Fubm90IG9wZW4gZmlsZTogL2Jpbi9mYXZvcml0ZS52b2wuXG5cbiIp Ow0KICAgJGNhbm5vdF9vcGVuID0gMTsgIyB0cnVlDQogICAkcmV0ID0gJmluaXRfdm9sKCk7DQog IH0NCg0KICBpZiggJGNhbm5vdF9vcGVuID09IDAgKQ0KICB7DQogICAgJG9sZF92ID0gPEZBVk9S SVRFVk9MPjsNCiAgICBjaG9wKCAkb2xkX3YgKTsNCiAgICBjbG9zZSggRkFWT1JJVEVWT0wgKTsN CiAgfSAjIGVuZCBpZiBjYW5ub3Rfb3BlbiA9PSAwDQoNCiAgcHJpbnQgIllvdXIgY3VycmVudCB2 b2x1bWUgc2V0dGluZyBpcyAkb2xkX3YuXG4iOw0KICAkbmV3X3YgPSAkb2xkX3Y7ICMgc3RhcnRp bmcgdm9sdW1lDQogICAgJGNtZCA9ICJ2b2x1bWVfcGF0aC92b2x1bWUgLWwgIi4kbmV3X3YuIiAt ciAiLiRuZXdfdjsNCiMgICAgcHJpbnQgImNtZCBpcyBcPCRjbWRcPi5cbiI7DQogICAgICAgc3lz dGVtKCAkY21kICk7ICMgZXhlY3V0ZSB0aGUgY29tbWFuZA0KICAkZmluYWxfY2hhbmdlID0gMDsg IyBmYWxzZQ0KDQogICAgIHByaW50ICJWb2x1bWUgQ29udHJvbCBNZW51OlxuIjsNCiAgICAgcHJp bnQgIlRvIHJldHVybiB0byB0aGUgTWFpbiBNZW51IHByZXNzIG0gYW5kXG4iOw0KICAgICBwcmlu dCAiZW50ZXIuIFRoZSBvbGQgdm9sdW1lIHdpbGwgYmUgcmVzdG9yZWQuXG4iOw0KICAgICBwcmlu dCAiVG8gZXhpdCB0aGUgcHJvZ3JhbSBwcmVzcyBxIGFuZFxuIjsNCiAgICAgcHJpbnQgImVudGVy LiBUaGUgb2xkIHZvbHVtZSB3aWxsIGJlIHJlc3RvcmVkLlxuIjsNCiAgICAgcHJpbnQgIiAgRWFj aCB0aW1lIHlvdSBwcmVzcyBkIGFuZCBlbnRlclxuIjsNCiAgICAgcHJpbnQgInRoZSAgdm9sdW1l IHdpbGwgYmUgZGVjcmVhc2VkLlxuIjsNCiAgICAgcHJpbnQgIiAgRWFjaCB0aW1lIHlvdSBwcmVz cyBpIGFuZCBlbnRlclxuIjsNCiAgICAgcHJpbnQgInRoZSAgdm9sdW1lIHdpbGwgYmUgaW5jcmVh c2VkLlxuIjsNCiAgICAgcHJpbnQgIldoZW4gZmluaXNoZWQgY2hhbmdpbmcgdm9sdW1lIHByZXNz IFxuIjsNCiAgICAgcHJpbnQgImVudGVyIGJ5IGl0c2VsZi5cbiI7DQoNCiAgd2hpbGUoICRmaW5h bF9jaGFuZ2UgPT0gMCApDQogIHsNCiAgICAgJGluX2tleSA9IDxTVERJTj47DQogICAgIGNob3Ao ICRpbl9rZXkgKTsNCiAgICAgJHJldCA9ICZzdHJpcF93aGl0ZV9zcGFjZSgpOw0KDQojICAgIHBy aW50ICJpbl9rZXkgXDwkaW5fa2V5XD5cbiI7DQoNCiAgICAgc3lzdGVtKCAiY2xlYXIiICk7ICMg Y2xlYXIgc2NyZWVuDQogICAgIGlmKCAkaW5fa2V5IGVxICJpIikNCiAgICAgew0KICAgICAgICRu ZXdfdiArPSAkZGVsdGFfdjsNCiAgICAgICBpZiggJG5ld192ID4gJHRvcF92ICkNCiAgICAgICB7 DQogICAgICAgICAkbmV3X3YgPSAkdG9wX3Y7DQogICAgICAgfQ0KDQogICAgICAgcHJpbnQgInZv bHVtZSBpcyAkbmV3X3YuXG4iOw0KICAgICAgICRjbWQgPSAiL2Jpbi92b2x1bWUtMi4xL3ZvbHVt ZSAtbCAiLiRuZXdfdi4iIC1yICIuJG5ld192Ow0KIyAgICBwcmludCAiY21kIGlzIFw8JGNtZFw+ XG4iOw0KICAgICAgIHN5c3RlbSggJGNtZCApOyAjIGV4ZWN1dGUgdGhlIGNvbW1hbmQNCiAgICAg fQ0KICAgICBlbHNpZiggJGluX2tleSBlcSAiZCIgKQ0KICAgICB7DQogICAgICAgJG5ld192IC09 ICRkZWx0YV92Ow0KICAgICAgIGlmKCAkbmV3X3YgPCAgJGRlbHRhX3YgKQ0KICAgICAgIHsNCiAg ICAgICAgICRuZXdfdiA9ICRkZWx0YV92Ow0KICAgICAgIH0NCg0KICAgICAgIHByaW50ICJ2b2x1 bWUgaXMgJG5ld192LlxuIjsNCiAgICAgICAkY21kID0gIi9iaW4vdm9sdW1lLTIuMS92b2x1bWUg LWwgIi4kbmV3X3YuIiAtciAiLiRuZXdfdjsNCiMgICAgcHJpbnQgImNtZCBpcyBcPCRjbWRcPlxu IjsNCiAgICAgICBzeXN0ZW0oICRjbWQgKTsgIyBleGVjdXRlIHRoZSBjb21tYW5kDQogICAgIH0N CiAgICAgZWxzaWYoICRpbl9rZXkgZXEgIiIgKSAjIGVudGVyIGJ5IGl0c2VsZg0KICAgICB7DQog ICAgICAgJGZpbmFsX2NoYW5nZSA9IDE7DQogICAgICAgcHJpbnQgIllvdXIgRmluYWwgVm9sdW1l IGlzICRuZXdfdi5cbiI7DQogICAgICAgJGZpbmFsX2NoYW5nZSA9IDE7DQoNCiAgICAgICBwcmlu dCAiRG8geW91IHdhbnQgJG5ld192IHRvIGJlIHlvdXIgdm9sdW1lIHNldHRpbmc/IHkvbiAiOw0K ICAgICAgICRpbl9rZXkgPSA8U1RESU4+Ow0KICAgICAgIGNob3AoICRpbl9rZXkgKTsNCiAgICAg ICAkcmV0ID0gJnN0cmlwX3doaXRlX3NwYWNlKCk7DQogICAgICAgaWYoKCRpbl9rZXkgZXEgInki KSB8fCAoJGluX2tleSBlcSAiWSIpKQ0KICAgICAgIHsNCiAgICAgICAgIHN5c3RlbSggInJtIC9i aW4vZmF2b3JpdGUudm9sIiApOw0KICAgICAgICAgdW5sZXNzKCBvcGVuKCBGQVZPUklURVZPTCwg Ij4vYmluL2Zhdm9yaXRlLnZvbCIpICkgew0KICAgICAgICAgICBkaWUoIkNhbm5vdCBvcGVuIGZp bGU6IC9iaW4vZmF2b3JpdGUudm9sIVxuXG4iKTsNCiAgICAgICAgIH0NCiAgICAgICAgIHByaW50 IEZBVk9SSVRFVk9MICIkbmV3X3ZcbiI7DQogICAgICAgICBwcmludCAiU2F2ZSBuZXcgdm9sdW1l IHNldHRpbmcgJG5ld192IGluIC9iaW4vZmF2b3JpdGUudm9sLlxuXG4iOw0KICAgICAgIH0gIyBl bmQgaWYgc2F2aW5nIG5ldyB2b2x1bWUgc2V0dGluZw0KICAgICB9DQogICAgIGVsc2lmKCAkaW5f a2V5IGVxICJtIiApICMgcmV0dXJuIHRvIG1haW4gbWVudQ0KICAgICB7DQogICAgICAgJGZpbmFs X2NoYW5nZSA9IDE7DQogICAgICAgJGNtZCA9ICIvYmluL3ZvbHVtZS0yLjEvdm9sdW1lIC1sICIu JG9sZF92LiIgLXIgIi4kb2xkX3Y7DQogICAgICAgc3lzdGVtKCAkY21kICk7ICMgZXhlY3V0ZSB0 aGUgY29tbWFuZA0KICAgICB9DQogICAgIGVsc2lmKCAkaW5fa2V5IGVxICJxIiApICMgZXhpdCBw cm9ncmFtDQogICAgIHsNCiAgICAgICAkZmluYWxfY2hhbmdlID0gMTsNCiAgICAgICAkY21kID0g Ii9iaW4vdm9sdW1lLTIuMS92b2x1bWUgLWwgIi4kb2xkX3YuIiAtciAiLiRvbGRfdjsNCiAgICAg ICBzeXN0ZW0oICRjbWQgKTsgIyBleGVjdXRlIHRoZSBjb21tYW5kDQogICAgICAgJHJldCA9ICZl eGl0X3Byb2dyYW0oKTsNCiAgICAgfSAjIGVuZCAgIHZvbHVtZSBleGVjdXRlIGJyYW5jaA0KICB9 ICMgZW5kIHdoaWxlIG5vdCBmaW5hbF9jaGFuZ2UNCn0gIyBlbmQgc3Vicm91dGluZSBjaGFuZ2Vf dm9sdW1lDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMN CiMgaW5pdF92b2wgaW5pdGlhbGl6ZSB2b2x1bWUgdG8gNTAgYW5kIHNhdmUgaXQNCiMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0Kc3ViIGluaXRfdm9sDQp7 DQogIHN5c3RlbSgidm9sdW1lIC1sIDQwIC1yIDQwIiApOw0KICBzeXN0ZW0oInJtIC9iaW4vZmF2 b3JpdGUudm9sIiApOw0KDQogIHVubGVzcyggb3BlbiggRkFWT1JJVEVWT0wsICI+L2Jpbi9mYXZv cml0ZS52b2wiKSApIHsNCiAgICBkaWUoIkNhbm5vdCBvcGVuIGZpbGU6IC9iaW4vZmF2b3JpdGUu dm9sIVxuXG4iKTsNCiAgfQ0KICAkbmV3X3YgPSA0MDsNCiAgcHJpbnQgRkFWT1JJVEVWT0wgIiRk ZWx0YV92XG4iOw0KICBwcmludCAiU2F2SU5HIHZvbHVtZSA0MCBpbiAvYmluL2Zhdm9yaXRlLnZv bC5cblxuIjsNCn0gIyBlbmQgc3ViIHJvdXRpbmUgc2V0X3ZvbA0KDQojIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIGZvbnRfbWVudSBjaG9pY2Ugb2YgNSBm b250cyBvZiBkaXJyZXJlbmNlIHNpemVzDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIw0Kc3ViIGZvbnRfbWVudQ0Kew0KICAkb2xkX2YgPSAiODB4MjUiOw0K ICAkY2Fubm90X29wZW4gPT0gMDsgIyBmYWxzZQ0KICB1bmxlc3MoIG9wZW4oIEZBVk9SSVRFRk9O LCAiL3Vzci9zYmluL2Zhdm9yaXRlLmZvbiIpICkgew0KICAgJHJldCA9ICZzbWFsbF9mb250KCk7 DQogICAkY2Fubm90X29wZW4gPT0gMTsgIyB0cnVlDQogIH0NCg0KICBpZiggJGNhbm5vdF9vcGVu ID09IDAgKQ0KICB7DQogICAgJG9sZF9mID0gPEZBVk9SSVRFRk9OPjsNCiAgICBjaG9wKCAkb2xk X2YgKTsNCiAgICBjbG9zZSggRkFWT1JJVEVGT04gKTsNCiAgfSAjIGVuZCBpZiBjYW5ub3Rfb3Bl biA9PSAwDQogIHN5c3RlbSggIlNWR0FUZXh0TW9kZSAkb2xkX2YiICk7DQoNCmRvICMgd2hpbGUN CnsNCiAgc3lzdGVtKCAiY2xlYXIiICk7DQogIHByaW50ICJDdXJyZW50IGZvbnQgaXMgJG9sZF9m LlxuIjsNCg0KICBwcmludCAiU2VsZWN0IGEgZm9udCB0aGVuIHByZXNzIGVudGVyLlxuIjsNCiAg cHJpbnQgIllvdXIgb3B0aW9ucyBhcmVcbiI7DQogIHByaW50ICIxIGZvciB0aGUgODB4MjUgZm9u dC4gIFxuIjsNCiAgcHJpbnQgIjIgZm9yIHRoZSA0MHgxMng4IGZvbnQuICBcbiI7DQogIHByaW50 ICIzIGZvciB0aGUgNDB4MTJ4OSBmb250LiAgXG4iOw0KICBwcmludCAiNCBmb3IgdGhlIDQweDE1 eDggZm9udC4gIFxuIjsNCiAgcHJpbnQgIjUgZm9yIHRoZSA0MHgxNXg5IGZvbnQuICBcbiI7DQog IHByaW50ICJtIHRvICByZXR1cm4gdG8gTWFpbiBNZW51LlxuIjsNCiAgcHJpbnQgInEgdG8gIGV4 aXQgdGhlIHByb2dyYW0uXG4iOw0KICBwcmludCAiciB0byAgcmVwZWF0IHRoaXMgbWVudS5cbiI7 DQogIHByaW50ICJTZWxlY3QgYW4gaXRlbSBhbmQgcHJlc3MgRW50ZXIgbm93IVxuIjsNCiAgJGlu X2tleSA9IDxTVERJTj47DQogIGNob3AoICRpbl9rZXkgKTsNCiAgJHJldCA9ICZzdHJpcF93aGl0 ZV9zcGFjZSgpOw0KDQogICAgJHZhbGlkX2ZvbnQgPSAxOyAjIHllcw0KICBpZiggJGluX2tleSA9 PSAxICkNCiAgew0KICAgIHN5c3RlbSggIlNWR0FUZXh0TW9kZSA4MHgyNSIgKTsNCiAgICAkbmV3 X2YgPSAiODB4MjUiOw0KICB9DQogIGVsc2lmKCAkaW5fa2V5ID09IDIgKQ0KICB7DQogICAgc3lz dGVtKCAiU1ZHQVRleHRNb2RlIDQweDEyeDgiICk7DQogICAgJG5ld19mID0gIjQweDEyeDgiOw0K ICB9DQogIGVsc2lmKCAkaW5fa2V5ID09IDMgKQ0KICB7DQogICAgc3lzdGVtKCAiU1ZHQVRleHRN b2RlIDQweDEyeDkiICk7DQogICAgJG5ld19mID0gIjQweDEyeDkiOw0KICB9DQogIGVsc2lmKCAk aW5fa2V5ID09IDQgKQ0KICB7DQogICAgc3lzdGVtKCAiU1ZHQVRleHRNb2RlIDQweDE1eDgiICk7 DQogICAgJG5ld19mID0gIjQweDE1eDgiOw0KICB9DQogIGVsc2lmKCAkaW5fa2V5ID09IDUgKQ0K ICB7DQogICAgc3lzdGVtKCAiU1ZHQVRleHRNb2RlIDQweDE1eDkiICk7DQogICAgJG5ld19mID0g IjQweDE1eDkiOw0KICB9DQogIGVsc2lmKCAkaW5fa2V5IGVxICJtIiApICMgcmV0dXJuIHRvIG1h aW4gbWVudQ0KICB7DQogICAgJHZhbGlkX2ZvbnQgPSAwOyAjIG5vDQogICAgIyBzeXN0ZW0oICJT VkdBVGV4dE1vZGUgJG9sZF9mIiApOw0KICB9DQogIGVsc2lmKCAkaW5fa2V5IGVxICJxIiApICMg ZXhpdCBwcm9ncmFtDQogIHsNCiAgICAkdmFsaWRfZm9udCA9IDA7ICMgbm8NCiAgICAjIHN5c3Rl bSggIlNWR0FUZXh0TW9kZSAkb2xkX2YiICk7DQogIH0gIyBlbmQgaWYgcGljayBhIG5ldyBmb250 DQogIHN5c3RlbSggImNsZWFyIiApOw0KDQogIGlmKCAkdmFsaWRfZm9udCA9PSAxICkNCiAgew0K ICAgIHByaW50ICJEbyB5b3Ugd2FudCAkbmV3X2YgdG8gYmUgeW91ciBmb250IHNldHRpbmc/IHkv biAiOw0KICAgICRpbl9rZXkgPSA8U1RESU4+Ow0KICAgIGNob3AoICRpbl9rZXkgKTsNCiAgICAk cmV0ID0gJnN0cmlwX3doaXRlX3NwYWNlKCk7DQojICAgcHJpbnQgImluX2tleSBpcyBcPCRpbl9r ZXlcPi5uIjsNCiAgICBpZigoJGluX2tleSBlcSAieSIpIHx8ICgkaW5fa2V5IGVxICJZIikpDQog ICAgew0KICAgICAgc3lzdGVtKCAicm0gL3Vzci9zYmluL2Zhdm9yaXRlLmZvbiIgKTsNCiAgICAg IHVubGVzcyggb3BlbiggRkFWT1JJVEVGT04sICI+L3Vzci9zYmluL2Zhdm9yaXRlLmZvbiIpICkg ew0KICAgICAgICBkaWUoIkNhbm5vdCBvcGVuIGZpbGU6IC91c3Ivc2Jpbi9mYXZvcml0ZS5mb24h IFxuXG4iKTsNCiAgICAgIH0NCiAgICAgIHByaW50IEZBVk9SSVRFRk9OICIkbmV3X2ZcbiI7DQog ICAgICBwcmludCAiU2F2aW5nIG5ldyBmb250IHNldHRpbmcgJG5ld19mIGluIC91c3Ivc2Jpbi9m YXZvcml0ZS5mb24uXG5cbiI7DQogICAgICAkb2xkX2YgPSAkbmV3X2Y7DQogICAgfQ0KICAgIGVs c2UgIyBkbyBub3Qgc2F2ZSBuZXcgZm9udA0KICAgIHsNCiAgICAgIHN5c3RlbSggIlNWR0FUZXh0 TW9kZSAkb2xkX2YiICk7DQogICAgfSAjIGVuZCBpZiBzYXZpbmcgbmV3IGZvbnQgc2V0dGluZw0K ICB9ICMgZW5kIGlmICR2YWxpZF9mb250ID09IDEgeWVzDQoNCiAgc3lzdGVtKCAiY2xlYXIiICk7 DQp9IHdoaWxlKCgkaW5fa2V5IG5lICJtIikgICYmICgkaW5fa2V5IG5lICJxIikgKTsNCg0KICBp ZiggJGluX2tleSBlcSAicSIgKSAjIGV4aXQgcHJvZ3JhbQ0KICB7DQogICAgIyBzeXN0ZW0oICJT VkdBVGV4dE1vZGUgJG9sZF9mIiApOw0KICAgICRyZXQgPSAmZXhpdF9wcm9ncmFtKCk7DQogIH0g IyBlbmQgaWYgcXVpdCB0aGlzIG1lbnUNCn0gIyBlbmQgc3Vicm91dGluZSBmb250X21lbnUNCg0K DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIHNtYWxs X2ZvbnQgdG8gODB4MjUgYW5kIHNhdmUgaXQNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIw0Kc3ViIHNtYWxsX2ZvbnQNCnsNCiAgc3lzdGVtKCJTVkdBVGV4 dE1vZGUgODB4MjUiICk7DQogICMgc3lzdGVtKCJybSAvdXNyL3NiaW4vZmF2b3JpdGUuZm9uIiAp Ow0KDQogIHVubGVzcyggb3BlbiggRkFWT1JJVEVGT04sICI+L3Vzci9zYmluL2Zhdm9yaXRlLmZv biIpICkgew0KICAgIGRpZSgiQ2Fubm90IG9wZW4gZmlsZTogL3Vzci9zYmluL2Zhdm9yaXRlLmZv biFcblxuIik7DQogIH0NCiAgcHJpbnQgRkFWT1JJVEVGT04gIjgweDI1XG4iOw0KICBwcmludCAi U2F2ZSBGb250IDgweDI1IGluIC91c3Ivc2Jpbi9mYXZvcml0NC5mb24uXG5cbiI7DQp9ICMgZW5k IHN1YnJvdXRpbmUgc21hbGxfZm9udA0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMNCiMgcmVhZG1lICBzaG93IHVybHMgYW5kIGluc3RhbGwgcGF0aHMN CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0Kc3ViIHJl YWRtZQ0Kew0KICBzeXN0ZW0oImNsZWFyIiApOw0KIHByaW50ICJEb3dubG9hZCB2b2x1bWUgZnJv bSBcbiI7DQogcHJpbnQgIiAgIGZ0cDovL21ldGFsYWIudW5jLmVkdS9wdWIvTGludXgvYXBwcy9z b3VuZC9zb3VuZGNhcmQvLlxuIjsNCiAgcHJpbnQgIldoZW4gdW50YXJyZWQgaXQgY3JlYXRlcyBk aXJlY3RvcnkgICAgICBcbiI7DQogIHByaW50ICJ2b2x1bWUtMi4xLiAgIFxuIjsNCg0KIHByaW50 ICIgVGhlIFVSTCBmb3IgbG9ja3RvbmVzICYgU1ZHQVRleHRtb2RlIGlzOlxuIjsNCiBwcmludCAi ICBodHRwOi8vbGViLm5ldC9wdWIvYmxpbnV4Ly5cbiI7DQogIHByaW50ICJUbyBpbnN0YWxsIHR5 cGUgdGhlIGZvbGxvd2luZzpcbiI7DQogcHJpbnQgIiAgIHJwbSAtaSBTVkdBVGV4dE1vZGUqLnJw bSBhbmQgcHJlc3MgZW50ZXIuXG4iOw0KIHByaW50ICIgICBycG0gLWkgbG9ja3RvbmVzKi5ycG0g YW5kIHByZXNzIGVudGVyLlxuIjsNCiAgcHJpbnQgIlRoZSBTVkdBVGV4dE1vZGUgYmluYXJ5IHdp bGwgYmUgcHV0IGF0IC91c3Ivc2Jpbi5cblxuIjsNCiAgcHJpbnQgIlRoZSBsb2NrdG9uZXMgYmlu YXJ5IHdpbGwgYmUgcHV0IGluIHR3byBwbGFjZXM6XG4iOw0KICBwcmludCAiICAgL3Vzci9iaW4g YW5kIC9iaW5cblxuIjsNCiAgcHJpbnQgIiAgU1ZHQSBUZXh0IE1vZGUgaXMgdmVyeSB0YWxrYXRp dmUuXG4iOw0KICBwcmludCAiSW4gL2V0Yy9UZXh0Y29uZmlnLCBkZWxldGUgYWxsIGxpbmVzXG4i Ow0KICBwcmludCAic3RhcnRpbmcgd2l0aCB0aGUgd29yZCBlY2hvLiAgICAgICAgIFxuIjsNCiAg cHJpbnQgIiAgSWYgeW91IHN0YXJ0IEVtYWNzcGVhayBhbmQgcGljayB0aGVcbiI7DQogIHByaW50 ICJvcHRpb24gdG8gY2hhbmdlIGNvbG9ycywgdGhlIGNvbG9yICAgXG4iOw0KICBwcmludCAiY2hv aWNlcyBhcmUgc2F2ZWQgaW4gdGhlIGZhdm9yaXRlcyBcbiI7DQogIHByaW50ICJmaWxlcyBidXQg RW1hY3NwZWFrIGRvZXMgbm90IGFsbG93ICAgXG4iOw0KICBwcmludCAidGhlIGNvbG9ycyB0byBh Y3R1YWxseSBjaGFuZ2UuIFJ1biAgIFxuIjsNCiAgcHJpbnQgInRoaXMgb3V0c2lkZSBFbWFjc3Bl YWsgdG8gc2VlIGNvbG9ycyBcbiI7DQogIHByaW50ICJjaGFuZ2UuICAgICAgICAgIFxuIjsNCiAg cHJpbnQgIiAgSWYgdm9sdW1lIGlzIGluY3JlYXNlZCBiZXlvbmQgMjQwLFxuIjsNCiAgcHJpbnQg InRoZSBzb3VuZCBsZXZlbCBzdWRkZW5seSBkcm9wcyB0byAwLlxuIjsNCiAgcHJpbnQgIiAgSWYg eW91IGNyZWF0ZSBmYXZvcml0ZS52b2wgZXRjLiAgIFxuIjsNCiAgcHJpbnQgIndpdGggYW4gZWRp dG9yLCBtYWtlIHN1cmUgZWFjaCBsaW5lIFxuIjsNCiAgcHJpbnQgImVuZHMgd2l0aCBhIG5ldyBs aW5lIGNoYXJhY3Rlci4gICAgIFxuIjsNCiAgcHJpbnQgIlxuIFByZXNzIGFueSBrZXkgd2hlbiBm aW5pc2hlZCByZWFkaW5nLlxuIjsNCiAgJGluX2tleSA9IDxTVERJTj47DQp9ICMgZW5kIHN1YnJv dXRpbmUgcmVhZG1lDQoNCiMgLS0tLSBmb3JlZ3JvdW5kIGJhY2tncm91bmQgc3Vicm91dGluZXMg LS0tLQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj DQojIGNoYW5nZV9jb2xvcl9zY2hlbWUNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpzdWIgY2hhbmdlX2NvbG9yX3NjaGVtZQ0Kew0KICBk byAjIHdoaWxlDQogIHsNCiMgIHN5c3RlbSggImNsZWFyIiApOw0KICAgcHJpbnQgIk1haW4gQ29s b3IgQ2hhbmdlIE1lbnUuXG5cbiI7DQogICBwcmludCAiWW91ciBvcHRpb25zIGFyZVxuIjsNCiAg ICBwcmludCAiMSB0byBjaGFuZ2UgRm9yZWdyb3VuZCBjb2xvci5cbiI7DQogICAgcHJpbnQgIjIg dG8gY2hhbmdlIEJhY2tncm91bmQgY29sb3IuXG4iOw0KICAgIHByaW50ICIzIHRvIHJlc3RvcmUg dGhlIGRlZmF1bHQgY29sb3JzLlxuIjsNCiAgICBwcmludCAibSB0byByZXR1cm4gdG8gTWFpbiBN ZW51LlxuIjsNCiAgICBwcmludCAicSB0byBxdWl0IHRoaXMgcHJvZ3JhbS5cbiI7DQogICAgcHJp bnQgInIgdG8gcmVwZWF0IHRoaXMgbWVudS5cbiI7DQogICAgcHJpbnQgIlR5cGUgMSAyIDMgbSBy IG9yIHEgYW5kIHByZXNzIEVOVEVSIG5vdyFcbiI7DQogICAgJGluX2tleSA9IDxTVERJTj47DQog ICAgY2hvcCggJGluX2tleSApOw0KICAgICRyZXQgPSAmc3RyaXBfd2hpdGVfc3BhY2UoKTsNCiAg ICBpZiggJGluX2tleSA9PSAxICkNCiAgICB7DQogICAgICAkZm9jdXNfbnVtID0gIjMiOyAjIGZv cmVncm91bmQgMyBpcyBoYXJkY29kZWQNCiAgICAgICRmb2N1c193b3JkID0gImZvcmVncm91bmQi Ow0KICAgICAgJHJldDEgPSAmY2hhbmdlX2ZvcmVncm91bmQoKTsNCiAgICAgIHN5c3RlbSggImNs ZWFyIiApOw0KICAgIH0NCiAgICBlbHNpZiggJGluX2tleSA9PSAyICkNCiAgICB7DQogICAgICAk Zm9jdXNfd29yZCA9ICJiYWNrZ3JvdW5kIjsNCiAgICAgICRmb2N1c19udW0gPSAiNCI7ICMgZm9j dXMgaXMgYmFja2dyb3VuZA0KICAgICAgJHJldDEgPSAmY2hhbmdlX2JhY2tncm91bmQoKTsNCiAg ICAgIHN5c3RlbSggImNsZWFyIiApOw0KICAgIH0NCiAgICBlbHNpZiggJGluX2tleSA9PSAzICkN CiAgICB7DQogICAgICBwcmludCAiU2V0dGluZyBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kXG4i Ow0KICAgICAgcHJpbnQgInRvIG9yaWdpbmFsIGNvbG9ycy4gICAgICAgICBcbiI7DQogICAgICBz eXN0ZW0oImVjaG8gLWUgXCJcMDMzWzM1OzFtIEJhYyB0byBvcmlnaW5hbCBjb2xvcnMgXDAzM1sw bVwiIiApOw0KICAgIH0gIyBlbmQgaWYgc3RhdGVtZW50DQogIH0gd2hpbGUoKCRpbl9rZXkgbmUg Im0iKSAmJiAoJGluX2tleSBuZSAicSIpKTsNCg0KIHN5c3RlbSggImNsZWFyIiApOw0KIGlmKCAk aW5fa2V5IGVxICJxIiApDQogew0KICAgJHJldCA9ICZleGl0X3Byb2dyYW0oKTsNCiB9DQp9ICMg ZW5kIHN1YnJvdXRpbmUgY2hhbmdlX2NvbG9yX3NjaGVtZQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIGNoYW5nZV9mb3JlZ3JvdW5kDQojIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpzdWIgY2hhbmdlX2ZvcmVncm91bmQNCnsNCiAg JG9sZF9jID0gIjE3IjsgIyB1bmtub3duDQogICRjYW5ub3Rfb3BlbiA9IDA7ICMgZmFsc2UNCiB1 bmxlc3MoIG9wZW4oIEZBVk9SSVRFRkcsICIvdXNyL3NiaW4vZmF2b3JpdGUuZmciKSApIHsNCiAg IHByaW50ICJGaWxlIC91c3Ivc2Jpbi9mYXZvcml0ZS5mZyBjYW4ndCBiZSBvcGVuZWQhXG4iOw0K ICAgJGNhbm5vdF9vcGVuID0gMTsgIyB0cnVlDQogfSAjIGVuZCB1bmxlc3MNCg0KIGlmKCAkY2Fu bm90X29wZW4gPT0gMCApDQogew0KICAgJG9sZF9jID0gPEZBVk9SSVRFRkc+Ow0KICAgY2hvcCgg JG9sZF9jICk7DQogICAkY29sb3IgPSAkb2xkX2M7DQogICAkcmV0MSA9ICZzZXRfY29sb3IoKTsN CiMgIHByaW50ICJvbGRfYyBcPCRvbGRfZmdcPi5cbiI7DQogICBjbG9zZSggRkFWT1JJVEVGRyAp Ow0KIH0gIyBlbmQgaWYgY2Fubm90X29wZW4gPT0gMA0KDQogc3lzdGVtKCAiY2xlYXIiICk7DQog cHJpbnQgIkN1cnJlbnQgJGZvY3VzX3dvcmQgaXMgJG9sZF9jICRjb2xvcnNbJG9sZF9jIC0xXS5c biI7DQojIHByaW50ICJQcmVzcyBhIGtleSB0byBjb250aW51ZS4iOw0KIyAkaW5fa2V5ID0gPFNU RElOPjsNCg0KICRyZXQxID0gJnNob3dfY29sb3JfbWVudSgpOw0KDQogJHJldDEgPSAmc2V0X2Nv bG9yKCk7DQoNCiBpZiggJHZhbGlkX2Nob2ljZSA9PSAxICkNCiB7DQogICBwcmludCAiRG8geW91 IHdhbnQgeW91ciAkZm9jdXNfd29yZCAkY29sb3JzWyRjb2xvciAtMV0/IHkvbiAiOw0KICAgJGlu X2tleSA9IDxTVERJTj47DQogICBjaG9wKCAkaW5fa2V5ICk7DQogICAkcmV0ID0gJnN0cmlwX3do aXRlX3NwYWNlKCk7DQojICBwcmludCAiaW5fa2V5IGlzIFw8JGluX2tleT4uXG4iOw0KICAgaWYo KCRpbl9rZXkgZXEgInkiKSB8fCAoJGluX2tleSBlcSAiWSIpKQ0KICAgew0KICAgICBzeXN0ZW0o ICJybSAgL3Vzci9zYmluL2Zhdm9yaXRlLmZHIiApOw0KICAgdW5sZXNzKCBvcGVuKCBGQVZPUklU RUZHLCAiPi91c3Ivc2Jpbi9mYXZvcml0ZS5mZyIpICkgew0KICAgICAgZGllKCJDYW5ub3Qgb3Bl biBmaWxlOiAvdXNyL3NiaW4vZmF2b3JpdGUuZmchXG5cbiIpOw0KICAgfSAjIGVuZCB1bmxlc3MN Cg0KICAgICBwcmludCBGQVZPUklURUZHICIkY29sb3JcbiI7DQogICAgIHByaW50ICJTYXZpbmcg JGNvbG9yICRjb2xvcnNbJGNvbG9yIC0xXSAkZm9jdXNfd29yZC5cblxuIjsNCiAgIH0NCiAgIGVs c2UgIyBubw0KICAgew0KICAgICAgJGNvbG9yID0gJG9sZF9jOw0KICAgICAgcHJpbnQgIlJlc3Rv cmluZyBvbGQgJGZvY3VzX3dvcmQgJG9sZF9jICRjb2xvcnNbJG9sZF9mZyAtMV0uXG4iOw0KICAg ICAgJHJldDEgPSAmc2V0X2NvbG9yKCk7ICMgJG9sZF9mZyApOw0KICAgfSAjIGVuZCBpZiBzYXZp bmcgbmV3IGNvbG9yIHNldHRpbmcNCiB9ICMgZW5kIGlmICR2YWxpZF9jaG9pY2UgPT0gMSB5ZXMN Cn0gIyBlbmQgc3Vicm91dGluZSBjaGFuZ2VfZm9yZWdyb3VuZA0KDQoNCiMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBzZXRfY29sb3Igb2YgZWl0aGVy IGZvcmVncm91bmQgb3IgYmFja2dyb3VuZA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjDQpzdWIgc2V0X2NvbG9yDQp7DQogICMgcHJpbnQgIlxuKioqIHN1 YiBjaGFuZ2VfYmFja2dyb3VuZCAqKipcbiI7DQogICMgSWYgJGZvY3VzX251bSBlcSAiMyIsIGZv cmVncm91bmQgZ2V0cyBzZXQuDQogICMgSWYgJGZvY3VzX251bSBlcSAiNCIsIGJhY2tncm91bmQg Z2V0cyBzZXQuDQoNCiAgaWYoKDAgPCAkY29sb3IpICYmICgkY29sb3IgPCA5KSkNCiAgew0KICAg ICRuID0gJGNvbG9yIC0gMTsNCiAgICBwcmludCAiXDAzM1siLiIkZm9jdXNfbnVtIi4iJG4iLiJt XG4iOw0KICAgICR2YWxpZF9iZyA9IDE7ICMgdHJ1ZQ0KICB9DQogIGVsc2lmKCg4IDwgJGNvbG9y KSAmJiAoJGNvbG9yIDwgMTcpKQ0KICB7DQogICAgJG4gPSAkY29sb3IgLSA5Ow0KICAgIHByaW50 ICJcMDMzWyIuIiRmb2N1c19udW0iLiIkbiIuIjsxbVxuIjsNCiAgICAkdmFsaWRfYmcgPSAxOyAj IHRydWUNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAkdmFsaWRfYmcgPSAwOyAjIGZhbHNlDQogIH0g IyBlbmQgaWYNCn0gIyBlbmQgc3Vicm91dGluZSBzZXRfY29sb3INCg0KIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgc2hvd19jb2xvcl9tZW51DQojIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0Kc3ViIHNob3dfY29s b3JfbWVudQ0Kew0KDQpkbw0Kew0KICBzeXN0ZW0oICJjbGVhciIgKTsNCg0KICAjIERpc3BsYXkg Y29sb3IgbWVudSBvbiBzY3JlZW4uDQogIGZvciggJGo9MSA7ICRqIDwgMTcgOyAkaisrICkNCiAg ew0KICAgIHByaW50ICIgJGogZm9yICRjb2xvcnNbJGogLSAxXS5cbiI7DQogIH0gIyBlbmQgZm9y IGxvb3AgdGhhdCBwcmludHMgYm9keSBvZiBtZW51DQogIHByaW50ICJUeXBlIGFuIGludGVnZXIg ZnJvbSAxIHRvIDE2IGFuZCBwcmVzcyBFTlRFUiBub3chXG4iOw0KICBwcmludCAib3IgdHlwZSBt ICYgcHJlc3MgRW50ZXIgdG8gZ28gdG8gdGhlIE1haW4gQ29sb3IgTWVudS5cbiI7DQogIHByaW50 ICJvciB0eXBlIHIgJiBwcmVzcyBlbnRlciB0byByZXBlYXQgbWVudS5cbiI7DQoNCiAgJGNvbG9y ID0gPFNURElOPjsNCiAgY2hvcCggJGNvbG9yICk7DQogICRjb2xvciA9fiBzL15ccysvLzsgIyBz dHJpcCBsZWFkICYgdHJhaWwgd2hpdGUgc3BhY2UNCiAgJGNvbG9yID1+IHMvXHMrJC8vOw0KIyAk Y29sb3IgPSBzdWJzdHIoICRjb2xvciwgMCwgMSApOw0KfSB3aGlsZSggJGNvbG9yIGVxICJyIiAp Ow0KDQoNCiAgaWYoKDAgPCAkY29sb3IpICYmICgkY29sb3IgPCAxNykgKQ0KICB7DQogICAgJHZh bGlkX2Nob2ljZSA9IDE7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgJHZhbGlkX2Nob2ljZSA9IDA7 ICMgZmFsc2UNCiAgfQ0KfSAjIGVuZCBzdWJyb3V0aW5lIHNob3dfY29sb3JfbWVudQ0KDQoNCiMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgY2hhbmdlX2JhY2tncm91 bmQNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnN1YiBjaGFuZ2Vf YmFja2dyb3VuZA0Kew0KICAkb2xkX2MgPSAiMTciOyAjIHVua25vd24NCiAgJGNhbm5vdF9vcGVu ID0gMDsgIyBmYWxzZQ0KIHVubGVzcyggb3BlbiggRkFWT1JJVEVCRywgIi91c3Ivc2Jpbi9mYXZv cml0ZS5iZyIpICkgew0KICAgcHJpbnQgIkZpbGUgL3Vzci9zYmluL2Zhdm9yaXRlLmJnIGNhbid0 IGJlIG9wZW5lZCFcbiI7DQogICAkY2Fubm90X29wZW4gPSAxOyAjIHRydWUNCiB9ICMgZW5kIHVu bGVzcw0KDQogaWYoICRjYW5ub3Rfb3BlbiA9PSAwICkNCiB7DQogICAkb2xkX2MgPSA8RkFWT1JJ VEVCRz47DQogICBjaG9wKCAkb2xkX2MgKTsNCiAgICRjb2xvciA9ICRvbGRfYzsNCiAgICRyZXQx ID0gJnNldF9jb2xvcigpOw0KICAgcHJpbnQgIm9sZF9jIFw8JG9sZF9jXD4uXG4iOw0KICAgY2xv c2UoIEZBVk9SSVRFQkcgKTsNCiB9ICMgZW5kIGlmIGNhbm5vdF9vcGVuID09IDANCg0KIHN5c3Rl bSggImNsZWFyIiApOw0KIHByaW50ICJDdXJyZW50ICRmb2N1c193b3JkIGlzICRvbGRfYyAkY29s b3JzWyRvbGRfYyAtMV0uXG4iOw0KDQogJHJldDEgPSAmc2hvd19jb2xvcl9tZW51KCk7DQoNCiAk cmV0MSA9ICZzZXRfY29sb3IoKTsNCg0KIGlmKCAkdmFsaWRfY2hvaWNlID09IDEgKQ0KIHsNCiAg IHByaW50ICJEbyB5b3Ugd2FudCB5b3VyICRmb2N1c193b3JkICRjb2xvcnNbJGNvbG9yIC0xXT8g eS9uICI7DQogICAkaW5fa2V5ID0gPFNURElOPjsNCiAgIGNob3AoICRpbl9rZXkgKTsNCiAgICRy ZXQgPSAmc3RyaXBfd2hpdGVfc3BhY2UoKTsNCiMgIHByaW50ICJpbl9rZXkgaXMgXDwkaW5fa2V5 Pi5cbiI7DQogICBpZigoJGluX2tleSBlcSAieSIpIHx8ICgkaW5fa2V5IGVxICJZIikpDQogICB7 DQogICAgIHN5c3RlbSggInJtICAvdXNyL3NiaW4vZmF2b3JpdGUuZkciICk7DQogICB1bmxlc3Mo IG9wZW4oIEZBVk9SSVRFRkcsICI+L3Vzci9zYmluL2Zhdm9yaXRlLmJnIikgKSB7DQogICAgICBk aWUoIkNhbm5vdCBvcGVuIGZpbGU6IC91c3Ivc2Jpbi9mYXZvcml0ZS5iZyFcblxuIik7DQogICB9 ICMgZW5kIHVubGVzcw0KDQogICAgIHByaW50IEZBVk9SSVRFQkcgIiRjb2xvclxuIjsNCiAgICAg cHJpbnQgIlNhdmluZyAkY29sb3IgJGNvbG9yc1skY29sb3IgLTFdICRmb2N1c193b3JkLlxuXG4i Ow0KICAgfQ0KICAgZWxzZSAjIG5vDQogICB7DQogICAgICAkY29sb3IgPSAkb2xkX2M7DQogICAg ICBwcmludCAiUmVzdG9yaW5nIG9sZCAkZm9jdXNfd29yZCAkb2xkX2MgJGNvbG9yc1skb2xkX2Zn IC0xXS5cbiI7DQogICAgICAkcmV0MSA9ICZzZXRfY29sb3IoKTsgIyAkb2xkX2ZnICk7DQogICB9 ICMgZW5kIGlmIHNhdmluZyBuZXcgY29sb3Igc2V0dGluZw0KIH0gIyBlbmQgaWYgJHZhbGlkX2No b2ljZSA9PSAxIHllcw0KfSAjIGVuZCBzdWJyb3V0aW5lIGNoYW5nZV9iYWNrZ3JvdW5kDQoNCiMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgY2F0Y2hfeW91cl9icmVh dGgNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnN1YiBjYXRjaF95 b3VyX2JyZWF0aA0Kew0KICBsb2NhbCggJGkpOw0KDQogIGZvciggJGkgPSAwIDsgJGkgPCAxMDAw MCA7ICRpKysgKSB7DQogICAgJGtlZXBfcXVpZXQgPSAxOw0KICB9ICMgZW5kIGZvciBsb29wDQp9 ICMgZW5kIHN1YnJvdXRpbmUgY2F0Y2hfeW91cl9icmVhdGgNCg0KIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBzdHJpcF93aGl0ZV9z cGFjZQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIw0Kc3ViIHN0cmlwX3doaXRlX3NwYWNlDQp7DQogICAkaW5fa2V5ID1+IHMvXlxzKy8v OyAjIGNob3AgbGVhZGluZyB3aGl0ZSBzcGFjZQ0KICAgJGluX2tleSA9fiBzL1xzKyQvLzsgIyBj aG9wIHRyYWlsaW5nIHdoaXRlIHNwYWNlDQogICAkaW5fa2V5ID0gc3Vic3RyKCAkaW5fa2V5LCAw LCAxICk7ICMgcmVkdWNlIHRvIGZpcnN0IGNoYXIgb25seQ0KfSAjIGVuZCBzdWJyb3V0aW5lIHN0 cmlwX3doaXRlX3NwYWNlDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBleGl0X3Byb2dyYW0gcHJpbnRzIGEgbWVzc2FnZSBh bmQgZXhpdHMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMNCnN1YiBleGl0X3Byb2dyYW0NCnsNCiAgcHJpbnQgIlxuXG5cblxuRXhpdGlu ZyBBY2Nlc3NpYmlsaXR5IFNldHRpbmdzIEZvciBUaGUgTGludXggQ29uc29sZSBcbiI7DQp9ICMg ZW5kIHN1YnJvdXRpbmUgZXhpdF9wcm9ncmFtDQoNCho= --0__=85256AD4006805E18f9e8a93df938690918c85256AD4006805E1--