Comments Requested On Accessibility Prototype

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



--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--





[Index of Archives]     [Linux Speakup]     [Fedora]     [Linux Kernel]     [Yosemite News]     [Big List of Linux Books]